субота, 10 січня 2026 р.

 Перевод на русский с интеграцией хэштегов прямо в текст.


Настройка 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

  1. Точный список пакетов для Debian я не знаю — система не новая и многое уже установлено. Согласно README, мне понадобились только libssl-dev и libcurl4-openssl-dev (в Fedora — примерно то же самое, но с суффиксом -devel).

  2. Создаём отдельного системного пользователя для изоляции от потенциальных уязвимостей:

    useradd -m snac
    
  3. Для удобства меняем shell на bash в /etc/passwd.

  4. Логинимся su snac и переходим в домашний каталог: cd.

  5. Качаем исходники:
    git clone https://codeberg.org/grunfink/snac2.git

  6. Переходим в каталог проекта: cd snac2.

  7. Компилируем и устанавливаем:
    make && sudo make install.

  8. Инициализируем хранилище сервера:
    snac init /home/snac/storage.

  9. Добавляем первого пользователя:
    snac adduser /home/snac/storage.

  10. Выходим обратно под root: exit.

Конфигурация

#Networking #Yggdrasil

У меня уже установлен и настроен узел Yggdrasil. Если интересно — см. предыдущую публикацию или официальную документацию.

Адрес подсети Yggdrasil

#IPv6

Этот шаг можно пропустить и использовать основной адрес 2*, если порты 80 или 8001 свободны. Но важно понимать: в API ActivityPub сервер Snac сообщает свой адрес другим узлам, и те кэшируют его как часть ID. Поскольку адрес хранится в файлах, а не в БД, заменить его потом будет сложно. Поэтому лучше сразу выделить отдельный адрес, особенно для продакшена.

  1. yggdrasilctl getself — узнаём свой IP и диапазон IPv6.

  2. 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 = false

  • browser.fixup.alternate.enabled = false


#Fediverse #YggdrasilNetwork #Decentralization #AltNet #SelfHosted

Немає коментарів:

Дописати коментар

Pure Acetone: "Pin Tweet to IPFS https://chro…" - Mastodon
https://mastodon.social/deck/@pureacetone/111421706607809813

  Noosphere, Connectivity, and Decentralized Networks: Why Open Development Became Critical Infrastructure for Thought #Noosphere #Decentral...