如何利用Docker搭建Mastodon实例(二):进阶魔改篇

如何在Docker系统上维持你的魔改 Posted by Mastodon搭建指南 on November 1, 2020

谁有这样的需求

前一篇教程中我曾提到Docker搭建长毛象的优缺点:

优点:

  1. 搭建、升级方便,命令简单,不用自行配置环境,比起用官方文档命令行搭建而言,更适合新手。

  2. 对内存较小的服务器,可以免除每次升级需要的编译(precompile)步骤给小机器带来的负担。

  3. Mastodon站点运行在一个隔离的小环境(容器)中,安全性较高,不怕新手操作把整个系统搞崩,出现问题之后只要重启即可,会按镜像自动复原。

缺点:

  1. 可用教程较少,许多命令需要重新学起。

  2. 魔改字数等相对而言不太方便,需要增加一个步骤,在下面会详细列出。

  3. 需要学习docker相关命令。

教程出来之后,大家都反馈安装十分方便,但对于需要魔改的同学来说就有点犯难了。因为官方给定了镜像文件,在容器里修改、融合改动(merge)又不如源码安装那样方便,难道每次升级都要从头魔改一次吗?

答案是不用。只要跟着本文进行设置,魔改之后每次升级都能安心、省心地度过。

注意:本文仅适合既希望享受Docker的安全、稳定,又希望能照抄他人轻量稳定魔改的朋友,不适合需要经常对本站进行魔改、调试、创新的技术大佬。

本教程依旧完全依赖兔子(@star@b612.me)大佬的手把手指导,绝大部分截图来自于当时ta的示范,万分感谢!

  

  

如何在Docker上保留你的魔改

这个问题兔子之前曾教我两种解决方案:

  1. 升级后在docker容器中重新魔改。具体步骤为:

    docker exec -it mastodon_web_1 /bin/bash
    

    进入docker容器后,按照源代码方式进行修改和precompile。

    此种方法的优点是即时修改显示效果快,但不能持久,重启之后所有改动就会消失。为了保存此次修改,需要在precompile并exit退出后,执行

    docker ps | grep mastodon_web | awk '{print $1}'    #查看容器id
    docker commit -m "【改动内容摘要】" 【容器id】 tootsuite/mastodon:【当前mastodon版本号】
    

    但这个方法的缺点在于,在未来的升级中,所有改动都需要重新执行此步,非常麻烦,所以该方法更适用于临时调试和紧急升级,可与后文讲述的方法结合。

  2. 先升级代码,然后在自己机器中用docker-compose build编译镜像。

    此方法的编译过程每次都要等待很久,对小机器也是一种考验,完全丢失了docker方法的优点。不推荐。

因此,在各位大佬的帮助和兔子手把手指导下,本文会重点介绍第三种方法:利用GitHub进行镜像编译,再将编译好的镜像拉到自己的服务器中直接使用。

  

1. 在GitHub上创建自己站点的分支并进行代码魔改(2023-07-08修改)

如果你已经通过前述教程用Docker安装了Mastodon,那么你的站点应当是尚未经过魔改的官方稳定版本。所以在注册GitHub账号后,推荐你到官方GitHub页面,在右上角点击“Fork”按钮,将官方代码复制到你自己的库中。

随后,在自己的个人电脑推荐安装三个软件:

  • Git,基础代码软件,后文大量内容需要用到。

  • GitHub官方出的 GitHub Desktop,可以进行很多可视化的git操作,非常实用。

  • Visual Studio Code,可以用来编辑代码。虽然记事本也能对付,但是万一哪次魔改代码时merge失败出现冲突(conflict),VS可以直接定位到错误地点,并且提示你一键接受新改动/保留旧改动/两者都接受,不用再自己尝试修改代码。

GitHubDesktop界面

在安装完这3个软件之后,请按照Git设置指南“Setting up Git”部分设置好本地git的用户名(username)和邮箱(email address)。

随后,你就可以通过GitHub Desktop将自己库中的代码下载到本地(Clone时选择for your own purpose),在VS中进行代码魔改后,再直接提交(commit)并推送(push)到GitHub网站你的远程库中,非常方便。

需要注意的是,此时你如果直接修改main分支,那么你的改动是基于官方的最前沿开发进程,可能会出现一些意外的bug。如果你希望仅在之前的稳定版本基础上进行魔改,则需要下述步骤:

在本地电脑中,Github软件 - 相应repository - 右键 - Open in Command Prompt:

在命令行中:

   git checkout -b newbranch tags/v4.1.8   #根据最新的稳定版本创建新分支
   git branch --delete main   #删除本地的main分支
   git branch -m newbranch main  #将新分支重命名为main
   git push origin main -f    #将新的main分支强制推送到你的github库中

这样就可以将你的main分支强行设置为之前的稳定版本。

按照mastodon采用的AGPL3.0协议,站长作为服务提供者,任何对源代码的改动都要开源,并在站内公开repo地址。可在.env.production文件里加一行配置:

   GITHUB_REPOSITORY=你的GitHub/mastodon

  

