Mastodon | 小球飞象建站笔记

4295字

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

踩在2021年的尾巴上也当了站长,在魔改前总之先记一下建站过程。


参考教程和鸣谢

小球飞象的搭建总体以Docker快速部署Mastodon教程为基础,参考pullopen的部分配置,象友Roelxy纯之手把手教学,前后大约花费16小时,重装VPS 3次。

两位象友都是搭博客过程中认识的,都给予了非常重要的帮助,非常感谢!


搭建过程

购买VPS

之前看建站教程,大部分推荐Vultr,但被象友告知,Vultr的5刀套餐不怎么好用,只有1G的内存和25G的SSD,内存太小需要开虚拟内存,硬盘太小也很容易装满,再升级就是每月10刀,又有点贵。不如换Contabo的7刀套餐,8G内存、200G SSD和1个快照,建完站还能搭点别的服务。

于是等到黑五,购买前先把价格修改成欧元,黑五期间免设置费,一次购买12个月免1个月,同时美国机房免附加费用。最后买了4.99欧/月的套餐,机房选了西雅图,后面的全部默认,用Visa付款,最终费用为54.88欧/年,大概是400人民币?

Contabo人工审核比较严格,一旦审核不通过则需要真实身份信息,所以要以真实IP购买,同时填写身份地址信息时不要太扯(。

我自己的审核非常快,付款后不到10分钟就发来了VPS信息邮件,这封邮件里有Contabo账号和VPS IP、密码等信息,收到后最好保存起来。


Termius

Termius是个终端,可以远程连接服务器,多平台通用,挺好看。

下载后先换个快捷键,Termius默认复制粘贴快捷键是Ctrl+Shift+C/Ctrl+Shift+V,为了方便起见改成熟悉的Ctrl+CCtrl+V。然后点New host,在adress部分输入Cantabo提供的IP address,双击新增的host,输入账号密码。

注:西风提醒我说终端不用Ctrl+C作复制的快捷键,是因为在终端中,Ctrl+C的作用是“中断当前进程”,后面也用到了它中断当前进程的功能,我临时把快捷键改了回来。


开始搭建

从买VPS到搭站成功一共16小时,不清楚是不是Pullopen站的教程过期,总之二八法则诚不欺我,差不多13小时都在踩坑,很多坑最后我也没弄明白怎么回事,非常稀里糊涂,能跑起来真是谢天谢地谢Roelxy耳提面命一步一步教命令和确认结果,谢纯之教会我遇事不决重装VPS,谢我自己周天早上一拍脑门换参考教程。

这里只记一下大概的步骤流程,本来打算把所有命令的反馈和检查也记一下的,但我不小心把终端整个儿关了查不到历史记录,非常遗憾。

域名我之前就有,更换名称服务器为Cloudfare的名称服务器,在Cloudfare激活站点,之后新添子域名,A记录指向VPS IP,将代理状态改为仅限DNS。

邮件用了Zoho的邮箱服务,但没有配置好,暂时先搁置了。


首先在Contabo控制面板重装VPS(之前没搞定,有残留且删不掉的数据库,干脆重装),重装时系统换成Debian10(之前用Ubuntu20.04也总报错,不确定是不是Ubuntu的问题,但据纯之说他用Debian10没问题,玄学一下)

之后按Docker快速部署Mastodon的教程来,补充了一些操作时看的内容,仅供参考:

安装需要用到的软件包:Curl 的用法指南

apt -y update
apt -y install curl git nginx python-certbot-nginx

安装Docker:Systemd 入门教程:命令篇

curl -sSL https://get.docker.com/ | sh
systemctl enable --now nginx docker

安装Docker-compose:Linux chmod命令

curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

之后检查一下是不是装好了:

docker -v //检查Docker版本
Docker version 20.10.11, build dea9396 //返回内容
docker-compose --version //检查Docker-compose
docker-compose version 1.27.4, build 40524192 //返回内容

按Lalaim的教程,长毛象配置文件夹(也就是yml所在的文件夹)是/opt/mastodon,所以之后拉取文件在opt目录下进行,拉取后定位到/opt/mastodon再操作其他的。

cd /opt
git clone https://github.com/tootsuite/mastodon.git
cd mastodon/

复制配置文件,再重命名原来自带的配置文件:Linux cp 命令Linux mv 命令

cp .env.production.sample .env.production
mv docker-compose.yml docker-compose.yml.bak

编辑docker-compose.yml

nano docker-compose.yml

之后开始修改配置,这里要参考Pullopen的教程,把数据库版本之类的改一改:

version: '3.5'

services:
  mastodon-db:
    image: postgres:9.6-alpine //这里把9.6换成12.5
    shm_size: 256mb
    environment:
      POSTGRES_DB: mastodon //注意名称为mastodon
      POSTGRES_USER: 设置为你想要的数据库用户名
      POSTGRES_PASSWORD: password //数据库密码
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "postgres"]
    volumes:
      - ./postgres:/var/lib/postgresql/data
    restart: unless-stopped

  mastodon-redis:
    image: redis:6.0-alpine
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
    volumes:
      - ./redis:/data
    restart: unless-stopped

  mastodon-web:
    image: tootsuite/mastodon //改为image: tootsuite/mastodon:latest
    env_file: .env.production
    command: bash -c "rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000"
    depends_on:
      - mastodon-db
      - mastodon-redis
    healthcheck:
      test: ["CMD-SHELL", "wget -q --spider --proxy=off localhost:3000/health || exit 1"]
    ports:
      - "127.0.0.1:3000:3000"
    volumes:
      - ./public/system:/mastodon/public/system
    restart: unless-stopped

  mastodon-streaming:
    image: tootsuite/mastodon //改为image: tootsuite/mastodon:latest
    env_file: .env.production
    command: node ./streaming
    depends_on:
      - mastodon-db
      - mastodon-redis
    healthcheck:
      test: ["CMD-SHELL", "wget -q --spider --proxy=off localhost:4000/api/v1/streaming/health || exit 1"]
    ports:
      - "127.0.0.1:4000:4000"
    restart: unless-stopped

  mastodon-sidekiq:
    image: tootsuite/mastodon //改为image: tootsuite/mastodon:latest
    env_file: .env.production
    command: bundle exec sidekiq
    depends_on:
      - mastodon-db
      - mastodon-redis
    volumes:
      - ./public/system:/mastodon/public/system
    restart: unless-stopped

