惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
有赞技术团队
有赞技术团队
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
U
Unit 42
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Recent Announcements
Recent Announcements
Y
Y Combinator Blog
Vercel News
Vercel News
Martin Fowler
Martin Fowler
V
V2EX
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
LangChain Blog
云风的 BLOG
云风的 BLOG
H
Hackread – Cybersecurity News, Data Breaches, AI and More
aimingoo的专栏
aimingoo的专栏
G
Google Developers Blog
The GitHub Blog
The GitHub Blog
N
Netflix TechBlog - Medium
Google DeepMind News
Google DeepMind News
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
F
Fortinet All Blogs

Dejavu's Blog

甲骨文 ARM 实例部署 Gemma 4 模型 Headscale + Tailscale 组建虚拟专用网 在 Linux 上使用 Yubikey OpenPGP 应用 BuyVM VPS 块存储挂载教程 Alpine Linux 服务器配置指南 Alpine Linux 安装 Cloudflared Docker 多容器共享中心数据库 安装 Komari 服务器监控工具 Scaleway VPS 安装 Debian Linux Debian 13 下部署 AsmBB 论坛 使用 Kopia 自动化备份服务器数据 给 Docker 启用 IPv6 支持 Netcup 服务器安装自定义 ISO 镜像 烽火 HG5582A 光猫开启桥接模式 Docker 自托管 Shlink 短链服务 部署 Obsidian LiveSync 实时同步服务指南 我的 2025 年不完全回顾 Linux 下 Intel 核显驱动配置与硬件加速 Fedora Linux 安装配置记录 2025 年优雅地自托管 RSS 服务 Woodpecker CI 和 Gitea 实现 Hugo 自动部署 Gitea/Forgejo 集成 Woodpecker CI/CD 在 Blinko 中使用 Ollama 作为 AI 供应商 Docker 部署 Gitea/Forgejo Plausible CE 启用城市级地理位置识别 Blinko 开源 AI 知识库 Docker 部署指南 Netcup 免税账号注册及购买服务器全记录 Docker 自托管 Cloudreve Pro 私有网盘服务 GiffGaff SIM 卡使用体验和注意事项 简体中文互联网在变得糟糕吗?
使用 snac 部署一个简洁优雅的 ActivityPub 实例
Dejavu Moe · 2025-09-19 · via Dejavu's Blog

前言

几年前,我曾 使用 Docker 快速部署单人 Fediverse 实例 ,使用基于 Python 的 microblog.pub 项目,它部署便捷,但性能不佳且现在已不再活跃维护。

最近,我发现一个更加极简且易于自托管的 ActivityPub 实例项目—— snac (又称 snac2,下文统称 snac)。网上关于如何自托管部署 snac 实例的文章似乎很少,尽管项目手册似乎看起来很复杂,但实际上非常易于部署。

snac 使用 terminal 主题

snac 是什么?

snac 是一个使用 C 语言编写的 ActivityPub 实例,以其可移植、轻量和易用的特性脱颖而出。在我目前探索过的自托管 Fediverse 服务中,snac 是单人1 Fediverse 实例的最佳选择。它不仅仅是一个功能受限的“小玩具”,而是经过实践检验的可靠服务。bsd.cafe2 社区已经稳定运行 snac 实例很长一段时间,充分证明了它的稳定性和可靠性。如果你正在为个人或小型社区寻找可自托管的 Fediverse 服务,我强烈建议你尝试一下 snac。

snac 特性

  • 轻量且依赖极少:运行高效,对系统资源的占用极低
  • 支持单用户或多用户:既可作为个人实例,也可服务于小型社区
  • 无需外部数据库或 S3 存储:所有数据均以本地文件形式存储,简化了部署和维护
  • 广泛的 ActivityPub 支持及 Mastodon API 兼容性:无缝融入 Fediverse 生态,并兼容主流的 Mastodon 客户端
  • 简洁的 Web 界面:不依赖任何 JavaScript 或 Cookie,提供干净、快速的用户体验

本文将详细记录我在 Debian 13 (trixie) 下自托管部署 snac 的完整过程。希望能为有兴趣的读者提供一些参考。

由于 snac 维护活跃,我强烈建议从源码编译安装,以确保获得最新的功能和安全更新。

安装依赖

snac 除了依赖 opensslcurl,主要利用系统库的硬链接,因此在 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

创建 snac 数据目录

你需要指定一个用于存储服务器和用户数据(如文章、媒体文件)的目录。请注意,这个目录在创建 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

i18n 多语言

WebUI 默认是英文,可以自定义 i18n 语言,以简体中文为例

wget -P lang/ https://codeberg.org/grunfink/snac2/raw/branch/master/po/zh.po

CSS 美化

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

Nginx 代理

得益于 Cloudflare CDN,我可以简化 SSL 的设置流程,只需要在服务器上安装 Cloudflare 的源服务器证书4,而边缘网络的 SSL 证书则完全由 Cloudflare 管理。

整个流程如下:

用户访问(HTTPS/443) -> SSL(WE1) -> Cloudflare(CDN) -> SSL(源服务器) -> Nginx -> VPS(snac)

生成 dhparam 参数 (Diffie-Hellman)

# 进入 Nginx 证书目录
cd /etc/nginx/cert/
# 生成 4096 位的 dhparam.pem 文件
sudo openssl dhparam -out dhparam.pem 4096
# 提示:这个过程可能会非常耗时。为了加快速度(不影响安全性),你可以添加 -dsaparam 参数:
sudo openssl dhparam -dsaparam -out dhparam.pem 4096

Nginx 缓存配置

为了减轻 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;

添加 snac 虚拟主机配置

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;
    }
}

检查 Nginx 配置

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

参考资料: