手把手教你怎么在Docker运行Mastodon(服务器搭建Mastodon)

开源源码 七七 1个月前 (01-06) 116次浏览 0个评论

由于 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。

  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引擎)

  1. 卸载旧版本。
    sudo apt-get remove docker docker-engine docker.io containerd runc
    

     

  2. 更新 apt 包索引并安装包以允许 apt 通过 HTTPS 使用存储库。
    sudo apt-get update
    
    sudo apt-get install \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
    

     

  3. 添加 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
    

     

  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引擎)
    sudo apt-get update
    
    运行时收到 GPG 错误 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
    

    依次找到 webstreamingsidekiq 容器, 在每一个容器的 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_certificate 和 ssl_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

喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址