Skip to content

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 实例。但是在如果你搭建的公共服务器那么你必须知道你将承哪些义务和责任。

  1. 意料不到的刑事指控。你需要了解你生活的国家和地区的法律,并不是所有国家和地区的法律体系都是友善,因为在有些国家和地区,平台的提供者和运营者会因为平台上用户产生的内容受到刑事指控和入狱。法律风险相关的信息你可以询问你的律师。

  2. 每日备份。对于用户来说,重要的是要相信电源线绊倒或恶意入侵不会擦除他们的所有数据。拥有备用策略是提供公共服务的基本必要条件。2

  3. 至少有不止一个人可以紧急访问服务器基础设施。各种情况可能会阻止 Mastodon 服务器的原始所有者回答技术紧急情况。所以必须有不止一个人具有这种​​能力。2

  4. 承诺在停机前下给予用户至少 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。

  1. 配置 SSH 公钥和禁用密码登陆,将你的公钥放入 authorized_keys 中,并且妥善保存私钥不要发给他人。

    vi ~/.ssh/authorized_keys
    

  2. 关闭服务器 SSH 密码登陆,这是为了确保服务器不被暴力入侵。

    vi /etc/ssh/sshd_config
    
    取消注释,将 PasswordAuthentication yes 修改为 PasswordAuthentication no,如何没有在末尾添加一行 PasswordAuthentication no

  3. 重启 sshd

    sudo systemctl restart sshd
    

  4. 更新服务器软件
    sudo apt-get update && apt-get upgrade
    

安装 Docker Engine (Docker引擎)

建议参考 Install Docker Engine on Debian

  1. 卸载旧版本。4

    sudo apt-get remove docker docker-engine docker.io containerd runc
    

  2. 更新 apt 包索引并安装包以允许 apt 通过 HTTPS 使用存储库。4

    sudo apt-get update
    
    sudo apt-get install \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
    

  3. 添加 Docker 的官方 GPG 密钥。4

    sudo mkdir -p /etc/apt/keyrings
    
    curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    

  4. 设置存储库。4

    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
    

  5. 安装 Docker Engine (Docker引擎)4

    sudo apt-get update
    

    运行时收到 GPG 错误 apt-get update

    您的默认 umask 可能配置不正确,导致无法检测存储库公钥文件。在更新包索引之前尝试授予 Docker 公钥文件的读取权限:

    sudo chmod a+r /etc/apt/keyrings/docker.gpg
    
    sudo apt-get update
    

    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
    

创建工作目录和拉取镜像

  1. 创建工作目录

    mkdir -p /data/mastodon
    
    cd /data/mastodon
    

  2. 拉取 Mastodon 镜像

    docker pull tootsuite/mastodon:latest
    

配置 docker-compose.yml 文件

  1. 从 Mastodon 官方仓库下载 docker-compose.yml 文件

    wget https://raw.githubusercontent.com/tootsuite/mastodon/master/docker-compose.yml
    

  2. 修改 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

  1. 设置 PostgreSQL 管理员密码。

    sudo docker run --name postgres14 -v /data/mastodon/postgres14:/var/lib/postgresql/data -e   POSTGRES_PASSWORD=$数据库管理员密码 --rm -d postgres:14-alpine
    
    $数据库管理员密码 替换为你设置的密码。

  2. 设置 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 容器

  3. 给 PostgreSQL 运行目录赋权

    sudo chown -R 70:70 /data/mastodon/postgres14
    

设置 Cloudflare

将你计划用来运行 Mastodon 的域名添加到 Cloudflare 并且修改 DNS 到 Cloudflare。

将 Cloudflare 中的 SSL/TLS 设置为 Full

在你计划用来运行 Mastodon 的域名中添加你服务器 IP 的解析,如果你的服务器提供商有提供 IPv6 强烈建议设置 AAAA 记录。并且开启 Proxy。

配置 SSL 证书

  1. 安装 Certbot

    sudo apt-get install python3-certbot-dns-cloudflare
    

  2. 配置 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 Key
    certbot certonly \
      --dns-cloudflare \
      --dns-cloudflare-credentials /etc/letsencrypt/certbot-dns-cloudflare.ini \
      --register-unsafely-without-email \
      -d '$域名'
    
    $域名 替换为你运行 Mastodon 的域名

安装和配置 Nginx

  1. 安装 Nginx

    sudo apt-get install nginx
    

  2. 从 Mastodon 官方仓库下载 Nginx 配置模版

    wget https://raw.githubusercontent.com/mastodon/mastodon/main/dist/nginx.conf -o /etc/nginx/sites-available/$域名
    
    $域名 替换为你运行 Mastodon 的域名

  3. 配置 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_certificatessl_certificate_key 前面的注释

  4. 创建软链接

    ln -s /etc/nginx/sites-available/$域名 /etc/nginx/sites-enabled/
    

  5. 重启 Nginx

    sudo systemctl restart nginx
    

配置 Mastodon

  1. /data/mastodon/ 创建一个的 .env.production 空白文件

    vi /data/mastodon/.env.production
    
    创建一个空白文件。

  2. 初始化 Mastodon

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

  3. 配置全文搜索,编辑 .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