This page looks best with JavaScript enabled

Mastodon | 采用docker建站后的使用与维护

 ·  ☕ 11 min read

注:本文写作目的为记录所知所学,并向手把手指导我的兔子大佬( @star@b612.me )致敬。本教程如有帮到读者亦感荣幸。

以下操作默认均在root用户下执行

root用户:sudo -i

一些可以参考的教程

长毛象配置文件夹

如何确定你的长毛象配置文件夹呢?

find / -name docker-compose.yml   #寻找名为docker-compose.yml的文件所在位置

在返回结果中找到看起来最靠谱的那个位置,然后

cd /your/own/path  #/your/own/path为刚刚返回结果中的位置,比如cd /opt/mastodon

这样就可以进入你的长毛象配置文件夹。

在配置文件夹中运行:

docker-compose exec web /bin/bash

然后再docker ps 你就能看到mastodon的服务了。

基础运维

有帮助的命令:

docker-compose run --rm web bin/tootctl 具体命令    
#运行mastodon tootctl命令,比如docker-compose run --rm web bin/tootctl cache clear

docker-compose run --rm web bin/tootctl reload    #重启长毛象

cd /opt/mastodon   #跳转至长毛象配置文件夹,此后教程均以此文件位置为例

find / -name filename    #寻找名为filename的文件

which filename      #寻找实际执行命令的文件

ls -a filepath    #列出filepath文件夹内的所有文件

apt update && apt install wget rsync python git curl vim git ufw -y  #安装一些常用命令

需要熟悉位置和名称的配置文件

cd /opt/mastodon    #进入长毛象配置文件夹
nano .env.production  #长毛象配置文件的修改方法

而在非docker中,此文件的修改方法如下。

cd /home/mastodon/live    #进入长毛象配置文件夹
nano .env.production  #长毛象配置文件的修改方法

nano 编辑器

为了定位一个2800行的配置文件中的第711行,我找到了快去定位行数的命令nano +number filename即可跳转到指定行数,例如:nano +711 blabla.yml

如果想持久化地在nano编辑器的最左边看到行数,可以:

nano ~/.nanorc  #nano配置文件,默认不存在
set constantshow   #使屏幕底部的状态框永久显示
set linenumbers  #编辑文件时行数会一直出现在屏幕左边

然后ctrl+x退出保存即可。

Docker 是什么?

把docker当作一个虚拟机,相当于你的mastodon跑在你现在vps的虚拟机里面,所以不能直接在vps的用户下执行tootctl命令。进入到这个“虚拟机”里面可以在docker-compose.yml文件所在的文件夹下运行:docker-compose exec web /bin/bash)。

报错?

如果在长毛象配置文件夹下运行docker-compose exec web /bin/bash命令时出现了以下错误:

可能是因为Python依赖没装全,运行pip install ordered_dict安装依赖。

如果安装python依赖也标红,返回错误结果:

Could not find a version that satisfies the requirement ordered_dict (from versions: )
No matching distribution found for ordered_dict

这种情况可能需要重装一下docker-compose:

which docker-compose   #找到docker-compose的安装位置,例如/usr/bin
rm -rf /usr/bin/docker-compose  #以/usr/bin 为例,rm递归删除此文件

然后再按照docker官网的Linux安装方式重装docker-compose:

之后可以正常看到,docker-compose run --rm web bin/tootctl能够正常运行,由于我们并没有运行官方文档tootctl命令集中的任何命令,因此ctrl+c退出即可。

想要升级怎么办

拉取镜像(images)  

Docker是一个容器,你的mastodon运行在这个容器里的一个镜像当中。如果在搭建服务器之初你是自己来部署mastodon的话,你应该知道你拉取(pull)的是哪个镜像。

如果你想要拉取(pull)一个特定的镜像(比如你想照抄一个使用docker部署站点的大佬的配置),以官方最新版镜像为例,键入:

docker pull tootsuite/mastodon:latest   #docker pull Dockerhub用户名/镜像名:tag名

片刻后即可享受他人的劳动成果(?)

版本升级

首先查看你的站点使用的是哪个镜像。

 cd /opt/mastodon   #跳转至目标文件夹

 nano docker-compose.yml   #修改此文件查看镜像

留意webstreamingsidekiq三项的image即为你使用的镜像。

如果没有进行过任何魔改,而使用的是官方镜像的话,此三项应该显示如下:

web:    
  image: tootsuite/mastodon:latest 
streaming:    
  image: tootsuite/mastodon:latest 
sidekiq:    
  image: tootsuite/mastodon:latest 
#格式为image: Dockerhub用户名/镜像名:tag名。tag名可以是某个具体的版本号也可以是latest。如果不是使用官方镜像的话当然也可能是其他,后面会讲到。

假设你使用的是官方镜像旧版本(官方的dockerhub用户名为tootsuite),升级只需要把web,streaming,sidekiq三个镜像的tag名改为这一页tag中发布的最新版本/latest即可。

如果你使用的不是tootsuite发布的镜像,而是别的用户发布的,或是你想照抄别人的配置,你可以选择像上面的操作一样拉官方镜像的最新版本(一般情况下站点没有被大量魔改过都可以),也可以去Dockerhub官网搜索你使用的dockerhub用户名/镜像名查看最新发布的tag,然后把docker-compose.yml中上述所说三项服务的image的tag名改为那个最新发布的tag名,保存。

凡更改过docker-compose.yml文件,操作后需要重启docker-compose才能重新加载配置文件并拉取镜像。

cd /opt/mastodon   #务必确保在目标文件夹下进行重启操作,否则会影响系统内其他使用docker-compose部署的服务(如果有)
docker-compose up -d   #重启目标文件夹下使用docker-compose部署的服务

数据库适应

站点升级后可能会遇到刷嘟时提示网络错误500的报错,虽然并不影响真实的使用体验。此时需要运行:

cd /opt/mastodon
docker-compose run --rm web rails db:migrate

每次更改镜像之后都可以运行此命令使数据库适应毛象版本。如果频繁提示此报错,可以尝试升级数据库版本,比如从Postgres 9.6升级至Postgres 12.5,参考如何升级Postgres数据库

为了防止运行migrate命令后翻车,请务必确认做好数据库备份!如何使用此备份请参考这篇文章中【如果旧服务器无法复制文件到新服务器】部分。

一点CSS魔改

2021/11/30更新:
一些CSS样式

选中文本颜色与背景色

前几天皮塔丘问我的博客里选中文本颜色与背景色是怎样改动的。虽然是这个功能是博客主题提供而不是我自己改的,但还是学习了一下相关知识:使用css3::selection属性,该属性用于匹配元素中被用户选中或处于高亮状态的部分,并且支持修改匹配元素的color, background, cursor,和outline属性。

1
2
3
4
::selection {
    color: #fff;    /*选中部分字体颜色*/
    background: #088;    /*选中部分背景颜色*/
}

然后我发现这个功能可以在毛象的自定义css中使用,而且理论上所有网站都可以使用:

1
2
3
4
5
6
/** 管理—网站设置-自定义css **/
/*鼠标选中底色*/
*::selection {
    color: #fff;   /*白色*/
    background-color: #b85798;   /*陈玫红*/
}