然后开始配置Mastodon,运行:

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

出现Domain name时,依次输入以下配置

Domain name: # Mastodon域名
Do you want to enable single user mode? # Yes //这里也可以用no,单人模式下不开放注册页面,访问域名会直接跳转到你的Mastodon主页
Are you using Docker to run Mastodon? # Yes
PostgreSQL host: # mastodon-db //注意名称
PostgreSQL port: # 5432 //默认端口,直接回车就行
Name of PostgreSQL database: # mastodon //注意名称
Name of PostgreSQL user: 刚刚填的数据库用户名
Password of PostgreSQL user: # 刚刚写的数据库密码,填写时不显示填写内容,盲敲后回车就行,出错/成功时都有很明显的提示
Redis host: # mastodon-redis //注意名称
Redis port: # 6379 //默认端口,直接回车
Redis password: # 留空,直接回车
Do you want to store uploaded files on the cloud? # No //这里是问文件要不要上云存储,可以暂时先不上,之后再根据情况做修改
Do you want to send e-mails from localhost? # Yes //是不是从主机发邮件?
Send a test e-mail with this configuration right now? # No //问是不是要发测试邮件,No掉它
Save configuration? Yes //是否保存

Yes后会立刻返回一大段内容,格式和上面这段代码块差不多,立刻保存下来,之后要用。

看到这段提示后退出来,教程说Ctrl+C退出,但之前我把Ctrl+C改成了复制键,这里改回来也很简单,Termius有不同的快捷键文件,暂时改回原来的文件就好。

Prepare the database now? (Y/n)

之后清空默认配置,并编辑配置文件,把刚刚保存的配置内容复制进去:如何使用echo指令向文件写入内容

echo > .env.production
nano .env.production

再重新运行一次配置向导,确保配置和上面保持一致

docker-compose run --rm mastodon-web bundle exec rake mastodon:setup
Prepare the database now? (Y/n) # Yes
Compile the assets now? (Y/n) # Yes
Do you want to create an admin user straight away? Yes //创建管理员账号,这一步会为你创建一个Mastodon账号
Username:Mastodon账号名
E-mail: 填个常用邮箱吧
You can login with the password:这部分是Mastodon密码,记得保存
You can change your password once you login.

开启容器内服务,把public的目录所有者改为容器内的

docker-compose up -d
chown -R 991:991 public

复制nginx的站点配置文件并编辑

cp /opt/mastodon/dist/nginx.conf /etc/nginx/conf.d/mastodon.conf
nano /etc/nginx/conf.d/mastodon.conf

改动配置文件内容如下:

……

