在 Docker 部署的 Mastodon (4.5.0) 中修改嘟文字数限制
教你如何通过极简、安全、可维护的方式修改 Mastodon 字数上限,完全兼容 Mastodon 更新。无需修改前端,也无需重新编译前端资源。
Mastodon 默认限制嘟文最大为 500 字符。
对于自建实例来说,你可能希望将字数扩展到:
-
1500 字
-
3000 字
-
5000 字(本文示例)
-
或任意你需要的值
然而,使用 Docker 部署的 Mastodon 无法直接修改容器内文件,官方镜像也没有暴露可配置项,因此必须采取覆盖代码的方式。
本教程将教你如何通过 极简、安全、可维护 的方式修改字数上限,并且完全兼容 Mastodon 更新。
🧱 原理说明
Mastodon 的发布长度限制由 后端 Rails 验证器决定:
app/validators/status_length_validator.rb
你只需要覆盖其中的:
MAX_CHARS = 500
即可改变嘟文的最大长度。
在最新版本中:
Mastodon 前端会自动从后端读取此限制,因此 无需修改任何前端代码。
这使得整个流程非常简洁且稳定。
📂 最终效果示例(本教程以 5000 字为例)
-
发布框显示最大 5000 字
-
超过 5000 会提示字数错误
-
官方更新不影响你的测设
-
不需要重新编译前端(只有 Ruby 文件更改)
🛠️ 操作步骤(Docker 部署)
以下以 /opt/mastodon 为部署目录为例。
① 创建 overrides 目录(用于存放覆盖文件)
cd /opt/mastodon mkdir overrides
② 新建后端覆盖文件:status_length_validator.rb
路径:
/opt/mastodon/overrides/status_length_validator.rb
内容(参见:# status_length_validator.rb):
class StatusLengthValidator < ActiveModel::Validator
# 修改为你想要的最大字数
MAX_CHARS = 5000
URL_PLACEHOLDER_CHARS = 23
URL_PLACEHOLDER = 'x' * 23
....
end
这段代码将覆盖官方镜像中的对应文件。
③ 在部署目录创建 Dockerfile(用于覆盖后端文件)
文件路径:
/opt/mastodon/Dockerfile
内容:
FROM ghcr.io/mastodon/mastodon:latest
# 只覆盖后端验证文件(无需重编译前端)
COPY overrides/status_length_validator.rb /opt/mastodon/app/validators/status_length_validator.rb
这是最小、最稳定的方式。
④ 修改 docker-compose.override.yml 来使用自定义镜像
找到 web: 和 sidekiq: 部分,将:
image: ghcr.io/mastodon/mastodon:latest
改为:
build: .
image: mastodon-custom:latest
示例:
web:
build: .
image: mastodon-custom:latest # (修改这一行)
restart: always
env_file: .env.production
command: bundle exec puma -C config/puma.rb
depends_on:
- db
- redis
sidekiq:
build: .
image: mastodon-custom:latest # (修改这一行)
restart: always
env_file: .env.production
command: bundle exec sidekiq
depends_on:
- db
- redis
两个服务都需要使用同一镜像。
⑤ 构建并重启服务
在 /opt/mastodon 执行:
docker compose build docker compose down docker compose up -d
构建速度非常快,因为没有重新编译前端。
✅ 验证修改是否成功
进入你的 Mastodon 网页:
-
打开发嘟窗口
-
输入超过 500 字文本(例如 800/1500/3000)
-
输入框左下角会正确显示新的最大字数
-
发布成功(只要 ≤ 5000)
-
超过 5000 字会提示”Status too long: max 5000”
如果以上均正常,你的修改已生效。
🧩 常见问题(FAQ)
1. 前端需要修改吗?需要构建前端吗?
不需要。
最新的 Mastodon 会自动从后端读取字数限制,在界面中同步显示。
2. 更新 Mastodon 会覆盖这个修改吗?
不会。
因为:
-
你使用了自定义 Dockerfile
-
官方镜像更新后,你覆盖文件仍然会被 COPY 在最终镜像中
只要你的 overrides 文件夹不变,更新也不会影响。
3. 我能设置成无限字数吗?
不建议。
建议设置合理范围:
-
1500:适合轻松长文
-
3000:社区常见值
-
5000:较长但不失控
-
10000:可能影响数据库存储与 UI 行为
4. Sidekiq 必须使用同一镜像吗?
是的。
因为 Sidekiq 也需要验证字数(例如处理后台发布或重写嘟文)。
🎉 总结
使用 Docker 部署的 Mastodon 修改字数上限,只需要:
-
新建覆盖目录
-
放入修改后的 Ruby 验证文件
-
用 Dockerfile 覆盖该文件
-
在 docker-compose.override.yml 指向自定义镜像
-
构建 + 重启
无需修改前端,也无需重新编译前端资源。
这是目前最稳定的做法。