Mastodon搭建小记

  1. 1. 准备
  2. 2. 正式开始
    1. 2.1. Mastodon主体配置
    2. 2.2. 前端代理配置

之前也有搭过好几个Masntodon测试站,于是这次就写个完整的教程吧,希望各位都能一次成功~
其实站点搭建并没有那么困难,官方已经做了相当多的简化措施,但是也有一些坑,稍不留意就会掉坑里(逃)
咱是使用docker搭建的Mastodon,这也是一种官方推荐的方法(易于管理,且易于迁移)
在正式开始之前,先来贴一份官方的教程~

准备

首先,Mastodon对于服务器的开销并不容小觑,你需要一台足够强大的服务器来承载它,其中内存需要>1G(1G也可能不够用,在编译资源时可能出错),CPU能强大一些尽量强大一些(Mastodon的周期同步峰对于CPU的压力还是不容小觑的)
我这台服务器是双核的,CPU承载仍然达到了快100%,单核的怕是要烫烫烫了(捂脸)

官方推荐使用Docker环境来承载,因此我们需要在服务器安装 DockerDocker Compose

正式开始

Mastodon主体配置

第一步自然是下载相关的文件了,官方给出的教程是下载到./live文件夹下,但是为了方便识别,我们可以下到~/mastodon文件夹下:

1
2
cd ~
git clone https://github.com/tootsuite/mastodon.git

等到传输完成,我们准备调整配置文件:

1
2
cd mastodon ## 把mastodon换成你下载到的文件夹的名称,咱给出的样例是mastodon文件夹
nano docker-compose.yml ## 用一个你喜欢的文本编辑器编辑docker-compose.yml配置文件

docker-compose的配置基本不需要更改,只是如果你想要使用预编译的二进制文件而不是花费大量时间来编译的话,用#注释掉三个build .即可。
三个build .分别在 web, streaming, sidekiq 三个模块下,逐个注释掉即可。
官方还提到了数据库的问题,如果没有取消掉db和redis的volume前的注释(卷映射)那么数据都无法迁移与永久保存,但是我配置时候看到的版本是都已经取消注释掉的(大概是太多人不仔细看,数据全丢了吧,官方于是就取消掉了这个默认的注释(光速逃))
然后需要复制样例的环境变量数据,否则无法开始配置。

1
cp .env.production.sample .env.production

复制完成之后就可以进入配置啦~
docker-compose build一下来准备必要的配置,如果之前注释掉了三个build那么此时应该能看到不少东西直接获取现成的,跳过编译的提示

记得先改一下文件夹权限,要不然站点上线之后可能会出现问题:

1
chown -R 991:991 public

但是官方的说明有一点疏漏,就是这么操作还不够,在上线之后还需要修改./public/system文件夹的权限,否则无法上传文件。因此请先记在心里,后面我们会再提到(如果忘了请别打我)
然后就可以开始配置啦~

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

等下载完成之后会进入交互式配置(大写的字母表示默认),依次输入

  • (填空)站点名(就是站点域名,也就是用户名后面跟的那一串,不含http/https协议头,形如example.com,这个很重要,设置错了或是后期修改了就会出现严重的找不到用户情况,请一定保证输入正确)
  • (选择填空)是否开启单用户模式(默认否,如果仅是个人站可以选择是,那样的话访问域名则直接跳转到个人页面,我们是多用户那么直接回车确认,单用户请输入y然后回车)
  • (选择填空)是否使用Docker来运行(默认是,我们确实是Docker运行,那么直接回车)
  • (带默认参数的填空)两套数据库的一些配置,保持默认,全部回车来确认即可,能连接上的,非Docker运行环境请根据自己的实际情况进行调整以适配
  • (选择填空)是否将文件上传到云端(默认否,我们没有云端服务器,那么保持否即可,直接回车)
  • (选择填空)是否从本地发送邮件(默认否,如果要从本地发送请选择是,我们使用了sendgrid的服务器,因此选择否,直接回车)
  • (带默认参数的填空)远程邮件服务器地址,默认是mailgun,但是我们用的是sendgrid,因此输入smtp.sendgrid.net,回车)
  • (带默认参数的填空)远程服务器端口(默认是587,sendgrid用的也确实是587,直接回车即可)
  • (填空)SMTP用户名(输入用户名,我们用了SendGrid的api,因此我们输入apikey,如果你是用的是其他验证方式请和相应的服务商取得联系(或参阅他们的说明文档))
  • (不显示文字的填空)SMTP密码(我们用的是apikey,因此输入apikey的具体内容即可,参阅邮件服务提供商给出的说明)
  • (带默认参数的填空)SMTP验证方式(默认是plain,sendgrid可以用plain的,具体参见服务商的说明)
  • (选择)OpenSSL验证方式(嫌配置起来麻烦,所以选择none不验证,直接回车(被打))
  • (带默认参数的填空)发件人(参照提供的样例书写即可,乱写可能导致被当成spam拒绝掉)
  • (填空选择)是否发送一封测试邮件(可以发一封试一试,接下来写收件人地址就可以了,嫌麻烦所以我没试(迷の自信(光速逃跑)))
  • (填空选择)是否保存配置(这个很迷,你不选是就前功尽弃,连配置内容都不会给你输出显示,选了是它也不会自动保存,还是得手动写出文件,但是必选是,默认也是是,所以直接回车即可)

