运营 tootbot.org 的经验分享:从搭建、维护到升级

作为一个 Mastodon 联邦实例的运营者,我想分享一下自己从零搭建 tootbot.org 到日常维护、定期升级、备份策略、安全管理、资源优化以及个人对联邦宇宙的体会。

一、搭建:一切从 Docker Compose 开始

tootbot.org 的部署完全基于 Docker Compose,以下是核心服务的简化配置:

version: "2.1"
services:
  db:
    image: postgres:14-alpine
    volumes:
      - ./postgres14:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=mastodon
      - POSTGRES_PASSWORD=${DB_PASS}

  redis:
    image: redis:7-alpine
    volumes:
      - ./redis:/data

  mastodon:
    image: lscr.io/linuxserver/mastodon:latest
    ports:
      - 1080:80
      - 10443:443
    volumes:
      - ~/appdata/config:/config
    environment:
      - LOCAL_DOMAIN=tootbot.org
      - REDIS_HOST=redis
      - DB_HOST=db
      - DB_NAME=mastodon
      - DB_USER=postgres
      - DB_PASS=${DB_PASS}
      - SMTP_SERVER=${SMTP_SERVER}
      - S3_ENABLED=${S3_ENABLED}
      - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
      - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
      ... # 其余配置略

通过 LinuxServer 的 Mastodon 镜像大大简化了配置和版本升级。

二、维护:Makefile + tootctl + gobackup

定期清理媒体文件

Mastodon 会缓存大量远端媒体,通过 tootctl 清理脚本自动化运行:

make clean-media
# 对应 Makefile 内容
clean-media:
	docker exec mastodon tootctl media remove

数据库备份

使用 gobackup 工具,配置如下:

models:
  mastodon_pg_backup:
    schedule:
      cron: "00 4 * * *"
    storages:
      spaces:
        type: spaces
        bucket: tootbot
        region: ${S3_REGION}
        path: postgres
    databases:
      tootbot_db:
        type: postgresql
        host: 127.0.0.1
        database: mastodon
        username: postgres
        password: ${DB_PASS}
    notifiers:
      telegram:
        type: telegram
        chat_id: '@ttnotihub'
        token: ${TG_TOKEN}

将备份推送到 DigitalOcean Spaces,保留最近 5 份。

三、升级:简单粗暴的脚本

升级脚本:

#!/bin/bash
sudo docker-compose pull
sudo docker-compose up --force-recreate --build -d
sudo docker image prune -f

执行一次,三步走完成拉取、重建、清理。

四、安全:最小暴露 + 强密码 + 备份 + 资源控制

  • 端口只暴露 1080 和 10443
  • 所有变量通过 .env 管理,强密码自动生成
  • PostgreSQL、Redis 不对外暴露,仅容器内通信
  • 所有数据定期离线备份
  • 遇上故障可快速恢复,测试过的冷启动恢复时间在 10 分钟以内

五、部署平台:良心云大促买买买

没有用独立数据库服务,而是把所有服务放在一台 VPS 上。我的策略是:

  • 利用腾讯云/阿里云/轻量云大促购买 1 年或者 3 年期实例
  • 用 Docker Compose 快速部署
  • 资源足够:目前活跃用户较少,Postgres 和 Mastodon 占用内存可控

六、联邦宇宙的体会

自己部署一个实例后,最大的感受就是:

自由地选择你想看到的信息源,而不是算法给你推荐的东西。

你可以选择 federate 哪些实例、屏蔽哪些内容,也可以自己手动关注远端用户。这种自由和透明,是中心化社交平台所没有的。

运营一个 Mastodon 实例虽然有点技术门槛,但收获远不止技术本身,而是一种更开放、更去中心的网络生活方式。


欢迎访问我的实例:https://tootbot.org

如果你也想运行一个 Mastodon 实例,欢迎交流,我乐于分享更多实践经验!