让 AI 帮你部署 DJM CMS

把部署约束写进提示词交给能执行命令的 AI:安装包校验、SQLite 配置、迁移、建管理员、systemd、Nginx 与验收清单。

这篇说明面向“希望让 AI 直接在服务器上装好站点”的场景。下面的提示词可以直接复制给支持终端操作的 AI(Claude Code、Cursor、Codex 等),也可以把安装包里的 INSTALL-AI.md 一起丢给它。

先说清楚边界:AI 能完成下载、解压、改配置、跑迁移、装 systemd、配 Nginx、做健康检查;域名解析、放行 80/443 端口、证书签发失败时的人工处理仍然需要人配合。所以流程必须是“先出计划、确认后执行”,不要让 AI 一把梭。

前提

  • AI 工具具备 SSH 或本机终端执行权限,能连续运行命令并读取输出;只能在聊天窗口给建议的工具做不了。
  • 服务器已装好 Nginx(或愿意让 AI 用 apt/yum 安装),systemd 可用。
  • 域名已解析到本机公网 IP;云厂商安全组/防火墙已放行 80、443。
  • 安装包从 Cloud 的 installers/newest 接口获取元数据(版本、大小、sha256、download_url),或从官网 下载页手动获取。releases 接口只提供升级包,不能拿来做全新安装。
  • 建议先在测试机或新目录跑一遍,再上正式站。

红线

  1. 先计划后执行:先列出将要执行的命令和会创建的文件,人工确认后再动手。
  2. 不碰其他站点:只允许在指定安装目录内操作,目标目录已存在就停下来询问。
  3. 密码不回贴对话:管理员密码写入 0600 文件,只告诉人文件路径,不要打印到对话、日志或截图。
  4. 失败即停:校验不过、端口被占用、证书申请失败都要停下来说明原因,不要跳过或“先继续后面再补”。

可复制提示词

把 <...> 里的内容换成你的实际值:

帮我在这台服务器上部署 DJM CMS。先给执行计划,我确认后再动手。