2. 在DockerHub中建立属于自己的镜像(2023-09-20修改)

  • DockerHub上注册账号,Account Setting - Security- Access Tokens创建密钥。

    DockerHub创建密钥

  • 回到GitHub,打开你自己的代码,Settings - Secrets and variables - Action - New repository secret,创建“DOCKERHUB_USERNAME”和“DOCKERHUB_TOKEN”字段,输入你的DockerHub用户名和密钥。

    GitHub创建NewSecrets

    DOCKERHUB_USERNAME&DOCKERHUB_TOKEN

  • 在你本地的mastodon库中,打开.github/workflows/build-container-image.yml,修改如下部位(适用于v4.1.7以上):

    修改build-container-image.yml_1

    修改build-container-image.yml_2

    打开.github/workflows/build-releases.yml,修改如下部位:

    修改build-releases.yml

    其他workflows文件夹中以build-开头的文件同样作类似的用户名修改。

    在命令行中:

     git tag -f v4.1.8          #目前所在tag位置移动到你刚才修改处
     git push origin v4.1.8 -f    #将新的v4.1.8 tag强制推送到你的github库中
    

    将修改推送至Github。

    此时点开Github你仓库上方的“Action”面板,应该就能看到workflow已经开始运作。其中耗时最长的就是build-image的workflow,一般每次修改后重新编译需要10多分钟。

    如果你后续魔改的代码中出现错误,编译失败,则可以点开具体的编译过程,搜索“ERROR”,一般能够找到错误的原因——不要慌,反正不是在你自己的机器上折腾,弄不坏。

  

3. 将编译完成的镜像拉到你自己的服务器上

到服务器中:

   cd /home/mastodon/mastodon        #进入所在文件夹
   docker pull 你的DOCKERHUB用户名/mastodon:latest        #latest为最新编码的tag,如果需要创建特定版本的tag,在后文中有说明如何推送
   nano docker-compose.yml

修改docker-compose.yml文件,将下列三处(web、streaming和sidekiq)修改为“你的DOCKERHUB用户名/mastodon:你设置的TAG名”:

   docker-compose up -d

启动,你的魔改版站点就上线啦!

  

  

未来如果想要魔改……

未来如果魔改,只需要在电脑中修改好代码,一口气push到GitHub中,GitHub会自动编译并且推送到DockerHub中去。

如果你设置的tag一直都是latest,那么每次只要等待编译完成后:

   cd /home/mastodon/mastodon
   docker pull 你的DOCKERHUB用户名/mastodon:latest
   docker-compose up -d

即可。

  

  

升级(2023-07-08修改)

升级其实也就是另一种意义的魔改。在本地电脑中,Github软件 - 相应repository - 右键 - Open in Command Prompt:

在命令行中:

   git remote -v

查看远程库版本是否包含了官方“tootsuite/mastodon”和“你自己/mastodon”,以及它们分别叫什么名字(一般为origin和upstream)。如果没有,需要用“git remote add 自己起个名 GitHub地址”命令进行添加,比如:

   git remote add upstream https://github.com/tootsuite/mastodon.git

然后拉取官方版本的进展(假设你这里官方版本的名字是upstream):

   git fetch --tags upstream
   git merge v4.1.8   #要升级的tag名

进行融合操作。

如果新代码与你的魔改出现冲突,GitHub Desktop会显示出所有你冲突的文件,会提示你依次转到Visual Studio Code中解决。只要选择接受哪一方的改动即可。

注:GitHub在有些地方被墙或者速度很慢,可以使用代理(cmd代理设置教程)。如有必要,可以将这一步完全转到服务器上使用git命令行进行。这里可以参考廖雪峰Git入门教程命令详解,本文不再赘述。

随后,修改tag位置并推送:

   git tag -f v4.1.8   #将相应tag标注在你最新提交的修改上
   git push origin v4.1.8    #将这个tag推送到远程github库中

这之后,你点开自己在github上的库,可以看到相应的tag,在Action栏目中可以看到正在对该tag进行编译。

推送到远程库后,后续操作则和上一部分一样:待编译完成后,在你的服务器中

   cd /home/mastodon/mastodon
   docker pull 你的DOCKERHUB用户名/mastodon:latest      #latest为最新改动的tag,也可以设置为相应版本号如v4.1.8      
   docker-compose up -d

然后根据官方升级指示,看是否需要执行其他步骤如docker-compose run --rm web rails db:migrate等。   

  

总结

总而言之,通过这种方法,每次升级的步骤只需要:merge改动-推送到GitHub-等待3个多小时待编译完成-将镜像拉到服务器-重启-根据官方指示看是否需要其他步骤,相对而言除了等待时间较长之外,其余步骤简单许多,不需要自己重新配置服务器环境。因为编译使用的是GitHub的资源,所以不会对本地服务器造成负担,也不用担心编译错误/内存不足等问题会导致全站崩溃。但缺点在于每次编译都需要等待很久,如果需要调试修改,则会耗费大量时间。因此,使用Docker安装Mastodon,更适合仅需照抄已成熟魔改、小机器、同时希望保证站点安全的朋友,并不适合热衷于试验的开发者。

在后续的文章中,本博客也将列举一些常见的魔改,希望能给大家提供帮助。