拖延症复健之Docker搭建长毛象复盘
目录
拖了近俩礼拜,终于开机敲字了!
写在前面的话 - 嘟嘟!
这是我第二次建站了!
第一次建站采用的是从源代码安装,运行了三个月后,被自己炸了服务器……充分说明了备份的重要性啊友友们!
这一次参考的是《 如何利用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
键拖动鼠标,也可以快速定位到某一行,再经过方向键调整位置。
说回来,找到web
、streaming
、sidekiq
分类,在每一类的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 日