Files
electrumx/README.ru-RU.md
bitdeals 7a7ecfb303
Build docker image and push to registry.bitdeals.org / build (push) Failing after 4m25s
ci: build and publish the image on every push to main
The registry account available on the testnet hosts is pull-only (403 on a
blob upload even for an existing repository), so publishing goes the same way
every other BitDeals image does: the Gitea runner builds and pushes with the
CI credentials. Tags mirror the family — an immutable <version>.<sha7>, a
moving <version>, and :latest for compose and Watchtower.

The version is read out of the Dockerfile ARG rather than repeated here: a tag
that can disagree with the code inside is worse than no tag.
2026-08-06 12:01:13 +00:00

138 lines
9.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Общие сведения
> English version: [README.md](README.md)
[ElectrumX](https://github.com/spesmilo/electrumx) — сервер протокола Electrum. Он индексирует цепочку по данным полного узла и отвечает на запросы, которые лёгкий клиент не может обработать сам: история и UTXO произвольного адреса, а также публикация транзакций.
ElectrumX, работающий в docker-контейнере, настраивается переменными окружения.
Репозиторий описывает только развёртывание в docker. Сам ElectrumX устанавливается из зафиксированного тега upstream-репозитория.
# Использование
ElectrumX нужен `bitcoind`, доступный по RPC, в той же сети и без обрезки
цепочки. `DAEMON_URL` — единственная обязательная переменная; `NET` должен
называть ту же сеть, в которой работает демон.
Контейнер отдаёт протокол Electrum на порту **50001** (открытый TCP) и, если
этого требует `SERVICES`, на порту **50002** (TLS). Никакой аутентификации нет,
поэтому держите оба порта во внутренней сети docker или на loopback.
Служебный **RPC** на `localhost:8000` наружу не выходит — им пользуется проверка
состояния контейнера.
## docker-compose
```yaml
services:
electrumx:
build:
context: https://git.bitdeals.org/private/electrumx.git
dockerfile: ./docker/Dockerfile
image: registry.bitdeals.org/electrumx
environment:
- COIN=Bitcoin
- NET=regtest
- DAEMON_URL=http://CHANGE_ME:CHANGE_ME@bitcoind:18443
- CACHE_MB=400
ports:
- 127.0.0.1:50001:50001 # без аутентификации — только loopback
volumes:
- electrumxdata:/data
volumes:
electrumxdata:
```
## docker cli
```sh
docker run -d \
-e COIN=Bitcoin \
-e NET=regtest \
-e DAEMON_URL=http://CHANGE_ME:CHANGE_ME@bitcoind:18443 \
-e CACHE_MB=400 \
-p 127.0.0.1:50001:50001 \
-v electrumxdata:/data \
registry.bitdeals.org/electrumx
```
Всё, что указано после имени образа, передаётся `electrumx_server`.
## сборка и публикация
Пуш в `main` собирает и публикует образ (`.gitea/workflows/build.yaml`) с тремя
тегами: `<версия>.<sha7>` — для развёртывания, `<версия>` — для чтения глазами,
`latest` — для compose и Watchtower. Вручную, если под рукой есть учётные данные
registry:
```sh
docker build . --file docker/Dockerfile --tag registry.bitdeals.org/electrumx
docker push registry.bitdeals.org/electrumx
```
Другая версия ElectrumX задаётся аргументом сборки — берите тег из
[upstream-репозитория](https://github.com/spesmilo/electrumx/tags):
```sh
docker build . --file docker/Dockerfile \
--build-arg ELECTRUMX_VERSION=2.0.0 \
--tag registry.bitdeals.org/electrumx:2.0.0
```
# Параметры
Образы контейнера настраиваются параметрами, передаваемыми при запуске. Все
переменные — собственные переменные ElectrumX, поэтому
[справочник upstream](https://electrumx-spesmilo.readthedocs.io/en/latest/environment.html)
применим без изменений; в таблице перечислены те, которым этот образ задаёт
значения по умолчанию.
|Параметр|Назначение|
|:--------|:-------|
|-p 127.0.0.1:50001|Протокол Electrum поверх открытого TCP. Аутентификации нет — см. «Замечания»|
|-p 127.0.0.1:50002|Протокол Electrum поверх TLS. Отдаётся, только если `SERVICES` содержит `ssl://`|
|-v /data|Каталог данных: индекс и самоподписанный сертификат, если он был создан. Его потеря означает повторную индексацию цепочки|
|-e DAEMON_URL|**Обязательный.** RPC демона, например `http://user:password@bitcoind:8332`. Можно указать несколько через запятую|
|-e COIN|Класс монеты. По умолчанию: `Bitcoin`|
|-e NET|Сеть: `mainnet`, `testnet`, `testnet4`, `signet`, `regtest` или `mutinynet`. Должна совпадать с сетью демона. По умолчанию: `mainnet`|
|-e DB_ENGINE|Хранилище индекса. По умолчанию: `rocksdb` — единственный движок, библиотеки которого есть в образе|
|-e DB_DIRECTORY|Где лежит индекс. По умолчанию: `/data`|
|-e SERVICES|Что обслуживать, через запятую. По умолчанию: `tcp://:50001,rpc://localhost:8000`. Оставьте запись `rpc://` — она нужна проверке состояния|
|-e SSL_CERTFILE, -e SSL_KEYFILE|Сертификат и ключ TLS. По умолчанию: самоподписанная пара создаётся в каталоге данных, если `SERVICES` содержит `ssl://`|
|-e PEER_DISCOVERY|Искать ли другие публичные серверы. По умолчанию: `off` — образ рассчитан на приватный индексатор|
|-e PEER_ANNOUNCE|Объявлять ли себя в сети серверов. По умолчанию: `false`|
|-e CACHE_MB|Кэш индексации. По умолчанию: `1200` (значение ElectrumX). Снижайте для небольшой цепочки, повышайте для ускорения первой индексации mainnet|
# Замечания
- **Аутентификации нет никакой.** Любой, кто дотянулся до 50001 или 50002, может
запросить произвольный адрес и опубликовать транзакцию. Публикуйте на
loopback, а если клиенты — контейнеры той же сети, не публикуйте вовсе.
- **Индекс от другого образа не читается.** Здесь rocksdb, а
`lukechilds/electrumx`, который этот образ заменяет в BitDeals, писал leveldb.
Подключите пустой том и дайте проиндексировать заново: для regtest и testnet
это быстро, для mainnet — несколько суток.
- **Демону нужны `txindex=1` и `txospenderindex=1`.** ElectrumX 2.x перед
началом работы запрашивает `getindexinfo` и завершается с `RuntimeError`,
называя недостающий индекс — по одному за раз, так что после включения
`txindex` вы получите то же сообщение про `txospenderindex`. В соседнем
[образе bitcoind](https://git.bitdeals.org/private/bitcoind) это
`BITCOIND_TXINDEX=1` и `BITCOIND_TXOSPENDERINDEX=1`; на существующем каталоге
данных их включение означает переиндексацию демона.
- **Демон не должен быть обрезанным.** Индексация читает каждый блок; узел с
`-prune` приводит к отказу на середине с сообщением об отсутствующем блоке, а
не о неверной настройке.
- **`NET` пишется по-электрумовски, а не по-биткойновски.** Демон называет сети
`main`, `test` и `regtest`, ElectrumX — `mainnet`, `testnet` и `regtest`.
Точка входа отвергает неизвестное значение, потому что пара обычно
настраивается из одного `.env`, и `NET=test` иначе упал бы глубоко внутри
поиска класса монеты.
- **Контейнер становится healthy только когда начинает обслуживать клиентов** —
то есть после того, как догнал демона. Первая индексация mainnet занимает
несколько суток, и всё это время контейнер будет unhealthy; смотрите логи. На
regtest это секунды.
- **Самоподписанный сертификат создаётся, только если `SERVICES` требует TLS, а
файлы не заданы.** Клиентам придётся доверять ему явно. Это плата за то, что
ElectrumX отказывается стартовать при запросе `ssl://` без сертификата — не
лучший способ узнать, что вы добавили порт.