静看光阴荏苒
不管不顾不问不说也不念

迁移Docker安装的Mastodon到甲骨文ARM

去年买了某家的黑5小鸡,在上面搭建了一个mastodon实例,今年这机器快到期了,我也不打算续费了,现在要着手把这个mastodon搬个家,思来想去最后决定搬到甲骨文的arm上面来。确实觉得甲骨文的arm还挺适合的,内存大,cpu性能也可以,跑个mastodon自用绰绰有余。

本文的迁移方案适用于按照我先前这篇文章部署的mastodon:

Docker快速部署Mastodon

如果你不是按我这篇文章部署的,步骤或许会有很大的出入,仅供参考。

另外我已经把我的这台甲骨文arm重装成debian11了,文章里写的在甲骨文arm上面的操作都是基于debian11的,甲骨文默认是没有debian系统的,如果你要按我这篇文章操作,得自己先重装,我之前写过相关的文章,可以搜索一下。或者你可以用甲骨文自带的ubuntu,步骤应该差不多。

还有就是我这台arm上面本身还跑了一个必须要用apache的程序,所以到时候反代相关的配置也是用apache。这里先提前说明一下。

咱先登到甲骨文的arm上,做些准备工作,把需要用到的软件都装好:

apt -y update
apt -y install build-essential curl git apache2 python3-certbot-apache python3-pip
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
pip3 install docker-compose
systemctl enable --now apache2 docker

由于mastodon官方没有在dockerhub上面发布基于arm64的image,所以我们得自己构建image。好在官方的dockerfile是直接支持arm64的,直接build一下就行了,不需要做什么额外的操作。先拉取项目文件,然后把分支切换到当前最新的版本,目前最新版是3.4.4:

cd /opt
git clone https://github.com/tootsuite/mastodon.git
cd mastodon/
git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)

构建3.4.4版本的mastodon镜像,需要花费一定的时间:

docker build -t mastodon .

把自带的docker-compose.yml重命名,待会用自己备份过来的:

mv docker-compose.yml docker-compose.yml.bak

做完这些后,arm这边的配置先放一边。来到mastodon实例所在的机器内。

别急着备份数据,先把这台机器的mastodon实例升级到最新版,让其与之前在arm上面构建的镜像版本保持一致:

cd /opt/mastodon
docker-compose pull
docker-compose up -d
docker-compose run --rm mastodon-web rails db:migrate
docker-compose restart

我现在是从3.4.1升级到3.4.4,按照官方的升级注意事项,这几个版本升级只需要做数据库迁移即可,但有些时候升级的步骤并不仅仅只有这些。

所以你需要仔细阅读官方每个版本的升级注意事项,具体的浏览这个网址查看:https://github.com/mastodon/mastodon/releases

升级完成后,停止并删除所有正在运行的容器:

docker-compose down

这里把我正在用的docker-compose配置贴一下:

version: '3.5'

services:
  mastodon-db:
    image: postgres:9.6-alpine
    shm_size: 256mb
    environment:
      POSTGRES_DB: mastodon
      POSTGRES_USER: imlala
      POSTGRES_PASSWORD: password
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "postgres"]
    volumes:
      - ./postgres:/var/lib/postgresql/data
    restart: unless-stopped

  mastodon-redis:
    image: redis:6.0-alpine
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
    volumes:
      - ./redis:/data
    restart: unless-stopped

  mastodon-es:
    image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.10
    environment:
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - "cluster.name=es-mastodon"
      - "discovery.type=single-node"
      - "bootstrap.memory_lock=true"
    healthcheck:
      test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
    volumes:
      - ./elasticsearch:/usr/share/elasticsearch/data
    ulimits:
      memlock:
        soft: -1
        hard: -1
    restart: unless-stopped

  mastodon-web:
    image: tootsuite/mastodon
    env_file: .env.production
    command: bash -c "rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000"
    depends_on:
      - mastodon-db
      - mastodon-redis
    healthcheck:
      test: ["CMD-SHELL", "wget -q --spider --proxy=off localhost:3000/health || exit 1"]
    ports:
      - "127.0.0.1:3000:3000"
    volumes:
      - ./public/system:/mastodon/public/system
    restart: unless-stopped

  mastodon-streaming:
    image: tootsuite/mastodon
    env_file: .env.production
    command: node ./streaming
    depends_on:
      - mastodon-db
      - mastodon-redis
    healthcheck:
      test: ["CMD-SHELL", "wget -q --spider --proxy=off localhost:4000/api/v1/streaming/health || exit 1"]
    ports:
      - "127.0.0.1:4000:4000"
    restart: unless-stopped

  mastodon-sidekiq:
    image: tootsuite/mastodon
    env_file: .env.production
    command: bundle exec sidekiq
    depends_on:
      - mastodon-db
      - mastodon-redis
    volumes:
      - ./public/system:/mastodon/public/system
    restart: unless-stopped

根据我上面贴出来的docker-compose配置,可以得知需要打包备份的目录有:

postgres // mastodon数据库
redis // redis数据
elasticsearch // es全文搜索索引数据
public/system/ // 站点上传的文件

现在打包数据:

tar -zcvf postgres.tar.gz postgres/
tar -zcvf redis.tar.gz redis/
tar -zcvf elasticsearch.tar.gz elasticsearch/
tar -zcvf system.tar.gz public/system/

将压缩包传到arm机器内:

scp postgres.tar.gz root@1.2.3.4:/opt/mastodon/postgres.tar.gz
scp redis.tar.gz root@1.2.3.4:/opt/mastodon/redis.tar.gz
scp elasticsearch.tar.gz root@1.2.3.4:/opt/mastodon/elasticsearch.tar.gz
scp system.tar.gz root@1.2.3.4:/opt/mastodon/system.tar.gz

