【实用的开源工具】Domain Admin:域名和 SSL 证书到期提醒平台

阅读约 12 分钟
【实用的开源工具】Domain Admin:域名和 SSL 证书到期提醒平台

「实用的开源工具」系列:我只收集值得用的开源项目,写清楚它能做什么、怎么部署、有哪些坑,并在文末标明出处。内容整理自官方文档,核对日期 2026-10-31,具体版本以官方为准。这篇我没有实际部署验证,命令和配置都来自官方文档和仓库;涉及我自己的判断时,会明确标出来。

项目信息卡

项目说明
名称Domain Admin
做什么域名、SSL 证书和托管证书文件的到期监控与提醒;附带 Let's Encrypt 证书申请和自动续期、证书部署功能
技术栈Python(Flask)+ Vue 3
许可证MIT
仓库github.com/dromara/domain-admin(README 说明项目已加入 Dromara 开源社区)
官方文档使用文档在 domain-admin.readthedocs.io;GitHub 仓库 Website 字段填的 mouday.github.io/domain-admin,README 把它标为“接口文档”
最近版本v1.6.78(2026-06-07 发布,查询于 2026-10-31);仓库未归档,最近一次推送 2026-10-22,比最近一个发布版新
运行方式Docker 镜像 mouday/domain-admin,容器内端口 8000,数据放在 /app/database,日志在 /app/logs;也可以用 pip 或源码、宝塔、1Panel、k8s
默认账号官方安装文档写明默认管理员是 admin / 123456,强烈建议登录后立即修改
数据库默认 SQLite;官方建议生产环境用 MySQL 避免锁表
通知渠道邮件、Webhook、企业微信、钉钉、飞书(文档逐个有配置说明)
需要留意官方 Dockerfile 的基础镜像是 python:3.7.15-alpine3.16,比较旧;前端源码在另一个仓库(见踩坑清单)

它能做什么

按官方 README 和文档:

  • 到期监控:监控域名、SSL 证书和托管证书文件的到期时间,到期前提醒。
  • 证书类型:单域名、多域名、泛域名(通配符)、IP 证书、自签名证书。
  • 网站监控:文档里有网站监控异常的通知模板(可以设置请求 URL 和重试次数)。
  • 证书申请与部署:支持 Let's Encrypt 证书免费申请和自动续期,验证文件和证书文件都可以一键部署到服务器,也可以用 API 把证书推送到你自己写的接口。
  • Prometheus 接口:有 /metrics,需要先在“系统设置 / API KEY”里拿授权 key;官方文档还给了 Grafana 模板的链接。
  • 多语言:中文和英文。

它解决的问题很具体:不同业务的域名和证书分散在不同平台,到期没人发现,线上就出问题。如果你只有一两个站点,手动记一下到期日也许就够了;域名和证书多了、又分散在不同平台时,一个集中的清单加到期提醒才真正有价值。(这是我的判断。)

部署

官方安装文档里的方式有:宝塔、Docker、源码、1Panel、k8s、pip。这里按 Docker 来。

先建目录:

bash
mkdir -p /opt/domain-admin/{database,logs} && cd /opt/domain-admin

compose.yaml(卷、端口、镜像名来自官方 docker-compose 示例;我把端口绑定到了 127.0.0.1,并固定了镜像版本):

yaml
services:
  domain-admin:
    image: mouday/domain-admin:v1.6.78
    container_name: domain-admin
    restart: unless-stopped
    ports:
      - "127.0.0.1:8000:8000"
    volumes:
      - "./database:/app/database"
      - "./logs:/app/logs"
    environment:
      - APP_MODE=production
      # 文档的配置示例里是 ENABLED_REGISTER=true;关闭注册的写法是我按字面意思推的,部署后请自己在登录页确认
      - ENABLED_REGISTER=false

启动:

bash
docker compose up -d
docker compose logs -f domain-admin

说明:

  • 镜像标签:官方示例用的是 mouday/domain-admin:latest。我查 Docker Hub 时,v1.6.78 这个标签存在(带 v 前缀),和最近发布版一致。照抄前请再确认一次标签还在。
  • 卷:官方文档说 database 是 SQLite 数据库和重要数据的目录,logs 是日志目录,用来排查问题。
  • 环境变量:官方文档说配置可以写进运行目录的 .env 文件,也可以直接设系统环境变量,并给出了 Docker Compose 里的 environment 和 env_file 两种写法。文档“配置参数”里列出的变量有 DB_CONNECT_URL、APP_MODE(production 或 development)、ALLOW_COMMANDS、ENABLED_REGISTER。仓库里的 .env.example 还多了一个 SHODAN_API_KEY,我没有在使用文档里找到它的说明。
  • 换数据库:官方示例是

``text DB_CONNECT_URL=mysql://root:[email protected]:3306/data_domain ``

