跳转主页

拖延症复健之Docker搭建长毛象复盘

·3274 字·7 分钟
Mastodon
目录

拖了近俩礼拜,终于开机敲字了!

写在前面的话 - 嘟嘟!

这是我第二次建站了!

第一次建站采用的是从源代码安装,运行了三个月后,被自己炸了服务器……充分说明了备份的重要性啊友友们!

这一次参考的是《 如何利用Docker搭建Mastodon实例》。有了上一次的经验,这回称得上是非常顺利了(每一行代码至少直接能看明白跑的是什么,报错了也能针对报错提示去查一查,非常好,夸夸自己!)

建站时长四小时,成功时间2022年07月05日。

非常喜欢这里的小象

管理员你好
管理员你好

来吧,建站!

服务器、虚拟内存、域名、cloudflare配置好相关项,这些准备工作已经完成了的。直接登录VPS后,就可以从安装docker开始了

1. 安装docker和docker-compose(一键安装docker脚本)

bash <(curl -L https://get.docker.com/)
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

2. 拉取Mastodon镜像

mkdir -p /home/mastodon/mastodon
cd /home/mastodon/mastodon
docker pull tootsuite/mastodon:latest
wget https://raw.githubusercontent.com/tootsuite/mastodon/master/docker-compose.yml

代码块解释

  • 在服务器中创建目录/home/mastodon/mastodon,这里用来存放mastdon的相关代码,之后运行毛象的命令行时也是需要先进到这个目录中
  • 进入目录/home/mastodon/mastodon
  • :latest代表拉取最新版本的毛象代码(如有指定版本的需求,可以改成对应版本号,版本号的相关影响参考原教程,这里就按我自己的操作做个记录)
  • 从链接中下载文件

3. 修改docker-compose.yml配置文件

nano docker-compose.yml

nano是啥?

  • nano 是一个字符终端的文本编辑器, nano+文件名就代表着进入这个文件编辑
  • 这里的意思就是打开文件docker-compose.yml编辑

回车完毕,就进入编辑器了。

与我们常用的电脑上的记事本这类编辑器不同,在Linux的编辑器中,并不能实现用光标点击一下就能定位到任一字符上的效果。需要通过键盘的“上下左右”来移动光标位置,或者按住Alt键拖动鼠标,也可以快速定位到某一行,再经过方向键调整位置

说回来,找到webstreamingsidekiq分类,在每一类的image: tootsuite/mastodon后添加:latest 即:image: tootsuite/mastodon:latest


键盘ctrl+X

退出编辑器

  • 这时候编辑器会问你是否保存修改,按y,然后回车,就保存并退出了。

4. 初始化PostgreSQL

docker run --name postgres14 -v /home/mastodon/mastodon/postgres14:/var/lib/postgresql/data -e   POSTGRES_PASSWORD=设置数据库管理员密码 --rm -d postgres:14-alpine

对新手一定有用的提示

  • 设置密码时不要奇怪为毛敲完键盘没反应。原因只是敲的密码在屏幕上隐藏了,所以看不见!输完直接回车就好!!!
docker exec -it postgres14 psql -U postgres
CREATE USER mastodon WITH PASSWORD '数据库密码(最好和数据库管理员密码不一样)' CREATEDB;

暴躁废话

  • 这里的密码也一样。回车完就创建了一个mastodon用户。
  • 另外自己敲的密码请自己记住,不要屏幕上是空的,脑子里也是空的。
  • 如果敲完就忘怎么办?我也不知道咋办,但我能劝你重头再来……[礼貌微笑]
\q  #退出数据库
docker stop postgres14  #停止运行数据库容器

5. 配置Mastodon

先确认一下当前目录是不是/home/mastodon/mastodon,是的话走下面(不是的话cd进去)

touch .env.production

代码解释

  • touch 创建空白文件
docker-compose run --rm web bundle exec rake mastodon:setup

顺利的话,接下来会出现很多Questions,问你的站点域名是啥、是否启动单用户模式等等问题,每一条敲进你的Answer就好。

Domain name: #你的域名
Single user mode disables registrations and redirects the landing page to your public profile. #单用户模式禁用注册并将目标页面重定向到您的公共个人资料
Do you want to enable single user mode? No #不启用单人模式
Are you using Docker to run Mastodon? Yes #Docker运行长毛象
PostgreSQL host: mastodon_db_1
PostgreSQL port: 5432
Name of PostgreSQL database: mastodon
Name of PostgreSQL user: mastodon
Password of PostgreSQL user: #这里写上面给mastodon设置的数据库密码
Database configuration works! 🎆
Redis host: mastodon_redis_1
Redis port: 6379
Redis password: #直接回车,没有密码
Redis configuration works! 🎆
Do you want to store uploaded files on the cloud? No #是否将上传的文件存储在云上
Do you want to send e-mails from localhost? No #从本地主机发送邮件
SMTP server: #有注册好邮件服务商,填写服务商给的SMTP配置;如果没有配置邮件服务直接回车就好,会有对应的确认项,选择完会跳过邮件服务配置
SMTP port: 
SMTP username: 
SMTP password: 
SMTP authentication: 
SMTP OpenSSL verify mode: none
E-mail address to send e-mails “from”: 
Send a test e-mail with this configuration right now? no #是否限制就发送一封测试邮件
This configuration will be written to .env.production #此配置将会写入.env.production
Save configuration? Yes #保存配置
Below is your configuration, save it to an .env.production file outside Docker:

随后出现的配置,先复制粘贴进自己的文档里

接下来是建立数据库和编译,都选yes

接下来问是否建立Mastodon的账号

Do you want to creat an admin user straight away? Yes
Uername: #输入用户名,用户名具有唯一性,想好咯
E-mail: #输入邮箱

我这里连接不太稳定,返回报错了几次。没关系,尝试回车重连就好。

成功了会返回账号密码:

You can login with the password: #会给出长毛象管理员账号的密码,记得存下来,后面用这个密码就可以登录使用了
you can change your password once you login #登录后可以修改密码

这个时候问题都回答完毕了,接下来需要把配置保存进文件中

nano .env.production

聪明的小可爱会举一反三

把配置内容粘贴进去(内容复制好,在nano编辑器中点一下鼠标右键就复制进去了),保存退出。

docker-compose down
docker-compose up -d
chown 991:991 -R ./public
chown -R 70:70 ./postgres14
docker-compose down
docker-compose up -d

代码解释

  • 启动Mastodon
  • 为相应文件夹赋权

6. 安装并配置nginx

你可以不看,我必须要吐的槽

  • 建站四个小时,我在nginx这卡了俩小时……
  • 到现在为止关于nginx我都没搞懂那么一丢丢……
sudo apt install nginx -y #安装nginx

将以下nginx模板中复制粘贴进vscode,j将对应内容修改掉

  • example.com替换成你的域名(可以使用查找-替换)
  • 此条已修改。(20和43行的 /home/mastodon/live/public替换成/home/mastodon/mastodon/public
map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

upstream backend {
    server 127.0.0.1:3000 fail_timeout=0;
}

upstream streaming {
    server 127.0.0.1:4000 fail_timeout=0;
}

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHE:10m inactive=7d max_size=1g;

server {
  listen 80;
  listen [::]:80;
  server_name example.com;
  root /home/mastodon/mastodon/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 example.com;

  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;
  ssl_session_tickets off;

  # Uncomment these lines once you acquire a certificate:
  # ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
  # ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  keepalive_timeout    70;
  sendfile             on;
  client_max_body_size 80m;

  root /home/mastodon/mastodon/public;

  gzip on;
  gzip_disable "msie6";
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml image/x-icon;

  add_header Strict-Transport-Security "max-age=31536000" always;

  location / {
    try_files $uri @proxy;
  }

  location ~ ^/(emoji|packs|system/accounts/avatars|system/media_attachments/files) {
    add_header Cache-Control "public, max-age=31536000, immutable";
    add_header Strict-Transport-Security "max-age=31536000" always;
    try_files $uri @proxy;
  }

  location /sw.js {
    add_header Cache-Control "public, max-age=0";
    add_header Strict-Transport-Security "max-age=31536000" always;
    try_files $uri @proxy;
  }

  location @proxy {
    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 Proxy "";
    proxy_pass_header Server;

    proxy_pass http://backend;
    proxy_buffering on;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    proxy_cache CACHE;
    proxy_cache_valid 200 7d;
    proxy_cache_valid 410 24h;
    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
    add_header X-Cached $upstream_cache_status;
    add_header Strict-Transport-Security "max-age=31536000" always;

    tcp_nodelay on;
  }

  location /api/v1/streaming {
    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 Proxy "";

    proxy_pass http://streaming;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;
  }

  error_page 500 501 502 503 504 /500.html;
}

内容改好后

nano /etc/nginx/sites-available/你的域名 -y #配置nginx

在编辑器中粘贴保存

ln -s /etc/nginx/sites-available/你的域名 /etc/nginx/sites-enabled/  #配置镜像文件
nginx -t  #检查
systemctl reload nginx #重启nginx
#配置SSL证书
apt install snapd
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot certonly --nginx -d 你的域名
systemctl reload nginx #重启nginx
certbot renew --dry-run #检查证书自动更新

以上的部分我都跑着没啥问题,但一打开站点,就报Host Error。查了半天,运行下面这行,站点才上线成功~

certbot --nginx #签发SSL证书

到这里为止,在浏览器中输入你的域名,回车!就可以看见长毛象了!

CONGRATULATIONS!

  • 恭喜成为fedi宇宙中的站长一枚,使用管理员邮箱+密码登录吧~

顺手设置

7. 脚本简化tootctl命令行

cd /home/mastodon/mastodon
nano 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 /home/mastodon/mastodon/tootctl.sh
echo "alias tootctl='/home/mastodon/mastodon/tootctl.sh' " >> ~/.bashrc 
source ~/.bashrc

执行完成后,每次需要运行毛象命令行,就简化成以下步骤(以查看版本为例)

#登录服务器
cd /home/mastodon/mastodon #进入长毛象容器
tootctl --version #查看mastodon版本

8. 定时清理媒体文件

crontab -e

会问你使用哪个编辑器,(选nano!),将以下脚本内容粘贴保存

3 01    * * 1   docker exec mastodon_web_1 tootctl media remove-orphans
3 02    * * 2   docker exec mastodon_web_1 tootctl media remove --days=30
3 03    * * 3   docker exec mastodon_web_1 tootctl preview_cards remove

代码块解释

  • 每周一03:01 执行 扫描出不属于任何媒体附件的文件并移除它们
  • 每周二03:02 执行 清理30天之前的媒体文件
  • 每周二03:03 执行 移除本地预览卡片缩略图
  • 注意这里的时间均指服务器时间
  • 当然你也可以根据需要调整时间,以及查看 tootctl命令文档调整清理命令

写文后记

本来文章开开心心写完了,一推上去查看,页面显示不支持< 警告框语法>,

伤心惹。

又手动把警告框语法一条条改成引用语法,排版达不到想要的效果,而现在是凌晨两点二十二分,我不管,我要睡了。



最后更新于: 2022 年 7 月 16 日