配置文件和docker-compose.yml也一并传到arm机器内:

scp .env.production root@1.2.3.4:/opt/mastodon/.env.production
scp docker-compose.yml root@1.2.3.4:/opt/mastodon/docker-compose.yml

现在回到arm机器内,解压压缩包:

tar -xzvf postgres.tar.gz
tar -xzvf redis.tar.gz
tar -xzvf elasticsearch.tar.gz
tar -xzvf system.tar.gz

现在需要把原来docker-compose内的dockerhub镜像修改为本地构建的:

nano docker-compose.yml

找到所有基于dockerhub镜像的配置:

image: tootsuite/mastodon

全部修改为本地构建的:

image: mastodon:latest

对于arm的es,原本的镜像版本用的是6.8.10,这个版本是不支持arm的:

image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.10

es从7.8版本开始才支持arm,修改为更高的版本来支持arm:

image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2

其他配置都不需要修改,直接up起来即可:

docker-compose up -d

修改public的目录所有者为容器内的991:

chown -R 991:991 public

检查容器是否都是up状态:

docker-compose ps

上面所有的步骤都没问题的话,这里应该就全部是up状态:

现在来配置反向代理,首先启用下面的apache2.4模块:

a2enmod proxy
a2enmod proxy_http
a2enmod proxy_wstunnel
a2enmod headers
a2enmod rewrite

重启apache2.4使其生效:

systemctl restart apache2

检查模块是否启用:

a2query -m

然后新建一个站点配置文件:

nano /etc/apache2/sites-available/mastodon.conf

写入如下配置:

<VirtualHost *:80>
        ServerName mastodon.example.com
        ServerAdmin imlala@lala.im
        DocumentRoot /opt/mastodon/public
        ErrorLog ${APACHE_LOG_DIR}/mastodon_error.log
        CustomLog ${APACHE_LOG_DIR}/mastodon_access.log combined
</VirtualHost>

这个站点配置文件仅仅用来做301跳转到https,所以不需要做额外过多的配置。启用这个站点即可:

a2ensite mastodon

重载apache2使其生效:

systemctl reload apache2

接下来使用certbot签发一个ssl证书:

certbot --apache

使用certbot给刚才的站点签发ssl证书后会自动多启用一个站点,我们编辑这个站点配置文件:

nano /etc/apache2/sites-available/mastodon-le-ssl.conf

在这个站点配置文件内添加反向代理相关的设置:

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName mastodon.example.com
        ServerAdmin imlala@lala.im
        DocumentRoot /opt/mastodon/public
        ErrorLog ${APACHE_LOG_DIR}/mastodon_error.log
        CustomLog ${APACHE_LOG_DIR}/mastodon_access.log combined

        SSLCertificateFile /etc/letsencrypt/live/mastodon.example.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/mastodon.example.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf

        <Directory />
                Require all granted
        </Directory>

        ProxyPreserveHost On
        RequestHeader set X-Forwarded-Proto "https"
   
        ProxyPass /500.html !
        ProxyPass /sw.js !
        ProxyPass /robots.txt !
        ProxyPass /browserconfig.xml !
        ProxyPass /mask-icon.svg !
        ProxyPassMatch ^(/.*\.(png|ico)$) !
   
        ProxyPass /api/v1/streaming/ ws://127.0.0.1:4000/
        ProxyPassReverse /api/v1/streaming/ ws://127.0.0.1:4000/
        ProxyPass / http://127.0.0.1:3000/
        ProxyPassReverse / http://127.0.0.1:3000/

        ErrorDocument 500 /500.html
        ErrorDocument 501 /500.html
        ErrorDocument 502 /500.html
        ErrorDocument 503 /500.html
        ErrorDocument 504 /500.html
</VirtualHost>
</IfModule>

certbot会自动帮你配置apache2的301跳转https,以及证书自动续期,现在只需检查你修改后的配置是否正确即可:

apache2ctl configtest

全部正常的话,重载apache2使新的站点配置生效:

systemctl reload apache2

至此,迁移就全部完成了,可以打开站点检查一下各项功能是否正常。

我看到官方的文档上面写到迁移后要重建一下用户的时间线,但我是单用户实例,时间线没有问题就没有重建。如果需要重建实例所有用户的时间线,执行下面的命令即可:

docker-compose run --rm mastodon-web bin/tootctl feeds build
赞(7)
未经允许不得转载:荒岛 » 迁移Docker安装的Mastodon到甲骨文ARM
分享到: 更多 (0)

评论 3

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    教程很棒,儿子用了之后很开森 :oops:

    橘子1年前 (2021-12-01) Google Chrome 95.0.4586.128 Google Chrome 95.0.4586.128 Windows 10 x64 Edition Windows 10 x64 Edition回复
  2. #2

    乾貨!謝謝分享
    lala知不知道為什麼mastodon沒有官方的arm64鏡像嗎?是不是自己build會有bug?

    Henry12个月前 (12-03) Chrome 96.0.4664.53 Chrome 96.0.4664.53 iPhone iOS 15.1 iPhone iOS 15.1回复
    • 不太清楚官方为啥不提供arm64镜像。。自己build的话一般不会有什么问题的。

      LALA12个月前 (12-11) Google Chrome 86.0.4240.198 Google Chrome 86.0.4240.198 Windows 10 x64 Edition Windows 10 x64 Edition回复

分享创造快乐

广告合作资源投稿