由于 Elon Musk 以 440 亿美元,将 Twitter 私有化产生了诸多争议,于是诸多媒体注意到了 Mastodon,并且在完成收购后大量 Twitter 用户涌入 Mastodon。 我在 2020 年就使用 Docker 运行了一台 Mastodon 但是出于某些特殊原因就不公开说明是那一台实例了。考虑现在 Elon Musk 已经将 Twitter 私有化完成,将来会有越来越多的 Twitter 用户转向使用 Mastodon。于是我决定写了如何在 Docker 中运行 Mastodon。
前期准备
如果你想运行自己的 Mastodon 我们需要准备
- 一个域名。这是运行 Mastodon 必要的条件之一,它将是你的 Mastodon 访问入口和用户用户名中包含的内容,我们可以在这些地方。
如何获得:Godaddy, Namecheap, Gandi 以及无数域名注册商中的任何一家。每年的费用因域名和后缀选择而异。
- 一台服务器。将运行始终连接到互联网的 Mastodon 的代码。
如何获得:我们可以根据实例预计用户参考下列信息,以及无数服务器提供商中的任何一家,服务商配置和服务器位置根据用户数量和用户位置选择,如果你实例的用户位于欧盟和EEA,请注意参考 GDPR。费用因实例用户数量和配置。每月收取费用。
大型实例:AWS, Google Cloud, Microsoft Azure
中型实例:Hetzner, OVH, DataPacket
小型实例:Vultr, DigitalOcean, Linode
- 一个 Cloudflare 账户。Cloudflare 可以为你的 Mastodon 提供无限的 DDoS 缓解和 CDN 加速,并且 Cloudflare 有未计量的免费套餐,非常适合小型实例。
如何获得:注册 Cloudflare 账户
- 准备电子邮件。Mastodon 需要通过电子邮件发送确认链接和各种通知,虽然你可以自己托管 SMTP 服务器,但是使用第三方提供商更可靠和稳定。
如何获得:Amazon SES, Mailgun, SendGrid 以及公开 SMTP API 的无数电子邮件托管提供商中的任何一家。根据发送的电子邮件量每月收取费用。
- 可选:对象存储。Mastodon 可以将你和你的用户上传的文件保存在运行服务器的硬盘驱动器上,但是硬盘驱动器通常不是无限的,而且以后很难升级。对象存储提供商为你提供几乎无限的计量文件存储。
如何获得:Amazon S3, Google Cloud Storage, Wasabi 任何公开 S3 兼容或 OpenStack Swift 兼容 API 的对象存储托管提供商中的任何一家。根据存储的文件量以及访问的频率,每月收取费用。
准备系统
确保服务器运行的是 Debian 10 或者 Debian 11。
- 配置 SSH 公钥和禁用密码登陆,将你的公钥放入
authorized_keys
中,并且妥善保存私钥不要发给他人。vi ~/.ssh/authorized_keys
- 关闭服务器 SSH 密码登陆,这是为了确保服务器不被暴力入侵。
vi /etc/ssh/sshd_config
取消注释,将
PasswordAuthentication yes
修改为PasswordAuthentication no
,如何没有在末尾添加一行PasswordAuthentication no
- 重启 sshd
sudo systemctl restart sshd
- 更新服务器软件
sudo apt-get update && apt-get upgrade
安装 Docker Engine (Docker引擎)
- 卸载旧版本。
sudo apt-get remove docker docker-engine docker.io containerd runc
- 更新
apt
包索引并安装包以允许apt
通过 HTTPS 使用存储库。sudo apt-get update
sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release
- 添加 Docker 的官方 GPG 密钥。
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
- 设置存储库。
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- 安装 Docker Engine (Docker引擎)
sudo apt-get update
运行时收到 GPG 错误
apt-get update
?sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
创建工作目录和拉取镜像
- 创建工作目录
mkdir -p /data/mastodon
cd /data/mastodon
- 拉取 Mastodon 镜像
docker pull tootsuite/mastodon:latest
配置 docker-compose.yml
文件
- 从 Mastodon 官方仓库下载
docker-compose.yml
文件wget https://raw.githubusercontent.com/tootsuite/mastodon/master/docker-compose.yml
- 修改
docker-compose.yml
文件vi docker-compose.yml
依次找到
web
,streaming
,sidekiq
容器, 在每一个容器的image: tootsuite/mastodon
后添加:latest
修改成为image: tootsuite/mastodon:latest
将容器运行路径从相对路径改为绝对路径,替换所有容器中
volumes
里的./
为/data/mastodon/
。取消注释
es
分类的所有注释。并且取消web
容器中depends_on
里的es
的注释。如果不开启全文搜索可以忽略上面
es
相关的这一步。此外,官方仓库的
docker-compose.yml
文件里elasticsearch
版本的是 7.17.4,但目前elasticsearch
最高版本为7.10.2
,需要修改。
初始化 PostgreSQL
- 设置 PostgreSQL 管理员密码。
sudo docker run --name postgres14 -v /data/mastodon/postgres14:/var/lib/postgresql/data -e POSTGRES_PASSWORD=$数据库管理员密码 --rm -d postgres:14-alpine
将
$数据库管理员密码
替换为你设置的密码。 - 设置 PostgreSQL 中 mastodon 用户的密码
sudo docker exec -it postgres14 psql -U postgres
CREATE USER mastodon WITH PASSWORD '$mastodon用户密码' CREATEDB;
将
$mastodon用户密码
替换为你设置的密码。\q
退出 PostgreSQL 的 CLI
sudo docker stop postgres14
停止 PostgreSQL 容器
- 给 PostgreSQL 运行目录赋权
sudo chown -R 70:70 /data/mastodon/postgres14
设置 Cloudflare
将你计划用来运行 Mastodon 的域名添加到 Cloudflare 并且修改 DNS 到 Cloudflare。
将 Cloudflare 中的 SSL/TLS 设置为 Full
在你计划用来运行 Mastodon 的域名中添加你服务器 IP 的解析,如果你的服务器提供商有提供 IPv6 强烈建议设置 AAAA 记录。并且开启 Proxy。
配置 SSL 证书
- 安装 Certbot
sudo apt-get install python3-certbot-dns-cloudflare
- 配置 Cloudflare 的 Key
vi /etc/letsencrypt/certbot-dns-cloudflare.ini
dns_cloudflare_email = $Cloudflare注册的邮箱 dns_cloudflare_api_key = $Cloudflare的Key
在 Cloudflare 创建一个你 Mastodon 的域名可以写入和编辑 TXT 的 Key,将上面的内容写入,并且将
$Cloudflare注册的邮箱
替换为你 Cloudflare 注册的邮箱,将$Cloudflare的Global Key
替换为你刚才创建的 Cloudflare Keycertbot certonly \ --dns-cloudflare \ --dns-cloudflare-credentials /etc/letsencrypt/certbot-dns-cloudflare.ini \ --register-unsafely-without-email \ -d '$域名'
将
$域名
替换为你运行 Mastodon 的域名
安装和配置 Nginx
- 安装 Nginx
sudo apt-get install nginx
- 从 Mastodon 官方仓库下载 Nginx 配置模版
wget https://raw.githubusercontent.com/mastodon/mastodon/main/dist/nginx.conf -o /etc/nginx/sites-available/$域名
将
$域名
替换为你运行 Mastodon 的域名 - 配置 Nginx
vi /etc/nginx/sites-available/$域名
将文件中所有
example.com
替换为你运行 Mastodon 的域名将文件中所有
/home/mastodon/live/public
替换为/data/mastodon/public
将文件中所有
try_files $uri =404;
替换为try_files $uri @proxy;
取消
ssl_certificate
和ssl_certificate_key
前面的注释 - 创建软链接
ln -s /etc/nginx/sites-available/$域名 /etc/nginx/sites-enabled/
- 重启 Nginx
sudo systemctl restart nginx
配置 Mastodon
- 在
/data/mastodon/
创建一个的.env.production
空白文件vi /data/mastodon/.env.production
创建一个空白文件。
- 初始化 Mastodon
sudo docker compose run --rm web bundle exec rake mastodon:setup
- 配置全文搜索,编辑
.env.production
文件,如果你不开启全文搜索请忽略这步。vi /data/mastodon/.env.production
ES_ENABLED=true ES_HOST=es ES_PORT=9200
添加到
.env.production
文件中sudo docker compose down sudo docker compose up -d
重启所有容器
Debug
当前版本 v4.0.2
在初始化过程中存在一些 Bug 需要注意。
Bug 1: 初始化 Mastodon 完成后配置不会自动存入 .env.production
在初始化 Mastodon 后,配置信息不会自动存入 .env.production
将自动输出的配置从上面的信息复制下来,手动存入。
vi /data/mastodon/.env.production
粘贴我们复制下来的配置。
Bug 2: Redis 配置不会自动生成
在初始化 Mastodon 后自动输出的配置没有包含 Redis 的配置,我们需要收从写入
vi /data/mastodon/.env.production
使用 sudo docker ps -a
查看 Redis 容器的名称,根据显示的容器名称选择下面任意一个。 添加一行 REDIS_URL=redis://@mastodon-redis-1:6379
或者 REDIS_URL=redis://@mastodon_redis_1:6379