Перевод на русский с интеграцией хэштегов прямо в текст.
Настройка Fedi-сервера Snac для сети Yggdrasil | DevZone
#Fediverse #Yggdrasil #SelfHosting #P2P #Linux
Время чтения: 15 минут
11 мая
Вскоре после моих размышлений о p2p я решил попробовать развернуть собственный экспериментальный инстанс #Fediverse. Причём сделать это средствами оверлейной сети #Yggdrasil, так как я не планирую покупать выделенный IP или VPS для этой игрушки; вместо этого сервер будет хоститься за модемом — на одноплатнике или даже на ПК, когда я в сети, с динамическим адресом за NAT.
Эта заметка в первую очередь написана для себя, но может быть полезна тем, кто, как и я, только начинает эксперименты с администрированием собственного узла Fediverse и интересуется альтернативными сетями в контексте #Linux.
Что такое Snac
#Snac #ActivityPub #Minimalism
Snac — это минималистичная альтернатива серверу #Mastodon, написанная на C, без JavaScript и без необходимости установки PostgreSQL. Все данные профилей хранятся в JSON-файлах. Недавно в сервер была добавлена поддержка IPv6, поэтому он корректно работает и с диапазоном Yggdrasil 0200::/7.
Поскольку Yggdrasil позволяет бесплатно генерировать неограниченное количество статических IP (на основе приватного ключа #Ed25519), в DNS здесь обычно нет необходимости. Опционально можно прикрутить #Alfis, но лично я этого не делаю (в том числе из-за до сих пор нерешённой проблемы #364), поэтому и не навязываю его в рамках протокола ActivityPub — формат будет просто username@IPv6, без необходимости что-то обновлять или «майнить» позже.
Установка
#BuildFromSource #LinuxAdmin
Точный список пакетов для Debian я не знаю — система не новая и многое уже установлено. Согласно README, мне понадобились только
libssl-devиlibcurl4-openssl-dev(в Fedora — примерно то же самое, но с суффиксом-devel).Создаём отдельного системного пользователя для изоляции от потенциальных уязвимостей:
useradd -m snacДля удобства меняем shell на bash в
/etc/passwd.Логинимся
su snacи переходим в домашний каталог:cd.Качаем исходники:
git clone https://codeberg.org/grunfink/snac2.gitПереходим в каталог проекта:
cd snac2.Компилируем и устанавливаем:
make && sudo make install.Инициализируем хранилище сервера:
snac init /home/snac/storage.Добавляем первого пользователя:
snac adduser /home/snac/storage.Выходим обратно под root:
exit.
Конфигурация
#Networking #Yggdrasil
У меня уже установлен и настроен узел Yggdrasil. Если интересно — см. предыдущую публикацию или официальную документацию.
Адрес подсети Yggdrasil
#IPv6
Этот шаг можно пропустить и использовать основной адрес 2*, если порты 80 или 8001 свободны. Но важно понимать: в API ActivityPub сервер Snac сообщает свой адрес другим узлам, и те кэшируют его как часть ID. Поскольку адрес хранится в файлах, а не в БД, заменить его потом будет сложно. Поэтому лучше сразу выделить отдельный адрес, особенно для продакшена.
yggdrasilctl getself— узнаём свой IP и диапазон IPv6.ifconfig lo inet6 add IP— вместо IP указываем произвольный адрес из полученного диапазона, например3xx:xxxx:xxxx:xxxx::fed/64.
⚠️ Данные, добавленные через ifconfig, не сохраняются после перезагрузки. Команду нужно прописать, например, в /etc/netplan/01-ygglo.yaml, /etc/network/interfaces или в systemd-сервис yggdrasil.service (через ExecStartPost=).
Nginx-прокси
#Nginx #ReverseProxy
На сервере уже установлен Nginx, занимающий порт 80. Менять это я не хочу, как и светить Snac на стандартном порту 8001. Поэтому, имея выделенный IPv6-адрес, просто проксирую API на 80, используя пример из оригинальной конфигурации:
server {
listen [3xx:xxxx:xxxx:xxxx::fed]:80;
server_name 3xx:xxxx:xxxx:xxxx::fed;
location @proxy {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_pass http://[3xx:xxxx:xxxx:xxxx::fed]:8001;
}
location /.well-known/webfinger { try_files $uri @proxy; }
location /.well-known/nodeinfo { try_files $uri @proxy; }
location / { try_files $uri @proxy; }
location /fedi/ { try_files $uri @proxy; }
}
SSL здесь намеренно отсутствует: #Yggdrasil уже обеспечивает защищённый канал, и дополнительный слой не нужен.
Административный API (admin и oauth) я ограничил по IP, поскольку у клиентов Yggdrasil адреса тоже статические:
location ~ /([^\/]+/admin|oauth) {
allow ADMIN_IP;
deny all;
try_files $uri @proxy;
}
Конфигурация Snac
#JSON #Config
Редактируем /home/snac/storage/server.json, созданный командой snac init:
{
"host": "[3xx:xxxx:xxxx:xxxx::fed]",
"address": "3xx:xxxx:xxxx:xxxx::fed",
"port": 8001,
"protocol": "http"
}
В моём случае протокол намеренно http.
Доступ через iptables / ufw
#Firewall
Открываю порт только для диапазона Yggdrasil:
ufw allow from 0200::/7 to any port 80
Если не используете Nginx — указывайте реальный порт, например 8001.
systemd
#Systemd
На основе официального примера:
[Unit]
After=network-online.target
Wants=network-online.target
[Service]
User=snac
ExecStart=/usr/local/bin/snac httpd /home/snac/storage
[Install]
WantedBy=multi-user.target
Бэкапы
#Backup #Rsync
Так как база — это файлы, резервное копирование тривиально. Использую rsync через crontab -e:
@daily rsync -av --delete /home/snac/storage /path/to/snac/daily
@weekly rsync -av --delete /home/snac/storage /path/to/snac/weekly
@monthly rsync -av --delete /home/snac/storage /path/to/snac/monthly
Использование
#FediverseAdmin
После запуска (snac httpd /home/snac/storage или через systemd) можно открытьhttp://[3xx:xxxx:xxxx:xxxx::fed] в браузере.
Тест взаимодействия
#ActivityPub
Для проверки федерации разверните второй узел в Yggdrasil и попробуйте подписку или переписку через Web UI или клиент.
Настройка браузера
#Firefox #IPv6
При первом использовании Yggdrasil-сайтов в Firefox может понадобиться изменить параметры в about:config:
browser.fixup.fallback-to-https = falsebrowser.fixup.alternate.enabled = false
#Fediverse #YggdrasilNetwork #Decentralization #AltNet #SelfHosted
Немає коментарів:
Дописати коментар
Pure Acetone: "Pin Tweet to IPFS https://chro…" - Mastodon
https://mastodon.social/deck/@pureacetone/111421706607809813