1. Запуск read-ноды
Шаг 1 ставит read-ноду Snapchain на хост из node.env, ждёт, пока она не догонит
сеть, и открывает SSH-туннель, чтобы http://127.0.0.1:3381 на вашей машине вёл к
HTTP API ноды.
./scripts/1-node.shЧто он делает на хосте
Заголовок раздела «Что он делает на хосте»-
Ждёт, пока хост не ответит по SSH. Новому серверу сначала нужно загрузиться и выполнить cloud-init; скрипт пробует 60 раз с интервалом 5 секунд.
-
Ждёт завершения cloud-init, если хост его использует.
-
Проверяет хост и печатает по строке на каждую проверку:
Проверка Требуется ram15 ГиБ (Snapchain просит 16 ГБ; часть оставляет себе ядро) disk1,8 ТиБ свободного места в каталоге данных; пропускается, когда ~/snapchain/.rocksуже существуетdockerсервер Docker, с которым может общаться пользователь SSH composeDocker Compose 2.24.4 или новее, он нужен для override-файла ниже ports3381–3383 свободны; показывается, но никогда не проваливается, потому что при повторном запуске их занимает нода clockрасхождение с часами вашей машины не больше 60 секунд noв любой строке останавливает запуск с кодом выхода 5. -
Пишет
~/snapchain/.envсAGREE_NO_REWARDS_FOR_ME=true,HUB_OPERATOR_FID(ваш--fid, по умолчанию 0),SKIP_CRONTAB=true, если не передан--autoupgrade, одним случайным паролем Grafana в видеGRAFANA_CREDS(его читает собственный скрипт Snapchain) иGRAFANA_PASSWORD(его override-файл передаёт Grafana), а такжеSTATSD_PUBLISHиSTATSD_ADMIN_PUBLISH, указывающими на loopback хоста, где compose-файл публикует statsd. Скрипт только добавляет ключи, которых в файле ещё нет, и никогда не меняет уже записанное значение. -
Скачивает
docker-compose.mainnet.yml(сохраняется какdocker-compose.yml),validators.toml,grafana.iniдля Grafana и дашборд Snapchain из репозитория Snapchain по тегу@latestили поv<version>с--release. -
Пишет
docker-compose.override.yml, который Docker Compose накладывает поверх скачанного файла и который обновления Snapchain никогда не заменяют. Он публикует Grafana только на loopback хоста, передаёт ей пароль из.env, её источник данных и дашборд, а с--block-retentionнастраивает удаление старых блоков. -
Запускает сервисы
snapchainиstatsdкомандойdocker compose up -d. -
Ждёт синхронизации до
--timeoutсекунд (по умолчанию 12 часов). -
Открывает туннель, если не передан
--no-tunnel.
Шаги 4–7 — это неинтерактивные части собственной команды Snapchain snapchain.sh upgrade;
руководство по ноде описывает ключи .env и
override-файл.
Ожидание синхронизации
Заголовок раздела «Ожидание синхронизации»При первом запуске скачивается снимок в несколько сотен ГБ, затем синхронизируются блоки, вышедшие после этого снимка. Рассчитывайте на часы. Скрипт один раз печатает полный статус:
snapchain <version>, synced: noshard 0 height <n> behind <s>s size <x> GiB mempool n/ashard 1 height <n> behind <s>s size <x> GiB mempool n/ashard 2 height <n> behind <s>s size <x> GiB mempool n/aзатем по строке на каждую проверку, со временем, отставанием самого медленного шарда и оценкой по скорости с первой проверки:
<HH:MM> <hours>h <minutes>m behind, ETA <estimate>Проверки начинаются с интервалом 10 секунд и постепенно замедляются до одной в минуту. Нода считается синхронизированной, когда
каждый шард отстаёт меньше чем на 10 секунд; тогда полный статус печатается снова. behind —
это blockDelay, который нода сообщает в /v1/info. Read-ноды не сообщают размер mempool для некоторых
шардов, это показывается как n/a.
Ctrl-C завершает только ожидание. Нода продолжает синхронизацию на хосте;
./scripts/1-node.sh status --wait следит за ней с текущего места. Повторный запуск ./scripts/1-node.sh
тоже работает, но повторяет каждый шаг и снова скачивает compose-файл (последнего релиза,
если не передать тот же --release).
Туннель
Заголовок раздела «Туннель»./scripts/1-node.sh tunnel # forward 127.0.0.1:3381 and :3383 to the node./scripts/1-node.sh tunnel --stop # close itТуннель — это фоновый процесс ssh -N, который находится и останавливается через свой управляющий
сокет в ~/.ssh. Он не восстанавливается сам после обрыва соединения или перезапуска вашей
машины: снова запустите tunnel. Если локальный порт 3381 или 3383
уже слушает что-то другое, туннель не поднимается, и скрипт об этом сообщает.
Другие команды
Заголовок раздела «Другие команды»| Команда | Что делает |
|---|---|
status |
статус синхронизации один раз; код выхода 0, если синхронизирована, иначе 1 |
status --wait |
опрашивать до синхронизации, как это делает up |
logs |
следить за логами контейнера snapchain; logs casty — за логами страницы |
upgrade |
скачать compose-файл последнего релиза или релиза из --release, затем загрузить образ и перезапустить |
serve |
запустить casty на хосте за HTTPS, с --domain или --tailscale: Из любой сети |
down |
остановить ноду и casty, если он отдаёт страницу; база данных остаётся на томе |
status спрашивает ноду по SSH, так что порту 3381 для этого никогда не нужно быть публичным.
Закрепление релиза и обновления
Заголовок раздела «Закрепление релиза и обновления»Compose-файл каждого релиза Snapchain называет образ farcasterxyz/snapchain:latest.
--release 0.14.3 скачивает файлы v0.14.3 и переписывает эту строку на
farcasterxyz/snapchain:0.14.3; если файл больше не называет :latest, скрипт останавливается, а не
запускает что-то другое. ./scripts/1-node.sh upgrade без --release возвращается к последнему
релизу.
--autoupgrade --fid <fid> вместо этого ставит еженедельное задание обновления из snapchain.sh, в день недели,
вычисленный из вашего fid так же, как его вычисляет snapchain.sh. Это задание выполняет
docker system prune --volumes -f, что затрагивает каждый проект Docker на хосте, а не только
Snapchain. --release и --autoupgrade нельзя сочетать, и --release удаляет найденное задание
обновления, поскольку задание заменило бы закреплённую версию.
Хранение блоков
Заголовок раздела «Хранение блоков»--block-retention <n> задаёт SNAPCHAIN_PRUNING__BLOCK_RETENTION, чтобы нода удаляла блоки старше
n дней. Snapchain разрешает это только на read-нодах и по умолчанию оставляет выключенным. Значение —
это длительность, которую конфиг Snapchain читает в формате humantime, поэтому <n>d, который пишет casty, для
30 дней выглядит как 30d.
Grafana
Заголовок раздела «Grafana»Compose-файл Snapchain включает Grafana. casty запускает только snapchain и statsd, но
готовит Grafana так, чтобы одна команда запускала её с уже подключённым дашбордом Snapchain: на
хосте выполните docker compose up -d grafana в ~/snapchain. Override-файл публикует её на
loopback хоста, поэтому обращайтесь к ней через SSH:
ssh -L 3000:127.0.0.1:3000 <user>@<node ip> # then open http://127.0.0.1:3000Дашборд открывается без входа (grafana.ini от Snapchain позволяет смотреть любому); чтобы редактировать, войдите
как admin с паролем, который хранится в GRAFANA_PASSWORD в ~/snapchain/.env. Grafana читает
этот пароль только при первом запуске: если вы сами задали GRAFANA_CREDS до запуска casty,
задайте GRAFANA_PASSWORD таким же.
Usage: 1-node.sh [up|status|logs|tunnel|upgrade|serve|down] [options]
(no command) up, wait for sync, then open the tunnel up check the host, write ~/snapchain, start the node, wait for sync status [--wait] sync progress per shard; --wait polls until synced logs [casty] follow the node's logs, or the casty service's tunnel [--stop] forward local ports 3381 and 3383 to the node over SSH upgrade fetch the latest release's compose file (or --release) and restart serve run casty on the host, reached over HTTPS from any network: needs --domain <name> (Caddy gets the certificate; open 80 and 443 with 0-provision.sh --https) or --tailscale (tailscale serve on the host) down stop the node, and casty if it serves
--fid <fid> your fid, recorded as HUB_OPERATOR_FID (default: 0) --autoupgrade install snapchain.sh's weekly auto-upgrade (needs --fid). It runs docker system prune --volumes -f on the whole host. --block-retention <n> prune blocks older than n days (read nodes only) --release <version> run this Snapchain release, such as 0.14.3, instead of the latest --no-tunnel do not open the tunnel after sync --timeout <seconds> how long status --wait waits (default: 43200, 12 hours) --env <file> node.env from step 0 (default: node.env) --dry-run print the ssh commands instead of running them serve: --domain <name> the name the page is reached at; must point at the host --tailscale reach it as the host's name on your tailnet instead --read-only a page that reads only: no app key or passphrase leaves this machine --config <dir> casty's config directory here (default: $XDG_CONFIG_HOME/casty)
Exit codes: 0 ok, 1 not synced or the node did not answer, 2 bad arguments, 3 missing prerequisite,4 no ssh connection or download failed, 5 preflight failed.Далее: 2. Установка клиента.