Mastodon | 大扫除,移除本地缓存的其它实例媒体附件

1932字

artist 本文作者没有任何代码基础,所有说明性文字主要靠连蒙带猜兼灵光一现,参考时请务必注意,欢迎提出意见和给出建议~

西风推荐了Servercat app来查看服务器状态,我深夜下载,快乐打开,然后:

看我这个200G的超大硬盘……等等,我这个200G的硬盘怎么就只剩下57G了???

我的服务器上一共只跑了三样东西:Mastodon,Miniflux,WordPress,犯罪嫌疑人非常容易确认,只会是Mastodon的媒体文件,话又说回来,我之前做长毛象数据备份的时候忘记写笔记了,我设定定时清理外站媒体文件了吗?

……写笔记真的是一件很重要的事情。


缩了,但没完全缩

废话不表,来讲结果,首先根据Mastodon文档我们可以发现,Masodon给出了媒体相关命令tootctl media usage,可以计算被Mastodon消耗的硬盘空间,但,tootctl命令是不能直接运行的,如果使用源代码建站,需要在命令中指定环境,如RAILS_ENV=production bin/tootctl help,而如果用docker建站,则需要在命令前指定运行的容器名称。每次都输入这么一长串命令实在非常麻烦,于是根据Mastodon | 采用docker建站后的使用与维护,我们写入一个脚本文件,这样就可以对命令进行简化,将docker-compose run --rm web bin/tootctl help简化为tootctl help

cd /opt/mastodon   #跳转至目标文件夹
nano 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

以上内容照抄Roelxy的笔记,但在实际输入命令后,我获得了这样一个结果:

root@vmi729048:/opt/mastodon# tootctl help
ERROR: No such service: web

阅读Docker命令教程,一个完整的在Docker内运行tootctl的命令为docker-compose run --rm web bin/tootctl help,其中,docker-compose run,意味着在创建一个新的容器并运行一个命令,加上--rm参数,意味着容器退出时自动清理容器内部的文件数据,根据文档,Mastodon的命令行界面是一个位于Mastodon根目录内bin目录中的名为tootctl的可执行文件,因此,完整的命令,意味着用docker-compose创建一个名为web的容器,并运行bin目录中的tootctl文件,在容器退出时清理干净内部数据。

而刚刚的报错为:ERROR: No such service: web

运行docker ps来列出容器,很容易就能发现一个叫做mastodon_mastodon-web_1的容器,于是试着修改命令为docker-compose run --rm mastodon-web bin/tootctl help

root:/opt/mastodon# docker-compose run --rm mastodon-web bin/tootctl help
Creating mastodon_mastodon-web_run ... done
/opt/ruby/lib/ruby/2.7.0/net/protocol.rb:66: warning: already initialized constant Net::ProtocRetryError
/opt/mastodon/vendor/bundle/ruby/2.7.0/gems/net-protocol-0.1.0/lib/net/protocol.rb:66: warning: previous definition of ProtocRetryError was here
/opt/ruby/lib/ruby/2.7.0/net/protocol.rb:206: warning: already initialized constant Net::BufferedIO::BUFSIZE
/opt/mastodon/vendor/bundle/ruby/2.7.0/gems/net-protocol-0.1.0/lib/net/protocol.rb:206: warning: previous definition of BUFSIZE was here
/opt/ruby/lib/ruby/2.7.0/net/protocol.rb:503: warning: already initialized constant Net::NetPrivate::Socket
/opt/mastodon/vendor/bundle/ruby/2.7.0/gems/net-protocol-0.1.0/lib/net/protocol.rb:503: warning: previous definition of Socket was here
Commands:
  tootctl accounts SUBCOMMAND ...ARGS             # Manage accounts
  tootctl cache SUBCOMMAND ...ARGS                # Manage cache
  tootctl domains SUBCOMMAND ...ARGS              # Manage account domains
  tootctl email_domain_blocks SUBCOMMAND ...ARGS  # Manage e-mail domain blocks
  tootctl emoji SUBCOMMAND ...ARGS                # Manage custom emoji
  tootctl feeds SUBCOMMAND ...ARGS                # Manage feeds
  tootctl help [COMMAND]                          # Describe available commands or one specific command
  tootctl ip_blocks SUBCOMMAND ...ARGS            # Manage IP blocks
  tootctl maintenance SUBCOMMAND ...ARGS          # Various maintenance utilities
  tootctl media SUBCOMMAND ...ARGS                # Manage media files
  tootctl preview_cards SUBCOMMAND ...ARGS        # Manage preview cards
  tootctl search SUBCOMMAND ...ARGS               # Manage the search engine
  tootctl self-destruct                           # Erase the server from the federation
  tootctl settings SUBCOMMAND ...ARGS             # Manage dynamic settings
  tootctl statuses SUBCOMMAND ...ARGS             # Manage statuses
  tootctl upgrade SUBCOMMAND ...ARGS              # Various version upgrade utilities
  tootctl version                                 # Show version

好耶!确实如此!

查看脚本,与之有关的,是docker-compose run --rm web bin/tootctl $*,将web修改为mastodon-web,缩写命令就能成功运行了。

以及Roelxy说上面这一长串警告是docker容器的问题,好像修复不了,不用管它。


抄了,但没完全抄

查了和Roelxy的聊天记录试图解开我的定时清理媒体文件之谜,发现根据聊天记录,我确实设定了定时任务……于是清理站点文件前,先研究明白定时任务到底有没有跑通:

根据Mastodon | 采用docker建站后的使用与维护中定期清理外站媒体文件一节,让服务器定时删除,需要先设定一个定时任务:

crontab -e   #编辑定时任务

选择1后,再将以下内容填入文件并保存:

0 3 * * * /opt/mastodon/tootctl.sh media remove --days=14 #清理缓存 14 天以上的外站媒体文件
0 3 * * * /opt/mastodon/tootctl.sh media remove-orphans #清理“无主”媒体文件
0 3 * * * /opt/mastodon/tootctl.sh statuses remove --days=90 #清理同本站任何用户产生关联的 90 天以上的 toot

……定时了,但没完全定时,确实设定了定时任务,但因为之前偷懒没有创建tootctl.sh脚本,当然也没修改脚本里的容器名称,这个定时任务根本就跑不起来嘛!


大扫除,好耶!

问题解决,开始大扫除:

tootctl media usage #计算被Mastodon消耗的硬盘空间。
Attachments:  92.7 GB (18.9 MB local)
Custom emoji: 209 MB (1.1 MB local)Preview cards: 999 MB
Avatars:      1.44 GB (88.4 KB local)
Headers:      3.39 GB (0 Bytes local)
Backups:      0 Bytes
Imports:      0 Bytes
settings:     0 Bytes
tootctl media remove #移除本地缓存的其它实例媒体附件。
Progress: |====================================================================|
Removed 115981 media attachments (approx. 73.6 GB)
tootctl media remove-orphans #扫描出不属于任何媒体附件的文件并移除他们,此操作需要遍历每个文件,因此速度很慢
这个遍历完了什么也没有返回,大概是还没有这样的文件吧。

好耶!!大扫除真的很快乐!!