Mastodon runing in Docker (在 Docker 中运行 Mastodon)
由于 Elon Musk 以 440 亿美元,将 Twitter 私有化产生了诸多争议,于是诸多媒体注意到了 Mastodon,并且在完成收购后大量 Twitter 用户涌入 Mastodon。1 我在 2019 年就使用 Docker 运行了一台 Mastodon 但是出于某些特殊原因就不公开说明是那一台实例了。考虑现在 Elon Musk 已经将 Twitter 私有化完成,将来会有越来越多的 Twitter 用户转向使用 Mastodon。于是我决定写了如何在 Docker 中运行 Mastodon。
Tip
很高兴你有兴趣运行一台自己的 Mastodon 实例。但是在如果你搭建的公共服务器那么你必须知道你将承哪些义务和责任。
-
意料不到的刑事指控。你需要了解你生活的国家和地区的法律,并不是所有国家和地区的法律体系都是友善,因为在有些国家和地区,平台的提供者和运营者会因为平台上用户产生的内容受到刑事指控和入狱。法律风险相关的信息你可以询问你的律师。
-
每日备份。对于用户来说,重要的是要相信电源线绊倒或恶意入侵不会擦除他们的所有数据。拥有备用策略是提供公共服务的基本必要条件。2
-
至少有不止一个人可以紧急访问服务器基础设施。各种情况可能会阻止 Mastodon 服务器的原始所有者回答技术紧急情况。所以必须有不止一个人具有这种能力。2
-
承诺在停机前下给予用户至少 3 个月的提前警告。有时服务会关闭,如果关闭是不可避免,并且成生命周期结束。但是用户必须相信,他们的账户不会在一夜之间消失,这样他们才有时间导出数据,寻找另一台服务器。2
当前版本 v4.0.2
在初始化过程中存在一些 Bug 需要注意。
请查看 Debug 根据 Debug 的信息参考配置。
前期准备
如果你想运行自己的 Mastodon 我们需要准备
-
一个域名。这是运行 Mastodon 必要的条件之一,它将是你的 Mastodon 访问入口和用户用户名中包含的内容,我们可以在这些地方。3
如何获得:Godaddy, Namecheap, Gandi 以及无数域名注册商中的任何一家。每年的费用因域名和后缀选择而异。3
-
一台服务器。将运行始终连接到互联网的 Mastodon 的代码。3
如何获得:我们可以根据实例预计用户参考下列信息,以及无数服务器提供商中的任何一家,服务商配置和服务器位置根据用户数量和用户位置选择,如果你实例的用户位于欧盟和EEA,请注意参考 GDPR。费用因实例用户数量和配置。每月收取费用。
大型实例:AWS, Google Cloud, Microsoft Azure
中型实例:Hetzner, OVH, DataPacket
小型实例:Vultr, DigitalOcean, Linode
-
一个 Cloudflare 账户。Cloudflare 可以为你的 Mastodon 提供无限的 DDoS 缓解和 CDN 加速,并且 Cloudflare 有未计量的免费套餐,非常适合小型实例。
如何获得:注册 Cloudflare 账户
-
准备电子邮件。Mastodon 需要通过电子邮件发送确认链接和各种通知,虽然你可以自己托管 SMTP 服务器,但是使用第三方提供商更可靠和稳定。3
如何获得:Amazon SES, Mailgun, SendGrid 以及公开 SMTP API 的无数电子邮件托管提供商中的任何一家。根据发送的电子邮件量每月收取费用。3
-
可选:对象存储。Mastodon 可以将你和你的用户上传的文件保存在运行服务器的硬盘驱动器上,但是硬盘驱动器通常不是无限的,而且以后很难升级。对象存储提供商为你提供几乎无限的计量文件存储。3
如何获得:Amazon S3, Google Cloud Storage, Wasabi 任何公开 S3 兼容或 OpenStack Swift 兼容 API 的对象存储托管提供商中的任何一家。根据存储的文件量以及访问的频率,每月收取费用。3
准备系统
确保服务器运行的是 Debian 10 或者 Debian 11。
-
配置 SSH 公钥和禁用密码登陆,将你的公钥放入
authorized_keys
中,并且妥善保存私钥不要发给他人。 -
关闭服务器 SSH 密码登陆,这是为了确保服务器不被暴力入侵。
取消注释,将PasswordAuthentication yes
修改为PasswordAuthentication no
,如何没有在末尾添加一行PasswordAuthentication no
-
重启 sshd
- 更新服务器软件
安装 Docker Engine (Docker引擎)
建议参考 Install Docker Engine on Debian
-
卸载旧版本。4
-
更新
apt
包索引并安装包以允许apt
通过 HTTPS 使用存储库。4 -
添加 Docker 的官方 GPG 密钥。4
-
设置存储库。4
-
安装 Docker Engine (Docker引擎)4
运行时收到 GPG 错误
apt-get update
?您的默认 umask 可能配置不正确,导致无法检测存储库公钥文件。在更新包索引之前尝试授予 Docker 公钥文件的读取权限:
创建工作目录和拉取镜像
-
创建工作目录
-
拉取 Mastodon 镜像
配置 docker-compose.yml
文件
-
从 Mastodon 官方仓库下载
docker-compose.yml
文件 -
修改
依次找到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 用户的密码
将$mastodon用户密码
替换为你设置的密码。 退出 PostgreSQL 的 CLI 停止 PostgreSQL 容器 -
给 PostgreSQL 运行目录赋权
设置 Cloudflare
将你计划用来运行 Mastodon 的域名添加到 Cloudflare 并且修改 DNS 到 Cloudflare。
将 Cloudflare 中的 SSL/TLS 设置为 Full
在你计划用来运行 Mastodon 的域名中添加你服务器 IP 的解析,如果你的服务器提供商有提供 IPv6 强烈建议设置 AAAA 记录。并且开启 Proxy。
配置 SSL 证书
-
安装 Certbot
-
配置 Cloudflare 的 Key
在 Cloudflare 创建一个你 Mastodon 的域名可以写入和编辑 TXT 的 Key,将上面的内容写入,并且将$Cloudflare注册的邮箱
替换为你 Cloudflare 注册的邮箱,将$Cloudflare的Global Key
替换为你刚才创建的 Cloudflare Key将certbot certonly \ --dns-cloudflare \ --dns-cloudflare-credentials /etc/letsencrypt/certbot-dns-cloudflare.ini \ --register-unsafely-without-email \ -d '$域名'
$域名
替换为你运行 Mastodon 的域名
安装和配置 Nginx
-
安装 Nginx
-
从 Mastodon 官方仓库下载 Nginx 配置模版
将wget https://raw.githubusercontent.com/mastodon/mastodon/main/dist/nginx.conf -o /etc/nginx/sites-available/$域名
$域名
替换为你运行 Mastodon 的域名 -
配置 Nginx
将文件中所有example.com
替换为你运行 Mastodon 的域名将文件中所有
/home/mastodon/live/public
替换为/data/mastodon/public
将文件中所有
try_files $uri =404;
替换为try_files $uri @proxy;
取消
ssl_certificate
和ssl_certificate_key
前面的注释 -
创建软链接
-
重启 Nginx
配置 Mastodon
-
在
创建一个空白文件。/data/mastodon/
创建一个的.env.production
空白文件 -
初始化 Mastodon
-
配置全文搜索,编辑
添加到.env.production
文件,如果你不开启全文搜索请忽略这步。.env.production
文件中 重启所有容器
Debug
当前版本 v4.0.2
在初始化过程中存在一些 Bug 需要注意。
Bug 1: 初始化 Mastodon 完成后配置不会自动存入 .env.production
在初始化 Mastodon 后,配置信息不会自动存入 .env.production
将自动输出的配置从上面的信息复制下来,手动存入。
Bug 2: Redis 配置不会自动生成
在初始化 Mastodon 后自动输出的配置没有包含 Redis 的配置,我们需要收从写入
使用sudo docker ps -a
查看 Redis 容器的名称,根据显示的容器名称选择下面任意一个。
添加一行 REDIS_URL=redis://@mastodon-redis-1:6379
或者 REDIS_URL=redis://@mastodon_redis_1:6379