奇点CMS 安装配置说明
本文档随交付包发布,描述 CMS 运行所需的网内配置与站外服务器配置和依赖。
后台「系统 → 部署检测」页面(admin/system-requirements.php)可对本文档全部项目做自动状态检测。
★ 维护约定:新增扩展/依赖时,必须同步更新 includes/SystemRequirements.php 注册表、
本文档、以及 docs/版本升级说明.md,打包时三者缺一不可(见 docs/打包说明.md)。
一、站外服务器配置与依赖
1. 基础环境
| 依赖 | 要求 | 用途 | 缺失后果 |
|---|
| PHP | >= 7.2(推荐 8.0+) | 运行环境 | 无法运行 |
| MySQL | >= 5.7 / MariaDB >= 10.2 | 数据存储 | 无法运行 |
| nginx | 推荐(Apache 可用但功能降级) | Web 服务器 | 视频加载加速器不可用 |
2. PHP 扩展
| 扩展 | 必选 | 用途 |
|---|
| pdo_mysql | ✅ | 数据库连接 |
| mbstring | ✅ | 中文多字节处理 |
| gd | ✅ | 头像裁剪/缩略图 |
| openssl | ✅ | 密码哈希/HTTPS/SMTP SSL/授权验证 |
| fileinfo | ✅ | 上传文件 MIME 检测 |
| curl | ✅ | HTTP 请求(远程 API/图片下载) |
| json | ✅ | API 通信 |
| dom | ✅ | 百科/时政/问答模块正文 HTML 白名单净化与目录生成(DOMDocument) |
| zip | 建议 | 后台在线更新包解压(缺失则在线更新不可用) |
| redis / exif / intl / sodium | 可选 | 缓存/图片信息/国际化/现代加密 |
完整清单与逐项检测见后台「服务器状态」页(admin/server-status.php)。
3. php.ini 关键配置
| 配置项 | 建议值 | 原因 |
|---|
| upload_max_filesize | >= 500M | 短视频/短剧上传 |
| post_max_size | > upload_max_filesize | 表单提交上限 |
| max_execution_time | >= 300 | 大文件上传/在线更新 |
| memory_limit | >= 256M | 图片处理/更新解压 |
| disable_functions | 不含 exec、proc_open | 在线更新(update.sh)与 ffmpeg 截图依赖;禁用则相关功能不可用 |
4. 系统级依赖
| 依赖 | 必选 | 用途 | 缺失后果 |
|---|
| ffmpeg | 建议 | 短剧/视频缩略图、时长探测、上传后压缩转码 | 缩略图降级为占位图;视频不压缩(传输体积大) |
| 磁盘空间 | >= 5GB | uploads 视频存储 | 上传失败 |
5. nginx 站点配置(关键)
除常规 PHP-FPM 配置外(见 nginx.conf.example),强烈建议启用视频加载加速器:
# 视频加载加速器(X-Accel-Redirect 内部直发)
location ^~ /accel-media/ {
internal;
alias /你的站点目录/uploads/;
}
- 宝塔用户:粘贴到站点「伪静态」即可,改完重载 nginx
- 作用:付费视频由 nginx sendfile 直发,PHP-FPM 只做鉴权即释放,多人并发播放不卡顿
- 未配置时 CMS 自动回退 PHP 分块出流(功能正常,并发性能差)
- 强制关闭:settings 表设
media_accelerator = off
大文件上传容忍配置(server 块内添加,nginx.conf.example 已内置):
client_max_body_size 600m; # 与 php.ini post_max_size(600M) 对齐
client_body_timeout 300s; # 默认 60s:弱网上传停顿 60s 即被 408/400 断开(浏览器报 ERR_CONNECTION_ABORTED / Failed to fetch)
send_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s; # 默认 60s:大文件上传后落盘 + ffmpeg 缩略图处理超 60s 会 504
二、网内所需配置(CMS 内部)
1. 安装期生成
| 项目 | 说明 |
|---|
config/generated.php | 安装向导生成的数据库凭据,勿入版本库/交付包 |
install.lock | 安装完成锁定标记,防止向导被重复执行 |
| 数据库 50 张核心表 | 由 database.sql + install/*-migration.sql 建立(含 token_expirations、wxpay_receipts 等运行必需表;完整清单以 database.sql 为准) |
2. 目录与权限(Web 用户可写)
| 目录 | 用途 |
|---|
uploads/(含 covers/avatars/moments/dramas/agent-icons/ads/_cache) | 用户上传与缓存 |
data/ | 号码池文件、授权文件运行时写入 |
config/ | 安装期写入 generated.php |
3. 运行期配置项(settings 表,后台可管理)
| 配置键 | 后台入口 | 默认 | 说明 |
|---|
| smtp_host / smtp_port / smtp_user / smtp_pass / smtp_from_name | 系统设置 → 邮件 SMTP 设置 | 空 | 找回密码等邮件通知;未配置时前台自动降级为引导联系客服 |
| media_accelerator | settings 表(无界面) | auto | auto=nginx 自动启用加速器;on/off 强制 |
| stream_secret | 自动生成 | 空 | 播放令牌 HMAC 签名密钥,首次签发时自动惰性生成,无需干预 |
| video_play_price / drama_episode_price | 系统设置 | 0.05 / 0.03 | Token 消费默认单价 |
| video_compress | settings 表(无界面) | 1 | 上传视频后台压缩转码开关(1 开 / 0 关)。开启时短视频/短剧上传成功后由 ffmpeg 后台转码(H.264/CRF28/最高720p/AAC 96k/faststart),产物比原片小才原子替换;依赖 ffmpeg + exec/shell_exec,任一不可用自动跳过不影响上传 |
| token_expire_enabled | 用户运营 → Token 数据面板(过期结算) | 1 | Token 过期扣减开关(1 开 / 0 关)。置 0 只停用「过期扣减」,充值返还始终执行 |
| token_expire_months | 用户运营 → Token 数据面板(过期结算) | 12 | 过期阈值(月,1~120):账户休眠满该时长即视为过期,扣减全部余留余额并记为「待返还」 |
| icon_agent_size / icon_agent_bg / icon_tab_chat_size / icon_tab_chat_bg | 站点外观 → 图标管理 | 空 | 前端「Agent 助手悬浮球」与「聊天呼出按钮」的大小与背景色。大小=圆形按钮直径 px(整数 12~96),背景色=#RGB/#RRGGBB 纯色,或勾选「透明背景」=无底色(存 transparent,前端同时关闭同色投影/呼吸光环);留空=沿用样式表默认(悬浮球 37 / 呼出按钮 48,默认渐变)。空值亦会写入,前端统一读取;非法值在保存时被拒绝且整表不落库 |
| wxpay_receipt_enabled / wxpay_receipt_token / wxpay_receipt_ip_allow | settings 表(无界面,见 payment-receipt.php 末尾注释) | 空 | 安卓微信收款回执监听开关与设备密钥。enabled=1 且 token 非空才接受设备上报(HMAC-SHA256 签名或令牌鉴权);ip_allow 可选(逗号分隔 IP 白名单,留空不限)。回执只入库供展示与人工核对,不自动入账——token_orders.status 与账户余额不受影响,到账仍由管理员审核 |
4. 数据表结构健康
users.token_balance 必须为 DECIMAL(10,2) NOT NULL DEFAULT 0; 历史环境漂移为 NULL 会导致充值审核通过却不到账(NULL+增量=NULL)。 检测页会专项检查,修复执行 install/token-balance-fix-migration.sql(幂等)。token_expirations(Token 过期 / 返还流水表,已并入 database.sql): 过期扣减逐户写一条(status=0 待返还),该用户充值订单审核通过时自动全额返还(status=1)。 已有站点升级执行 install/token-expirations-migration.sql(幂等,同时补齐 settings.token_expire_enabled / token_expire_months);该表已纳入「部署检测 → 核心数据表完整性」清单,缺表会被标记为"不通过"并给出修复建议。 结算入口:后台「用户运营 → Token 数据面板 → 过期结算」(默认预览,需二次确认), 或命令行 php cron-token-expiry.php(仅 CLI,支持 --dry-run / --asof=YYYY-MM-DD), 建议在宝塔「计划任务 → Shell 脚本」配置每天一次。wxpay_receipts(微信收款回执流水,已并入 database.sql):安卓设备监听微信收款通知后上报的回执。 只记录「设备看到的收款事实」,不作入账依据——到账仍由管理员审核 token_orders。 端点首次调用自动建表(settings.wxpay_receipt_schema_ready 标记),已纳入「部署检测 → 核心数据表完整性」清单;旧站点升级执行一次「数据库结构同步」即可(全新安装无需操作)。
5. 官方支付模块(可选,需手工建表与密钥目录)
官方支付(支付宝当面付 / 微信支付 APIv3)是可选模块:不启用时站点仍走「收款码 + 管理员人工审核」流程,
无需任何处理;启用前请按下表逐项配置。
| 项目 | 说明 |
|---|
| 数据表 | 4 张表 payment_orders / payment_notifies / payment_refunds / payment_reconcile 不并入 database.sql,需手工执行一次:mysql -u<用户> -p<密码> <数据库名> < includes/payment/schema.sql(幂等,全部 CREATE TABLE IF NOT EXISTS,不改动任何既有表) |
| 未建表表现 | 后台「支付订单」页显示建表指引并给出命令;php cron-payment.php 报 [FAIL] 数据表 payment_orders 不存在 |
| 密钥目录 | includes/payment/PaymentConfig.php 默认 PAYMENT_KEY_DIR = /www/wwwroot/video-payment-keys(站点根目录之外,目录 0750 / 文件 0600)。站点根目录不是 /www/wwwroot/video 时必须覆盖:在 config/generated.php 中追加 define('PAYMENT_KEY_DIR', '/你的密钥目录');,否则密钥会写到与你站点无关的路径 |
| 密钥安全 | 部署检测「支付」组用 keyDirLooksExposed() 判断密钥目录是否落在 webroot 内,落在内部判「不通过」 |
| 回调基址 | 后台「系统 → 支付设置 → 回调基址」:留空按访问域名自动推导。该地址必须能被支付宝/微信从公网访问(微信 APIv3 强制 HTTPS);不可达时由主动查单补偿到账 |
| 定时任务 | php cron-payment.php(仅 CLI):默认执行 sweep(关闭超时未付订单)+ reconcile(主动查单对账);--no-query 只关单不查单,--limit=N 限制处理条数。建议宝塔「计划任务 → Shell 脚本」每 5 分钟一次 |
| 退款 | 渠道层 PaymentGateway::refund()(支付宝/微信均已实现)尚无后台入口,本期退款需到渠道商户平台人工操作,站点侧不自动记账 |
6. Agent+ Go 加速服务(可选,Windows / Linux 双形态)
Agent+ 采用双实现:Go 常驻服务不可用时由 PHP 微内核自动接管(功能一致、性能降低),
因此不部署 Go 服务不影响站点功能,检测页该组显示警告属预期状态。
| 项目 | Linux | Windows(宝塔 Windows / IIS) |
|---|
| 产物位置 | /opt/xdream-go/x-dream-go | <站点>\go-service\x-dream-go.exe(必须在站点目录内,否则 PHP 受 open_basedir 限制无法探测,检测页只会显示"无法探测") |
| 常驻方式 | systemd 单元 x-dream-go.service | go-service\run-xdream-go.ps1 启动器(守护循环 + 崩溃自愈 + 心跳) |
| 开机自启 | systemctl enable --now x-dream-go | 管理员执行 go-service\register-task.ps1(计划任务 x-dream-go,SYSTEM / 开机启动) |
| 运行时状态 | journald | 心跳 data/.go_service_heartbeat(每 10s,UTF-8 无 BOM JSON)/ 日志 data/.go_service.log |
| 一键适配 | —(见 go-service/README.md 第五节) | powershell -ExecutionPolicy Bypass -File .\qdcms-go-win.ps1 -Build -Start |
| 共享密钥 | config/generated.php 的 GO_API_KEY + systemd 单元 Environment=GO_API_KEY= | 只需 config/generated.php 的 GO_API_KEY(启动器自动读取,不会两侧不一致) |
| 公网防护 | nginx 拒绝 ^~ /go-service/ 与可执行文件后缀 | 同左(宝塔填在「伪静态」,改完必须重载 nginx 才生效) |
Windows 关键提示
- 编译需 Go 1.21+:
cd <站点>\go-service → $env:GOPROXY='https://goproxy.cn,direct' → go build -trimpath -ldflags "-s -w" -o x-dream-go.exe .;不想装到系统时可用官方 go1.22.x.windows-amd64.zip 解压到任意目录当便携工具链 go-service/ 含 Go 源码与可执行文件,必须在 nginx 中拒绝公网访问;qdcms-go-win.ps1 会自动追加规则,但需重载 nginx 才生效- 心跳文件建议保持无 BOM 的 UTF-8 JSON:Windows PowerShell 5.1 的
Set-Content -Encoding UTF8 会写入 BOM(检测代码已对 BOM 容错,但启动器仍改用 .NET 无 BOM 写入,避免旧版检测逻辑误判"无心跳") - 检测项按
PHP_OS_FAMILY 自动切换口径,Linux/Windows 共用同一份源码;完整步骤见 go-service/README.md 第六节 - Windows 还有两个易漏点:计划任务默认 72 小时上限(须改
PT0S)与 SYSTEM 任务对非管理员不可见; 另有 .ps1 需 UTF-8 带 BOM、心跳 JSON 需无 BOM、open_basedir 要求产物位于站点内等 —— 汇总见 docs/Windows部署说明.md - FFmpeg(Windows):包内
qdcms-ffmpeg-win.ps1 一键改写探测与后台压缩逻辑 (ffmpeg.exe 候选路径 + cmd if exist 探测 + 生成 .bat 压缩),未适配前 Windows 检测项会一直显示"未安装"
三、安装步骤速览
- 服务器装好 PHP/MySQL/nginx,按第一节核对扩展与 ini
- 上传 CMS 到站点目录,配置 nginx(含 accel-media location)
- 浏览器访问
/install/ 走向导(数据库默认值 127.0.0.1/root/空密码/dream_cms,管理员必填) - 登录后台 → 系统 → 部署检测,处理全部"不通过"与"警告"项
- 按需配置 SMTP(系统设置页),发测试邮件验证
- 交付前跑一次包内自检脚本(Windows:
powershell -ExecutionPolicy Bypass -File .\qdcms-selfcheck.ps1; Linux:同上方式运行或直接看后台部署检测页),确认无 FAIL 后再签收。详见 docs/Windows部署说明.md 第七节 - 一台服务器部署多个站点(Windows):用
qdcms-deploy.ps1 批量部署/巡检(默认只预演,-Apply 写盘), 见 docs/Windows部署说明.md 第八节;巡检模式 -Discover 可一次列出本机所有 QDCMS 站点的版本、数据库与自检结论, 加 -Report 还能生成巡检日报(文件 + 可选邮件,邮件复用站点自身 SMTP),并可注册为每日定时任务
四、检测页使用说明
- 入口:后台左侧菜单「系统 → 部署检测」
- 分三组展示:🏠 网内所需配置 / 🖥️ 站外服务器配置与依赖 / 🤖 Agent+ 智能体服务环境与依赖
- 状态:通过(绿)/ 警告(黄,功能受损)/ 不通过(红,功能不可用)/ 信息(灰)
- 每项附当前值与修复建议;处理后点「重新检测」
- 检测项定义集中在
includes/SystemRequirements.php,新增依赖按文首维护约定登记
五、Agent+ 智能体服务环境与依赖(可选增强)
对应部署检测页第三组(🤖 Agent+ 智能体服务环境与依赖)。
Agent+ 为双实现架构:Go 常驻服务不可用时由 PHP 微内核自动接管,
功能一致、性能降低,因此该组异常项多为"警告/信息"而非"不通过";
未部署 Go 服务时该组呈"信息/警告"属预期状态,站点功能不受影响。
1. Go 常驻服务(可选,用于性能提升)
| 项目 | 要求 | 用途 | 缺失后果 |
|---|
部署产物 /opt/xdream-go/x-dream-go | 建议 | Agent 微内核 / 通知聚合 / 知识库检索的 Go 实现 | 回退 PHP 微内核(功能一致、性能降低) |
systemd 单元 x-dream-go.service | 建议 | 常驻运行 + 崩溃自愈 + 开机自启 | 服务不会自动拉起,需人工手动运行 |
回环端点 http://127.0.0.1:8080 | 建议 | 仅供本机 PHP 侧调用(IP 白名单 127.0.0.1,::1) | 回退 PHP |
GO_API_KEY | 可选 | PHP↔Go 请求的 HMAC-SHA256 签名校验 | 使用开发默认密钥(退化为内网信任模式) |
- 编译、安装与加固步骤见
go-service/README.md;检测页会比对"源码 vs 已部署二进制"的时间,提示重新编译 config/config.php(+ generated.php)须对运行 Go 服务的 www 用户可读;Go 侧复用该配置连库,不另行落盘口令- 前端浏览器直连 Go 服务默认关闭(
settings.go_service_url 留空),统一由 PHP GoAdapter 走回环调用 - 安装/重装容错:安装向导(
install/auto-install.php、install/index.php)生成 config/generated.php 时只重写 DB_*, 其余配置项(含 GO_API_KEY)原样保留;若该常量缺失,则按「环境变量 → systemd 单元(含 .d/*.conf)→ 运行中的 x-dream-go 进程」 顺序探测实际生效值并继承,以 Go 侧为准(Go 是校验方:密钥不匹配返回 401、密钥非默认且无签名返回 403)。 探测到多个来源互相矛盾时只输出提示、不猜测、不写入。因此重装不会造成「PHP 侧无密钥 / Go 侧仍持自定义密钥」的静默退化。 - 密钥取不到时的显式告警:Web 安装进程常受
open_basedir 限制读不到 /etc/systemd、/proc,此时向导对回环 /api/stats 发起一次不带签名的只读探测:若返回 403「缺少 CSRF 签名」,说明 Go 侧使用的是非默认密钥,向导会在生成配置前显著告警, 并提示改用命令行安装(站点根目录执行 php install/auto-install.php,可正常继承密钥)、或安装后在 config/generated.php 手工写入与 systemd 单元一致的 GO_API_KEY;探测不可达或返回 200 时不告警。
2. 知识库数据表与索引
| 项目 | 必选 | 用途 | 缺失后果 |
|---|
agent_knowledge / agent_knowledge_hits | ✅ | Agent+ 知识条目与命中日志 | 知识库与 Agent 检索不可用(检测为"不通过") |
FULLTEXT ft_knowledge_title_content(title,content)(MySQL 5.7+ 附加 WITH PARSER ngram) | 建议 | 中文全文检索 | 检索降级为 LIKE(相关性差、数据量大时慢) |
- MySQL 5.7+ 内置 ngram 解析器,安装时自动附加
WITH PARSER ngram;MariaDB 无该解析器 (WITH PARSER 报 1128 Function 'ngram' is not defined),安装向导与 install/auto-install.php 会自动省略该子句,索引照常建立(仅默认分词),中文检索由 agent-ai.php / AgentKnowledge.php 的 LIKE 兜底 - 检测页「知识库中文全文索引」按引擎判定:MySQL 要求 ngram 解析器,MariaDB 只要求
FULLTEXT(title,content) 存在,两者均为"通过" - 建表与索引定义见
database.sql 的 agent_knowledge 段;修复走后台首页「数据库结构检查/同步」(DbUpdater 增量 DDL,不删表) - 仅"手工执行
mysql < database.sql"这一种方式需要自行删除该行的 WITH PARSER ngram(或改用安装向导)
3. PHP 侧依赖
| 项目 | 要求 | 用途 | 缺失后果 |
|---|
allow_url_fopen = On | 建议 | GoAdapter 通过 file_get_contents 调用 Go 服务 | 全部 Go 调用失败并回退 PHP 微内核 |
| 站点目录外文件可读(open_basedir) | 可选 | 检测页直接读取部署产物与 systemd 单元文件 | 该两项显示"信息:无法从 Web 进程读取",改由子进程/回环探测(不影响站点与检测结论) |