Mastodon 装修笔记:建站后还可以做什么

简单记录一下建站后都对站点进行了哪些改动,文中每一步都已有大佬写过教程,本文仅作记录

参考

本文主要参考的教程:
[1] 如何装饰你的站点:自定义CSS、中继站和自定义表情
[2] 进阶魔改:修改字数上限、媒体上限、投票上限、添加自定义主题、界面用语、非登陆用户有限显示、优化中文搜索,附阻止本站嘟文流入某站点方法

装修升级命令

如果使用 DockerHub 建立镜像辅助搭建、修改实例,则每次装修可电脑上修改完成后,push 到 GitHub,GitHub 自动编译完成且推送到 DockerHub后,在服务器端直接使用命令:

1
2
3
cd /home/mastodon/mastodon
docker pull melocery/mastodon:latest
docker-compose up -d

教程:如何利用Docker搭建Mastodon实例(二):进阶魔改篇

利用脚本缩写 tootctl 命令

根据官方文档:使用管理命令行,每次需要运行的命令行很长,使用脚本可以将命令缩写。
打开 mastodon 的目录,并写入脚本:

1
2
cd /home/mastodon/mastodon
nano tootctl.sh

脚本内容为:

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
#!/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

保存并退出后,执行命令:

1
2
3
chmod +x /home/mastodon/mastodon/tootctl.sh
echo "alias tootctl='home/mastodon/mastodon/tootctl.sh' " >> ~/.bashrc
source ~/.bashrc

之后使用管理命令就可以直接使用 tootctl

待处理的数据库迁移

这个一般出现在经历较大的站点升级或较多魔改之后 (我的站点初始搭建之后就出现了这行提醒),在管理员账号的管理面板会出现的一个提醒:有待处理的数据库迁移。请运行它们以确保应用程序正常运行。
找了很多 docker 搭建教程都没有提到这一步,由于对 docker 不熟悉,也不知道从何改起,直到看到Mastodon | 记录大型魔改过程。此时需要数据库迁移:

1
docker-compose run --rm web rails db:migrate

另外,还需要运行命令 tootctl cache clear 以避免出现与站外通信延迟较高的问题。成功执行后,运行命令重启服务器,否则数据库迁移不生效。

1
2
docker-compose down
docker-compose up -d

自定义 CSS

参考来自:如何装饰你的站点:自定义CSS、中继站和自定义表情
所有更改在 管理—网站设置-自定义css 进行。