server {
    if ($host = toot.mantyke.icu) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


  listen 80;
  listen [::]:80;
  server_name Mastodon域名; 
  root /opt/mastodon/public; //改为public目录的绝对路径
  location /.well-known/acme-challenge/ { allow all; }
  location / { return 301 https://$host$request_uri; }


}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name Mastodon域名;
  
  ……

  root /opt/mastodon/public; //改为public目录的绝对路径
  
  ……

最后签发SSL证书,有一些需要选择的部分看情况选就行了

certbot --nginx

稍等一会儿,刷新Mastodon域名,就看到站点上线了,Hello World!


遇到的坑

这里大概写一下遇到的坑……遇到挺多坑的,大部分也没搞清楚,总之于遇事不决上VPS控制面板重装机器,人是光脚不愁嘛。

一开始走到最后一步发现域名只能显示Nginx页面,可能是数据库出错。想把数据库删掉,但用了各种方法都还残留了一部分。只能重装机子后再搞,但证书又装不上,装上了又有个什么服务在不断重启启动失败,伴随着全过程的zoho邮箱配置失败,总之焦头烂额。

常用重启功能:

docker-compose down
docker-compose up -d

猜测Zoho配置失败是因为SMTP server用了欧洲版的地址(smtp.zoho.eu),改成国际版(smtp.zoho.com)可能就可以了,暂时不考虑开放注册,因此再说再说。

通过管理命令行也可以增加账号,不打算增加太多用户的话,好像也没必要一定配置邮件功能。

4.29日补充:数据库出错,不断重启,之后找到了一个解决办法(没有尝试过)可能有效:列出资料库容器并删除相关数据,命令如下:

docker volume ls -q 列出资料库容器
docker volume rm 容器名称 #删除数据

Zoho配置失败的猜想是正确的,是因为SMTP server需要配置为国际版的地址,附上我之后使用的配置做参考:

SMTP_SERVER=smtp.zoho.com
SMTP_PORT=587
SMTP_LOGIN=admin@mantyke.icu(设定好的zoho发件邮箱)
SMTP_PASSWORD=密码
SMTP_AUTH_METHOD=plain
SMTP_OPENSSL_VERIFY_MODE=none
SMTP_FROM_ADDRESS=mastodon <admin@mantyke.icu>

后续魔改

参考教程:Mastodon | 采用docker建站后的使用与维护,提到了后续升级的办法、使用alias脚本缩写tootctl命令、部署媒体文件外部存储服务和定期清理外站媒体文件。

Pullopen的搭建教程还提到了开启全文搜索、修改配置文件、使用管理命令行、备份数据库的方法

利用Docker进行魔改进阶魔改:修改字数上限、媒体上限、投票上限、添加自定义主题、界面用语、非登陆用户有限显示,附阻止本站嘟文流入某站点方法。

站点CSS修改:长图补丁、高级Web铺满页面、Tag高亮显示、放大Emoji、加上猫耳头像、自定义站点表情。

修改站点图标,但这个好像是根据托管服务进行的,暂时先放在这里。

进度:在Contabo建立了无魔改的镜像,预计下周开始对站点进行修改。


一点感想

这一段写来写去都觉得怪矫情的,既不像我的画风,也实在写不下去,干脆都删了。其实就是挺感慨,想起我的第一个Mastodon账号建立于2017年,那时候Pwaoo.net实例在微博上被热转,我向来是好奇心重,就去注册了一个——注册完后迅速抛开,毕竟当时谁能从微博搬家呢?我需要微博的这个,也需要微博的那个,热闹、新鲜、讨论和观点。

2018年去了草莓县,草莓县关闭后又搬到新草莓县,几次搬家潮后中文Mastodon忽然兴盛起来,我逛来荡去,在各个实例切了分身,视心情做过主站,认识又告别了许多人,一转眼已经是2021年,Mastodon已经成了我的碎碎念重地,也围绕它建立了新的网络社交关系。世事有趣,2017年时不能想象几年后天地逼仄至此,当然也无从想象彼时一点蓬勃好奇,到如今竟然应在这里。

又觉得真是有意思,我恨极了审查,但如果外部互联网没有糟烂至此,我当然也不会于此时此地此刻来写建站日志,这几年内外交煎,安全感全丧,反而迫得我从搭积木开始为自己建筑小天地,最终竟然有所收获。搭站过程中看Roelxy的Blog,看到她写“三个月从:wq到虚拟机再到购买主机开始建站,从谷歌如何用vm打开一个新的虚拟机到能用命令行基础运维一个网站,我也没想到有些事情我就是能”看得发愣,哎,我也想不到我竟然能。