环境信息:
- 域名:<cms.example.com>(已解析到本机,HTTPS 用 Let's Encrypt)
- 安装目录:</www/wwwroot/cms.example.com>
- 安装包:读取 https://cloud.duojumi.com/api/public/v1/cms/installers/newest?channel=stable&os=linux&arch=amd64 的 download_url 和 package_sha256,下载到 /root/djm-installer.zip 并校验 sha256
- 数据库:SQLite
- 后台入口:随机生成,形如 /manage-xxxxxxxx
- 管理员:admin,密码用 openssl rand -base64 24 生成,写入 /root/cms-admin-password(权限 0600)
- 进程:systemd 单元 djm-cms.service,ExecStart=<安装目录>/djm-cms serve,Restart=on-failure,KillMode=process,RestartSec=5
- 反向代理:Nginx 反代 127.0.0.1:23180,并申请 HTTPS 证书

红线:
- 不要修改安装目录以外的任何站点或目录;目标目录已存在就停下来问我
- 不要结束或重启与本项目无关的进程;端口 23180 被占用先停下来问我
- 管理员密码只写入 0600 文件,不要打印到对话、日志或截图,最后只告诉我文件路径
- 任一步失败就停下来说明原因,不要跳过校验

执行顺序:
1. 检查系统:CPU 架构、systemd、nginx、23180 端口占用、磁盘空间
2. 校验安装包 sha256 后解压
3. 运行 sh install.sh <安装目录>;数据库配置问题回答 n(SQLite 由你直接改配置)
4. 编辑 <安装目录>/shared/configs/app.yaml:
   app.environment 改为 production;
   database.driver 改为 sqlite,path 填 storage/database/djm.sqlite;
   server.addr 改为 "127.0.0.1:23180";
   用 openssl rand -base64 32 分别生成 3 个独立密钥,写入 auth / member / comment 的 identity_hash_key
5. 在安装目录执行 ./djm-cms migrate,再执行:
   ./djm-cms install --admin-user admin --admin-password-file /root/cms-admin-password \
     --site-name "<站点名称>" --site-domain <cms.example.com> --admin-path <随机后台入口>
6. 创建并 enable systemd 单元,启动后检查 curl http://127.0.0.1:23180/health/live 与 /health/ready
7. 配置 Nginx 反代与 HTTPS,确认 https://<cms.example.com>/ 和后台登录页都返回 200
   (后台是单页应用,用 curl 验证时加 -H 'Accept: text/html',否则会被当成资源请求返回 404)
8. 最后告诉我:后台地址、用户名、密码文件路径、服务名、日志查看命令

验收标准:
- /health/ready 返回 200,首页与后台登录页均返回 200
- systemctl is-enabled djm-cms 为 enabled,systemctl is-active 为 active
- 任一验收项失败:回滚本次新建的目录和 systemd 单元,并说明失败原因

AI 执行清单

提示词里的 8 步对应下面这份检查表,人可以按它逐项核对 AI 的输出:

步骤要做的事通过标准
系统检查架构、systemd、Nginx、端口、磁盘架构与安装包一致;23180 空闲
下载校验sha256sum 对比官网值摘要一致
解压安装sh install.sh <目录>生成 current、releases、shared
配置SQLite、生产环境、3 个独立密钥、监听 127.0.0.1app.yaml 无 change-me 之类的示例值
迁移./djm-cms migrate退出码 0,无待执行迁移
创建账号./djm-cms install ...输出管理员 ID,安装模式自动关闭
守护systemd 单元 + Restart=on-failure、KillMode=processis-enabled=enabled、is-active=active
反向代理Nginx + HTTPS首页、后台、/health/ready 均 200

补充两点:

  • Restart=on-failure 加 KillMode=process 是为了让后台“检查更新 → 升级”能自动完成;用 Restart=always 在 1.0.157 起也可以自动完成。其他组合后台会提示需要手工重启一次。
  • 不想用 systemd 时,可以在 app.yaml 配置 deploy.restart_command,让面板或自建脚本托管也能自动重启,详见《升级后自动重启》。

人工兜底

AI 卡住时按顺序看这几处:

  1. journalctl -u djm-cms -n 200 --no-pager:启动失败、端口占用、配置校验错误都在这里。
  2. <安装目录>/shared/logs/:运行日志。
  3. cd <安装目录> && ./djm-cms doctor:一次检查 configs/storage/plugins/themes 软链、current 指向、数据库连通与迁移进度、插件与主题完整性,直接给出公开页 500 的原因。
  4. nginx -t 与 /var/log/nginx/error.log:反代与证书问题。
  5. 访问 https://<域名>/health/live 与 /health/ready,区分“进程没起来”还是“数据库没连上”。

如果 AI 在面板环境里反复出错,直接切回对应的人工教程:

  • 宝塔面板:《宝塔面板部署》(安装包里是 INSTALL-BT.md)
  • 普通 Linux 服务器:《普通服务器安装说明》(安装包里是 INSTALL-SERVER.md)

安全提醒

  • 演示或公开环境不要用本流程暴露真实管理员密码;密码文件用完及时删除或转存到密码管理器。
  • 安装完成后确认安装模式已关闭(cms install 会自动关闭),并确认后台入口是随机路径。
  • 让 AI 执行的每一条会改动系统的命令都应先出现在计划里;“顺手优化”类的额外操作一律拒绝。

下载 AI 部署说明(TXT)

继续阅读

安装部署 升级后自动重启:systemd 与脚本托管配置 安装部署 SQLite 部署与备份:安装时选择单文件数据库 安装部署 宝塔面板部署 DJM CMS:数据库可选、Nginx 与进程守护 安装部署 反向代理、HTTPS 与健康检查 安装部署 版本升级、回滚与备份

讨论