颜色可以自己改动,支持十六位进制色值(六位数,比如#b85798),网页颜色(三位数,比如#088)和英文代码(比如red)。

给出几个网站可能会有帮助:

  • 颜色值转换,可参考英文代码和对应的十六进制色值。
  • 颜色码对照表,我所用的#b85798就是这个网站推荐的模拟式配色陈玫红。
  • 图片取色,上传本地图片获取任意色块的色值。

鼠标样式

不知道是什么原因暂时不可用,不过给出css源码,参考个人网站如何在CSS中自定义鼠标样式

1
2
3
4
/*鼠标指针样式*/
body{cursor:url(/zb_users/upload/img/pointer.cur),default;}  /*预设光标*/
/*鼠标链接指针样式*/
a:hover{cursor:url(/zb_users/upload/img/link.cur),pointer;}  /*手状光标*/

注意鼠标样式一般用.cur格式的,据说ani格式的不起作用。不过我还没来得及验证(因为cur格式的都没成功。另外引用的url值可以使用cdn也可以是本地。不过毛象站点的话,docker建站用本地资源似乎有点…

Docker的镜像问题

虚悬镜像与镜像的删除

如果本地中已经拉取了一模一样的镜像,将不会重复拉取。如果tag名相同但镜像有更新(比如tootsuite/mastodon:latest),则会再拉取最新的镜像,并且把原镜像的tag命名为<none>,这一切你都可以使用docker images -a来直观地看到你拉取了哪些镜像。

<none>镜像被称为虚悬镜像,是不可用的,但不一定有害。虚悬镜像的产生原因有很多种,上面刚刚提到的"两次拉取镜像的tag名相同但镜像本身有更新"是产生虚悬镜像最常见的原因之一。这种方式产生的虚悬镜像只会占据存储空间,不处理并不会危害服务器安全,所以简单删除即可。运行:

docker images -a   #查看docker拉取的所有镜像并列出列表,包含虚悬镜像
docker rmi imageid   #删除镜像id为imageid的镜像,这里填要删掉的镜像的id

即可删除镜像。

清理docker镜像脚本

此脚本日常运维并不常用,不是用来清理mastodon远程媒体的,而是经过升级/魔改操作后删掉旧的镜像(images)的。此脚本本身不会运行任何命令,而是提示你应该运行什么命令。如果你的服务器中没有docker-clean.sh脚本,那么在/opt/astodon文件夹中,运行vim docker-clean.sh,将以下内容写入其中,然后保存。

  GNU nano 2.9.3                                                                                    docker-clean.sh                                                                                              

#!/bin/bash

# remove exited containers:
docker ps --filter status=dead --filter status=exited -aq | xargs -r docker rm -v

# remove unused images:
docker images --no-trunc | grep '<none>' | awk '{ print $3 }' | xargs -r docker rmi

# remove unused volumes (needs to be ran as root):
find '/var/lib/docker/volumes/' -mindepth 1 -maxdepth 1 -type d | grep -vFf <(
  docker ps -aq | xargs docker inspect | jq -r '.[]|.Mounts|.[]|.Name|select(.)'
  ) | xargs -r rm -fr

# remove all images without at least one container
docker image prune -a


当想要使用此脚本时,运行:

cat docker-clean.sh

然后按照提示结果输入相应命令,清理虚悬镜像/无用镜像即可。

使用alias脚本缩写tootctl命令

(此脚本由兔子大佬编写)

使用管理命令行在服务器中进行维护需要了解官方文档tootctl命令集。以执行help为例,如果使用docker建站需要运行docker-compose run --rm web bin/tootctl help,前缀非常麻烦,如果能简化为tootctl help似乎就简单得多。那么如何进行tootctl命令的缩写呢?

cd /opt/mastodon   #跳转至目标文件夹
vim tootctl.sh   #将以下内容写入/opt/mastodon中并命名为tootctl.sh

以下为脚本内容:

#!/bin/bash
lpwd=$PWD
mypath=`dirname $0`
cd $mypath
if [ $# -ge 1 ]
then
	case $1 in 
		"restart")
			docker-compose restart
		;;
		"reload")
			docker-compose down && docker-compose up -d
		;;
		"stop")
			docker-compose down
		;;
		"start")
			docker-compose up -d
		;;
		"psql")
			docker-compose exec db $*
		;;
		*)
			docker-compose run --rm web bin/tootctl $*
		;;
	esac
