去年买了某家的黑5小鸡,在上面搭建了一个mastodon实例,今年这机器快到期了,我也不打算续费了,现在要着手把这个mastodon搬个家,思来想去最后决定搬到甲骨文的arm上面来。确实觉得甲骨文的arm还挺适合的,内存大,cpu性能也可以,跑个mastodon自用绰绰有余。
本文的迁移方案适用于按照我先前这篇文章部署的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
教程很棒,儿子用了之后很开森
乾貨!謝謝分享
lala知不知道為什麼mastodon沒有官方的arm64鏡像嗎?是不是自己build會有bug?
不太清楚官方为啥不提供arm64镜像。。自己build的话一般不会有什么问题的。