Mobilizon 5.2.4 配置参数详解
Mobilizon 5.2.4 配置体系全解:.env→config.exs→管理UI 三层优先级模型、镜像内 263 行模板逐行提取的 MOBILIZON_* 全键表、configure/reference 高级参数域(CSP/媒体代理/HTML hooks/LDAP-OAuth/Oban/反垃圾)、改实例名+注册开关的改参→重启→验证实测闭环与 7 条纠偏(实测日期 2026-11-02)
Mobilizon 5.2.4 配置参数详解
目标:把 Mobilizon 5.2.4 的配置体系一次讲透——三层配置模型(.env 环境变量 → config.exs → 管理 UI 运行时设置)的优先级、Docker 镜像内 263 行
config.exs模板暴露的全部MOBILIZON_*环境变量、官方 configure/reference 文档的全参数域语义,以及"改参 → 重启 → 验证"的实测闭环。所有实测基于 2026-11-02 部署的kaihuri/mobilizon:5.2.4-amd64实例(宿主端口 8160)。部署步骤见站内文章 《Mobilizon Docker Compose 部署指南》。
一、三层配置模型与优先级
Mobilizon 的配置自下而上有三层,上层覆盖下层:
| 层 | 位置 | 载体 | 生效方式 |
|---|---|---|---|
| ① 环境变量层 | .env(Docker)或进程环境 | MOBILIZON_* 键 | 容器重建(docker compose up -d)后生效 |
| ② 配置文件层 | /etc/mobilizon/config.exs | Elixir Config DSL | 重启进程生效;env 模板未覆盖的参数只能在这层配 |
| ③ 管理 UI 层 | 后台「设置」(存 DB) | Web 管理界面 | 即时生效,优先级最高 |
关键认知(官方 reference 反复出现的措辞)::name、:description、:registrations_open、:languages 等 config 项都是 "fallback … if not configured into the admin UI"——即文件配置只是兜底默认值,管理员在 UI 里设置过之后,改 .env 将不再体现到前台。排查"改了没生效"先查这一层。
验证生效值的权威入口(实测):管理员 JWT 调 GraphQL config 查询:
curl -s http://127.0.0.1:8160/api -H 'Content-Type: application/json' \
-H "Authorization: Bearer $TOKEN" \
-d '{"query":"{config{name description registrationsOpen federating demoMode version}}"}'
# → {"name":"C1 ParamTest Renamed","registrationsOpen":false,...,"version":"5.2.4"}
纠偏:GraphQL 里的 instance(domain: ID!) 查询是查远端联邦实例的(instances 表存已知远端域),查本地域名实测返回 404 not_found,且 instances 列表本地实例并不在其中(空表 total=0);本地实例生效配置请用 config(需管理员登录态,匿名查询被拒 unauthenticated)。
二、改参 → 重启 → 验证 实测闭环
以 MOBILIZON_INSTANCE_NAME 与 MOBILIZON_INSTANCE_REGISTRATIONS_OPEN 为例(2026-11-02 实测):
# 1. 改 .env
# MOBILIZON_INSTANCE_NAME=C1 ParamTest Renamed
# MOBILIZON_INSTANCE_REGISTRATIONS_OPEN=false
# 2. 重建容器(注意:restart 不够,env_file 变更需 up -d 重建)
docker compose up -d mobilizon
# 3. 三点验证
curl -s http://127.0.0.1:8160/ | grep '<title>'
# → <title>C1 ParamTest Renamed - Mobilizon</title>
curl -s http://127.0.0.1:8160/.well-known/nodeinfo/2.0 | jq .openRegistrations
# → false
# GraphQL config 查询 → name/registrationsOpen 同步为新值(见上)
# 4. 回滚 .env → up -d → title 恢复 "G25 Mobilizon Test"、openRegistrations=true
结论:env 层参数改后必须 docker compose up -d(触发 recreate),docker compose restart 不会重读 .env;本例未在 UI 覆盖过 name/registrations,故 env 值直接透传到前台 title、nodeinfo 与 config 三处,行为一致。
三、Docker 镜像 .env 全键表
下表逐行取自镜像内 /etc/mobilizon/config.exs(263 行)的 System.get_env 调用,是 env 键的权威清单(官方 env.template 未列全)。格式:env 键 →(config 落点,默认值)。
3.1 实例与端点
| 环境变量 | 落点 / 默认值 | 说明 |
|---|---|---|
MOBILIZON_INSTANCE_HOST | endpoint url.host 与 :instance hostname / mobilizon.lan | 实例域名,联邦身份的一部分,改动影响已有 actor ID |
MOBILIZON_INSTANCE_PORT | http.port / 4000 | 容器内监听端口 |
MOBILIZON_INSTANCE_LISTEN_IP | http.ip / 0.0.0.0 | 非法 IP 格式启动时直接 raise(模板显式校验) |
MOBILIZON_INSTANCE_NAME | :instance name / Mobilizon | UI 未设置时的兜底实例名(实测闭环见上) |
MOBILIZON_INSTANCE_DESCRIPTION | :instance description | 兜底描述 |
MOBILIZON_INSTANCE_REGISTRATIONS_OPEN | :instance registrations_open / false | 仅字符串 "true" 算开(实测 false 透传 nodeinfo) |
MOBILIZON_INSTANCE_REGISTRATIONS_MODERATION | registrations_moderation / false | 注册需审核 |
MOBILIZON_INSTANCE_REGISTRATIONS_EMAIL_ALLOWLIST | 逗号分隔 | 关注册仍放行的邮箱/域 |
MOBILIZON_INSTANCE_REGISTRATIONS_EMAIL_DENYLIST | 逗号分隔 | 永远拒绝的邮箱/域 |
MOBILIZON_INSTANCE_DISABLE_DATABASE_LOGIN | disable_database_login / false | 禁用邮箱密码登录(配合 LDAP/OAuth) |
MOBILIZON_INSTANCE_DEFAULT_LANGUAGE | default_language / en | 用户语言找不到时的兜底 |
MOBILIZON_INSTANCE_DEMO | demo / false | 演示模式 |
MOBILIZON_INSTANCE_ALLOW_RELAY | allow_relay / true | 是否可被 Relay 订阅/中继 |
MOBILIZON_INSTANCE_FEDERATING | federating / true | 设 false 完全断联邦 |
MOBILIZON_INSTANCE_ENABLE_INSTANCE_FEEDS | / true | 实例级公开事件/帖子 feeds |
MOBILIZON_INSTANCE_ENABLE_SEARCH_FEEDS | / true | 搜索页 feeds |
MOBILIZON_INSTANCE_EMAIL | email_from / noreply@mobilizon.lan | 邮件 From 头 |
MOBILIZON_REPLY_EMAIL | email_reply_to | 邮件 Reply-To 头 |
MOBILIZON_INSTANCE_SECRET_KEY_BASE | endpoint secret_key_base / changethis | 必改:openssl rand -hex 48(官方建议 gpg --gen-random --armor 1 50) |
MOBILIZON_INSTANCE_SECRET_KEY | Guardian secret_key / changethis | 必改:JWT 签名密钥,openssl rand -hex 32;改动会使全部已发 token 失效 |
3.2 数据库与日志
| 环境变量 | 默认值 | 说明 |
|---|---|---|
MOBILIZON_DATABASE_HOST/PORT/DBNAME/USERNAME/PASSWORD/SSL | postgres/5432/mobilizon/username/password/false | compose 场景 HOST 填服务名(本例 db);SSL 仅认字符串 "true";pool_size 模板固定 10,要改需覆盖 config.exs |
MOBILIZON_LOGLEVEL | error | 枚举 emergency/alert/critical/error/warning/notice/info/debug;非法值不报错、静默回落 error(模板逻辑实测确认) |
3.3 邮件 SMTP
| 环境变量 | 默认值 | 说明 |
|---|---|---|
MOBILIZON_SMTP_SERVER / MOBILIZON_SMTP_PORT | localhost / 25 | 不配真实 SMTP 则所有通知邮件不可达;tls_certificate_check 会对该 server 做证书检查 |
MOBILIZON_SMTP_USERNAME / MOBILIZON_SMTP_PASSWORD | nil | 凭据 |
MOBILIZON_SMTP_TLS / MOBILIZON_SMTP_SSL / MOBILIZON_SMTP_AUTH | if_available / false / if_available | Swoosh SMTP adapter 语义 |
发信验证:docker compose exec mobilizon mobilizon_ctl maintenance.testemails(实测存在,官方 CLI 页未列)。
3.4 地理编码与地图
| 环境变量 | 说明 |
|---|---|
MOBILIZON_GEOSPATIAL_SERVICE | 枚举(大小写敏感):Nominatim/Addok/Photon/GoogleMaps/MapQuest/Mimirsbrunn/Pelias/Hat;模板 case 无兜底分支,填错启动即崩 |
MOBILIZON_GEOSPATIAL_NOMINATIM_ENDPOINT/_API_KEY | 默认 https://nominatim.openstreetmap.org;自建实例改 endpoint |
MOBILIZON_GEOSPATIAL_ADDOK_ENDPOINT / _PHOTON_ENDPOINT / _GOOGLE_MAPS_API_KEY / _MAP_QUEST_API_KEY / _MIMIRSBRUNN_ENDPOINT / _PELIAS_ENDPOINT | 各服务对应参数 |
地图瓦片 :maps tiles/attribution/routing | env 模板未暴露,需 config.exs:换瓦片源要同步改 CSP 否则不出图 |
3.5 上传、导出、时区、推送
| 环境变量 | 默认值 | 说明 |
|---|---|---|
MOBILIZON_UPLOADS | /var/lib/mobilizon/uploads | 本地上传器目录(compose 已挂卷) |
MOBILIZON_UPLOADS_EXPORTS | /var/lib/mobilizon/uploads/exports | 参与者名单导出路径 |
MOBILIZON_EXPORTS_FORMAT_CSV_ENABLED / _PDF_ENABLED / _ODS_ENABLED | true | 三种导出格式开关(CSV/PDF/ODS) |
MOBILIZON_TIMEZONES_DIR / MOBILIZON_TZDATA_DIR | /var/lib/mobilizon/timezones、/var/lib/mobilizon/tzdata | tzdata 首启自动下载(实测 2026b→2026f) |
MOBILIZON_WEB_PUSH_ENCRYPTION_SUBJECT/PUBLIC_KEY/PRIVATE_KEY | nil | Web Push(VAPID)三件套 |
| GeoIP 库路径 | /var/lib/mobilizon/geo_db/GeoLite2-City.mmdb | 缺失仅 WARNING,不阻塞启动 |
3.6 错误上报与分析
| 环境变量 | 说明 |
|---|---|
MOBILIZON_ERROR_REPORTING_SENTRY_DSN | 设置即启用 Sentry(含 Sentry.LoggerBackend 捕获 error 级日志、前端 Sentry 分析) |
MOBILIZON_ERROR_REPORTING_SENTRY_ORGANISATION/PROJECT/HOST | Sentry 前端参数与 CSP connect_src |
MOBILIZON_FRONT_END_ANALYTICS_MATOMO_ENABLED / _ENDPOINT / _SITE_ID / _TRACKER_FILE_NAME | Matomo 开关与参数(启用时自动把 host 注入 CSP connect/script/img_src) |
四、config.exs 高级参数域(env 未暴露,需挂卷覆盖)
覆盖方法:docker cp mobilizon-mobilizon-1:/etc/mobilizon/config.exs ./config.exs → 编辑 → compose 挂载到同路径 → up -d。重要域(源自官方 configure/reference,2026-09-18 版):
:instance补充项:extra_categories(%{id: :protest, label: "Protest"}追加活动分类);upload_limit/avatar_upload_limit/banner_upload_limit;remove_orphan_uploads+orphan_upload_grace_period_hours(孤儿上传周期清理,配合media.cleanorphan);remove_unconfirmed_users+unconfirmed_user_grace_period_hours;activity_expire_days+activity_keep_number(群组活动时间线保留策略);duration_of_long_event(天,0=不区分长短活动)。:instance :groups/:events:enabled: false可整体关闭群组或活动功能。:instance :media_proxy:enabled/proxy_opts/redirect_on_failure/max_body_length/max_read_duration/follow_redirect——代理远程图片防泄漏 IP。:instance :html_hooks:app_index_html_head_first/head_last/body_first/body_last注入原始 HTML(自定义样式/脚本/统计代码),值可以是任意返回字符串的 Elixir 表达式(如File.read!("/path/snippet.html"))。:instance :restrictions:only_admin_can_create_groups、only_groups_can_create_events(强制活动必须挂群组——实测个人代发群组活动本就会被 GraphQL 拒绝,此开关把限制前移到创建入口)。- Endpoint
:http_security:enabled/sts/sts_max_age/csp_policy/referrer_policy——安全头与 CSP 主开关。 - Uploads
:uploader/:filters:Uploader.Local之外可配远程;过滤器Dedupe(哈希去重)与Optimize(ExOptimizer 压缩);allow_list_mime_types、link_name。 - 认证:
Mobilizon.Service.Auth.Authenticator可切LDAPAuthenticator(找不到用户自动回落默认库认证);:auth oauth_consumer_strategies配 OAuth 登录。 - Federation
:activitypub:actor_stale_period(远端 actor 刷新周期)、actor_key_rotation_delay(密钥轮换延迟)、sign_object_fetches(签名拉取请求)。 - 匿名参与
:anonymous:participation allowed+validation(email.enabled/confirmation_required、captcha.enabled);reports.allowed。 - Oban:队列
search/mailers/background/default(实测日志Oban peer became leader);周期任务BuildSiteMap、RefreshGroups、CleanOrphanMediaWorker、CleanUnconfirmedUsersWorker。 - 富媒体:
rich_media parsers(OEmbed/OGP/TwitterCard/Fallback);resource_providers/external_resource_providers。 - 反垃圾(两选一,不能同时启用):
- Akismet:
config :mobilizon, Mobilizon.Service.AntiSpam, service: Mobilizon.Service.AntiSpam.Akismet+Akismet key: "…"; - Keyword(5.2.4 新增):
service: Mobilizon.Service.AntiSpam.Keyword+Keyword keywords: ["casino","viagra","buy now"]。
- Akismet:
五、高频配方速查
| 需求 | 做法 |
|---|---|
| 关注册但放行内部邮箱 | REGISTRATIONS_OPEN=false + REGISTRATIONS_EMAIL_ALLOWLIST=org.com |
| 换实例名/描述 | 改 MOBILIZON_INSTANCE_NAME/_DESCRIPTION 后 up -d;若 UI 设过,改 UI |
| 断联邦 | MOBILIZON_INSTANCE_FEDERATING=false(actor 不再对外同步) |
| 自建地理编码 | GEOSPATIAL_SERVICE=Photon + GEOSPATIAL_PHOTON_ENDPOINT=https://… |
| 禁个人建活动 | config.exs restrictions only_groups_can_create_events: true |
| 关键词反垃圾 | config.exs 设 AntiSpam service: Keyword + keywords 列表(5.2.4+) |
| 导出只留 CSV | MOBILIZON_EXPORTS_FORMAT_PDF_ENABLED=false、ODS_ENABLED=false |
| 提高日志详细度 | MOBILIZON_LOGLEVEL=debug(拼错值会静默按 error,改完用日志确认) |
六、坑与纠偏清单
- UI 优先:name/description/registrations 等是 fallback,UI 配过之后 env 改动无效(第一节)。
up -dvsrestart:.env变更必须 recreate(第二节实测)。- 布尔语义严格:
*_OPEN/SSL/ENABLED类只认字符串"true",TRUE/1/yes都算 false。 - LOGLEVEL 非法值静默回落 error;GEOSPATIAL_SERVICE 非法值直接崩(模板一个有兜底、一个没有)。
instance(domain:)不是本地配置查询(第一节纠偏);本地生效值用config(admin token)。- SECRET_KEY 改动 = 全员登出:所有 JWT 立即失效,属高影响操作。
- 地图瓦片/CSP/媒体代理/HTML hooks/认证集成均无 env 入口,必须走 config.exs 挂卷路径。
取证说明:环境变量表逐行核对自 5.2.4 镜像内 config.exs 模板;参数域语义核对自 docs.mobilizon.org configure/reference(Last update 2026-09-18);改参闭环与 config/instance/instances 查询行为均为 2026-11-02 实测。CLI 工具详解见同专栏《Mobilizon 5.2.4 常用 CLI 命令与工具详解》。