Domain Locker 配置参数详解
Domain Locker v0.3.5 的 .env 全参数手册:加载机制与优先级、DL_ENV_TYPE 四模式实测(含 dev+Supabase 门禁 403)、SQLite/PostgreSQL 参数成组配置与部分配置回退实测、鉴权全链路 401/登录/API Key 验证、调度器间隔逐项验证、WHOIS/保留策略/通知参数速查与未实测项声明(2026-10-28 实测)。
Domain Locker 配置参数详解:.env 全参数逐项生效验证
本文在 Ubuntu 22.04.5 + Node.js v22.23.4 + PostgreSQL 14.24 上对 Domain Locker v0.3.5 做逐项配置实测(实测日期 2026-10-28)。每项参数标注验证状态:✅ 实测(本文真机回显)、📖 文档核实(来自官方文档/源码,未单独触发验证)。部署过程见 《Domain Locker Ubuntu 22.04 安装部署指南》。
1. .env 的加载机制与优先级
Domain Locker 从两处读取配置(来源:官方文档《Environmental Variables》,查询日期 2026-10-28):
- 运行时变量:进程环境变量,或应用根目录下与
dist/同级的.env文件; - 构建时变量:执行
npm run build时已存在的.env,其中部分值会被烘焙进前端产物。
优先级:运行时 > 构建时 > 兜底默认值。服务端只把 src/server/utils/client-env.ts 白名单内的变量下发给浏览器(经 /api/env-var 端点),DL_PG_PASSWORD、DL_AUTH_PASSWORD 等敏感项永不进入前端。
两个实测结论:
- 改 .env 必须重启进程才生效(官方文档原话 "You have to restart the app for changes to env vars to take affect")。
- 每次启动第一行日志即回显加载了几个配置项,可用于快速确认 .env 是否被读到:
🔵 [env] Read 2 settings from /root/domain-locker/.env
浏览器侧配置下发端点有环境门禁,实测 dev 模式下访问直接被拒:
# curl -s http://localhost:8147/api/env-var
{"error":true,"message":"This endpoint is only available for selfHosted environment."}
2. DL_ENV_TYPE:运行模式(✅ 实测)
四种取值(来源:官方文档;managed 仅官方托管实例使用):
| 取值 | 行为 | 实测观察 |
|---|---|---|
selfHosted | 自托管模式,走本地 SQLite/PostgreSQL,启用内置调度器与 /api/env-var | ✅ 启动日志出现数据库与调度器段落 |
dev | 开发模式,连官方托管 dev Supabase 实例 | ✅ 启动日志极简、本地 v1 API 返回 403 |
demo | 只读演示模式,预填数据 | 📖 文档核实 |
managed | 托管 SaaS,启用计费与多用户 | 📖 文档核实 |
DL_ENV_TYPE=dev + Supabase 凭据的实测(凭据取自仓库 .env.sample 的公开 anon key):
🔵 [env] Read 4 settings from /root/domain-locker/.env
Listening on http://[::]:8147
对比 selfHosted 模式:没有 database/scheduler/migrations 日志段——dev 模式下数据面走 Supabase(浏览器直连),本地 Nitro 服务只承担页面与代理。此时本地 v1 API 被门禁:
# curl -s http://localhost:8147/api/v1/auth/status
{
"error": true,
"url": "http://localhost:8147/api/v1/auth/status",
"statusCode": 403,
"statusMessage": "Server Error",
"message": "Server Error"
}
选型结论:自托管一律 DL_ENV_TYPE=selfHosted;dev 仅用于参与项目开发且愿意连官方共享 dev 库的场景,官方明确标注 NOT suitable for production。
3. 端口与地址
| 参数 | 说明 | 状态 |
|---|---|---|
PORT | HTTP 监听端口,默认 3000 | ✅ 实测设 8147,启动日志 Listening on http://[::]:8147,ss -ltn 见 *:8147 |
DL_BASE_URL | 实例公网 URL,用于 sitemap 与来源校验 | 📖 文档核实:浏览器永远调用自身 origin,反代与访问域名一致时无需设置 |
DL_INTERNAL_BASE_URL | 服务端内部回环地址,默认 http://localhost:3000 | 📖 文档核实:仅当应用不在本机回环监听时需要 |
DL_ALLOWED_ORIGINS | 额外放行的跨域 origin,逗号分隔 | 📖 文档核实 |
4. 数据库参数
4.1 SQLite(默认,✅ 实测)
未设置任何 DL_PG_* 时自动使用 SQLite,零配置:
🔵 [database] Using SQLite at /root/domain-locker/data/domain-locker.db
自定义路径(✅ 实测 DL_SQLITE_PATH=/root/dl-data/custom-locker.db):
🔵 [database] Using SQLite at /root/dl-data/custom-locker.db
# ls -la /root/dl-data/
-rw-r--r-- 1 root root 4096 Oct 28 05:11 custom-locker.db
-rw-r--r-- 1 root root 32768 Oct 28 05:11 custom-locker.db-shm
-rw-r--r-- 1 root root 704552 Oct 28 05:11 custom-locker.db-wal
可见 SQLite 以 WAL 模式运行(-shm/-wal 伴随文件)。备份时务必连同 -wal 文件或使用 sqlite3 在线备份,命令见 《Domain Locker 常用 CLI 命令详解》。
4.2 PostgreSQL(✅ 实测)
五个变量必须成组配置:DL_PG_HOST、DL_PG_PORT、DL_PG_USER、DL_PG_PASSWORD、DL_PG_NAME。
只配一部分时的真实行为(✅ 实测仅设 DL_PG_HOST):
🟡 [database] Postgres is only partly configured, so SQLite is being used instead. Missing: DL_PG_USER, DL_PG_PASSWORD, DL_PG_NAME
🔵 [database] Using SQLite at /root/domain-locker/data/domain-locker.db
即静默回退 SQLite(黄色告警),不会启动失败——排查"明明配了 PG 为什么数据还在 SQLite"时先看这行日志。完整配置后:
🔵 [database] Using Postgres at localhost/domain_locker
schema 应用与迁移由应用启动时自动完成;若用官方 db/setup-postgres.sh 建库,注意脚本以 DL_PG_PASSWORD 连接 postgres 超级用户的坑(实测与解法见 B 篇 6.2 节)。
4.3 Supabase 连接(✅ 门禁实测)
SUPABASE_URL + SUPABASE_ANON_KEY 只在 DL_ENV_TYPE=dev / managed 场景生效(实测行为见第 2 节:本地数据库与调度器段落消失、v1 API 返回 403)。配套变量 DL_SUPABASE_PROJECT 为项目 ID(📖 文档核实)。官方对自托管用户的建议(来源:官方文档《Supabase Setup》,查询日期 2026-10-28):"Where possible, we recommend self-hosted users to use SQLite or Postgres instead"——Supabase 栈仅推荐给复刻官方托管版的团队,其配置/迁移/Edge Functions 独立维护在 Lissy93/dl-sb-iac 仓库。
5. 鉴权参数(✅ 全链路实测)
| 参数 | 说明 | 状态 |
|---|---|---|
DL_AUTH_PASSWORD | 面板访问口令,设置后全站需登录 | ✅ |
DL_API_KEY | 外部触发作业用的共享密钥 | ✅ |
DL_AUTH_SECRET | 会话 Cookie 签名密钥;缺省时由口令派生(scrypt) | 📖 源码核实 |
DL_DISABLE_WRITE_METHODS | 禁用 UI 侧写操作(无鉴权的只读分享场景) | 📖 文档核实 |
未设置口令时的启动告警(真实回显):
🟡 [security] No DL_AUTH_PASSWORD or DL_API_KEY is set, so anyone who can reach this instance can read your domains and trigger the scheduled jobs
设置 DL_AUTH_PASSWORD=q1w2e3r4、DL_API_KEY=dl-key-2026-test 后,告警消失,鉴权链路逐条实测:
# curl -s http://localhost:8147/api/v1/auth/status
{"authRequired":true,"authenticated":false}
# 无凭据访问业务 API → 401
# curl -s -w "\nHTTP %{http_code}\n" http://localhost:8147/api/v1/domains
{
"error": true,
"url": "http://localhost:8147/api/v1/domains",
"statusCode": 401,
...
}
HTTP 401
# 错误口令 → 401
# curl -s -w "\nHTTP %{http_code}\n" -X POST http://localhost:8147/api/v1/auth/login \
-H "Content-Type: application/json" -d '{"password":"wrongpass"}'
{"error":{"code":"unauthorized","message":"Incorrect password"}}
HTTP 401
# 正确口令 → 200 并下发 dl_session Cookie
# curl -s -c /tmp/dl-cookie.txt -w "\nHTTP %{http_code}\n" -X POST http://localhost:8147/api/v1/auth/login \
-H "Content-Type: application/json" -d '{"password":"q1w2e3r4"}'
{"authenticated":true}
HTTP 200
# Cookie 会话与 X-API-Key 均可通过
# curl -s -b /tmp/dl-cookie.txt http://localhost:8147/api/v1/domains
[]
# curl -s -H "x-api-key: dl-key-2026-test" http://localhost:8147/api/v1/domains
[]
要点:会话 Cookie 30 天有效;作业触发端点(如 /domain-updater)凭口令或 API Key 任一即可调用,因此只想保护 cron 端点时可以只配 DL_API_KEY 不配口令。
6. 调度器与监控开关(✅ 实测)
v0.3.0 起应用内置四类定时作业,默认间隔(启动日志实测):
🔵 [scheduler] Scheduled domain-monitor every 15 minutes
🔵 [scheduler] Scheduled domain-updater every 1440 minutes
🔵 [scheduler] Scheduled expiration-reminders every 1440 minutes
🔵 [scheduler] Scheduled cleanup-monitor-data every 10080 minutes
| 参数 | 默认 | 实测 |
|---|---|---|
DL_DISABLE_SCHEDULER | false | ✅ 设 true 后:🔵 [scheduler] Internal scheduler disabled by DL_DISABLE_SCHEDULER,四个作业全部不注册(外部 cron 自行触发 /domain-updater 等端点,需配 DL_API_KEY 或口令) |
DL_MONITOR_INTERVAL_MINUTES | 15 | ✅ 设 5 后:Scheduled domain-monitor every 5 minutes |
DL_UPDATER_INTERVAL_MINUTES | 1440 | ✅ 设 60 后:Scheduled domain-updater every 60 minutes |
DL_REMINDERS_INTERVAL_MINUTES | 1440 | ✅ 未设时日志默认值 1440 |
DL_CLEANUP_INTERVAL_MINUTES | 10080 | ✅ 未设时日志默认值 10080 |
DL_MONITOR_CONCURRENCY | 10 | 📖 文档核实:可用性检查并发数 |
DL_UPDATER_BATCH_SIZE | 100 | 📖 文档核实:每轮刷新的域名批量 |
7. WHOIS 采集参数
| 参数 | 默认 | 状态 |
|---|---|---|
DL_WHOIS_PROVIDERS | rdap,whois-json,who-dat,native,whoisxml | ✅ 实测默认顺序生效:updater 日志 🟢 [whois] Got WHOIS data via RDAP for example.com。官方提示无法出 43 端口的主机应去掉 whois-json |
DL_WHO_DAT_URL | 官方公共实例 https://who-dat.as93.net | 📖 文档核实:可指向自建 who-dat |
DL_WHOIS_CONCURRENCY | 5 | 📖 文档核实:更新器并发(.it/.eu 等限速注册局建议调低) |
DL_WHOIS_DELAY_MS | 0 | 📖 文档核实:请求间隔毫秒数 |
DL_DOMAIN_INFO_API / DL_DOMAIN_SUBS_API | 官方端点 | 📖 文档核实:可将数据面 API 指向自建实例 |
8. 数据保留参数(📖 文档核实)
| 参数 | 默认 | 说明 |
|---|---|---|
DL_UPTIME_AGGREGATE_AFTER_DAYS | 7 | 明细可用性数据保留天数,到期聚合为日均 |
DL_UPTIME_RETENTION_DAYS | 永久 | 可用性历史保留天数 |
DL_HISTORY_RETENTION_DAYS | 永久 | 域名变更历史保留天数 |
DL_NOTIFICATIONS_RETENTION_DAYS | 永久 | 通知保留天数(到期提醒永不清理) |
以上四项在 v0.3.4 引入(来源:GitHub Releases v0.3.4 说明 "feat: data retention policy for self-hosted",查询日期 2026-10-28)。数据库膨胀或合规要求有限留存时配置;本文未构造长周期数据逐项验证清理效果。
9. 通知与第三方集成(📖 文档核实)
| 参数组 | 用途 |
|---|---|
NOTIFY_WEBHOOK_BASE/TOPIC/TOKEN/USERNAME/PASSWORD | ntfy 兼容 Webhook 推送(私有实例配 token 或账密) |
DISCORD_WEBHOOK_URL | Discord 频道推送 |
APPRISE_API_URL/KEY/URLS/TAG | 经 Apprise API 转发到 Telegram/邮件等上百通道 |
DL_TURNSTILE_KEY | Cloudflare Turnstile 人机校验 |
DL_GLITCHTIP_DSN | GlitchTip/Sentry 错误上报 |
DL_PLAUSIBLE_URL/SITE | Plausible 访问统计 |
DL_STRIPE_CHECKOUT_URL / DL_STRIPE_CANCEL_URL | 托管版计费项,自托管无用 |
DL_DEMO_USER / DL_DEMO_PASS | demo 模式预填账号 |
通知通道均依赖外部服务,本文未逐一联通验证;通道行为与自托管通知机制另见官方文档《Notifications for Self-Hosted》。
10. 其他参数
| 参数 | 说明 | 状态 |
|---|---|---|
DL_SKIP_INIT | 设 true 跳过打包入口 start.sh 的环境自检直接起进程 | 📖 源码核实(start.sh 专用,node dist/analog/server/index.mjs 直启路径不经过它) |
DL_DISABLE_SSRF_PROTECTION | 设 true 关闭内网域名 SSRF 防护 | 📖 文档核实:仅监控纯内网域名时才需要,公网实例勿开 |
11. 全参数速查表
| 参数 | 默认 | 验证 |
|---|---|---|
| DL_ENV_TYPE | —(必填) | ✅ |
| PORT | 3000 | ✅ |
| DL_SQLITE_PATH | ./data/domain-locker.db | ✅ |
| DL_PG_HOST/PORT/USER/PASSWORD/NAME | 空(回退 SQLite) | ✅ |
| SUPABASE_URL / SUPABASE_ANON_KEY | 空 | ✅ |
| DL_BASE_URL / DL_INTERNAL_BASE_URL / DL_ALLOWED_ORIGINS | 空 | 📖 |
| DL_AUTH_PASSWORD / DL_API_KEY / DL_AUTH_SECRET | 空 | ✅ / ✅ / 📖 |
| DL_DISABLE_WRITE_METHODS | false | 📖 |
| DL_DISABLE_SCHEDULER | false | ✅ |
| DL_MONITOR_INTERVAL_MINUTES | 15 | ✅ |
| DL_UPDATER_INTERVAL_MINUTES | 1440 | ✅ |
| DL_REMINDERS_INTERVAL_MINUTES | 1440 | ✅(默认值) |
| DL_CLEANUP_INTERVAL_MINUTES | 10080 | ✅(默认值) |
| DL_MONITOR_CONCURRENCY | 10 | 📖 |
| DL_UPDATER_BATCH_SIZE | 100 | 📖 |
| DL_WHOIS_PROVIDERS | rdap,whois-json,who-dat,native,whoisxml | ✅ |
| DL_WHO_DAT_URL | https://who-dat.as93.net | 📖 |
| DL_WHOIS_CONCURRENCY / DL_WHOIS_DELAY_MS | 5 / 0 | 📖 |
| DL_UPTIME_AGGREGATE_AFTER_DAYS | 7 | 📖 |
| DL_UPTIME_RETENTION_DAYS / DL_HISTORY_RETENTION_DAYS / DL_NOTIFICATIONS_RETENTION_DAYS | 空(永久) | 📖 |
| NOTIFY_WEBHOOK_* / DISCORD_WEBHOOK_URL / APPRISE_* | 空 | 📖 |
| DL_TURNSTILE_KEY / DL_GLITCHTIP_DSN / DL_PLAUSIBLE_* | 空 | 📖 |
| DL_DOMAIN_INFO_API / DL_DOMAIN_SUBS_API | 空 | 📖 |
| DL_DEMO_USER / DL_DEMO_PASS / DL_STRIPE_* | 空 | 📖 |
| DL_SKIP_INIT / DL_DISABLE_SSRF_PROTECTION | 空 | 📖 |
12. 未逐项实测清单(诚实声明)
以下参数因依赖外部服务或长周期数据,本文仅做文档与源码核实,未触发验证:保留策略四项的实际清理动作、通知三通道的端到端推送、Turnstile/GlitchTip/Plausible 集成效果、DL_BASE_URL 的 sitemap 行为、DL_MONITOR_CONCURRENCY/DL_UPDATER_BATCH_SIZE 的并发上限压测、demo/managed 两种模式的完整行为。如需这些项的实测结论,应在具备对应外部条件的环境另行验证。
相关阅读
- 《Domain Locker 介绍与选型指南》:定位与技术架构
- 《Domain Locker Ubuntu 22.04 安装部署指南》:安装、PostgreSQL 切换与部署排障
- 《Domain Locker 常用 CLI 命令详解》:进程管理、备份恢复与 API 实测
- 《Uptime Kuma 配置参数详解》:拨测侧同类工具的配置参考