hitobito 2.10 配置参数详解

详解 hitobito 2.10 的环境变量、初始化器与 wagon 三层配置通道,逐项给出默认值、本实例实测生效值与生产配置模板。

hitobitohitobitoRubyRails会员管理2026/11/02

hitobito 2.10 配置参数详解

目标:系统梳理 hitobito 2.10 的配置通道(环境变量文件、初始化代码、wagon 设置)与全部关键参数的含义、默认值和本实例实测生效值,给出生产配置模板。本文全部命令与回显在已部署 hitobito 2.10.0 的 Ubuntu 22.04 服务器(应用目录 /opt/hitobito/app,本实例环境文件 /etc/hitobito/hitobito.env,服务地址 http://localhost:8152)实测。

一、环境信息

  • 操作系统:Ubuntu 22.04 LTS(x86_64)
  • 应用:hitobito core 2.10.0(cat VERSION 实测),wagon generic(rake wagon:list 实测)
  • 运行时:Ruby 3.3.13、Rails 8.0.5、Bundler 4.0.13
  • 依赖服务:PostgreSQL 16(主机 postgres,库 hitobito_development)、Redis 8(主机 redis,库 1)
  • 应用目录:/opt/hitobito/app;本实例环境文件:/etc/hitobito/hitobito.env
  • 服务地址:http://localhost:8152(由 RAILS_HOST_NAME 决定,实测生效)
  • 演示账号:admin@hitobito.ch / q1w2e3r4

二、前置条件

本文命令分两类,均可在运行中的实例上独立执行:

  1. 应用目录内命令:cd /opt/hitobito/app 后执行 bundle exec rake / bundle exec rails 系列命令,要求 Ruby 依赖已安装完毕(bundle exec rails runner 能正常输出即满足,本文实测环境如此);
  2. HTTP 验证命令:curl 访问本实例 http://localhost:8152。

参数生效的统一前提是应用进程重启:环境变量与初始化器都在进程启动时读取,改完不重启不生效(见"常见问题"7.2 实测)。

三、参数查看与修改方式

3.1 环境文件(主通道)

hitobito 应用侧参数几乎全部来自 RAILS_*/HITOBITO_* 等环境变量(官方运维文档 doc/operator/01_deployment.md 给出权威清单)。本实例环境文件实测内容(节选,另有 1 项开发环境专用开关不在本文范围):

RAILS_DB_ADAPTER=postgresql
RAILS_DB_HOST=postgres
RAILS_DB_PORT=5432
RAILS_DB_USERNAME=hitobito
RAILS_DB_PASSWORD=hitobito
RAILS_DB_NAME=hitobito_development
RAILS_ACTIONCABLE_REDIS_URL=redis://hitobito_redis@redis:6379/1
RAILS_HOST_NAME=localhost:8152
RAILS_MAIL_DOMAIN=localhost
RAILS_MAIL_DELIVERY_METHOD=smtp
RAILS_MAIL_DELIVERY_CONFIG=address: mailcatcher, port: 1025
ANNOTATERB_SKIP_ON_DB_TASKS=1
RAILS_LOG_TO_STDOUT=1
DISABLE_SPRING=true

修改方式:编辑该文件后重启应用进程。本实例实测一次"改 devise.rb + 重启"的完整生效周期:重启后 /healthz 约 165 秒恢复 200。

3.2 验证参数是否生效

不看配置文件、直接验证运行时行为,是本实例实测的三种判定:

# RAILS_HOST_NAME 生效:未登录跳转的 host 即该参数值
$ curl -s -I http://localhost:8152/ | grep -i '^location'
location: http://localhost:8152/de/users/sign_in

# 数据库参数生效:能连上并读出 schema 版本
$ bundle exec rake db:version
database: hitobito_development
Current version: 20260701094113

# 密钥类参数生成(SECRET_KEY_BASE 用)
$ bundle exec rails secret
1198ab6d94a0aa8d930ff6784aecfedf33384709f66446d2cc82f22763e0151b93d9c94d8e603ca02af0d324eb092efaa7545fee5213a9da6a8e03cbe6ea5126

rails secret 实测输出 128 位十六进制串,正是官方文档对 SECRET_KEY_BASE 的格式要求。

3.3 代码级参数(初始化器)

少数策略参数硬编码在 config/initializers/,不走环境变量。实测密码长度策略位置:

$ grep -n 'password_length' config/initializers/devise.rb
170:  config.password_length = 12..128

改动示例(本实例为演示账号 8 位口令临时放宽为 8..128)与默认值报错实测见"常见问题"7.1。同文件实测 config.email_regexp 为单 @ 校验。

3.4 配置自检任务

内置任务检查必需配置是否齐备(实测末行):

$ bundle exec rake hitobito:check_config
...(逐项检查 SQL 与输出,实测节选)
✅ SelfRegistrationRoleTypes configured correctly

3.5 wagon 设置文件

组织级参数(如根用户邮箱 root_email)在 wagon 的 config/settings.yml;核心侧根用户亦可用 RAILS_ROOT_USER_EMAIL 指定。生产环境首次登录官方建议走"忘记密码"流程设置密码。

💡 技术拓展:Rails 应用参数通道对比——

通道载体适合注意
环境变量(hitobito 主通道)进程环境/env 文件部署相关、多实例差异启动时读取,改后需重启
Rails credentials(credentials.yml.enc)master.key 加密 YAML少量机密与 ENV 混用易漏配
YAML 配置文件(wagon settings.yml)仓库内文件组织业务参数随 wagon 版本管理
初始化器硬编码代码策略常量(如密码长度)改动即代码变更,需重启

hitobito 实测采用"环境变量为主 + wagon YAML + 少量硬编码"三层结构,本文第四章按此归类。

四、参数总览

对应用 config/ 目录做 ENV 引用普查(实测命令):

$ cd /opt/hitobito/app && grep -rhoE '\bENV\b[^A-Z]*[A-Z][A-Z0-9_]{2,}' config \
    | grep -oE '[A-Z][A-Z0-9_]{3,}' | sort -u
ADDRESSES_TOKEN AWS_REGION BUNDLE_GEMFILE ... PROMETHEUS_EXPORTER_HOST
PROMETHEUS_EXPORTER_PORT RAILS_ACTIONCABLE_REDIS_URL RAILS_AIRBRAKE_API_KEY
RAILS_BULK_MAIL_BATCH_TIMEOUT RAILS_BULK_MAIL_SIZE RAILS_CACHE_REDIS_CONFIG
RAILS_CACHE_REDIS_URL RAILS_DB_ADAPTER RAILS_DB_CHECKOUT_TIMEOUT RAILS_DB_NAME
RAILS_DB_POOL RAILS_DB_SCHEMA ... RAILS_HOST_SSL RAILS_LOG_LEVEL
RAILS_LOG_TO_STDOUT RAILS_MAIL_DELIVERY_CONFIG RAILS_MAIL_DELIVERY_METHOD
RAILS_MAIL_DOMAIN RAILS_MAIL_RETRIEVER_CONFIG RAILS_MAIL_RETRIEVER_TYPE
RAILS_MAX_THREADS RAILS_ROOT_USER_EMAIL RAILS_S3_ACCESS_KEY RAILS_S3_BUCKETNAME
RAILS_S3_ENDPOINT RAILS_S3_SECRET_KEY RAILS_SERVE_STATIC_FILES SECRET_KEY_BASE
SENTRY_DSN WEB_CONCURRENCY ...(输出节选,实测共 60 项应用相关变量)

按用途归类(默认值列取自官方运维文档与代码实测):

分类参数默认值(官方/实测)
数据库RAILS_DB_ADAPTER/NAME/USERNAME/PASSWORD/HOST/PORTadapter postgres;name hitobito_[environment]
数据库连接池RAILS_DB_POOL/CHECKOUT_TIMEOUT/IDLE_TIMEOUT/SCHEMA代码引用实测,无显式默认
Redis/缓存RAILS_ACTIONCABLE_REDIS_URL、RAILS_CACHE_REDIS_URL/CONFIG、MEMCACHE_SERVERSactioncable 默认 redis://localhost:6379/1;memcache 默认 localhost:11211
邮件发信RAILS_MAIL_DELIVERY_METHOD/CONFIG/DOMAINmethod 取 sendmail 或 smtp
邮件收信RAILS_MAIL_RETRIEVER_TYPE/CONFIGtype 取 pop3 或 imap
群发控制RAILS_BULK_MAIL_SIZE、RAILS_BULK_MAIL_BATCH_TIMEOUT代码引用实测
主机与 TLSRAILS_HOST_NAME、RAILS_HOST_NAME_INTERNAL、RAILS_HOST_REGEX、RAILS_HOST_SSLssl 默认 false
密钥SECRET_KEY_BASE、JWT_SIGNING_KEY、ADDRESSES_TOKENSECRET_KEY_BASE 生产必填(128 hex)
监控与错误SENTRY_DSN、SENTRY_CURRENT_ENV、RAILS_AIRBRAKE_*、PROMETHEUS_EXPORTER_HOST/PORT、MEMORY_USAGE_LIMIT_PERCENTAGE可选
进程与日志RAILS_ENV、RAILS_STAGE、RAILS_LOG_TO_STDOUT、RAILS_LOG_LEVEL、RAILS_MAX_THREADS、WEB_CONCURRENCY、PORT、RAILS_SERVE_STATIC_FILES标准 Rails 语义
存储RAILS_STORAGE_SERVICE、RAILS_S3_ENDPOINT/BUCKETNAME/ACCESS_KEY/SECRET_KEY、AWS_REGIONActiveStorage 后端选择
业务HITOBITO_PROJECT、HITOBITO_STAGE、HITOBITO_WALLETS_SYNC_SECONDS、RAILS_ROOT_USER_EMAILwallets 同步默认 180 秒
构建期BUNDLE_GEMFILE本实例实测 Gemfile.local

解读:与多数 Rails 应用不同,hitobito 把收信(RAILS_MAIL_RETRIEVER_*)也作为一等配置——邮件列表的入站处理依赖它,官方文档标注"列表功能必需";漏配不会让 Web 挂掉,只会让"发信正常、收信静默失败",排查成本高,第五章 5.3 展开。

五、核心参数分类详解

5.1 数据库参数

参数本实例实测值说明
RAILS_DB_ADAPTERpostgresql官方默认 postgres,两者代码均接受
RAILS_DB_HOSTpostgres数据库主机名
RAILS_DB_PORT5432标准端口
RAILS_DB_USERNAMEhitobito应用账号
RAILS_DB_PASSWORDhitobito演示值;生产用强口令并走密钥注入
RAILS_DB_NAMEhitobito_development官方默认模式 hitobito_[environment]
RAILS_DB_POOL 等未显式设置连接池大小/检出超时/空闲超时/模式名,代码引用实测

生效验证实测(同 3.2):bundle exec rake db:version 返回 database: hitobito_development 与 schema 版本 20260701094113。

⚠️ 注意:官方运维文档要求 PostgreSQL ≥ 16。实例规模实测:111 张表、generic 种子下 Person 224 / Group 29 / Event 79 / Role 225。

5.2 Redis 与缓存参数

参数本实例实测值官方默认
RAILS_ACTIONCABLE_REDIS_URLredis://hitobito_redis@redis:6379/1redis://localhost:6379/1
RAILS_CACHE_REDIS_URL / RAILS_CACHE_REDIS_CONFIG未设置(走默认)见代码引用
MEMCACHE_SERVERS未设置localhost:11211

实测 URL 中直接内嵌 Redis 密码(hitobito_redis@),对应 Redis 以 requirepass 启动的形态。Action Cable 承载页面实时推送,URL 配错表现为"页面能用但实时更新失效"。

💡 技术拓展:Rails 缓存后端选型——

后端依赖特点
Memcachedmemcached 服务纯 KV、无持久化、多实例共享
Redisredis 服务KV + 数据结构,可同时喂 Action Cable
memory_store无进程私有,多实例不一致
LRU/文件无开发用

hitobito 官方文档给的是"Memcached 或 Redis"二选一;本实例实测走 Redis(一份服务同时承担缓存与 Action Cable),Memcache 参数保持默认未启用。

5.3 邮件参数(发信与收信)

参数本实例实测值可选值/说明
RAILS_MAIL_DELIVERY_METHODsmtpsendmail 或 smtp
RAILS_MAIL_DELIVERY_CONFIGaddress: mailcatcher, port: 1025YAML 行内哈希,SMTP 主机与端口
RAILS_MAIL_DOMAINlocalhost邮件域名
RAILS_MAIL_RETRIEVER_TYPE未设置pop3 或 imap;邮件列表入站必需
RAILS_MAIL_RETRIEVER_CONFIG未设置收信账号参数(哈希)
RAILS_BULK_MAIL_SIZE / RAILS_BULK_MAIL_BATCH_TIMEOUT未设置群发分批大小与批间隔(代码引用实测)

发信链路端到端实测:触发"忘记密码"(POST /de/users/password)返回 HTTP/1.1 303 See Other,SMTP 捕获端实测收到 1 封,主题 Anleitung für das Setzen Deines Passworts。健康检查还有邮件专项端点(rails routes 实测路由 healthz_mail GET /healthz/mail、healthz_truemail GET /healthz/truemail),可用于监控发信可用性与邮箱校验服务。

💡 技术拓展:邮箱地址校验库(healthz/truemail 端点对应的能力)——

方案校验深度特点
email_validator 类正则语法便宜,误判多
Truemail语法 + MX/SMTP 探测可配置验证等级,hitobito 实测内置端点
第三方验证 API送达性收费、有隐私合规问题

hitobito 实测走 Truemail(路由 healthz/truemail 存在),配合 catch-all 邮箱支撑邮件列表场景。

5.4 密钥与安全参数

参数要求/默认实测要点
SECRET_KEY_BASE生产必填,128 位 hexbundle exec rails secret 实测生成长串
JWT_SIGNING_KEYOIDC/JWT 签名密钥本实例由部署入口以 openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 自动生成 jwt_signing_key.pem
RAILS_HOST_SSL默认 false置 true 后生成 https 链接
RAILS_ROOT_USER_EMAIL无根用户邮箱约定
ADDRESSES_TOKEN无地址服务导入令牌(配合 address:import 任务)
SENTRY_DSN可选配置后错误上报 Sentry(实测运行时含 sentry-ruby 6.1.0)

⚠️ 注意:SECRET_KEY_BASE、数据库口令、SENTRY_DSN 等真实密钥不要明文落库存文档——生产以环境注入方式提供(如部署系统导出后再写 env 文件),本文演示值仅限实验实例。

5.5 进程、日志与监控参数

参数本实例实测值说明
RAILS_LOG_TO_STDOUT1日志走标准输出,便于集中采集
RAILS_LOG_LEVEL / RAILS_MAX_THREADS / WEB_CONCURRENCY / PORT未显式设置代码引用实测;线程数与工作进程数按 Puma 语义
RAILS_SERVE_STATIC_FILES未设置生产若无反代直出静态需置 true
MEMORY_USAGE_LIMIT_PERCENTAGE未设置进程内存水位控制(代码引用实测)
PROMETHEUS_EXPORTER_HOST/PORT未设置指标导出端点
DISABLE_SPRINGtrue关闭预加载器,避免脚本类命令读到旧代码

💡 技术拓展:Rails 应用进程模型——

模型代表并发单位内存特征
多线程Puma 单进程线程(RAILS_MAX_THREADS)省内存,受 GVL 限制
多进程+线程Puma cluster(WEB_CONCURRENCY)进程×线程吞吐高,内存翻倍
应用服务器嵌入Apache+Passenger(官方文档推荐)进程按需与 Apache 共生命周期

hitobito 官方生产文档推荐 Apache + Passenger;本实例运行时为 Puma(PORT/WEB_CONCURRENCY 参数即其环境变量),调这两组参数就是调并发容量。

5.6 业务与扩展参数

参数默认实测/说明
HITOBITO_PROJECT / HITOBITO_STAGE无项目与阶段标识(错误上报、日志标注用)
HITOBITO_WALLETS_SYNC_SECONDS180电子钱包同步周期;worker 实测日志出现 Job WalletSynchronizationJob (id=192) COMPLETED after 0.0068,周期任务在跑
RAILS_STORAGE_SERVICE + RAILS_S3_*/AWS_REGION本地盘附件存储后端切换
BUNDLE_GEMFILEGemfile本实例实测 Gemfile.local(隔离本地 wagon 路径对锁文件的污染)

💡 技术拓展:Rails 附件存储后端(ActiveStorage)——

后端依赖适用
Disk本地文件系统单机、备份随应用盘
S3 兼容RAILS_S3_* 参数多实例共享、对象存储
GCS/Azure对应 SDK云厂商绑定

hitobito 代码实测同时引用 Disk 与 S3 参数组(RAILS_STORAGE_SERVICE 选择),多实例部署建议切 S3 兼容后端避免头像/附件分裂在各自本地盘。

六、生产配置模板

适用画像:16 GB 内存 / 4 vCPU / NVMe SSD、万级会员、单实例应用 + 独立 PostgreSQL/Redis(本实验实例为开发画像,标注"实测"的值为实验值,生产值请按模板注释替换):

# /etc/hitobito/hitobito.env —— hitobito 2.10 生产示例(16GB/4vCPU/万级会员)
RAILS_ENV=production

# —— 必填:128 位 hex,生成命令 bundle exec rails secret(实测)
SECRET_KEY_BASE=${SECRET_KEY_BASE}          # 由部署系统注入,勿明文入库

# —— 数据库(实测值: hitobito_development;生产建议 hitobito_production)
RAILS_DB_ADAPTER=postgresql
RAILS_DB_HOST=db01.internal
RAILS_DB_PORT=5432
RAILS_DB_USERNAME=hitobito
RAILS_DB_PASSWORD=${RAILS_DB_PASSWORD}      # 密钥注入
RAILS_DB_NAME=hitobito_production
RAILS_DB_POOL=25                            # 默认未设;4vCPU×(线程+worker) 估算

# —— 主机与 TLS
RAILS_HOST_NAME=members.example.org
RAILS_HOST_SSL=true

# —— Redis(实测值: redis://hitobito_redis@redis:6379/1)
RAILS_ACTIONCABLE_REDIS_URL=redis://:${REDIS_PASSWORD}@redis01.internal:6379/1
MEMCACHE_SERVERS=memcache01.internal:11211  # 仅当缓存后端选 Memcached 时启用

# —— 邮件:发信走真实 SMTP;收信器为邮件列表必需
RAILS_MAIL_DELIVERY_METHOD=smtp
RAILS_MAIL_DELIVERY_CONFIG=address: smtp.example.org, port: 587, user_name: hitobito, password: ${SMTP_PASSWORD}, authentication: plain, enable_starttls: true
RAILS_MAIL_DOMAIN=members.example.org
RAILS_MAIL_RETRIEVER_TYPE=imap
RAILS_MAIL_RETRIEVER_CONFIG=host: imap.example.org, port: 993, ssl: true, username: list-catchall, password: ${IMAP_PASSWORD}

# —— 业务与可观测
HITOBITO_PROJECT=prod
HITOBITO_WALLETS_SYNC_SECONDS=180
RAILS_ROOT_USER_EMAIL=root@example.org
SENTRY_DSN=${SENTRY_DSN}
RAILS_LOG_TO_STDOUT=1
RAILS_SERVE_STATIC_FILES=true
WEB_CONCURRENCY=3
RAILS_MAX_THREADS=8

# —— 附件多实例共享时启用(否则走本地盘)
RAILS_STORAGE_SERVICE=s3
RAILS_S3_ENDPOINT=s3.internal
RAILS_S3_BUCKETNAME=hitobito
RAILS_S3_ACCESS_KEY=${RAILS_S3_ACCESS_KEY}
RAILS_S3_SECRET_KEY=${RAILS_S3_SECRET_KEY}

逐项要点:

  • ${...} 为真实密钥占位,注入方式:部署前 export SECRET_KEY_BASE="$(bundle exec rails secret)" 或由密钥管理系统渲染该文件;
  • RAILS_MAIL_RETRIEVER_* 两行是官方文档标注"邮件列表必需"的收信配置,模板给 IMAP+SSL 示例,pop3 亦可;
  • WEB_CONCURRENCY=3 × RAILS_MAX_THREADS=8 ≈ 24 个 Rails 并发单元,对应 RAILS_DB_POOL=25 留 1 个维护连接——按"连接数 ≥ 进程×线程"原则联动调整;
  • 密码策略不在本文件(硬编码 12..128,见 3.3),模板无需也不能配它。

七、常见问题

7.1 设置 8 位密码报错,想放宽策略

默认下限 12 位(devise.rb 实测 config.password_length = 12..128)。本实例为演示账号 q1w2e3r4 改为 8..128 前,实测直接设置会抛:

Gültigkeitsprüfung ist fehlgeschlagen: Passwort ist zu kurz (weniger als 12 Zeichen) (ActiveRecord::RecordInvalid)

改文件并重启应用进程后,重置实测回显 RESET_OK admin@hitobito.ch id=222 sign_in_count=0,登录实测 HTTP/1.1 303 See Other。生产建议保持默认下限而不是放宽。

7.2 改了环境文件/初始化器,行为没变化

环境变量与 initializer 均在进程启动时读取。本实例实测:修改后重启应用进程,/healthz 约 165 秒恢复 200,随后新行为生效(303 登录验证通过)。若用 rails runner 临时验证脚本逻辑,记得本实例设了 DISABLE_SPRING=true,避免预加载缓存读到旧代码。

7.3 API 返回 401,是不是没配对参数

不是配置问题,是认证头缺失。实测未认证 GET /api/people 返回 401,错误体 {"errors":[{"code":"unauthorized","status":"401","title":"Login benötigt",...(节选);带 Authorization: Bearer <访问令牌> + Accept: application/vnd.api+json 实测 200 返回 JSON:API 数据;令牌取值方法:管理员在应用目录用 bundle exec rails runner 调 Doorkeeper::AccessToken.create! 生成(实测有效期 7200 秒)。另实测 .json 后缀路径不存在(404),媒体类型只能靠 Accept 头声明。

7.4 邮件发得出去,列表却收不到信

发信(RAILS_MAIL_DELIVERY_*)与收信(RAILS_MAIL_RETRIEVER_*)是两组独立参数。本实例实测只配了发信(SMTP 端到端 303+捕获成功),收信组留空——此时 Web 与发信一切正常,但邮件列表入站静默不处理。按 5.3 补 TYPE=pop3|imap 与 CONFIG 后,可用 GET /healthz/mail 端点验证邮件通道。

7.5 如何快速确认"必需配置"是否齐备

用内置自检任务(实测末行输出):

$ bundle exec rake hitobito:check_config
✅ SelfRegistrationRoleTypes configured correctly

该任务逐项校验自注册角色类型等必需配置组合,失败会以非零退出,适合放进部署流水线的发布前检查。

八、参考链接

hitobito 2.10 配置参数详解 - Quzuo