Две разные роли, и путать их дорого.
| что делает | что о нём знает сеть | |
|---|---|---|
| Реле | принимает запечатанные пакеты и отдаёт тому, кто пришёл за своими | адрес и отпечаток ключа |
| Зеркало | держит публичное пространство доступным, когда владелец офлайн | обычный участник-читатель |
Реле не образуют сеть между собой. Сеть образуют клиенты поверх реле. Реле друг о друге не знают, ничего друг другу не пересылают и не синхронизируются. Это не недоделка, это конструкция: чем меньше реле умеет, тем меньше о нём нужно знать.
Реле
Что оно может и чего не может
Реле — почта до востребования. Оно видит зашифрованные пакеты и адреса ящиков, которые меняются каждые несколько часов. Оно не участник: не читает содержимое приватных пространств, не подписывает событий, не решает, кто чей друг, и не хранит ничего дольше срока (по умолчанию 48 часов, максимум 7 суток).
Из этого следует главное для того, кто его поднимает: потеря реле не теряет переписку. Долговечная правда живёт у участников; реле — только место встречи.
Поставить
Собрать под сервер:
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o terminal-relay ./cmd/terminal-relay
Положить бинарь, завести служебного пользователя и unit:
useradd --system --no-create-home --shell /usr/sbin/nologin quietrelay
install -o root -g root -m 755 terminal-relay /opt/quiet-relay/terminal-relay
[Unit]
Description=Quiet Spaces relay
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=quietrelay
Group=quietrelay
ExecStart=/opt/quiet-relay/terminal-relay --listen :7411 --data /var/lib/quiet-relay
Restart=always
RestartSec=2
StateDirectory=quiet-relay
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/quiet-relay
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictAddressFamilies=AF_INET AF_INET6
MemoryMax=768M
[Install]
WantedBy=multi-user.target
--data — это не кэш
Каталог под --data хранит постоянный ключ личности реле. Его отпечаток
(SPKI pin) закрепляется у каждого клиента при первом соединении. Потеряете
каталог — реле сменит личность, и все клиенты откажутся к нему
подключаться. Так и задумано: смена ключа должна быть отказом, а не тихим
«подключились к чему-то другому».
Держите его в бэкапе. Права 600, владелец — служебный пользователь.
Отпечаток
При старте реле печатает его:
identity SPKI pin: gk0X84yjjmahVYaUO7snq/a/BecbtX4deDFp7hGkC/c=
Проверьте с другой машины по проводу, а не только по логу: лог говорит, во что верит процесс, рукопожатие — что реально предложат клиенту.
terminal relay show-identity ВАШ.АДРЕС:7411
Дальше отпечаток сравнивают глазами один раз. Клиент запоминает и при смене ключа откажет с внятным сообщением.
Лимиты
Значения по умолчанию — рельсы против злоупотребления, а не обещание
пропускной способности: 64 предмета на ящик, 1 МиБ на предмет, TTL ≤ 7
суток, 4096 соединений. Меняются флагами (--max-conns, --per-hint-mib,
--total-gib, --collect-rate, --write-rate, --fetch-rate).
Порт по умолчанию 7411/tcp — откройте его.
Зеркало
Зачем
Публичное пространство живёт на реле окнами и обновляется сердцебиением владельца. Когда владелец офлайн дольше окна, пространство перестаёт существовать для всех, кто не читал его раньше.
Зеркало републикует подписанный владельцем конверт байт в байт и держит медиа, на которое он ссылается. Оно ничего не добавляет к правам: ключа пространства у него нет, изменить оно не может ничего, чужие ящики не трогает. Оно добавляет доступность — и только её.
Поставить
Зеркало — это обычный узел с ключами, поэтому ему нужна парольная фраза.
Никогда не передавайте её аргументом командной строки: systemctl status
печатает командную строку службы кому угодно, и /proc тоже. Только через
EnvironmentFile, читаемый одним root.
install -m 600 /dev/null /etc/quiet-mirror.env
# внутри одна строка: QP_PASSPHRASE=…
[Service]
User=quietrelay
Group=quietrelay
EnvironmentFile=/etc/quiet-mirror.env
ExecStart=/opt/quiet-relay/terminal-mirror node --data /var/lib/quiet-mirror --no-lan
Restart=always
StateDirectory=quiet-mirror
ReadWritePaths=/var/lib/quiet-mirror
Добавить пространство:
terminal mirror add --link ССЫЛКА --data /var/lib/quiet-mirror --passphrase … --seed
terminal mirror list --data /var/lib/quiet-mirror --passphrase …
Запускайте это от того же пользователя, что и службу. Запуск от root
пересоздаст файлы каталога под root, и служба перестанет стартовать с
«permission denied». Если такое случилось: chown -R quietrelay:quietrelay /var/lib/quiet-mirror.
--seed — это согласие, а не настройка скорости
Без него зеркало держит байты, но не отвечает на чужие запросы. С ним — отвечает, и тем самым сообщает, что этот файл у него есть, то есть что оно это читает. Для публичного каталога, который вы ведёте сами, это ровно то, что нужно; для чужого пространства — осознанное решение.
Каталог тянет за собой то, на что ссылается
Если зеркалируемое пространство — каталог (директория из карточек), оно
подхватит и те пространства, которые перечисляет: откроет, начнёт зеркалить,
и унаследует seed. Каталог, чьи записи недоступны, — не каталог, который
держат доступным.
Трогаются только пространства, которых узел ещё не знает. mirror remove
снимает флаги и оставляет пространство, поэтому снятое вручную остаётся
снятым — автоматика больше не переоценивает уже известное.
Зеркаля чужой каталог, вы соглашаетесь хранить и раздавать то, что его владелец в него добавит. Это передача решения, и её стоит принимать осознанно.
Сколько это места
Столько, сколько весит медиа зеркалируемых пространств, плюс мелочь на
события. Демонстрационный каталог из трёх пространств — около 100 МБ.
terminal mirror list показывает не намерение, а факт: media 12/14 значит
«обещал держать четырнадцать, держу двенадцать».
Что стоит знать заранее
У каждого пространства своё место встречи. Публичное пространство несёт адрес реле в подписанной политике; ссылка несёт его же. Читатель приходит именно туда, с какого угодно своего реле. Ваше личное реле и реле пространства — разные вещи, и это нормально.
Реле пространства фиксируется при рождении. Сменить личное реле можно в любой момент; адрес уже созданного публичного пространства — это ревизия политики, а не настройка.
Медиа не лежит на реле как файл. Через реле ходят события и манифесты; байты подтягиваются по требованию у того, кто их держит. Поэтому зеркало и имеет смысл: оно и есть тот, кто держит, когда владелец спит.
Тишина не диагноз. Правильно настроенное реле, к которому никто не
пришёл, выглядит ровно как настроенное неверно. Проверяйте отпечатком и
terminal relay show-identity, а не отсутствием жалоб.