DomainMOD 4.23 常用 CLI 命令详解

DomainMOD 4.23 命令行与维护工具全解:cron.php 调度入口手动执行与 last_run 验证、maintenance 三个维护脚本(汇率/域名费用/SSL 费用,带 Referer 触发实测)、Backup & Restore 全库备份恢复与 Cleanup、mariadb-dump 命令行备份、Admin Maintenance 清队列清日志、Debug Log/System Information 诊断、报表 CSV 导出(2026-10-26 实测)。

DomainMODDomainMOD域名服务证书管理2026/10/26

DomainMOD 4.23 常用 CLI 命令详解

目标:把 DomainMOD 4.23(自托管域名与 SSL 证书资产台账)日常维护会用到的命令与入口一次讲全——调度器入口 cron.php、三个维护脚本、Web 端 Backup & Restore、命令行数据库备份/恢复、调试日志与诊断页、报表 CSV 导出。全部命令与回显在 Ubuntu 22.04 + Apache 2.4.69 + PHP 8.2.35 + MariaDB 10.11.19 单机部署上实测(应用版本 4.23.0,2026-10-26);参数含义与界面字段见 《DomainMOD 4.23 配置参数详解》。演示约定:应用根目录 /var/www/html,管理员 admin/q1w2e3r4,数据库账号 domainmod/q1w2e3r4。

一、环境信息

项目值
应用版本DomainMOD 4.23.0
应用根目录/var/www/html
调度入口/var/www/html/cron.php
维护脚本目录/var/www/html/maintenance/
运行用户domainmod(cron 与 Apache 同属)
数据库MariaDB 10.11.19,库名 domainmod
备份落盘目录/var/www/html/temp(Web 备份)/ 运维自定义(命令行备份)

二、工具概览

