Перейти к содержимому

Весь путь

Эта страница проходит весь путь один раз, в том порядке, в каком вы его проходите, и ссылается на страницу с подробностями каждого шага. Команды запускаются из клона репозитория casty, если не сказано «на хосте».

Seed-фраза управляет всем аккаунтом. Для этого руководства используйте тестовый аккаунт, вставляйте seed-фразу только в программы разработчиков, которым доверяете, и предпочитайте ключ, одобренный вашим кошельком: casty init --fid <fid>, затем casty web и в разделе о вас «add a key with your wallet».

Вам нужны:

  • Тестовый аккаунт Farcaster: его fid, хотя бы один storage unit (Аренда хранилища) и кошелёк, в котором есть адрес, на который зарегистрирован fid (или, как запасной вариант, seed-фраза этого адреса). casty whoami и casty storage показывают и то и другое, когда casty настроен.
  • Хост для ноды: аккаунт в Hetzner Cloud или AWS, где casty арендует сервер, или собственная машина с 16 ГБ RAM, 4 ядрами, 2 ТБ свободного диска и Docker (Нода дома). За арендованный сервер и его том на 2 ТБ выставляется счёт, пока вы их не удалите (шаг 9).
  • На вашей машине: ssh, curl и jq, а также пара SSH-ключей, по умолчанию ~/.ssh/id_ed25519. Пока у проекта нет релиза, ещё и Node.js 22.12 или новее, поскольку шаг 2 тогда собирает клиент здесь. В Windows используйте WSL2.
  • Время: первая синхронизация ноды скачивает снимок в несколько сотен ГБ и занимает часы. Если перестать ждать, ничего не теряется; каждый шаг можно запустить снова, и он продолжит с того места, где остановился.
Окно терминала
git clone https://github.com/castyfun/casty.git && cd casty
ls ~/.ssh/id_ed25519.pub || ssh-keygen -t ed25519 # a key to log in to the node with

Задайте учётные данные одного провайдера; скрипты читают их из вашего окружения и никогда никуда их не записывают (0. Подготовка хоста).

Окно терминала
export HCLOUD_TOKEN=<token> # Hetzner: Cloud console, your project, Security, API tokens (read/write)
# or, for AWS: aws configure # or AWS_PROFILE, or AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY

Для машины, которая у вас уже есть, пропустите это и передайте --host user@ip на шаге 2.

Прочитайте, что сделает запуск, прежде чем что-либо будет создано; пробному запуску учётные данные не нужны:

Окно терминала
./scripts/deploy.sh --dry-run -- --provider hetzner

Он печатает каждую команду провайдера и SSH строкой DRY: и ничего не создаёт.

Окно терминала
./scripts/deploy.sh --fid <fid>

Это выполняет три шага ниже по порядку и останавливается на первом, который завершился с ошибкой, с кодом выхода этого шага. Запустите ту же команду снова, чтобы продолжить: первая синхронизация занимает часы, и Ctrl-C во время неё ничего не теряет. Добавьте --domain <name> (или --tailscale), чтобы ещё и поставить страницу на хост, шаг 6. Без --fid шаг 2c вместо этого спрашивает seed-фразу.

Что каждый шаг спрашивает у вас:

  • Хост (0-provision.sh): печатает, что он создаст и за что будет выставлен счёт, и продолжает только после того, как вы введёте имя сервера (--yes пропускает вопрос). Он пишет node.env, который читает каждый следующий шаг и который нужен для удаления ноды: сохраните его. С --host user@ip ничего не создаётся; хост проверяется по SSH.
  • Нода (1-node.sh): отвечать ничего не нужно. Проверяет хост (RAM, диск, Docker, часы), запускает Snapchain, печатает ход синхронизации и открывает SSH-туннель к 127.0.0.1:3381, когда нода догонит сеть.
  • Клиент (2-client.sh): с --fid ничего; casty настраивается для вашего fid пока без ключа, и читается лента. Без него: пароль для хранилища ключей (дважды), затем seed-фраза, в скрытом поле ввода.

То же самое, по одному шагу:

Окно терминала
./scripts/0-provision.sh # a: a server, a 2 TB volume and a firewall; or --host user@ip
./scripts/1-node.sh # b: the read node, the wait for its sync, the tunnel
./scripts/2-client.sh --fid <fid> # c: ./bin/casty, set up for your fid; the seed phrase path without --fid

