Весь путь
Эта страница проходит весь путь один раз, в том порядке, в каком вы его проходите, и ссылается на страницу с подробностями каждого шага. Команды запускаются из клона репозитория casty, если не сказано «на хосте».
0. Прежде чем начать
Заголовок раздела «0. Прежде чем начать»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 castyls ~/.ssh/id_ed25519.pub || ssh-keygen -t ed25519 # a key to log in to the node with1. Дайте casty облако или хост
Заголовок раздела «1. Дайте casty облако или хост»Задайте учётные данные одного провайдера; скрипты читают их из вашего окружения и никогда никуда их не записывают (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: и ничего не создаёт.
2. Запуск
Заголовок раздела «2. Запуск»Одной командой
Заголовок раздела «Одной командой»./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. Установка клиента.
3. Добавьте ключ приложения
Заголовок раздела «3. Добавьте ключ приложения»casty пишет с ключом приложения: это ключ Ed25519, который одобряет custody-адрес вашего fid, добавленный
бесплатным сообщением KEY_ADD через вашу ноду, без транзакции и без газа
(Custody-адрес и ключи приложений).
Вашим кошельком
Заголовок раздела «Вашим кошельком»./bin/casty webcasty webдважды спрашивает пароль для хранилища ключей, которое собирается создать, и печатает ссылку с токеном. Откройте её в браузере, где есть ваш кошелёк (расширение вроде MetaMask).- В разделе о вас выберите «add a key with your wallet».
- Кошелёк запрашивает аккаунт; выберите тот, на который зарегистрирован fid. Если он находится в другой сети, кошелёк попросят переключиться на Ethereum mainnet, что ничего не стоит.
- Подпишите два запроса, которые покажет кошелёк: запрос ключа, затем добавление ключа.
- Страница проверяет обе подписи, отправляет
KEY_ADDчерез вашу ноду, ждёт, пока нода не покажет ключ, и сохраняет его зашифрованным в~/.config/casty/keys.enc.json.
На телефоне, где кошелёк — приложение, запустите ./bin/casty web --listen 0.0.0.0:3390 (или используйте страницу
на хосте, шаг 6), откройте страницу на телефоне и в разделе о вас воспользуйтесь ссылкой, которая открывает её в
браузере вашего кошелька; кнопка рядом с ней копирует ссылку для связывания, чтобы вставить её там.
Seed-фразой, как запасной вариант
Заголовок раздела «Seed-фразой, как запасной вариант»./bin/casty initКоманда спрашивает пароль, затем фразу в скрытом поле ввода; фраза используется один раз, чтобы
подписать запрос ключа, и никогда не записывается на диск. --address-index выбирает другой адрес
этой фразы.
В обоих случаях ключ может подписывать касты, реакции и подписки (--scopes добавляет изменения профиля),
и он истекает после 30 дней без использования (--ttl, не больше 90d); каждое подписанное им сообщение
продлевает его. ./bin/casty whoami показывает ключ, custody-адрес и ваше хранилище.
4. Работа в терминале
Заголовок раздела «4. Работа в терминале»./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 фильтруют по нему. Каждая запись ждёт, пока у
ноды не появится сообщение, и сообщает, если его нет.
5. Работа в браузере
Заголовок раздела «5. Работа в браузере»./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; машина должна оставаться включённой, пока ей пользуется телефон.
6. Страница из любой сети
Заголовок раздела «6. Страница из любой сети»Чтобы открыть страницу из мобильной сети, запустите её на хосте ноды за HTTPS
(Из любой сети). Сначала ей нужен ключ приложения здесь (шаг 3): хранилище ключей и его
пароль попадают на хост как Docker-секрет, если не указан --read-only.
С доменом:
-
Направьте DNS-запись
Aдля имени, которым вы владеете, скажемnode.example.org, на IP ноды (NODE_IPвnode.env). -
Запустите:
Окно терминала ./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>: команда пересобирает и
перезапускает страницу.
7. Работа с нодой
Заголовок раздела «7. Работа с нодой»| Чтобы | Запустите |
|---|---|
| увидеть синхронизацию | ./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 снова, и он перенесёт правила на ваш текущий адрес, на той же
ноде.
8. Ключи и безопасность
Заголовок раздела «8. Ключи и безопасность»| Чтобы | Запустите |
|---|---|
| перечислить ключи вашего 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. Безопасность перечисляет каждый задействованный секрет, где он лежит и что делать при утечке.
9. Удалить всё
Заголовок раздела «9. Удалить всё»./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 namerm -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 останавливается с
кодом шага, который остановился, и та же команда продолжает оттуда.