Keila 0.30.3 配置参数详解
Keila 0.30.3 环境变量配置详解:必填项与启动报错、数据库/Web 端点/SMTP 邮件/管理员种子/验证码/文件存储/运行开关逐项说明,均附实测回显与生效验证方法。
Keila 0.30.3 配置参数详解
一、配置机制总览
Keila 0.30.3 的全部配置通过环境变量完成,没有配置文件。实现在 config/runtime.exs:每次应用启动(含 bin/keila start/daemon/eval)时读取环境变量并构建运行时配置。由此推出三条使用规则:
- 修改环境变量后必须重启进程才生效;
- 必填项在启动时强校验:缺失直接打印错误并退出(
System.halt(1)),配置错误不可能「带病运行」; - 可选项缺失会打印
[warning]行但服务照常启动,默认值兜底。
本文所有行为均在 Debian 12 源码部署的 Keila 0.30.3 上实测(部署过程见《Debian 12 安装 Keila 0.30.3 指南》,环境变量写入 env 文件供启动脚本 source)。
二、必填变量
2.1 DB_URL(数据库连接串)
格式 postgres://user:password@host:port/database。Keila 把业务表与 Oban 作业队列都存在这个库里,是唯一的外部服务依赖。
实测缺失时的启动报错:
2026-10-26T06:49:51.603 [error] could not fetch environment variable "DB_URL" because it is not set
2026-10-26T06:49:51.604 [error] You must provide the DB_URL environment variable in the format:
postgres://user:password/database
数据库组还有三个可选变量控制 TLS 与 schema:
| 变量 | 默认 | 说明 |
|---|---|---|
DB_ENABLE_SSL | false | 设 true 启用 PostgreSQL 连接 TLS |
DB_VERIFY_SSL_HOST | TRUE | 是否校验服务器证书主机名(自签证书场景配合 DB_CA_CERT 或显式设 false) |
DB_CA_CERT | 空 | PEM 格式 CA 证书内容(整串 PEM 文本直接写进变量,非路径) |
DB_SCHEMA | 空 | 数据库 schema 前缀(多实例共用一个库时隔离用,同时作用于 Oban 队列表) |
2.2 SECRET_KEY_BASE(会话签名密钥)
至少 64 字符的强随机串,参与登录会话签名,并派生 LiveView signing salt。官方推荐的生成方式:
head -c 48 /dev/urandom | base64
实测缺失时的启动报错(尾部):
You must set SECRET_KEY_BASE.
This should be a strong secret with a length
of at least 64 characters.
One way to create a strong secret is running the following command:
head -c 48 /dev/urandom | base64
必须固化:该值还派生联系人 Hashid 盐(未显式设置 HASHID_SALT 时,盐 = sha256(SECRET_KEY_BASE <> "hashid_salt")),中途更换会让登录会话全部失效、联系人的外部标识全部变化。
2.3 MAILER_*(系统邮件通道)
系统邮件(注册激活、密码重置)的发信通道。MAILER_TYPE 默认 smtp(0.30.3 生产可用类型即 SMTP),其中两个必填:
MAILER_SMTP_HOST:SMTP 中继主机;MAILER_SMTP_FROM_EMAIL:系统邮件发件人地址。
实测缺失 MAILER_SMTP_HOST 时的启动报错(尾部):
You must configure a mailer for system emails.
Use the following environment variables:
- MAILER_TYPE (defaults to "smtp")
- MAILER_SMTP_HOST (required)
- MAILER_SMTP_USER
- MAILER_SMTP_PASSWORD (required unless MAILER_SMTP_AUTH_METHOD=none)
- MAILER_SMTP_PORT (optional, defaults to 587)
- MAILER_SMTP_AUTH_METHOD (optional, defaults to "auto", options: "password", "none", "auto")
- MAILER_SMTP_TLS_MODE (optional, defaults to "auto", options: "tls", "starttls", "none", "auto")
逐项说明:
| 变量 | 默认 | 说明 |
|---|---|---|
MAILER_SMTP_USER | 取 FROM_EMAIL | SMTP 用户名 |
MAILER_SMTP_PASSWORD | 空 | SMTP 密码(AUTH_METHOD=none 时可省) |
MAILER_SMTP_PORT | 587 | SMTP 端口 |
MAILER_SMTP_AUTH_METHOD | auto | password 强制认证 / none 强制匿名 / auto 由适配器协商 |
MAILER_SMTP_TLS_MODE | auto | tls 隐式 TLS(465) / starttls 明文升级(587) / none 不加密 / auto 协商 |
MAILER_ENABLE_SSL / MAILER_ENABLE_STARTTLS | false | 旧变量,已被 MAILER_SMTP_TLS_MODE 取代,仅在后者未设时生效 |
auto 模式下还会启用证书校验(tls_certificate_check),对内网自建中继没有受信证书时,要显式设 MAILER_SMTP_TLS_MODE=none。实测本文用内网测试收信端的配置即:
export MAILER_SMTP_HOST="10.89.60.3"
export MAILER_SMTP_PORT="1025"
export MAILER_SMTP_FROM_EMAIL="newsletter@keila.local"
export MAILER_SMTP_AUTH_METHOD="none"
export MAILER_SMTP_TLS_MODE="none"
三、Web 端点变量
| 变量 | 默认 | 说明 |
|---|---|---|
PORT | 4000 | 应用 HTTP 监听端口 |
URL_HOST | 空 | 对外访问主机名/地址,用于生成邮件内链接与站点 URL |
URL_PORT | 取 PORT,URL_SCHEMA=https 时 443 | 对外端口 |
URL_SCHEMA | 端口 443 → https,否则 http | 对外协议 |
URL_PATH | / | 部署在子路径时设置(如反代 /keila/) |
HASHID_SALT | 由 SECRET_KEY_BASE 派生 | 联系人 Hashid 盐 |
URL_HOST 缺失时不会失败,只警告并以 http://localhost 对外(实测回显,见下节启动日志块)。反代场景的要点:PORT 是应用真实监听端口,URL_* 是用户浏览器看到的地址,两者经常不同。
四、管理员与初始化种子
| 变量 | 默认 | 说明 |
|---|---|---|
KEILA_USER | root@localhost | 首次初始化创建的实例管理员邮箱 |
KEILA_PASSWORD | 随机生成 | 管理员密码 |
三个实测得出的硬约束:
- 种子只在数据库为空时执行一次(守卫条件是 groups 表为空;已初始化的库再次启动日志会打
Database already populated, not populating database.),所以KEILA_USER/KEILA_PASSWORD必须在首次启动前设置,错过只能清库重来; - 密码最少 10 个字符——User changeset 硬校验
password, min: 10,8 位的q1w2e3r4不通过,实测使用q1w2e3r4q1; - 未设
KEILA_USER时会以root@localhost建号并把随机密码打印在启动日志的 warning 行:
[warning] KEILA_USER not set. Creating root user with email: root@localhost
[warning] KEILA_PASSWORD not set. Setting random root user password: <随机串>
[info] Created root user with admin@keila.local
首次启动自动跑完全部数据库迁移(约 30 张表)再执行种子,日志依次出现 Running ... change/0 forward、Migrations already up(二次启动)、Created root user with <邮箱>。
五、验证码变量
注册、登录等表单默认挂 hCaptcha,相关变量:
| 变量 | 说明 |
|---|---|
CAPTCHA_SITE_KEY(或 HCAPTCHA_SITE_KEY) | 验证码站点密钥 |
CAPTCHA_SECRET_KEY(或 HCAPTCHA_SECRET_KEY) | 验证码服务端密钥 |
CAPTCHA_PROVIDER | hcaptcha(默认)或 friendly_captcha |
CAPTCHA_VERIFY_URL | 校验接口(默认 hCaptcha 官方) |
CAPTCHA_SCRIPT_URL | 前端脚本地址 |
未配置时不会失败,但启动日志会警告,且 Keila 回退到 hCaptcha 的 staging 密钥对——验证码可通过任意响应,生产环境等于没有验证码,必须配置:
[warning] Captcha not configured.
Keila will fall back to using hCaptcha's staging configuration.
六、文件存储变量
| 变量 | 默认 | 说明 |
|---|---|---|
USER_CONTENT_DIR | ./uploads | 用户内容(联系人头像、Campaign 附件等)的本地存储目录,相对路径相对 release 工作目录 |
USER_CONTENT_BASE_URL | 空 | 用独立域名/服务提供用户内容时设置;设置后应用不再自己对外提供这些文件 |
缺失时的警告(两行分别对应目录与独立域名两项):
[warning] You have not configured a directory for user uploads.
[warning] You have not configured a separate URL for untrusted content uploaded by
开源版只有本地文件存储适配器;USER_CONTENT_BASE_URL 的安全意义是让不可信的用户内容走独立域名,与应用主域隔离(cookie 不随请求发送)。
七、运行行为开关
以下变量均为「设了就开/关」的布尔开关(大小写不敏感的 true/1,或仅非空即生效的见注明):
| 变量 | 语义 |
|---|---|
DISABLE_REGISTRATION | 非空且非 0/false 即生效:关闭 Web 界面自助注册 |
DISABLE_SENDER_CREATION | 关闭普通用户自建发件人(只能用管理员共享的发件人) |
ENABLE_QUOTAS | 需显式 true/1:启用账户发送配额 |
DISABLE_UPDATE_CHECKS | 关闭版本更新检查的外呼 |
DISABLE_TZDATA_UPDATES | 关闭 IANA 时区数据自动更新 |
DISABLE_PRECEDENCE_HEADER | 关闭投递邮件的 Precedence: bulk 头 |
MESSAGE_RETENTION_DAYS | 数字:已发消息正文的保留天数(省空间) |
DISABLE_REGISTRATION 实测生效验证——设为 true 重启后,/auth/register 页面从注册表单变为提示页:
curl -s http://192.168.146.131:8139/auth/register | grep -oE "Registration disabled\.|Please contact an administrator\."
实测回显:
Please contact an administrator.
Registration disabled.
DISABLE_UPDATE_CHECKS 与时区更新的外呼行为可从启动日志观察:不设时每次启动有 Tz is fetching the latest IANA time zone data version at https://data.iana.org/time-zones/tzdb/version 行,离线服务器建议设 DISABLE_TZDATA_UPDATES=true 与 DISABLE_UPDATE_CHECKS=true 消除对外依赖。
八、日志变量
LOG_LEVEL 支持 info(默认)、error、debug。
实测注意事项:设 LOG_LEVEL=error 后,通过 bin/keila eval 检查确认环境变量已读入且 :logger 的 Application env 已置为 :error({"error", :error}),但守护进程启动期的 [info] 行(迁移、Bandit 绑定等)仍照常写入日志——Logger 的运行时级别在 config provider 评估前已初始化,0.30.3 的该项配置对启动期日志未产生肉眼可见的抑制效果。依赖它降噪的读者请以自己的实测为准。
九、启动日志诊断(生效验证方法)
一次干净的启动,日志会依次给出所有可选项的生效状态。下面是实测中最简配置(仅必填项)下的完整启动块,可直接当诊断清单用:
2026-10-26T06:50:13.269 [info] Loading 148 CA(s) from :otp store
2026-10-26T06:50:13.270 [warning] Captcha not configured.
2026-10-26T06:50:13.270 [warning] You have not configured a Hashid salt. Defaulting to
2026-10-26T06:50:13.270 [warning] You have not configured the application URL. Defaulting to http://localhost.
2026-10-26T06:50:13.270 [warning] You have not configured a directory for user uploads.
2026-10-26T06:50:13.270 [warning] You have not configured a separate URL for untrusted content uploaded by
2026-10-26T06:50:13.270 [info] PORT environment variable unset. Running on port 4000.
2026-10-26T06:50:13.295 [info] Migrations already up
2026-10-26T06:50:13.300 [info] Database already populated, not populating database.
2026-10-26T06:50:13.308 [info] Running KeilaWeb.Endpoint with Bandit 1.12.0 at 0.0.0.0:4000 (http)
2026-10-26T06:50:13.309 [info] Access KeilaWeb.Endpoint at http://localhost:4000
读法:每条 [warning] 都是一个未配置的可选项及其兜底默认值;Running KeilaWeb.Endpoint ... at 0.0.0.0:4000 是实际监听端口(PORT 生效点);Access KeilaWeb.Endpoint at http://localhost:4000 是 URL_* 生效点(上例未配置 URL_HOST,所以站点地址回落为 localhost——这就是邮件内链接会指向 localhost 的原因)。
十、常见问题
10.1 服务反复重启,日志只有一句 must provide
必填变量四缺一:DB_URL、SECRET_KEY_BASE、MAILER_SMTP_HOST、MAILER_SMTP_FROM_EMAIL。完整报错文本会指明缺哪个,按上文逐项补齐。
10.2 改了环境变量没生效
runtime.exs 只在启动时评估一次,改完必须重启进程。另外注意 env 文件的加载方式:systemd 用 EnvironmentFile=,shell 脚本用 source,不要混用两种机制导致部分变量没进环境。
10.3 邮件内链接全是 localhost
URL_HOST 未设置,回落 http://localhost(见上文启动日志 Access KeilaWeb.Endpoint at http://localhost:4000)。设置后重启即可。
10.4 密码重置邮件没发出
MAILER_* 指向的中继不可达、认证参数不匹配,或 TLS 模式与中继不兼容。先用 MAILER_SMTP_TLS_MODE=none 排除证书因素;中继需要认证时按 AUTH_METHOD=password 补 MAILER_SMTP_USER/PASSWORD。
10.5 想用环境变量直接建管理员没生效
KEILA_USER/KEILA_PASSWORD 只在数据库为空的首次启动时被种子读取。已初始化的实例要换管理员,进 Web 界面用现有管理员在 /admin/users 管理,或清库重来。
10.6 SECRET_KEY_BASE 可以随便换吗
不可以。会话签名与 Hashid 盐都派生自它,更换即全员掉线、联系人外部标识变化。首次部署生成后固化进配置。
十一、参考链接
- Keila 官方仓库(runtime.exs 为配置实现的权威来源):https://github.com/pentacent/keila
- Keila 官方网站与文档:https://www.keila.io
- 本专栏其他篇目:《Keila 0.30.3 介绍与选型指南》《Debian 12 安装 Keila 0.30.3 指南》《Keila 0.30.3 API 使用详解》(官方打包形态的部署指南见专栏内 sort 3)