else
	echo "please use tootctl help for help"
fi
cd $lpwd

然后执行:

chmod +x /opt/mastodon/tootctl.sh
echo "alias tootctl='/opt/mastodon/tootctl.sh' " >> ~/.bashrc 
source ~/.bashrc

之后就能用tootctl这个命令来调用tootctl而不用输入繁琐的前缀了,从而达到缩写命令的目的。

本教程此后所有tootctl命令均会缩写。

部署媒体文件外部存储服务

由于Scaleway object storage存储空间免费限额 75 GB,我们以此为例进行设置。

cd /opt/mastodon   #进入目标文件夹
#清理外站缓存和无嘟文媒体,为一会儿的迁移减少工作量
tootctl media remove   #移除本地缓存的其它实例媒体附件
tootctl media remove-orphans   #扫描出不属于任何媒体附件的文件并移除他们,此操作需要遍历每个文件,因此速度很慢。

首先借用salt站长的配置教程,选择外部存储的节点。

注册后,创建 Project(可选,或直接使用预设project)和Bucket,然后按照教程获取 API Key,注意无论如何获取API Key的project和Bucket所在的project必须相同,如果获取的是mastodon project的API Key,而Bucket设置在default project里,是不可以的。

apt install python-pip
pip install awscli   #安装aws-cli
aws configure        #调试aws-cli

按指示依次输入Access Key和Secret Key。Region部分填写fr-par/nl-ams/pl-waw。Default output format直接回车即可。

继续按照salt站长的教程继续编辑长毛象配置文件.env.production,保存。

此处参考pullopen站长同步已有媒体的步骤,运行:

aws s3 sync public/system s3://【你的bucket名】/ --endpoint-url=https://你的储存桶地区地址 --acl public-read    

等待媒体文件全部上传至外部存储服务即可,在此期间可以ps -ef | grep aws用screen做守护进程。完成后运行tootctl reload重启 Mastodon服务。

最后,salt站长的教程中绑定 Cloudflare这里,最后注意添加一步:Auto Minify(位置:speed>最佳化>自动缩制)在3.3.0版本之后会影响网页打开,请勿勾选!

确定设置无误后,执行以下命令:

tootctl reload   #重启Mastodon的docker容器
rm -rf /opt/mastodon/public/system  #清理本地文件

以上步骤,可以将媒体文件同步至s3,并清理本地硬盘文件。

定期清理外站媒体文件

此处依旧参考salt站长的配置教程,但对命令做了改动使其能在docker中使用。

crontab -e   #编辑定时任务

选择1后将以下内容填入并保存:

0 3 * * * /opt/mastodon/tootctl.sh media remove --days=14
0 3 * * * /opt/mastodon/tootctl.sh media remove-orphans
0 3 * * * /opt/mastodon/tootctl.sh statuses remove --days=90

定时任务会在每天服务器时间的3点清理缓存 14 天以上的外站媒体文件、“无主”媒体文件、同本站任何用户产生关联的 90 天以上的 toot。

落笔感悟

虽然本教程基本都是兔子大佬的成果,但怎么说从看教程到整理材料落笔写教程这个过程也是有很大收获的。从第一次接触Linux到着手购买域名开始建站一共也就两个月的时间,到现在这篇教程完成也只是将近三个月。三个月从:wq到虚拟机再到购买主机开始建站,从谷歌如何用vm打开一个新的虚拟机到能用命令行基础运维一个网站,我也没想到有些事情我就是能。虽然这个过程该踩的坑都踩过了,但毕竟是我经历的,那就有话可说。

在这里也非常感谢各位站长的教程,bgme站长帮我迁移docker,还有兔酱的对我提问所做的回答,以及ta非常优秀的脚本。虽然我依旧是个小白,但我相信我能走下去。


Roelxy
WRITTEN BY
Roelxy
新世紀摸魚戰士