【VPS 自建应用大赏 03】自建 Mastodon 联邦社交实例:VPS 配置、存储与邮件收发

Mastodon 是去中心化社交平台。本文讲清自建实例的 VPS 配置(侧车进程、Redis、Postgres)、媒体存储增长、邮件送达率与规模化成本。

延伸阅读

更多相关攻略推荐:从 Git Push 到秒级上线:CI/CD 流水线与"无中断"发布【VPS 进阶玩法精选 030】用 VPS 搭建云端 IDE(cod连云厂商也看不到你的数据?机密计算(Confidential Com被割裂的"云上互联网":数据主权(GDPR)、本地化存储与主权云(S什么时候非得要独立 IPv4?便宜国外 VPS 独立 IP 适用场景

Mastodon 是什么,为什么有人要自建实例

Mastodon 是一个基于 ActivityPub 协议的开源、去中心化联邦社交平台,属于所谓的"fediverse"(联邦宇宙)。和微博、Twitter 那种一个中心服务器说了算的模式不同,你可以自己跑一个实例(instance),同时和全网其他 Mastodon、Pixelfed、PeerTube、Pleroma 等实例互通。

为什么要自建?核心就三个词:数据主权、审核策略、社区规则。你完全掌控自己服务器上的内容和规则,不被中心化平台的政策摆布。尤其是小社区——一家人、一群朋友、某个兴趣小组、或者私密邀请制的小圈子——特别适合自己搭一个。

联邦机制也值得说清楚:你实例上的用户关注了别的服务器账号,你的实例就会"订阅"对方的更新;而你本地发的每条帖子,会被 fan-out 投递到每一个远程关注者的 home 实例上去。这套机制决定了后面很多架构和成本的选择。

架构拆解:不只是"一个程序"

Mastodon 不是单机程序,它是 Ruby on Rails(Puma 应用服务)加 React 前端的全栈应用,由多个协同组件拼起来。理解这些组件,才能理解后面为什么吃内存。

Web 进程(Puma)负责处理 HTTP 请求、渲染网页界面和 API,默认端口 3000。Streaming API 是一个 Node.js 进程,通过 WebSocket 推送实时更新(时间线、通知),默认端口 4000。Sidekiq workers 是后台任务处理机——联邦投递、邮件发送、媒体转码、数据清洗,它是资源消耗大户之一。PostgreSQL 存全部应用数据:帖子、账号、关注关系、媒体元数据,用户量越大访问越密集。Redis 负责缓存、会话存储和 Sidekiq 的任务队列。

还有几个可选但常被提到的组件:Elasticsearch 提供全文搜索,单机可以省略来省内存;S3 兼容对象存储用来放用户上传和联邦缓存的远程媒体;SMTP 事务邮件服务发注册确认、通知和密码重置;反向代理(Nginx 或 Caddy)终结 SSL 并把 streaming 路径转发到对应容器。

内存占用参考(社区和 ARM 部署文档,标记为参考值):Rails 进程 150 到 300 MB 乘 2 到 3 个,Sidekiq 100 到 200 MB 乘 1 到 2 个,PostgreSQL 50 到 150 MB,Redis 20 到 50 MB,Elasticsearch 500 MB 以上(常被省略)。也就是说小实例空闲就吃 1 到 2 GB,真正跑起来 2 GB 其实偏紧。

VPS 配置起步:内存是命门

综合 2025 到 2026 年各方资料,官方和社区通用的说法是最小 2GB 内存、推荐 4GB 以上;CPU 最小 1 核、推荐 2 核以上;存储最小 10GB、推荐 50GB 以上(因为媒体增长快);带宽建议不限流量。BestVPSFor 在 2026 年 3 月的实测给的最小是 4GB、推荐 8GB,2 个 vCPU,存储 50GB 或 40GB 以上 NVMe,系统 Ubuntu 22.04 以上。IONOS 指南给的分级更细:100 人以内用小规模,100 到 1000 人中规模,1000 到 10000 大规模,1 万以上超大规模。

个人实测(pstam,约 4000 粉丝)说 4GB 实例平均占用约 2GB 还有余量,1GB 能凑合但不推荐,2GB 是可接受下限(尤其是不跑 ES 的时候)。给读者的结论口径是:2 核 4GB 是舒适起步线,2GB 是勉强下限,内存比 CPU 更关键,因为多进程等于多吃内存。Puma 调优也有讲究:加线程多吃 CPU,加进程多吃 RAM,得按规模平衡。

Docker 部署概要

官方仓库自带 docker-compose.yml,一次性编排 web、streaming、sidekiq、postgres、redis、nginx 六个服务,统一设 restart 为 unless-stopped。强烈建议 pin 到稳定的 v4.x 标签(比如 4.3.0、4.3.1),不要跟 main 分支,否则哪天构建挂了都不知道。

密钥生成需要 SECRET_KEY_BASE、OTP_SECRET、VAPID 密钥和 Active Record 加密密钥,用官方 bin/setup 向导或 rails 命令生成后写进 .env.production。TLS 这块 Caddy 摩擦最小,一行 Caddyfile 加自动 Let's Encrypt;或者用 nginx 配 certbot 走经典路线。

管理上用 tootctl 把首个用户提为管理员,后台注册模式建议选审批制(approval-required)或邀请制(invite-only)作为安全默认,而不是全面开放。对外只暴露 80、443 和 SSH 端口。

媒体存储膨胀与对象存储

这是新手最容易翻车的地方。联邦会缓存媒体:你关注的远程账号发的图片、视频会被拉到本地缓存,媒体文件会快速累积——这才是 Mastodon 存储增长的主因,不光是你自己用户上传的那点。

本地磁盘写满直接导致实例故障。所以推荐用 S3 兼容对象存储而不是本机盘:AWS S3、Wasabi、IONOS 对象存储都行。对象存储的优势是存储和计算解耦、按 TB 弹性扩容、不占 VPS 系统盘。IONOS 对象存储参考价约 4.99 美元每 TB。

配合策略上,要设置上传文件大小限制,并开启自动媒体清理和缓存保留期(media cache retention),避免无限膨胀。在 .env.production 里把 S3_ENABLED 设为 true,再填好对应的 S3_BUCKET 和 S3_ENDPOINT。

邮件送达率:SPF/DKIM/DMARC 加事务邮件服务

Mastodon 依赖邮件发注册确认链接、通知和密码重置。技术上可以不配邮件启动,但用户注册和账号管理会坏掉,所以生产环境必须配 SMTP。

强烈建议用事务邮件服务(Mailgun、SendGrid、Mailjet、SparkPost、Postmark、SendLayer),别自建邮件服务器。原因是多数 VPS 封了 25 端口,自建出向邮件需要 smart host 中继;而且新 VPS 的 IP 信誉差,容易被 Spamhaus 等黑名单、被 Microsoft 和 Gmail 拒收或丢进垃圾箱;事务邮件服务商替你维护 IP 信誉池和反馈回路。

DNS 三件套是避开垃圾箱的关键:SPF 用 TXT 记录声明哪些 IP 被授权代发,建议先用软失败(~all)确认无误再改硬失败(-all);DKIM 对每封邮件做加密签名,公钥发布在 DNS(形如 mail._domainkey.example.com),Gmail 和 Outlook 等要求 DKIM 签名才进收件箱;DMARC 把 SPF 和 DKIM 关联并给出失败处置,从 p=none 先观察,再到 quarantine,最后 reject。还有 PTR 反向解析,没有 PTR 几乎必被标垃圾,得向 VPS 商设置 IP 到 FQDN 的映射。额外还要注意 STARTTLS、IP 预热、监控黑名单和 DMARC 报告。

规模化与成本

带宽上,联邦会产生可观的出向流量——每条本地帖子 fan-out 到所有远程关注者。NordBastion 估算:100 个活跃用户的实例向外联邦投递约 100 到 300 GB 每天(标记为估算值)。所以必须选不限流量(unmetered)套餐,否则按 egress 计费的账单会很吓人。

成本阶梯参考:小实例(100 人以内)VPS 约 7 到 12 美元每月(Hetzner 8GB/2vCPU 约 7.50 美元起,DigitalOcean 2GB droplet 约 12 美元);中等(100 到 1000 人)需要更大内存和 CPU(8GB 以上);大型(1000 到 10000 以上)得把数据库、缓存、Sidekiq 拆到独立服务器并做负载均衡。媒体存储是 unbounded 的成本,按 TB 计费,是长期最大的变量。

自建和托管怎么选?自建长期更便宜、数据自主、审核可控,但得自己维护升级、处理邮件和存储增长、承担可用性(单台 VPS 宕机等于实例下线)。托管(比如 masto.host)省心、免维护、有 SLA,按月订阅单价高于自管 VPS 但省人力,适合不想碰运维的小社区。

常见坑与维护清单

三座大山是内存、存储、邮件。内存 2GB 勉强易 OOM,开了 Elasticsearch 再多吃 500MB;存储靠对象存储加清理策略解决;邮件靠事务服务和 DNS 三件套解决。新手最高频的卡住点就是收不到注册邮件——多半是 25 端口被封或三件套没配。

别自建邮件,这是 HN 上的共识,折腾 IP 黑名单和 Microsoft 拒收极其痛苦。带宽务必选不限流量,否则 egress 账单惊喜。单台 VPS 是单点故障,不像大实例有冗余。升级要注意大版本 migration 和 precompile assets,偶有 breaking change。

安全上必须保持更新:历史上出过严重的媒体处理路径遍历 RCE(CVE-2023-36460),影响多版本,需升级到 4.1.3、4.0.5、3.5.9 等修复版。日常要做自动安全更新、监控(Prometheus/Grafana 看队列长度和响应)、每日数据库 dump 加媒体快照到异地。反向代理只暴露 80/443 和 SSH,用 SSH 密钥和防火墙。

💡 延伸阅读:关于架构与基础设施的更多深潜指南,请前往 VPS 主题导读中心 (Hub) 获取全盘策略。