本文目标

在中心化社交平台频繁封号、数据泄露、算法操纵的背景下,去中心化社交网络(Fediverse)正在成为越来越多人的选择。本文用 Docker Compose 方式,从零搭建当前最活跃的两个平台——MisskeyMastodon,并做横向对比,帮助你做出适合自己的选择。

为什么要去中心化

第一次接触 Fediverse 是因为 Twitter 改名叫 X 之后,算法越改越离谱,付费蓝V横行,言论边界越来越模糊。后来了解到 Mastodon 和 Misskey,发现它们解决的不只是”换个平台”的问题,而是数据主权的问题。

自己的服务器,数据想备份备份,想迁移迁移,管理员跑路、历史帖子全没了这种事不存在。

Fediverse 基于 ActivityPub 协议(W3C 标准),可以跨平台互相关注——你在 Misskey 发帖,我在 Mastodon 能看到,反之亦然。

本文适合谁

  • 有 Linux 服务器(2核2G以上)
  • 想要掌控自己社交数据
  • 对 Fediverse 有好奇心,想动手试试
  • 不怕写配置文件

共同的环境准备

两个平台都推荐用 Docker Compose 部署,共用以下基础设施。

安装 Docker

# Ubuntu/Debian 安装
curl -fsSL https://get.docker.com | sh

# 确认版本
docker --version

# Docker Compose V2(插件方式,已内置)
docker compose version

本文命令基于 Docker Compose V2,使用 docker compose(空格)而非旧版的 docker-compose(连字符)。

域名与 SSL

推荐用 Cloudflare 免费托管 DNS,好处三点:免费 SSL 证书、隐藏服务器真实 IP、抗 DDoS。

在 Cloudflare DNS 中添加两条记录:

misskey.yourdomain.com  → 服务器IP
mastodon.yourdomain.com → 服务器IP

SSL 用 Let’s Encrypt + Certbot 自动申请:

apt install -y nginx certbot python3-certbot-nginx

# 申请证书(后续在各平台配置里用到)
certbot --nginx -d misskey.yourdomain.com
certbot --nginx -d mastodon.yourdomain.com

搭建 Misskey

Misskey 是日本开发者打造的现代化去中心化社交平台,界面流畅、功能丰富,用户体验最接近 Twitter/X。

文件结构

mkdir -p ~/misskey && cd ~/misskey

下载官方配置模板:

# 下载 docker-compose.yml
wget https://raw.githubusercontent.com/misskey-dev/misskey/master/docker-compose.yml

# 下载配置文件模板
wget https://raw.githubusercontent.com/misskey-dev/misskey/master/.config/example.yml \
  -O .config/default.yml

目录结构:

~/misskey/
├── docker-compose.yml
├── .config/
│   └── default.yml       # 主配置文件
├── files/                 # 用户上传文件(自动创建)
├── db/                    # PostgreSQL 数据(自动创建)
├── redis/                 # Redis 数据(自动创建)
└── keys/
    └── signingkey.pem    # 签名密钥(手动生成)

配置 default.yml

nano .config/default.yml

关键配置项:

# 实例 URL
url: https://misskey.yourdomain.com/
port: 3000

# 域名
host: misskey.yourdomain.com

# 数据库
db:
  host: postgres
  port: 5432
  db: misskey
  user: misskey
  pass: <YOUR_DB_PASSWORD>    # 改成强密码

# Redis
redis:
  host: redis
  port: 6379

# 管理员邮箱(先部署,再注册账号提权)
admin:
  email: admin@yourdomain.com

# 签名密钥路径
signingKeyPath: ./keys/signingkey.pem

配置 docker-compose.yml

version: "3"

services:
  web:
    image: misskey/misskey:latest
    container_name: misskey
    restart: always
    ports:
      - "3000:3000"
    volumes:
      - ./files:/misskey/files
      - ./.config:/misskey/.config:ro
      - ./keys:/misskey/keys
    environment:
      - "SELF_URL=https://misskey.yourdomain.com"
    depends_on:
      - db
      - redis
    networks:
      - internal

  db:
    image: postgres:15-alpine
    container_name: misskey_db
    restart: always
    environment:
      - "POSTGRES_USER=misskey"
      - "POSTGRES_PASSWORD=<YOUR_DB_PASSWORD>"
      - "POSTGRES_DB=misskey"
    volumes:
      - ./db:/var/lib/postgresql/data
    networks:
      - internal

  redis:
    image: redis:7-alpine
    container_name: misskey_redis
    restart: always
    volumes:
      - ./redis:/data
    networks:
      - internal

