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

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
T
Tor Project blog
U
Unit 42
G
Google Developers Blog
T
The Blog of Author Tim Ferriss
Recorded Future
Recorded Future
B
Blog
I
InfoQ
H
Help Net Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
aimingoo的专栏
aimingoo的专栏
H
Hackread – Cybersecurity News, Data Breaches, AI and More
小众软件
小众软件
Spread Privacy
Spread Privacy
T
Tenable Blog
C
Cybersecurity and Infrastructure Security Agency CISA
F
Fortinet All Blogs
Microsoft Security Blog
Microsoft Security Blog
I
Intezer
P
Proofpoint News Feed
A
About on SuperTechFans
S
Securelist
D
DataBreaches.Net
Security Latest
Security Latest
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threat Research - Cisco Blogs
Know Your Adversary
Know Your Adversary
大猫的无限游戏
大猫的无限游戏
Cyberwarzone
Cyberwarzone
AWS News Blog
AWS News Blog
Engineering at Meta
Engineering at Meta
MyScale Blog
MyScale Blog
V
Visual Studio Blog
A
Arctic Wolf
Hugging Face - Blog
Hugging Face - Blog
Project Zero
Project Zero
博客园 - 司徒正美
美团技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
B
Blog RSS Feed
Vercel News
Vercel News
T
Threatpost
博客园 - Franky
有赞技术团队
有赞技术团队
爱范儿
爱范儿
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
D
Darknet – Hacking Tools, Hacker News & Cyber Security
L
LINUX DO - 热门话题

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 卡使用体验和注意事项 简体中文互联网在变得糟糕吗? 如何低成本申请 S/MIME 证书用于个人邮件服务 迁移到 NameCrane Mail 域名邮箱套件服务 香烟与咖啡 在 Windows 中使用 Yubikey 的 OpenPGP 应用 Windows 11 IoT LTSC 养老指南 巧用浏览器生成 HAR 文件批量下载所需网页资源 聊聊静态网站的评论系统 在 Hugo 站点中优雅地展示实况照片 当 25 岁来临的时候 断网的这两年 从 Bitwarden/Vaultwarden 到 KeePassXC 也许是 Android 上最好的本地播放器 - 椒盐音乐 2023 半年小结 写一个好玩的 Hugo 货币汇率转换短代码 写一个 Hugo 短代码将不同类别的总字数统计转换为书名显示 海信 Touch Lite 墨水屏音乐阅读器的简单体验 从 Debian 11(bullseye) 无感升级到 Debian 12(bookworm) 使用 GitHub Actions 自动提交 URL 到 IndexNow 批量重写 Git 历史提交记录 使用 cgit 托管小小的也很可爱的 Git 服务器 在 Debian 上使用 stagit 和 Nginx 的简单 Git 服务器 托管简单 Git 服务器的一些尝试 使用 stagit 自托管纯静态 Git 存储库 使用 Docker 快速部署单人 Fediverse 实例 我是如何建立自己的个人博客的? 简单、隐私友好的谷歌分析替代品,Plausible 自托管部署指南 服务器使用 Cloudflare CDN 的最佳实践 甲骨文服务器分配并启用 IPv6 地址 Git 版本控制学习笔记(二) Cloudflare WAF 防护策略简易指南 Mastodon 服务器批量导入自定义表情 低成本自托管 Mastodon 实例简明指南 自托管服务指南──有了服务器可以做什么? 使用 Miniflux + RSSHub 打造个人 RSS 阅读器 构建支持多种 CPU 架构的 Docker 镜像 一个可自托管的静态短链接应用 别了,二〇二二! Duplicacy CLI 进阶使用指南 Duplicacy CLI 备份工具的基本使用 初探 Cloudflare 零信任 - 通过 Docker 部署 Bitwarden 密码管理器 Yubikey 转运日志及上手指南 初探 Cloudflare 零信任 — 通过 Cloudflare Tunnel 搭建 SSH 聊天室 初探 Cloudflare 零信任 - 通过 Cloudflare Tunnel 访问服务 某科学的 PGP 算号指南 2022 年的 MacBook Air M1 使用体验及应用推荐 使用 Vercel 和 Supabase 自托管 Cusdis 评论系统 为什么你的搜索引擎不好用? 个人在 Windows 上常用软件清单 macOS 基础开发环境设置指南 在 macOS 上使用 Canokey 的 OpenPGP 应用 提取 Windows UWP 应用商店的安装包以供离线安装 Git 版本控制学习笔记(一) 使用 Notion 管理 GitHub Star 项目 使用 Vercel 免费部署 Giscus 评论系统 将博客评论从 Utterances 无缝迁移到 Giscus Canokey 签名和认证应用指南 Canokey 的基本使用指南 Canokey Pigeon 揽件日志及简单开箱 关于 Google Play 保护机制和 DRM 安全等级的那些事 记录一次捡垃圾装机 GitHub 使用 GPG 密钥提交签名认证 使用 Scoop 管理 Windows 下的软件和开发环境 Windows Terminal+PowerShell 7 打造 Windows 下最好用的终端 一个好用的 Telegram 文件批量上传/下载工具 Clash for Windows 优雅地使用 TUN 模式接管系统流量 全平台搭建 Hexo 静态博客指南 尝试将 Manjaro 作为主力操作系统使用 Hexo 进行 SEO 优化的基本指南 使用本地代理给 Git 和 NPM 加速 使用 flowerss 部署 Telegram RSS 订阅机器人
使用 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

参考资料: