本文目标
在中心化社交平台频繁封号、数据泄露、算法操纵的背景下,去中心化社交网络(Fediverse)正在成为越来越多人的选择。本文用 Docker Compose 方式,从零搭建当前最活跃的两个平台——Misskey 和 Mastodon,并做横向对比,帮助你做出适合自己的选择。
为什么要去中心化
第一次接触 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
横向对比
| 对比维度 | Misskey | Mastodon |
|---|---|---|
| 技术栈 | Node.js + TypeScript + Vue.js | Ruby 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 的世界没有算法推荐、没有广告,是时候拥有自己的社交空间了。
种下你的想法
在花园里留下一条评论,和这篇文章一起生长。