






















几年前,我曾 使用 Docker 快速部署单人 Fediverse 实例 ,使用基于 Python 的 microblog.pub 项目,它部署便捷,但性能不佳且现在已不再活跃维护。
最近,我发现一个更加极简且易于自托管的 ActivityPub 实例项目—— snac (又称 snac2,下文统称 snac)。网上关于如何自托管部署 snac 实例的文章似乎很少,尽管项目手册似乎看起来很复杂,但实际上非常易于部署。

snac 是一个使用 C 语言编写的 ActivityPub 实例,以其可移植、轻量和易用的特性脱颖而出。在我目前探索过的自托管 Fediverse 服务中,snac 是单人1 Fediverse 实例的最佳选择。它不仅仅是一个功能受限的“小玩具”,而是经过实践检验的可靠服务。bsd.cafe2 社区已经稳定运行 snac 实例很长一段时间,充分证明了它的稳定性和可靠性。如果你正在为个人或小型社区寻找可自托管的 Fediverse 服务,我强烈建议你尝试一下 snac。
本文将详细记录我在 Debian 13 (trixie) 下自托管部署 snac 的完整过程。希望能为有兴趣的读者提供一些参考。
由于 snac 维护活跃,我强烈建议从源码编译安装,以确保获得最新的功能和安全更新。
snac 除了依赖 openssl 和 curl,主要利用系统库的硬链接,因此在 Debian/Ubuntu 系统上,你只需要安装以下几个包:
sudo apt install git libssl-dev libcurl4-openssl-dev
确保当前工作目录为非 root 用户,因为 snac 始终使用普通用户运行
拉取最新源码
git clone https://codeberg.org/grunfink/snac2.git && cd snac2
添加 -lrt 标志3 开始编译
编译过程只需要几秒钟,因为它实在是太小了
$ sudo make install
# 正常输出
mkdir -p -m 755 /usr/local/bin
install -m 755 snac /usr/local/bin/snac
mkdir -p -m 755 /usr/local/man/man1
install -m 644 doc/snac.1 /usr/local/man/man1/snac.1
mkdir -p -m 755 /usr/local/man/man5
install -m 644 doc/snac.5 /usr/local/man/man5/snac.5
mkdir -p -m 755 /usr/local/man/man8
install -m 644 doc/snac.8 /usr/local/man/man8/snac.8
你需要指定一个用于存储服务器和用户数据(如文章、媒体文件)的目录。请注意,这个目录在创建 snac 实例前必须不存在。下面以当前用户 home 目录下的 snac-data 为例:
# 初始化 snac 数据目录
$ snac init $HOME/snac-data
# 监听网络/Unix 套接字地址(默认 127.0.0.1)
Network address or full path to unix socket [127.0.0.1]:
# 监听端口号(默认 8001)
Network port [8001]:
# 主机名(输入自己的域名)
Host name: snac.your.domain
# URL 前缀(默认为空)
URL prefix:
# 管理员邮箱(可选)
Admin email address (optional): [email protected]
Done.
# 添加 WebUI 翻译文件(可选,默认 en)
Wanted web UI language files (.po) must be copied manually to /home/dejavu/snac-data/lang
初始化后的 snac-data 目录应该如下
~/snac-data$ ls -al
total 40
drwxrws--- 7 dejavu dejavu 4096 Sep 18 14:37 .
drwxr-xr-x 13 dejavu dejavu 4096 Sep 18 14:37 ..
-rw-rw---- 1 dejavu dejavu 923 Sep 18 14:37 greeting.html
drwxrws--- 2 dejavu dejavu 4096 Sep 18 14:37 inbox
drwxrws--- 2 dejavu dejavu 4096 Sep 18 14:37 lang
drwxrws--- 2 dejavu dejavu 4096 Sep 18 14:37 object
drwxrws--- 2 dejavu dejavu 4096 Sep 18 14:37 queue
-rw-rw---- 1 dejavu dejavu 619 Sep 18 14:37 server.json
-rw-rw---- 1 dejavu dejavu 2134 Sep 18 14:37 style.css
drwxrws--- 2 dejavu dejavu 4096 Sep 18 14:37 user
配置文件保存在 server.json 文件中。详细的配置说明,请参考 snac 官方文档:
Customization snac
。
WebUI 默认是英文,可以自定义 i18n 语言,以简体中文为例
wget -P lang/ https://codeberg.org/grunfink/snac2/raw/branch/master/po/zh.po
snac 允许你通过一个单独的 CSS 文件来定制整个网站或单个用户的 Web 界面主题。你可以查看由社区维护的 snac 主题汇总 来获取灵感。我个人比较喜欢 snac-terminal-theme 这种风格。
wget https://codeberg.org/ERROR404NULLNOTFOUND/snac-terminal-theme/raw/branch/main/style.css
sudo chmod 660 $HOME/snac-data/style.css
snac 的用户管理完全在服务端进行,这表示它 默认不开放注册。因此,你无需配置繁琐的 SMTP 服务来处理用户注册或找回密码等事宜。若需要重置用户密码,也只需通过命令行简单操作即可。下面添加我们的第一个用户:
snac adduser $HOME/snac-data mod # mod 是添加的用户名
Creating RSA key...
Done.
User password is <初始密码,首次登录及时修改>
Go to https://snac.dejavu.moe/mod and continue configuring your user there.
仅需添加一个 systemd 服务来守护 snac 的进程管理
sudo sh -c 'cat > /etc/systemd/system/snac.service << EOF
[Unit]
Description=snac
After=network.target
[Service]
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/snac httpd /home/dejavu/snac-data # <-注意修改路径
[Install]
WantedBy=multi-user.target
EOF'
启动 snac 服务
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 将 snac 服务设置为开机自启动
sudo systemctl enable snac.service
# 立即启动 snac 服务
sudo systemctl start snac.service
# 查看 snac 服务状态
sudo systemctl status snac
得益于 Cloudflare CDN,我可以简化 SSL 的设置流程,只需要在服务器上安装 Cloudflare 的源服务器证书4,而边缘网络的 SSL 证书则完全由 Cloudflare 管理。
整个流程如下:
用户访问(HTTPS/443) -> SSL(WE1) -> Cloudflare(CDN) -> SSL(源服务器) -> Nginx -> VPS(snac)
# 进入 Nginx 证书目录
cd /etc/nginx/cert/
# 生成 4096 位的 dhparam.pem 文件
sudo openssl dhparam -out dhparam.pem 4096
# 提示:这个过程可能会非常耗时。为了加快速度(不影响安全性),你可以添加 -dsaparam 参数:
sudo openssl dhparam -dsaparam -out dhparam.pem 4096
为了减轻 snac 直接处理静态资源的压力,我们可以对部分资源进行缓存。
cd /etc/nginx$ sudo vim nginx.conf
# 在 http 字段内添加一行
# Caching configuration for snac
proxy_cache_path /var/cache/nginx/snac_cache levels=1:2 keys_zone=snac:10m max_size=1g inactive=1440m use_temp_path=off;
cd /etc/nginx/conf.d && sudo vim snac.dejavu.moe.conf
示例如下
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
ssl_certificate /etc/nginx/cert/snac.your.domain.pem;
ssl_certificate_key /etc/nginx/cert/snac.your.domain.key;
ssl_dhparam /etc/nginx/cert/dhparam.pem;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ecdh_curve secp521r1:secp384r1;
ssl_ciphers EECDH+AESGCM:EECDH+AES256;
ssl_session_cache shared:TLS:2m;
ssl_buffer_size 4k;
# 使用 Cloudflare CDN 和源服务器证书可注释下面三行
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001];
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload' always;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Proxy "";
proxy_pass_header Server;
proxy_buffering on;
tcp_nodelay on;
if ($scheme = http) {
return 301 https://$host$request_uri;
}
# 1. 缓存路径 (优先级最高,因为是正则且有特殊逻辑)
location ~ ^/.+/s/ {
proxy_pass http://127.0.0.1:8001;
proxy_cache snac;
proxy_cache_valid 200 1d;
proxy_cache_valid 404 1h;
proxy_ignore_headers "Cache-Control" "Expires";
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_lock on;
add_header X-Proxy-Cache $upstream_cache_status;
}
location ~* ^/(.well-known/|api/|oauth|share|authorize_interaction) {
proxy_pass http://127.0.0.1:8001;
}
location / {
proxy_pass http://127.0.0.1:8001;
}
}
sudo nginx -t
# Ok 的话重新加载虚拟主机配置
sudo nginx -s reload
别忘了,将你的域名解析到 VPS 的 IP 地址。现在,你应该能够通过域名访问你的 snac 实例了。登录,享受你的新服务吧!
由于 snac 的代码更新非常活跃,保持最新版本非常重要。更新流程也非常简单:
# 进入你之前拉取的源码目录
cd /home/dejavu/snac2
# 拉取最新的源码
git pull
# 重新编译
make LDFLAGS=-lrt
# 重新安装
sudo make install
# 重启 snac 服务
sudo systemctl restart snac
备份数据
tar -czf backup.tar.gz -H /home/<username>/snac-data
参考资料:
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。