然后你就会看到一大段配置项,注意:配置项此时仅存在容器里,还得手动写出
最新的程序似乎说会自动将配置项暂存在容器里,因此可以直接开始准备数据库和编译文件,但是我没有试(被坑过的某喵),所以可以直接开始准备数据库、编译样式与准备管理员账户。也可以先保存配置项,然后再去准备这些东西(不知道是不是会直接读配置还是使用配置,现在想来当时乱敲配置还有点小害怕)
我的方法是先不准备这些东西,退出配置进程,复制刚才生成的那一大段配置信息,rm .env.production删掉环境文件样例,再nano .env.production新建,粘贴配置内容,Ctrl+O写出Ctrl+X关闭,然后重新运行docker-compose run --rm web bundle exec rake mastodon:setup进行配置。(咱就是这里乱敲配置,现在想想觉得有点害怕,为了防止出事要不还是认真敲一遍吧(光速逃跑))
这一遍就可以准备数据库和编译资源文件了,注意编译资源文件非常耗资源,有必要的话请使用swap文件
数据库准备完成,资源编译完成,创建一个管理员账户,就可以使用生成的随机密码登入系统啦~密码可以在后台进行修改的说~
但是还没完…还记得之前提到的权限问题吗?如果不开权限那么文件上传会失败,因此请:

1
2
cd ~/mastodon/public ## 如果过程中没变化路径的话就不需要这一行啦
chown -R 991:991 system

完成之后,就可以

1
docker-compose up -d

开启服务啦~

前端代理配置

但是此时mastodon还是无法访问…为什么呢?因为mastodon使用的是3000和4000端口(其中3000端口用于提供主体资源,4000端口用于提供api长连接),我们需要一个反向代理服务器来配置这些文件。我们以nginx为例,因为嫌麻烦所以直接将nginx装在docker外面
以Ubuntu/Debian为例,用apt安装:

1
2
3
apt update
apt upgrade
apt install nginx

安装完成之后我们需要配置nginx的内容,这里给出一个配置样例(我们使用了HTTPS+HSTS Preload技术,不想使用的请务必删去相关行…):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
server {
listen 80;
#listen [::]:80;
server_name lcy.moe;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name lcy.moe;
## SSL
ssl_certificate /etc/nginx/ssl/lcy.moe.crt;
ssl_certificate_key /etc/nginx/ssl/lcy.moe.key;

## reverse proxy

location / {
proxy_pass http://127.0.0.1:3000;
include conf.d/shared/proxy.conf;
add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload" always;
}
location /api/v1/streaming/ {
proxy_pass http://127.0.0.1:4000/;
include conf.d/shared/proxy.conf;
proxy_buffering off;
proxy_redirect off;
tcp_nodelay on;
}

}

其中conf.d/shared/proxy.conf为手动创建的通用的代理配置,放置在/etc/nginx/conf.d/shared/proxy.conf,内容如下:

1
2
3
4
5
6
7
8
9
10
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;

完成!记得安装SSL证书(如果你用的是HTTPS的话)
然后就可以systemctl restart nginx重启nginx服务,来访问站点啦~