拥有自己的社交账号听起来很美好,直到你意识到这个账号住在别人的服务器上,受别人的规则和在线时间摆布。自己的 Mastodon 实例解决了这个问题:你的账号是 @you@your-domain,除了你没人能关掉它。代价是,Mastodon 可不是个小应用。最好事先知道自己要面对什么。
适合谁
- 给你自己或公司官方账号用的单用户实例。
- 朋友圈或项目团队的小社区——几十人,不是几千人。
再大的话,你运营的就是一项需要承担审核职责、处理举报、配备正经基础设施的服务了。那是另一回事。
真正需要什么
Mastodon 会同时运行好几个进程:Rails Web 应用、后台的 Sidekiq 工作进程、一个流式服务器、PostgreSQL 和 Redis。由于联邦机制,哪怕你在睡觉,服务器也在不断从其他服务器拉取帖子和媒体。
| 实例 | 套餐 |
|---|---|
| 单用户,关注不多 | Small-IP — 2 vCPU、4 GB、每月 $16 |
| 小社区,联邦活跃 | Medium-IP — 4 vCPU、6 GB、每月 $20 |
4 GB 能跑但很紧;你关注的某条热帖收到几千条回复时,Sidekiq 队列就会积压。6 GB 才留得出喘息的空间。另一个限制是磁盘——见下面的媒体部分。
你还需要一个域名和一个独立 IP:其他服务器通过 443 端口向你投递。
用 Docker 部署
官方仓库自带 docker-compose.yml。在一台装好了 Docker 的全新 Ubuntu 24.04 服务器上:
git clone https://github.com/mastodon/mastodon.git
cd mastodon
git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)
touch .env.production
docker compose run --rm -v $(pwd)/.env.production:/opt/mastodon/.env.production \
web bundle exec rake mastodon:setup
docker compose up -d
初始化任务会询问你的域名、数据库和 Redis 设置(默认值与 compose 文件一致)、邮件设置和第一个管理员账号,并把一切写进 .env.production。请阅读你检出的那个标签的发布说明——大版本之间步骤偶尔会变。
Mastodon 在 dist/nginx.conf 里自带了 nginx 模板。把它复制到 /etc/nginx/sites-available/,替换域名,再用 certbot 申请证书。我们的反向代理指南和域名指南都讲到了。
邮件:用中继
Mastodon 会发送确认邮件和重置密码邮件。我们的服务器关闭了 25 和 465 端口,所以请让 Mastodon 通过 587 端口连接外部的事务邮件服务商:
SMTP_SERVER=smtp.your-provider.example
SMTP_PORT=587
SMTP_LOGIN=apikey
SMTP_PASSWORD=your-smtp-password
SMTP_FROM_ADDRESS=notifications@your-domain.example
说实话,你本来也会想用中继。从全新服务器 IP 发出的邮件很容易进垃圾箱;中继有你还没有的信誉。
媒体:磁盘吞噬者
你的服务器见到的账号,其每张图片、每段视频都会缓存在本地。活跃的实例每周就是好几 GB。定期清理旧的远程媒体:
docker compose exec web tootctl media remove --days 7
docker compose exec web tootctl preview_cards remove --days 30
把它们放进每天运行的 cron 任务里。实例变大后,用 .env.production 里的 S3_* 设置把媒体迁到 S3 兼容的对象存储——这样 VPS 磁盘上就只剩数据库了。
日常维护
- 更新: 拉取新标签,
docker compose pull,按发布说明运行迁移,然后重启。不要跳过大版本。 - 备份: 转储 PostgreSQL,并妥善保存
.env.production——少了里面的密钥,恢复就不会成功。我们的 restic 指南讲了异地副本,Managed Backups 则能加上整台服务器的每日还原点。 - 域名定了就不能改。 它写死在整个联邦宇宙里每个账号的地址中。在创建第一个账号前选好。
想找个更轻量的团队聊天方案?Matrix 服务器可能更合适。
评论
暂无评论。来做第一个吧。