Пока нода синхронизируется, ./scripts/1-node.sh status показывает, насколько отстаёт каждый шард, а ./scripts/1-node.sh status --wait ждёт, пока она не синхронизируется. Подробности: 1. Запуск read-ноды, 2. Установка клиента.

casty пишет с ключом приложения: это ключ Ed25519, который одобряет custody-адрес вашего fid, добавленный бесплатным сообщением KEY_ADD через вашу ноду, без транзакции и без газа (Custody-адрес и ключи приложений).

Окно терминала
./bin/casty web
  1. casty web дважды спрашивает пароль для хранилища ключей, которое собирается создать, и печатает ссылку с токеном. Откройте её в браузере, где есть ваш кошелёк (расширение вроде MetaMask).
  2. В разделе о вас выберите «add a key with your wallet».
  3. Кошелёк запрашивает аккаунт; выберите тот, на который зарегистрирован fid. Если он находится в другой сети, кошелёк попросят переключиться на Ethereum mainnet, что ничего не стоит.
  4. Подпишите два запроса, которые покажет кошелёк: запрос ключа, затем добавление ключа.
  5. Страница проверяет обе подписи, отправляет KEY_ADD через вашу ноду, ждёт, пока нода не покажет ключ, и сохраняет его зашифрованным в ~/.config/casty/keys.enc.json.

На телефоне, где кошелёк — приложение, запустите ./bin/casty web --listen 0.0.0.0:3390 (или используйте страницу на хосте, шаг 6), откройте страницу на телефоне и в разделе о вас воспользуйтесь ссылкой, которая открывает её в браузере вашего кошелька; кнопка рядом с ней копирует ссылку для связывания, чтобы вставить её там.

Окно терминала
./bin/casty init

Команда спрашивает пароль, затем фразу в скрытом поле ввода; фраза используется один раз, чтобы подписать запрос ключа, и никогда не записывается на диск. --address-index выбирает другой адрес этой фразы.

В обоих случаях ключ может подписывать касты, реакции и подписки (--scopes добавляет изменения профиля), и он истекает после 30 дней без использования (--ttl, не больше 90d); каждое подписанное им сообщение продлевает его. ./bin/casty whoami показывает ключ, custody-адрес и ваше хранилище.

./bin/casty --help перечисляет все команды; <command> --help — их флаги. Чтобы набирать casty, сделайте ссылку один раз: ln -s "$PWD/bin/casty" ~/.local/bin/casty.

Чтобы Запустите
прочитать ленту casty feed, casty feed --since 24h --no-replies --limit 20
прочитать, что вам написали другие casty mentions
открыть каст с тем, на что он отвечает, и ответами на него casty thread 2
опубликовать casty cast "hello from my own node", --channel /name, --embed <url>
ответить, лайкнуть, рекастнуть casty reply 1 "agreed", casty like 1, casty recast 1
отменить casty unlike 1, casty unrecast 1, casty delete 1
подписаться casty follow @name, casty unfollow @name
увидеть приложения за ключами fid casty clients --fid <fid>
проверить хранилище casty storage
проверить ноду, часы и настройку casty doctor, casty node status

Номер перед кастом в последнем списке принимают like, reply, recast, delete и thread; как и <fid>:<hash> и ссылку каста на farcaster.xyz. via называет приложение, через которое опубликован каст; --only-app и --exclude-app фильтруют по нему. Каждая запись ждёт, пока у ноды не появится сообщение, и сообщает, если его нет.

./bin/casty web отдаёт те же команды как страницу на http://127.0.0.1:3390 и печатает ссылку, которая связывает браузер (В браузере и на телефоне).

  • На телефоне дома: ./bin/casty web --listen 0.0.0.0:3390 печатает ссылку для каждого сетевого адреса и QR-код; отсканируйте его в той же сети. Соединение идёт по обычному HTTP, поэтому используйте сеть, которой доверяете. Добавьте страницу на домашний экран, чтобы открывать её на весь экран.
  • Только чтение: --read-only не спрашивает пароль, и страница не может писать.
  • Новый токен: --new-token делает недействительной каждую ссылку, напечатанную раньше.

Ctrl-C останавливает casty web; машина должна оставаться включённой, пока ей пользуется телефон.

Чтобы открыть страницу из мобильной сети, запустите её на хосте ноды за HTTPS (Из любой сети). Сначала ей нужен ключ приложения здесь (шаг 3): хранилище ключей и его пароль попадают на хост как Docker-секрет, если не указан --read-only.