networks:
  internal:
    driver: bridge

生成签名密钥

mkdir -p keys
openssl genrsa -out keys/signingkey.pem 2048

Nginx 反向代理

server {
    listen 80;
    server_name misskey.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name misskey.yourdomain.com;

    ssl_certificate     /etc/letsencrypt/live/misskey.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/misskey.yourdomain.com/privkey.pem;

    client_max_body_size 100m;

    location / {
        proxy_pass http://127.0.0.1:3000;
        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;

        # WebSocket 支持(Misskey 实时推送依赖此配置)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
ln -s /etc/nginx/sites-available/misskey /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

启动并初始化

cd ~/misskey
docker compose up -d

# 查看日志确认启动
docker compose logs -f

首次启动需要几分钟初始化数据库。访问 https://misskey.yourdomain.com 即可看到初始化页面。

注册第一个账号后,需要 SSH 进服务器手动提权:

docker compose exec misskey bash

# 在容器内执行(将 admin_username 替换为你的用户名)
npx tsc ./script/role-to-admin.ts admin_username
exit

搭建 Mastodon

Mastodon 是历史最久的去中心化社交平台,Ruby on Rails 技术栈,由 Eugen Rochko 主导开发,在 Fediverse 中用户基数最大。

文件结构

mkdir -p ~/mastodon && cd ~/mastodon

# 克隆官方仓库获取 Docker 模板
git clone https://github.com/mastodon/mastodon.git ./

# 切换到最新稳定版
git fetch --tags
git checkout $(git tag -l 'v4.*' --sort=-v:refname | head -n 1)

# 复制环境变量模板
cp .env.production.sample .env

配置环境变量

nano .env

Mastodon 交互式配置

Mastodon 官方提供了引导式配置命令,可以自动帮你完成所有配置:

docker compose run --rm web bundle exec rake mastodon:setup

会依次要求你输入域名、管理员账号密码、SMTP 配置等,并自动初始化数据库、编译前端资源。推荐用这个方式,比手动改 .env 更不容易出错。

如果手动配置,关键项如下:

# 域名配置
LOCAL_DOMAIN=mastodon.yourdomain.com
WEB_DOMAIN=mastodon.yourdomain.com
SINGLE_USER_MODE=false

# 数据库
DB_HOST=db
DB_PORT=5432
DB_NAME=mastodon_production
DB_USER=mastodon
DB_PASS=<YOUR_DB_PASSWORD>    # 改成强密码

# Redis
REDIS_HOST=redis
REDIS_PORT=6379

# 对象存储(可选,推荐使用腾讯云 COS / Cloudflare R2)
S3_ENABLED=true
S3_BUCKET=<your-bucket>
S3_REGION=<region>
AWS_ACCESS_KEY_ID=<your-key>
AWS_SECRET_ACCESS_KEY=<your-secret>
S3_ENDPOINT=https://your-cos-endpoint.cos.<region>.myqcloud.com

# 发件邮箱(SMTP 配置)
SMTP_SERVER=smtp.yourmail.com
SMTP_PORT=587
SMTP_LOGIN=postmaster@yourdomain.com
SMTP_PASSWORD=<YOUR_SMTP_PASSWORD>
SMTP_FROM_ADDRESS=postmaster@yourdomain.com
SMTP_AUTH_METHOD=plain
SMTP_ENABLE_STARTTLS=auto

# 安全密钥(三个随机字符串)
SECRET_KEY_BASE=<openssl rand -hex 64>
OTP_SECRET=<openssl rand -hex 64>
VAPID_PRIVATE_KEY=<openssl ecparam -genkey -name prime256v1 | openssl ec -outform DER 2>/dev/null | openssl base64 | tr -d '\n'>
VAPID_PUBLIC_KEY=<用上面私钥算出>

初始化数据库

# 方式一:交互式引导(推荐)
docker compose run --rm web bundle exec rake mastodon:setup

# 方式二:手动初始化
docker compose run --rm web bundle exec rails db:setup
docker compose run --rm web bundle exec rails assets:precompile

启动 Mastodon

docker compose up -d

# 查看状态
docker compose ps

# 查看日志
docker compose logs -f

Nginx 反向代理

Mastodon 有两个内部端口:Web 主站(3000)和 Streaming API(4000),两者都需要代理。

server {
    listen 80;
    server_name mastodon.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name mastodon.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/mastodon.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mastodon.yourdomain.com/privkey.pem;

    root /home/username/mastodon/public;   # 替换为实际路径
    gzip on;
    max_gzip_size 1024;
    client_max_body_size 100m;

    # Streaming API(实时推送)
    location /api/v1/streaming {
        proxy_pass http://127.0.0.1:4000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # 主站
    location / {
        proxy_pass http://127.0.0.1:3000;
        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;
    }
}
certbot --nginx -d mastodon.yourdomain.com
nginx -t && systemctl reload nginx

横向对比

对比维度MisskeyMastodon
技术栈Node.js + TypeScript + Vue.jsRuby on Rails + React
内存占用较低(~1.5GB 可运行)较高(推荐 4GB+)
界面风格现代化,类 Twitter,UI 细腻较传统,类似 Twitter 早期
中文社区中文用户较多(国内镜像站活跃)较小众
实时推送WebSocket,体验流畅Streaming API
中文搜索内置中文搜索需额外配置 Elasticsearch
定制性主题/挂件高度可定制定制性一般
移动端PWA 体验良好依赖第三方客户端
联邦兼容性Fediverse 广泛兼容历史积累深厚,用户最多
部署难度⭐⭐ 较简单⭐⭐⭐⭐ 较复杂
资源消耗⭐⭐ 轻量⭐⭐⭐⭐ 较重
适合人群追求体验、中文圈用户追求开放协议、国际化用户

选择建议

追求现代 UI、较低资源、快速上手 → Misskey
追求最大联邦兼容性、长期稳定、深度定制 → Mastodon


日常维护

Misskey

cd ~/misskey

# 更新版本
docker compose pull && docker compose up -d

# 查看日志
docker compose logs -f misskey

# 备份数据库
docker compose exec misskey_db pg_dump -U misskey misskey > backup_$(date +%Y%m%d).sql

Mastodon

cd ~/mastodon

# 更新版本
git fetch origin
git checkout $(git tag -l 'v4.*' --sort=-v:refname | head -n 1)
docker compose build && docker compose up -d

# 清理旧资源
docker compose run --rm web rails assets:clean

# 查看 Sidekiq 队列状态
docker compose exec web rails runner "Sidekiq::Stats.new"

# 备份数据库
docker compose exec db pg_dump -U mastodon mastodon_production > backup_$(date +%Y%m%d).sql

常见问题

启动后 502 Bad Gateway?

检查 Nginx upstream 端口是否正确(Misskey → 3000,Mastodon → 3000+4000),以及容器是否已完全启动(首次启动需要几分钟初始化数据库)。

图片/媒体文件上传失败?

检查 Nginx 配置中 client_max_body_size 是否 ≥ 100m,以及 Docker volume 挂载路径权限是否正确。

无法发送邮件?

检查 .env 中的 SMTP 配置。推荐用 Mailgun / SendGrid / 腾讯企业邮箱,确保端口(587)、密码、认证方式正确。

同一台服务器同时运行两个实例?

完全可以。用不同域名和不同内部端口即可。例如 Misskey 用 3000,Mastodon 用 3001,各自配置独立 Nginx server block 即可。


结语

Misskey 和 Mastodon 都是优秀的去中心化社交方案。无论选哪个,Docker 部署都大幅降低了维护门槛,版本更新只需几行命令。

Fediverse 的世界没有算法推荐、没有广告,是时候拥有自己的社交空间了。

种下你的想法

在花园里留下一条评论,和这篇文章一起生长。

COMMENTS