Docker下的Mastodon安装笔记

联邦宇宙

Facebook啥的吹的元宇宙感觉要凉,还是长毛象的联邦宇宙看上去比较靠谱。自己的数据放在巨头手里真是风险太大。

所以决定自己部署一个长毛象实例。

归根到底还是因为自己老了,居然到现在才知道长毛象这个好东西。

其实早在2009年的上海Barcamp,我就做过一个关于分布式微博的设想演讲,当时也没做很仔细的准备,就大概说了自己的一点想法,后来因为种种原因也没有动手做,停留在空谈的阶段。

还好还是有人做出来了,虽然跟我的设想有一些不同,但至少比我的空想实在多了。

不过因为是用RoR开发的,部署过程比较复杂,开始是按文档直接部署没有成功,后来改用docker部署才可以,所以还是记录一下吧。

这个时候就觉得,如果是用go开发的就好了,部署多简单啊。当然,还好数据库是用postgresql的,如果用mysql,1G内存就跑不起来了……当然现在用1G也只是能跑起来而已,要正常使用还是得2G以上。

准备工作

需要:

  • 一台服务器,内存至少1G,推荐2G,最好4G或更多,有外网IP,有一个域名
  • Linux系统,我一般用Debian/UbuntuServer,实际上能跑Docker都可以
  • 一个SMTP服务——第三方或本地,我用了第三方
  • 创建一个mastodon用户,指定ID为991,禁止登录(关闭shell):adduser -u 991 --disabled-login --disabled-password mastodon,只能从其它用户su -s <shell> mastodon过去
  • 拉取Postgresql镜像docker pull postgres:<tag>,版本用自己喜欢的,尽量高一点,比如13或更高
  • 拉取Redis镜像docker pull redis:<tag>,版本也尽量新一点,6或更新
  • 拉取mastodon镜像:tootsuite/mastodon:,比如v3.4.1或更新版
  • 下载docker-compose.yml

配置

修改docker-compose.yml文件:

  • 各镜像加上tag,保持与之前拉取的一致,避免用latest(被latest坑过,比如新版调整了配置参数导致用旧配置无法启动)
  • volumes改为实际的路径,我一般习惯保持与直接安装放在同样的路径下,比如/var/lib/xxx
  • mastodon的三个服务需要修改env_file的路径到/home/mastodon/.env.production,以及public路径到/home/mastodon/public,以便统一管理及权限控制

然后启动Postgresql和Redis:

docker-compose up -d db
docker-compose up -d redis

配置数据库:

docker exec -it mastodon_db_1 psql -U postgres

创建用户:

postgres=#
CREATE USER mastodon WITH PASSWORD '数据库用户密码' CREATEDB;

生成mastodon配置文件

docker-compose run --rm web bundle exec rake mastodon:setup

这个步骤比较麻烦,还好大部分选项都有默认值。几个需要注意的项目是:

  • 域名填你的域名
  • Docker模式选“是”
  • 数据库名和用户名填mastodon
  • 是否上传云存储先填否,如果有可以后面再配
  • 发送邮件的信息填前面准备的SMTP服务器信息,需要注意的是,我用的第三方邮件服务需要使用login认证模式,而不是默认的plain。填完可以给自己发个邮件测试一下,不成功可以返回重填(当然,全部参数重填也是很麻烦,所以最好先测试好SMTP再创建配置,尽量一次成功)。

之后就是建数据库和创建管理员账号,记得把管理员密码记录下来。

最后把配置保存到.env.production文件中。

启动服务

docker-compose up -d

会启动三个服务:webstremming, sidekiq,看一下状态是否都正常,如果出错则看一下日志。

配置Nginx

先下载配置模板,把域名改一下,然后放到/etc/nginx/sites-enabled下,然后重启nginx。

证书啥的就不配了,直接弄个自签名证书意思一下,然后前面加一个cloudflare,证书会自动搞定,省很多事。

管理实例

现在可以用域名打开你的实例了,用管理员账号登录吧。

增加全文搜索

拉取镜像,这个是我搞的一个集成了hanlp中文分词的es镜像:

docker pull raptor/eshanlp:7.10.1

修改docker-compose.yml,把es部分的注释去掉,镜像改用:raptor/eshanlp:7.10.1,web部分依赖es的那行注释也去掉。

修改.env.production,增加如下三行:

ES_ENABLED=true
ES_HOST=es
ES_PORT=9200

然后重启服务:

docker-compose down
docker-compose up -d

现在就启用了全文检索,然后需要对数据创建索引:

docker-compose run --rm web bin/tootctl search deploy

等待创建完毕就可以搜索了。

日常运维

由于平时使用中会同步很多联邦宇宙中的内容过来,导致服务器硬盘使用增加很快,为了节约空间,建议定期清除:

# 清除过期媒体
docker-compose run --rm web bin/tootctl media remove --days=14
# 清除孤立媒体(未被嘟文引用的媒体)
docker-compose run --rm web bin/tootctl media remove-orphans
# 清除无用嘟文(未被引用的或本地用户已不再关注的等)
docker-compose run --rm web bin/tootctl statuses remove

其中最占硬盘的就是媒体内容。这个清除语句可以放在crontab里定期执行。

推送到[go4pro.org]