С доменом:

  1. Направьте DNS-запись A для имени, которым вы владеете, скажем node.example.org, на IP ноды (NODE_IP в node.env).

  2. Запустите:

    Окно терминала
    ./scripts/deploy.sh --fid <fid> --domain node.example.org

    На ноде, которую арендовал casty, это открывает 80 и 443 на её файрволе; на собственном хосте откройте их сами. Затем команда собирает casty на хосте, запускает его за Caddy, который получает сертификат, спрашивает пароль хранилища ключей и печатает https://node.example.org/#token=.... QR-код этой ссылки находится в ./scripts/1-node.sh logs casty.

С Tailscale вместо этого установите его на хост и войдите в него, подключите телефон к тому же tailnet и запустите ./scripts/deploy.sh --fid <fid> --tailscale; ни один порт не открывается в интернет.

На хосте лента берётся из индекса, который следует за событиями ноды. В разделе о вас «notifications» включает push-уведомление на каждое упоминание или ответ с именем отправителя и ничем больше; на iPhone сначала добавьте страницу на домашний экран (iOS 16.4 и новее).

После изменения casty снова запустите ./scripts/1-node.sh serve --domain <name>: команда пересобирает и перезапускает страницу.

Чтобы Запустите
увидеть синхронизацию ./scripts/1-node.sh status (код выхода 1, пока нода отстаёт)
следить за её логами или логами страницы ./scripts/1-node.sh logs, ./scripts/1-node.sh logs casty
снова открыть туннель после перезапуска вашей машины ./scripts/1-node.sh tunnel (--stop закрывает его)
перейти на новейший релиз Snapchain ./scripts/1-node.sh upgrade
остаться на одном релизе ./scripts/1-node.sh upgrade --release 0.14.3
обновляться каждую неделю автоматически ./scripts/1-node.sh --autoupgrade --fid <fid>: выполняет docker system prune --volumes -f на всём хосте
хранить меньше блоков ./scripts/1-node.sh --block-retention 30 (дни)
посмотреть Grafana на хосте docker compose up -d grafana в ~/snapchain; здесь ssh -L 3000:127.0.0.1:3000 <user>@<ip> и http://127.0.0.1:3000
остановить ноду и страницу ./scripts/1-node.sh down; база данных остаётся на томе

Из другой сети файрвол по-прежнему пропускает только тот адрес, который был у вас: запустите ./scripts/0-provision.sh снова, и он перенесёт правила на ваш текущий адрес, на той же ноде.

Чтобы Запустите
перечислить ключи вашего fid casty key list
удалить ключ этого casty самим этим ключом casty key revoke --self
удалить любой ключ casty key revoke <key>, с seed-фразой
отвязать все браузеры casty web --new-token; на хосте удалите ~/snapchain/casty/config/web-token и выполните docker compose restart casty

Ключ, который истёк или был удалён в другом месте, пропускается; добавьте другой, как на шаге 3. Безопасность перечисляет каждый задействованный секрет, где он лежит и что делать при утечке.

Окно терминала
./bin/casty key revoke --self # first, while the node runs: the key stops working everywhere
./scripts/1-node.sh down # stops the node and the page; nothing is deleted
./scripts/0-provision.sh --destroy # deletes the server, its volume and its firewall, after you type the name
rm -rf ~/.config/casty # the config and the encrypted key store here

--destroy читает node.env, чтобы знать, что удалять, и после этого удаляет его; новая нода синхронизируется с самого начала. На собственном хосте уничтожать нечего: удалите там ~/snapchain.

pnpm install, затем pnpm demo запускает клиент против mock-ноды с тестовой фразой и удаляет то, что создал; pnpm demo:web так же отдаёт страницу до Ctrl-C.

Каждый скрипт печатает, что не удалось и что делать, и завершается с кодом, который говорит, какого рода была проблема:

Код 0-provision.sh 1-node.sh 2-client.sh
1 не синхронизирована, или нода не ответила
2 неверные аргументы неверные аргументы неверные аргументы
3 нет инструмента или учётных данных нет инструмента нет инструмента, или Node слишком старый
4 провайдер отказал нет SSH-соединения, или загрузка не удалась нода недоступна (откройте туннель), или нет годной загрузки
5 хост не дотягивает хост не дотягивает проблема с ключом: пароль, seed-фраза, хранилище

В Устранении неполадок есть каждое сообщение с его исправлением. deploy.sh останавливается с кодом шага, который остановился, и та же команда продолжает оттуда.