需要事先建好数据库,并建议指定字符集 utf8mb4;PostgreSQL 的连接串是 postgresql://...,官方说需要自己装 psycopg2 依赖。以上都只是示例,用户名和密码请换成你自己的。官方镜像构建时安装的 requirements/production.txt 里包含 pymysql,但我没有看到 psycopg2,所以 PostgreSQL 在官方镜像里可能需要自己处理,这点我没有验证。

  • 不用 Compose 的写法:官方也给了 docker run 版本,参数就是上面这些卷和端口,镜像用 mouday/domain-admin:latest。

另一种官方支持的方式是 pip(Linux/macOS):

bash
python3 -m venv venv && source venv/bin/activate
pip install gunicorn domain-admin
gunicorn --bind '127.0.0.1:8000' 'domain_admin.main:app'

Windows 官方文档的做法是用 waitress-serve --listen=127.0.0.1:8000 domain_admin.main:app(因为 gunicorn 不支持 Windows)。

Nginx 反向代理

官方文档没有给反向代理示例,下面是我写的通用写法,不是官方配置。因为服务默认是 HTTP,登录页又有默认账号,不要裸露在公网:

nginx
server {
    listen 443 ssl;
    server_name domain-admin.example.com;

    ssl_certificate     /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

官方 Dockerfile 里的启动命令是 gunicorn --bind '[::]:8000' --timeout 120 'domain_admin.main:app',也就是单个 gunicorn 进程监听 8000,超时 120 秒。

第一次使用

官方文档涉及的首次操作大致是:

  1. 登录并改密码。 打开页面,用 admin / 123456 登录,然后立刻改掉默认密码。官方安装文档用的措辞是“强烈建议”。
  2. 设置发件邮箱。 在“系统管理 / 系统设置 / 邮箱设置”里配置系统发件邮箱。官方说明:如果需要对域名做到期监控和邮件提醒,必须设置它;用 163 邮箱的话,密码处填授权码。
  3. 配置通知。 在通知配置里选择渠道,填写好后点测试(见下一节)。如果测试收不到消息,官方建议把“剩余天数”设成一个比较大的值再试。
  4. 添加域名和证书。 加入你要监控的域名或网站。监控非 443 端口的站点,格式写成 域名:端口,例如 www.example.com:8080。具体按钮和菜单名称以你的版本界面为准,官方使用文档里关于这一步的说明很少,我这里就不编了。
  5. 了解它的工作原理(官方 FAQ):

- 证书监控:先实时访问网站,取回证书并解析签发和过期时间,写入数据库;再根据你设置的通知条件查库,有符合的就发通知。如果网站不可访问,可以关掉“自动更新”,不影响到期通知。 - 域名监控:通过域名服务器取回注册信息,解析注册和过期时间;然后同样按条件查库发通知。因为域名到期时间不会变,所以程序只在到期前 30 天内才去更新域名信息,避免查询过快被域名信息服务器拦截而误报。

通知渠道

官方“通知配置”文档逐个写了这些:

渠道文档里的说明
邮件先设置系统发件邮箱,再用 JSON 数组填收件人,例如 ["[email protected]", "[email protected]"]
Webhook通用接口,支持自定义请求头和请求体;文档里有钉钉群机器人、企业微信群机器人、飞书、Resend(发邮件的 API)、showdoc(推送到微信服务号)的示例
企业微信应用消息,需要 touser、agentid 等
钉钉工作通知,需要 agent_id、userid_list 等
飞书消息接口,需要 receive_id 等

此外:

  • Webhook、企业微信、飞书、钉钉都支持自定义通知模板,用的是 Jinja2。官方给出的模板变量(证书、域名到期)包括 domain、start_date、expire_date、expire_days,放在 list 里,而 list 里只有满足通知条件的数据。
  • 网站监控异常的模板变量有 monitor_row.title、monitor_row.http_url、monitor_row.allow_error_count、monitor_row.status(0 未知,1 成功,2 失败)和 error。
  • 文档里没有 Telegram 的配置说明。 官方“开发计划”页里把“支持 Telegram 告警”列在没有标记“已完成”的条目里。如果你需要 Telegram 推送,不要想当然,先看你的版本界面里有没有这个选项。

更新与卸载

官方安装文档的说法:Domain Admin 所有版本都支持平滑升级,装最新版再重启即可;Docker 安装的话,注意 database 目录是不是手动挂载的,不要删。用 Compose 时,官方给的更新方式是先拉取镜像再重启:

bash
cd /opt/domain-admin
cp -a database database.bak-$(date +%F)    # 先备份数据目录(通用建议)
# 把 compose.yaml 里的镜像标签改成新版本(先确认 Docker Hub 上有这个标签),然后:
docker compose pull
docker compose up -d

pip 方式的官方升级命令:

bash
pip3 install -U domain-admin -i https://pypi.org/simple

卸载:

bash
cd /opt/domain-admin
docker compose down

这只会停掉并删除容器。./database 里是监控清单、通知配置和(如果你用了证书功能)证书相关数据,删掉就没有了;确认不需要再 rm -rf /opt/domain-admin。pip 安装的用 pip uninstall domain-admin(通用命令,不是官方文档里的)。

踩坑清单

  1. 默认账号 admin / 123456,一定要改。 官方文档自己写了“强烈建议登录后修改默认密码”,而且这个默认值是公开的,不要在改密码之前把页面暴露到公网。
  2. SQLite 适合测试,生产建议 MySQL。 官方文档:SQLite 只支持单线程操作,操作频繁会出现 database is locked,换成 MySQL 就能避免;MySQL 建议用 utf8mb4。
  3. 数据目录要挂载。 官方强调 database 目录是 SQLite 数据库和重要数据所在,Docker 下别删。
  4. 只能单进程运行,不要加多个 worker。 官方 FAQ:用 master + 多 worker 方式启动,会启动多个定时任务调度器,导致任务被重复执行;小规模使用一个进程就够。
  5. 想关注册,就自己确认 ENABLED_REGISTER。 官方配置示例是 ENABLED_REGISTER=true,说明“目前仅支持邮箱验证码登录”。我在 Compose 里写了 false,但这个取值我没验证过,部署后请自己看登录页还有没有注册入口。
  6. ALLOW_COMMANDS 是“允许远程执行的命令白名单”,别乱填。 官方示例是 nginx -s reload 之类。这是我的判断:它会让程序有执行服务器命令的能力,没用到远程部署证书的话,就不要设置。
  7. 发件邮箱不设置,邮件提醒就不会工作。 官方说明域名到期监控和邮件提醒必须设置系统发件邮箱;邮件发送失败时可以试试换端口 25、465、587。
  8. 测试收不到通知,先加大“剩余天数”。 这是官方备注里的建议。我的推断是:官方说明传给模板的 list 只包含满足通知条件的数据,没有符合条件的数据,就没有内容可发。
  9. 有些域名后缀查不到信息。 官方列出已知不支持的后缀:.lc、.ml、.ai、.my、.ch、.edu.cn、.name。查不到信息的域名可以关掉自动更新,不影响到期通知。
  10. 用了 CDN 的站点,证书的主机地址可能显示不对。 官方说明系统不会主动清空已有的主机地址,这类证书可以打开“动态主机”,每次更新都会先清空主机 IP 列表再重新获取。
  11. 证书申请功能会碰到敏感信息。 官方文档里的自动部署需要填写服务器账号和密码,远程部署会把证书和私钥推送到你指定的接口。官方自己的建议是:首次使用推荐手动验证,流程跑通之后再用一键部署。这是我的补充:能手动就手动,真要自动,用权限最小的账号,并保护好 database 目录和它的备份。
  12. 申请的证书不会自动提醒到期。 官方说明:通过平台申请到的证书不会有到期提醒,需要把部署该证书的域名加入证书监控列表;全程用一键部署的话,到期前 30 天会自动续期。
  13. 忘记 admin 密码的办法是改数据库。 官方 FAQ 的做法是把 tb_user 表里的密码字段替换成一个已知密码的哈希(可以重置为 123456)。这也说明:能读写数据库文件的人,就能重置管理员密码,所以 database 目录的权限要收紧。
  14. 官方镜像的基础环境比较旧。 官方 Dockerfile 基于 python:3.7.15-alpine3.16,并把时区设成了 Asia/Shanghai。这是我的判断:基础镜像旧,所以更要放在反向代理和访问控制后面,不要直接暴露端口。
  15. 发布版本和仓库提交不同步。 最近发布版是 2026-06-07 的 v1.6.78,而仓库在 2026-10-22 还有推送;Docker Hub 的 latest 对应的是已发布的版本。想用仓库里更新的修复,要等发布。
  16. 前端源码不在主仓库里。 README 说明本项目前后端分离,前端代码在另一个仓库(README 的获取方式是自行解码链接或联系交流群);发布包和镜像里带了打好包的前端。如果你要二次开发前端,请先读 README。
  17. 官方在线体验站已经到期。 README 里的体验版地址旁标着“服务器已到期”,预览版是纯静态的、没有实际功能,所以官方的建议是自己部署。
  18. Docker 发布的端口会绕过 ufw 之类的防火墙。 这是通用的 Docker 知识,不是项目特有的问题,所以示例里绑定在 127.0.0.1。官方示例默认是对所有网卡开放的 8000。

出处

想要类似的东西?网站、Telegram 机器人、运维工具,说说你的需求。
发布需求

有想法或问题?去留言板留言 →