DomainMOD 4.23 的"命令行"由三部分组成:一个纯 CLI 入口(cron.php)、一组通过 Web 触发的维护脚本(maintenance/*.php)、以及数据库侧的 mariadb 客户端命令。清单如下:

入口类型用途自动化程度
cron.phpCLI 脚本调度器总入口,驱动全部定时任务系统 cron 每 10 分钟自动执行
maintenance/update-conversions.phpWeb 触发手动刷新币种汇率需登录会话
maintenance/update-domain-fees.phpWeb 触发从注册商费用表重算域名费用需登录会话
maintenance/update-ssl-fees.phpWeb 触发重算 SSL 证书费用需登录会话
Backup & Restore 页面Web 触发全库备份下载 / 恢复 / 清理需管理员
Admin Maintenance 页面Web 触发清空队列 / 清空调试日志需管理员
mariadb / mariadb-dump数据库 CLI命令行备份恢复、数据核查可进系统 cron
报表导出(Reporting)Web 触发各类报表 CSV 导出需登录会话

三、前置条件

  1. 部署完成且已建账(见部署篇),以下命令默认以能 sudo 的运维账号在服务器终端执行。
  2. cron 归属正确:调度入口必须以 domainmod 用户跑(与 Web 同属,保证文件权限一致):
crontab -l -u domainmod
*/10 * * * * domainmod /usr/local/bin/php -q /var/www/html/cron.php > /dev/null

zip/源码安装形态若没有这条,按官方 README「Cron Job」节补齐(用户名换成实际运行 Apache 的用户)。

  1. 数据库命令行可用(密码为演示值):
mariadb -u domainmod -pq1w2e3r4 domainmod -e 'SELECT @@version;'
@@version
10.11.19-MariaDB-ubu2204

四、cron.php:调度器入口

4.1 它做什么

cron.php 不做具体业务,而是读 scheduler 表(配置见配置篇第六节),把到点的任务逐个执行:域名队列处理、到期邮件、汇率刷新、系统清理、新版本检查、数据仓库构建。它是全部自动化的唯一驱动。

4.2 手动执行

手动跑一次(正常时无任何输出、退出码 0,实测):

php -q /var/www/html/cron.php; echo "EXIT=$?"
EXIT=0

💡 输出为空不代表没执行——所有输出被任务内部消化(邮件发出、数据落库、日志入表)。要判断效果看 4.3 的执行时间戳。

4.3 验证执行效果

执行前后核对 scheduler 表的 last_run:

mariadb -u domainmod -pq1w2e3r4 domainmod \
  -e 'SELECT id,name,last_run FROM scheduler WHERE id=1;'
id  name                     last_run
1   Domain Queue Processing  2026-10-26 02:35:53

last_run 已刷新为刚才那次执行的时间(库内时间戳为 UTC,页面 Task Scheduler 显示本地时间 10:35:53,差 8 小时是设计行为,见配置篇 6.5)。自动化验证只需盯 Web → Administration → Task Scheduler 的 Last Run 是否每 10 分钟内推进。

4.4 与 Web 调度页的关系

Web 页面的 Run Now 按钮本质也是立即触发对应任务(绕过 expression 判断);cron.php 则严格按 expression 到点执行。两者共用同一套任务实现,效果一致,回显差异见配置篇 6.4(Expiration Email Sent 等)。

五、维护脚本:maintenance/*.php

目录 /var/www/html/maintenance/ 下是三个可手动触发的维护脚本。注意它们是 Web 脚本而非 CLI——需要登录会话并从 Maintenance 页面发起(带 Referer),命令行 curl 模拟时必须带 Cookie 与 Referer,否则被会话检查弹回。

页面入口:Administration → Maintenance,标题 Maintenance Tasks,列出手动维护项:

Maintenance Tasks
Update Conversion Rates   Updates all of your currency conversion rates.
Update Domain Fees        Updates all of your domain fees based on the fees you've saved for each of your registrar accounts.
Update SSL Fees           Updates all of your SSL fees based on the fees you've saved for each of your SSL provider accounts.
Admin Maintenance
Clear Queues              Deletes all processing and failed items from your queues.
Clear Debug Log           Deletes all entries in the Debug Log.

5.1 Update Conversion Rates:刷新汇率(实测)

适用:Currency Converter 已开启(配置篇 5.5),或汇率源调整后想立即生效。

curl -s -b /tmp/dmck.txt -e "http://127.0.0.1:8131/maintenance/" \
  -o /dev/null -w '%{http_code}->%{redirect_url}\n' \
  http://127.0.0.1:8131/maintenance/update-conversions.php
302->http://127.0.0.1:8131/maintenance/index.php

脚本执行完 302 回 Maintenance 页,页面顶部反馈执行结果。等价操作:直接点页面上的 Update Conversion Rates 按钮。不带 Referer 的裸访问会被拒绝(302 弹回),这是登录态校验,不是故障。

5.2 / 5.3 Update Domain Fees / Update SSL Fees

  • maintenance/update-domain-fees.php:按各注册商账号里保存的费用(Initial/Years 1-10/Renewal/Transfer 等列)重算全部域名的费用字段。适用:批量改了注册商价格表之后。
  • maintenance/update-ssl-fees.php:同理作用于 SSL 证书。
  • 触发方式与 5.1 相同(页面按钮或带会话的 curl),执行完 302 回 Maintenance 页。两个脚本都是纯库内重算,不访问外部接口。

5.4 与定时任务的关系

这三个脚本的"自动版"就是 scheduler 里的 Update Conversion Rates(每日)等任务;手动脚本用于"改完配置立即要结果"的场景,不必等 15:00。

六、备份与恢复

6.1 Web 全库备份(Backup Entire Database,实测)

页面:Administration → Tools → Backup & Restore。点击 Backup Entire Database 直接下载 SQL 文件(实测响应头与文件头):

HTTP/1.1 200 OK
Content-disposition: attachment; filename=domainmod-backup.sql
Content-Length: 98665
-- mysqldump-php https://github.com/ifsnop/mysqldump-php
-- Host: db    Database: domainmod
-- Server version 10.11.19-MariaDB-ubu2204

应用内部用 PHP 版 mysqldump 库(mysqldump-php)导出,覆盖全部业务表。备份前临时文件落在 /var/www/html/temp(该目录必须全局可写,部署时已自动 chmod 777,见部署篇 7.3)。

⚠️ 页面官方警告(原文):Before you can use Backup & Restore you must update the permissions on the /var/www/html/temp folder——temp 不可写时备份按钮报错,这是 Web 备份失败的头号原因。

6.2 命令行全库备份(mariadb-dump,实测)

更可控、可进系统 cron 的方式:

mariadb-dump -u domainmod -pq1w2e3r4 domainmod > /var/backups/dm-dump.sql
ls -la /var/backups/dm-dump.sql
-rw-r--r-- 1 root root 96617 Oct 26 10:37 /var/backups/dm-dump.sql

建议挂 cron 每日一次并保留多份(文件名带日期):

30 4 * * * domainmod mariadb-dump -u domainmod -p数据库密码 domainmod | gzip > /var/backups/domainmod-$(date +\%F).sql.gz

⚠️ 命令行带密码会触发 MariaDB 的明文密码告警("Using a password on the command line interface can be insecure"),不影响功能;严谨做法是配 /root/.my.cnf(chmod 600)后免密执行。

6.3 恢复全库(Restore Entire Database)

页面同处的 Restore Entire Database:上传或选择 temp 下的备份 SQL,整库替换。页面官方警告(原文照抄):

WARNING! This will delete and replace all of the data in your database.
Make sure you have a recent backup, just in case.

恢复完成后系统会登出(数据库被替换,原会话失效),用备份内的账号密码重新登录。改密后务必立即做一次全库备份——这是忘记 admin 密码时的唯一自救通道(见配置篇 FAQ 5)。

命令行等价恢复(先重建空库再导入):

mariadb -u root -p -e 'DROP DATABASE domainmod; CREATE DATABASE domainmod;'
mariadb -u root -p domainmod < /var/backups/dm-dump.sql

⚠️ 恢复是破坏性操作,执行前再确认目标库与备份版本一致;应用会按 settings 表 db_version 自动跑结构迁移,跨大版本恢复后先访问一次首页让迁移完成。

6.4 Perform Cleanup:清理备份残留

Backup & Restore 页面的 Perform Cleanup:删除 temp 目录里历史备份/恢复遗留的临时文件。实测执行后 temp 目录只剩系统所需文件(本轮实测 temp 内为空,仅历史操作时出现 domainmod-backup.sql)。常规备份建议命令行直出 /var/backups,Web 备份产物仅作临时交接用。

七、Admin Maintenance:清队列与清日志

Maintenance 页面下半区两个按钮:

  • Clear Queues:清空域名/证书/SSL 队列中所有 processing 与 failed 条目。适用:队列卡死、大量失败重试挤占处理(每 5 分钟的 Domain Queue Processing 会更快跑完)。执行后队列页计数归零。
  • Clear Debug Log:清空调试日志。排障结束后清理(Debug Log 页同有 Clear 按钮,效果一致)。

两键都无需确认弹窗,点击即执行——执行前想留证据的话先把 Debug Log 导出。

八、诊断入口

8.1 Debug Log

页面:Administration → Debug Log。内容来源:Debugging Mode 开启后的系统错误与 SQL 细节(配置篇 5.7)。实测空日志时显示:

The Debug Log is empty

页面右上 Clear Debug Log 可清空。排障姿势:临时开 Debugging Mode → 复现问题 → 看 Debug Log → 关模式 → Clear。

8.2 System Information(版本与体检)

页面:Administration → System Information。核实版本与环境的唯一权威入口(部署篇 4.5 有完整回显),关键行:

DomainMOD Version: 4.23.0 (4.23.0)
PHP Version: 8.2.35
MySQL Version: 10.11.19-MariaDB-ubu2204

升级后第一件事就是看这里,确认版本号已经走完自动迁移。

九、数据导出:报表 CSV(实测)

Reporting 页每张报表右上角都有 Export 导出 CSV。以 Domain Cost by TLD Report 为例(实测导出内容原文照抄):

"Domain Cost by TLD Report"

"Date Range:",ALL
"Total Cost:",$28.00,USD
"Number of Domains:",3

TLD,Cost,Domains,"Per Domain"
.com,$15.00,1,$15.00
.net,$0.00,1,$0.00
.org,$13.00,1,$13.00

💡 文件带 BOM 头,Excel 直接双击打开中文/特殊字符不乱码。命令行批量导出走 SQL 自查或脚本调用导出 URL(同样需要登录会话),适合与其他系统做日终同步。

十、注意事项

  1. maintenance/*.php 与导出 URL 都要求登录会话 + Referer,脚本化时先登录拿 Cookie 再带 Referer 调用(见 5.1 实测),裸调用一律 302 弹回。
  2. cron.php 必须以应用属主用户执行(domainmod),用 root 跑会把 temp/log 文件属主改乱,Web 备份随即失败。
  3. 数据库时间戳一律 UTC,last_run/expiry 等字段核对时先换算时区(页面显示按 TZ)。
  4. 备份三份走三条路:Web 备份(人肉核对方便)、mariadb-dump 进系统 cron(每日自动)、下载到部署机之外(异地)。Restore Entire Database 是整库替换,没有"部分恢复"。
  5. Clear 类操作不可逆(清队列、清日志无确认),执行前确认无需留档。

十一、常见问题(FAQ)

Q1:手动执行 cron.php 报 Table 'domainmod.scheduler' doesn't exist? 库是空的(还没走安装向导)。先完成 Web 安装(部署篇 4.3)再谈调度;已安装却报此错说明连错了库,核对 config.inc.php 的四项数据库参数。

Q2:到期邮件任务到点没跑? 按配置篇 FAQ 2 的四层链路排查:系统 cron 存在(第三节)→ 任务 active(配置篇 6.1)→ SMTP 测试通过(配置篇 5.8)→ 用户订阅开启(配置篇 7.1)。

Q3:Update Conversion Rates 执行了但汇率没变? 该任务依赖外网汇率源(Free Currency Rates API)。服务器出网受限时任务静默失败,开 Debugging Mode 看 Debug Log 的 cURL 报错;也可先用 curl 验证服务器能否访问汇率接口。

Q4:Web 备份 0 字节或报错? temp 目录权限(777)被改动或磁盘满。恢复权限(部署篇 7.3)后重试;持续失败改走 6.2 命令行备份。

Q5:恢复备份后登录不进去? 备份里带的是当时的账号密码(比如恢复到改密前的备份就是 admin/admin)。这不是故障,用备份内的账号登录即可;恢复动作本身会强制登出所有会话。

Q6:升级后报数据库结构错误? 确认升级路径为「备份 → 换新版本镜像 → 启动」并访问一次首页让自动迁移跑完(升级机制见部署篇 10.3);仍报错时回滚镜像并用 6.3 恢复备份。

十二、参考链接