表情包鼠标悬停放大

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
/* START mastodon emoji scaling by @eh5@eh5.me */
.account__header__content,
.reply-indicator__content,
.status__content:not(.status__content--collapsed) {
overflow: unset;
}
.account__header__content .emojione,
.reply-indicator__content .emojione,
.status__content:not(.status__content--collapsed) .emojione {
position: relative;
z-index: 10;
transform-origin: center;
/* Animation duration */
transition: 200ms ease-in-out;
}
.account__header__content .emojione:hover,
.reply-indicator__content .emojione:hover,
.status__content:not(.status__content--collapsed) .emojione:hover {
z-index: 11;
/* Scale up 2.3 times */
transform: scale(2.3);
/* shadows around image edges */
filter: drop-shadow(0 0 1px #282c37);
}
.directory__card .account__header__content .emojione:hover {
transform: unset;
}
/* END mastodon emoji scaling by @eh5@eh5.me */

长图补丁

使具体图片铺满整个页面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.image-loader {
align-items: center;
}
.zoomable-image {
display: flex;
max-height: 100%;
max-width: 98%;
overflow: auto !important;
}

.zoomable-image img {
max-height: 100%;
max-width:100%;
}

Tag高亮显示(蓝色)

颜色可以通过修改background-color和border-color修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*hashtag style blue by slashine 071320*/
.mention.hashtag{
background-color: #93AEFD36;
padding: 0px 4px;
text-align: center;
text-decoration: none;
display: inline-block;
border-style: dashed;
border-color: #93AEFD;
border-width: 0.5px;
border-radius: 2px;
margin-top: 2px;
margin-bottom: 2px;
}

自定义表情

网页端:管理员界面

管理员账号的 首选项 - 管理 - 自定义表情 - 上传新表情,可上传大小不超过 50kb 的 png 或 gif 格式的图作为表情包。
偷别站表情可通过 首选项 - 管理 - 自定义表情 - 远程,选择想要的表情包,复制后即可在本站看到并管理该表情。

服务器端:偷表情神器

使用 emojidownloader 直接从他站复制一个或多个分类下的表情。
在项目的 releases 界面找到 emoji_downloader_linux_x86_64,右键复制链接。在服务器合适的目录下:

1
2
3
wget https://github.com/Starainrt/emojidownloader/releases/download/v0.1.0/emoji_downloader_linux_x86_64 # 复制的链接,可能有变化
chmod +x ./emoji_downloader_linux_x86_64
./emoji_downloader_linux_x86_64

运行 ./emoji_downloader_linux_x86_64,根据提示一步步操作即可。此处具体步骤可参考:Mastodon | 记录大型魔改过程 #从他站爬取自定义表情包

表情包下载至服务器后需要拷贝到容器中,并导入数据库:

1
2
3
# 以 neodb 的星星表情为例
docker cp /root/myEmojis/neodb.tar.gz mastodon_web_1:/tmp/neodb.tar.gz
docker-compose exec web bin/tootctl emoji import --category=neodb /tmp/neodb.tar.gz

定期清理外站存储

参考此方的教程:Mastodon 媒体存储和数据库备份,直接启动容器执行tootctl命令。
通过 crontab -e 设置定时任务:

1
2
3
30 2 * * *  docker exec mastodon_web_1 tootctl media remove --days=14 >> /home/mastodon/log/mastodon/all.log 2>&1
30 2 * * * docker exec mastodon_web_1 tootctl media remove-orphans >> /home/mastodon/log/mastodon/all.log 2>&1
30 2 * * * docker exec mastodon_web_1 tootctl statuses remove --days=180 >> /home/mastodon/log/mastodon/all.log 2>&1

修改实例字数上限

参考 commit 在相应位置进行修改。修改后 precompile 和重启。
蓝盒子站长提示:3.3.0 版本后,app/javascript/mastodon/features/compose/components/compose_form.js 修改会发生变化,请先接受官方文件,然后在该文件中将所有 500 改成你的字数上限,一共2处。

修改投票上限

参考 Commit 在相应位置进行修改。修改后 precompile 和重启。

添加自定义主题

直接从他站拷贝主题:

  1. 进入他站代码库的 app/javascript 文件夹,在 fonts、images 和 styles 文件夹内选择想要添加的主题,将相关文件复制入代码库。
    • 蓝盒子站代码库:pullopen
    • 蓝盒子站长提示:Win95 主题还需要在 config/webpacker.yml 中加一行 - .gif 才可编译。
  2. 修改 config/themes.yml
    • 根据格式 witches-town: styles/witches-town.scss 将添加的主题都写入文件
  3. (可选) 修改 config/locales/en.ymlconfig/locale/zh-CN.ymlthemes 部分,给主题起英文名和中文名。注意这里需要按照原名的字母顺序排列。
  4. precompile 和重启。

自己写主题则将主题文件放在相应的位置,修改配置文件,precompile 和重启即可。

修改界面用语

修改中文界面用语,可通过修改 app/javascript/mastodon/locales/zh-CN.json 实现。
如开启 “注册时需要批准” 功能,可在 “你为什么想要加入?” 下加入一段注册提示语。 在 mastodon/config/locales/simple_form.zh-CN.yml 找到 invite_request 项,修改 text

主页对非登陆用户只显示10条嘟文

根据 Commit 修改相应文件。

Docker 安装优化中文搜索

参考 进阶魔改:修改字数上限、媒体上限、投票上限、添加自定义主题、界面用语、非登陆用户有限显示、优化中文搜索,附阻止本站嘟文流入某站点方法 的 “Docker 安装优化中文搜索(2022-04-25新增)” 部分。

阻止本站嘟文流入某站

在服务器修改 nginx 配置:

1
nano /etc/nginx/sites-available/musain.cafe # 以本站为例,一般为实例名

1
2
3
server {
listen 443 ssl http2;
server_name musian.cafe;

后添加

1
2
3
if ($http_user_agent ~* "对方域名不带前后缀") {
return 403;
}

保存并退出。使用命令 systemctl reload nginx 重启 nginx。

屏蔽国内浏览器及搜索爬虫

蓝盒子站长提示:此方法有一定机率误伤使用国内手机的用户,请务必全面通知后再使用!

使用 Cloudflare 可在防火墙规则中添加:如果

1
(http.host eq "【站点地址】" and not lower(http.user_agent) contains "feedly" and not lower(http.user_agent) contains "pleroma") and ((lower(http.user_agent) contains "2345") or (lower(http.user_agent) contains "360") or (lower(http.user_agent) contains "ali-") or (lower(http.user_agent) contains "alipay") or (lower(http.user_agent) contains "baidu") or (lower(http.user_agent) contains "bingbot") or (lower(http.user_agent) contains "bytespider") or (lower(http.user_agent) contains "coolnovo") or (lower(http.user_agent) contains "duckduckgo") or (lower(http.user_agent) contains "easou") or (lower(http.user_agent) contains "facebook") or (lower(http.user_agent) contains "google") or (lower(http.user_agent) contains "huaweibrowser") or (lower(http.user_agent) contains "iaskspider") or (lower(http.user_agent) contains "iqiyi") or (lower(http.user_agent) contains "jike") or (lower(http.user_agent) contains "lbbrowser") or (lower(http.user_agent) contains "liebao") or (lower(http.user_agent) contains "maxthon") or (lower(http.user_agent) contains "meizu") or (lower(http.user_agent) contains "metasr") or (lower(http.user_agent) contains "micromessenger") or (lower(http.user_agent) contains "miui") or (lower(http.user_agent) contains "miuibrowser") or (lower(http.user_agent) contains "msnbot") or (lower(http.user_agent) contains "oneplus") or (lower(http.user_agent) contains "oppo") or (lower(http.user_agent) contains "qihoo") or (lower(http.user_agent) contains "qiyu") or (lower(http.user_agent) contains "qq") or (lower(http.user_agent) contains "saayaa") or (lower(http.user_agent) contains "se 1.x") or (lower(http.user_agent) contains "se 2.x") or (lower(http.user_agent) contains "sina") or (lower(http.user_agent) contains "sogou") or (lower(http.user_agent) contains "soso") or (lower(http.user_agent) contains "taobao") or (lower(http.user_agent) contains "taobrowser") or (lower(http.user_agent) contains "tencent") or (lower(http.user_agent) contains "teoma") or (lower(http.user_agent) contains "the world") or (lower(http.user_agent) contains "twitter") or (lower(http.user_agent) contains "ucweb") or (lower(http.user_agent) contains "vivo") or (lower(http.user_agent) contains "wechat") or (lower(http.user_agent) contains "weibo") or (lower(http.user_agent) contains "xiaomi") or (lower(http.user_agent) contains "yahoo") or (lower(http.user_agent) contains "yandexbot") or (lower(http.user_agent) contains "yisou") or (lower(http.user_agent) contains "yodao") or (lower(http.user_agent) contains "youdao") or (lower(http.user_agent) contains "zte"))

则阻止。

不使用 Cloudflare 可在 nginx 的配置文件的 server { } 括号中添加:

1
2
3
if ($http_user_agent ~* (2345|360|ali-|alipay|archive|baidu|bingbot|bytespider|coolnovo|duckduckgo|easou|facebook|google|huaweibrowser|iaskspider|iqiyi|jike|lbbrowser|liebao|maxthon|meizu|metasr|micromessenger|miui|miuibrowser|msnbot|oneplus|oppo|qihoo|qiyu|qq|saayaa|se\ 1.x|se\ 2.x|sina|sogou|soso|taobao|taobrowser|tencent|teoma|the\ world|twitter|ucweb|vivo|wechat|weibo|xiaomi|yahoo|yandexbot|yisou|yodao|youdao|zte)) {
return 403;
}

为站点添加 local-only

参考此方的教程:Mastodon | 以 local-only 代码合并为例浅谈如何合并特定 commit,具体步骤不再赘述。

增加 sidekiq 线程

参考 mastodon 增加 sidekiq 线程 修改相应内容。

修改昵称字数上限

参考 Commit 修改相应内容。