feat: docker image for Bitcoin Core, configured by environment
Replaces lncm/bitcoind, which pins Core 26 — a version that still has legacy wallets, while the code that talks to it (bt's BitcoindClient) is written for the descriptor-only behaviour of 29 and later. The binaries are the official release build, verified by SHA-256 in the same layer that downloads them; a version bump that forgets the checksum fails the build instead of shipping something unverified. uid 1000 and /data/.bitcoin are kept from the image this replaces, so an existing named volume survives the switch without a recursive chown of a synced chain. Verified on testnet2: regtest node healthy in ~12 s, descriptor wallet, 101 blocks mined, sendtoaddress accepted — the last one being the check for BITCOIND_FALLBACKFEE, without which a fresh chain refuses to send.
This commit is contained in:
+139
@@ -0,0 +1,139 @@
|
||||
# Общие сведения
|
||||
|
||||
> English version: [README.md](README.md)
|
||||
|
||||
[Bitcoin Core](https://bitcoincore.org/) — эталонная реализация Bitcoin. `bitcoind` — её демон: хранит полную копию цепочки, ретранслирует транзакции и предоставляет интерфейс JSON-RPC.
|
||||
|
||||
Bitcoin Core, работающий демоном в docker-контейнере, настраивается переменными окружения.
|
||||
|
||||
Репозиторий описывает только развёртывание в docker. Двоичные файлы — официальная сборка релиза, проверяемая по SHA-256, зафиксированному в Dockerfile.
|
||||
|
||||
# Использование
|
||||
|
||||
У контейнера два порта, и они не взаимозаменяемы. Порт **RPC** (8332 для main,
|
||||
18332 для test, 18443 для regtest) управляет кошельком и не имеет TLS: держите
|
||||
его на loopback или во внутренней сети docker. Порт **P2P** (8333 / 18333 /
|
||||
18444) — протокол цепочки: опубликуйте его, чтобы принимать входящие соединения,
|
||||
или не публикуйте, и тогда узел работает только на исходящих.
|
||||
|
||||
Сеть выбирается переменной `BITCOIND_CHAIN`, она же задаёт RPC-порт по
|
||||
умолчанию. Неизвестное значение останавливает контейнер, а не откатывается к
|
||||
mainnet.
|
||||
|
||||
## docker-compose
|
||||
|
||||
```yaml
|
||||
services:
|
||||
bitcoind:
|
||||
build:
|
||||
context: https://git.bitdeals.org/private/bitcoind.git
|
||||
dockerfile: ./docker/Dockerfile
|
||||
image: registry.bitdeals.org/bitcoind
|
||||
environment:
|
||||
- BITCOIND_CHAIN=regtest
|
||||
- BITCOIND_USER=CHANGE_ME
|
||||
- BITCOIND_PASSWORD=CHANGE_ME
|
||||
- BITCOIND_FALLBACKFEE=0.00001
|
||||
- BITCOIND_TXINDEX=1 # оба нужны ElectrumX; уберите,
|
||||
- BITCOIND_TXOSPENDERINDEX=1 # если узел никто не индексирует
|
||||
ports:
|
||||
- 127.0.0.1:18443:18443 # RPC — только loopback
|
||||
volumes:
|
||||
- btcdata:/data/.bitcoin
|
||||
|
||||
volumes:
|
||||
btcdata:
|
||||
```
|
||||
|
||||
## docker cli
|
||||
|
||||
```sh
|
||||
docker run -d \
|
||||
-e BITCOIND_CHAIN=regtest \
|
||||
-e BITCOIND_USER=CHANGE_ME \
|
||||
-e BITCOIND_PASSWORD=CHANGE_ME \
|
||||
-e BITCOIND_FALLBACKFEE=0.00001 \
|
||||
-p 127.0.0.1:18443:18443 \
|
||||
-v btcdata:/data/.bitcoin \
|
||||
registry.bitdeals.org/bitcoind
|
||||
```
|
||||
|
||||
Всё, что указано после имени образа, добавляется к аргументам демона, поэтому
|
||||
разовая служебная операция не требует нового образа:
|
||||
|
||||
```sh
|
||||
docker run --rm -v btcdata:/data/.bitcoin registry.bitdeals.org/bitcoind -reindex
|
||||
```
|
||||
|
||||
## сборка и публикация
|
||||
|
||||
```sh
|
||||
docker build . --file docker/Dockerfile --tag registry.bitdeals.org/bitcoind
|
||||
docker push registry.bitdeals.org/bitcoind
|
||||
```
|
||||
|
||||
Другая версия Core задаётся аргументом сборки, и вместе с ней меняется
|
||||
контрольная сумма — оба значения берутся из
|
||||
`https://bitcoincore.org/bin/bitcoin-core-<версия>/SHA256SUMS`:
|
||||
|
||||
```sh
|
||||
docker build . --file docker/Dockerfile \
|
||||
--build-arg BITCOIN_VERSION=31.1 \
|
||||
--build-arg BITCOIN_SHA256_X86_64=b80d9c3e04da78fb6f0569685673418cf686fadba9042d926d13fb87ff503f9e \
|
||||
--tag registry.bitdeals.org/bitcoind:31.1
|
||||
```
|
||||
|
||||
# Параметры
|
||||
|
||||
Образы контейнера настраиваются параметрами, передаваемыми при запуске.
|
||||
|
||||
|Параметр|Назначение|
|
||||
|:--------|:-------|
|
||||
|-p 127.0.0.1:8332|Порт RPC. Внутри контейнера демон слушает то, что задано `BITCOIND_RPCBIND`, поэтому доступность определяет то, что опубликовано. RPC полностью управляет кошельком — см. «Замечания»|
|
||||
|-p 8333|P2P-порт. Необязательный: без него узел всё равно подключается к пирам сам, просто к нему подключиться нельзя. Зависит от сети: 8333 для main, 18333 для test, 18444 для regtest|
|
||||
|-v /data/.bitcoin|Каталог данных: цепочка, индекс блоков и кошельки. Без него обновление контейнера означает повторную загрузку цепочки|
|
||||
|-e BITCOIND_CHAIN|Сеть: `main`, `test`, `signet` или `regtest`. Любое другое значение останавливает контейнер. По умолчанию: `main`|
|
||||
|-e BITCOIND_USER|Пользователь RPC. По умолчанию: `user` — измените|
|
||||
|-e BITCOIND_PASSWORD|Пароль RPC. По умолчанию: `pass` — измените|
|
||||
|-e BITCOIND_PORT|Порт RPC. По умолчанию: стандартный порт выбранной сети (`8332`/`18332`/`38332`/`18443`). Задайте явно, чтобы URL RPC не менялся при смене сети|
|
||||
|-e BITCOIND_RPCBIND|Интерфейс, на котором RPC слушает внутри контейнера. По умолчанию: `0.0.0.0`, чтобы другие контейнеры обращались по имени сервиса|
|
||||
|-e BITCOIND_RPCALLOWIP|Кому разрешены вызовы RPC. По умолчанию: `0.0.0.0/0` — закрытость контейнера обеспечивается тем, что опубликовано, а не этим параметром|
|
||||
|-e BITCOIND_FALLBACKFEE|Комиссия (BTC/kvB) на случай, когда в цепочке нет истории для оценки. По умолчанию: `0` (выключено). Свежей regtest-цепочке параметр необходим, например `0.00001`|
|
||||
|-e BITCOIND_TXINDEX|Строить полный индекс транзакций. По умолчанию: `0`. Требуется для ElectrumX. Изменение на существующем каталоге данных вызывает переиндексацию|
|
||||
|-e BITCOIND_TXOSPENDERINDEX|Строить индекс «какая транзакция потратила этот выход». По умолчанию: `0`. Требуется для ElectrumX 2.x. Изменение на существующем каталоге данных вызывает переиндексацию|
|
||||
|-e BITCOIND_EXTRA_ARGS|Дополнительные аргументы `bitcoind`, разделяемые пробелами и добавляемые последними — то есть они перекрывают всё вышеперечисленное|
|
||||
|
||||
# Замечания
|
||||
|
||||
- **RPC полностью управляет кошельком и не имеет TLS.** Публикуйте его только на
|
||||
`127.0.0.1` или не публикуйте вовсе — внутри compose-проекта другие сервисы
|
||||
обращаются к нему по имени сервиса во внутренней сети. Значение
|
||||
`BITCOIND_RPCALLOWIP` по умолчанию `0.0.0.0/0`, потому что только оно работает
|
||||
для обращений между контейнерами; закрытость даёт публикация портов.
|
||||
- **Учётные данные RPC видны в списке процессов контейнера.** Это аргументы
|
||||
демона, и иначе нельзя: сетевые параметры Core в конфигурационном файле
|
||||
действуют только внутри секции `[chain]`. Внутри контейнера `bitcoin-cli`
|
||||
берёт их из `cli.conf`, поэтому проверка состояния второй копии не создаёт.
|
||||
- **Каталог данных из другого образа требует однократного `chown`.** Демон
|
||||
работает под uid 1000, точка входа исправляет владельца самого каталога, но
|
||||
намеренно не обходит его содержимое: синхронизированный mainnet — сотни
|
||||
гигабайт, и рекурсивный `chown` добавлялся бы к каждому перезапуску.
|
||||
- **ElectrumX перед этим узлом требует двух индексов.** Задайте одновременно
|
||||
`BITCOIND_TXINDEX=1` и `BITCOIND_TXOSPENDERINDEX=1`: ElectrumX 2.x при старте
|
||||
запрашивает `getindexinfo` и завершается, назвав недостающий — сначала
|
||||
`txindex`, а после его включения `txospenderindex`. По умолчанию оба выключены,
|
||||
потому что занимают место, а большинству других применений не нужны.
|
||||
- **Обрезка цепочки (pruning) несовместима с ElectrumX.** Индексатору нужна вся
|
||||
цепочка; `-prune` через `BITCOIND_EXTRA_ARGS` приведёт к отказу позже и в куда
|
||||
менее очевидном месте.
|
||||
- **В Core 29 и новее нет legacy-кошельков.** `createwallet` создаёт
|
||||
дескрипторный кошелёк, приватный ключ импортируется через `importdescriptors`,
|
||||
а не `importprivkey`. Код, жёстко задающий `descriptors=false`, падает уже при
|
||||
создании кошелька.
|
||||
- **Смена версии — это и смена контрольной суммы.** Сборка скачивает архив
|
||||
релиза и проверяет его в том же слое; изменение одной лишь версии приводит к
|
||||
ошибке `sha256sum -c`, а не к выпуску непроверенного образа.
|
||||
- Контейнер становится healthy, как только отвечает RPC, — задолго до
|
||||
синхронизации цепочки. Это сделано намеренно: состояние «unhealthy трое суток
|
||||
начальной загрузки блоков» приводило бы к перезапускам узла всем, что следит
|
||||
за состоянием контейнеров.
|
||||
Reference in New Issue
Block a user