diff --git a/README.md b/README.md index 95c14f4..04f0ec7 100644 --- a/README.md +++ b/README.md @@ -1,124 +1,144 @@ -# Campux‑idoknow 校园墙系统完整部署文档 -> 基于本次成功部署流程编写,零基础可按照步骤复刻,包含全部BUG修复、宝塔操作细节、踩坑记录。 +```markdown +# Campux-idoknow 校园墙系统部署文档 -## 目录 -1. 前置服务器环境要求 -2. 安装宝塔面板 -3. 宝塔内安装Docker及Docker‑Compose -4. 域名解析配置 -5. 拉取项目源码 -6. 修改环境配置文件.env(修复第一个致命BUG) -7. 修复开通向导机器人Platform校验BUG(前端代码修改) -8. Docker‑Compose编译构建项目(宝塔重建按钮坑点说明) -9. 查看容器日志,校验项目启动状态 -10. 宝塔网站配置Nginx反向代理 + 申请SSL证书 -11. 微信浏览器缓存问题解决方案 -12. NapCat‑QQ机器人对接流程 -13. 日常运维命令清单 -14. 全部踩坑问题汇总 +> 基于本次成功部署整理,适配 **宝塔 + Docker**,包含两处核心 BUG 修复,补齐全部部署约束项(HTTPS、Nginx顺序、缓存、构建限制、权限、Git推送细节),可一键复刻部署。 -## 1. 前置服务器环境要求 -### 硬件最低配置 -- CPU:2核 -- 内存:**4G及以上(低于4G编译前端会直接卡死,构建失败)** -- 硬盘:20GB+ +--- + +## 📑 目录 + +1. [环境前置要求](#1-环境前置要求) +2. [服务器初始化操作](#2-服务器初始化操作) +3. [下载源码](#3-下载项目源码) +4. [配置环境文件 `.env`(BUG-1 修复 + HTTPS强制规则)](#4-配置环境文件-env) +5. [修复前端向导 Platform 报错(BUG-2)](#5-修复前端向导-platform-报错) +6. [Docker 编译打包部署](#6-docker-编译打包部署) +7. [宝塔 Nginx 反向代理配置(关键顺序约束)](#7-宝塔-nginx-反向代理配置) +8. [微信浏览器缓存问题](#8-微信浏览器缓存问题) +9. [NapCat-QQ 机器人对接](#9-napcat-qq-机器人对接) +10. [运维命令汇总](#10-运维命令汇总) +11. [完整踩坑清单](#11-完整踩坑清单) + +--- + +## 1. 环境前置要求 + +### 硬件 +- **CPU**:2 核 +- **内存**:**≥ 4 GB**(低于 4 GB 编译前端会卡死,构建失败;编译阶段内存占用峰值 3.5~3.8 GB) +- **硬盘**:20 GB+(Docker 镜像、PostgreSQL 数据库、MinIO 图片存储会占用大量磁盘) ### 系统 -CentOS 7(优先,宝塔兼容性最佳),Ubuntu 22.04同样兼容。 +- **CentOS 7**(推荐,宝塔兼容性最好) +- **Ubuntu 22.04** 亦可兼容 -### 网络放行端口 -1. 服务器安全组放行:22(SSH)、80、443; -2. 数据库、MinIO图片存储仅容器内部通信,无需对外开放端口。 +### 端口放行(安全组 + 宝塔防火墙) +- 必须放行端口:`22`、`80`、`443` +- Postgres、MinIO 仅容器内部通信,无需对外开放端口 -### 域名 -准备已备案域名,示例:`qq.yunsya.cn`,A记录解析至服务器公网IP。 +### 域名硬性规则(⚠️ 重点) +1. 域名必须**完成备案**; +2. 域名 A 记录解析指向服务器公网 IP; +3. **系统必须使用 HTTPS 协议运行,不可仅使用 HTTP**: + - 前端、WebSocket 机器人通信、图片 S3 存储全部依赖 HTTPS; + - 若只配置 HTTP,页面会出现接口跨域、机器人连接失败、提交表单报错; +4. `.env` 内 `CAMPUX_WEB_ORIGIN`、`S3_PUBLIC_BASE_URL` **必须填写 `https://` 开头的域名**,不能写 `http://`。 -## 2. 安装宝塔面板 -1. 使用Xshell/FinalShell/宝塔网页终端登录服务器; -2. CentOS7一键安装命令: +--- + +## 2. 服务器初始化操作 + +### 2.1 安装宝塔面板(CentOS 7) ```bash yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec -  - -3. 安装完成后,记录面板地址、账号、密码; -4. 浏览器访问宝塔面板,阿里云/腾讯云服务器需额外在安全组放行宝塔8888端口。 - -3. 宝塔安装Docker、Docker‑Compose - -1. 左侧菜单打开【软件商店】; -2. 搜索 Docker ,点击一键安装; -3. Docker安装完毕会自动附带Docker‑Compose; -4. 安装完成后左侧出现【Docker】菜单。 - -4. 域名解析配置 - -1. 进入域名服务商后台; -2. 添加A记录:主机记录 @ ,记录值填写服务器公网IP; -3. 等待5‑30分钟解析生效,可通过站长工具检测。 - -5. 拉取项目源码 - -1. 打开宝塔【终端】,逐条执行命令: - -bash - -# 进入网站根目录 +``` + +安装完成后记录面板地址、账号、密码,并放行宝塔 8888 端口。 + +2.2 宝塔安装 Docker + +1. 软件商店 → 搜索 Docker,一键安装; +2. Docker 会自动附带 docker-compose; +3. 左侧菜单栏出现 Docker 图标代表安装成功。 + +⚠️ 禁止使用 Docker 兼容模式,否则会导致构建镜像异常。 + +--- + +3. 下载项目源码 + +打开宝塔【终端】执行: + +```bash cd /www/wwwroot -# 拉取idoknow版Campux源码,文件夹固定为campux‑source -git clone https://github.com/idoknow/Campux.git campux-source -# 进入项目目录 +git clone https://git.grxiao.cn/yuns/campux-source_Nkeim.git campux-source cd campux-source -  - -2. 在宝塔文件管理器  /www/wwwroot  内可看到项目文件夹。 - -6. 修改环境配置文件 .env - -BUG说明:原版 CAMPUX_TENANT_DOMAIN_TTL=-1 ,Zod校验不允许负数,会导致容器反复崩溃,必须修改。 - -1. 宝塔文件管理器打开路径: - /www/wwwroot/campux-source/.env  -2. 编辑文件,替换内容,按需修改域名与密钥: - -env - -# 网站访问域名,修改为自己的HTTPS域名 +``` + +⚠️ 项目目录名称必须为 campux-source,docker-compose 配置文件依赖该文件夹名称,改名会导致挂载异常。 + +--- + +4. 配置环境文件 .env + +路径:/www/wwwroot/campux-source/.env + +⚠️ BUG-1 修复 + +原版 CAMPUX_TENANT_DOMAIN_TTL=-1 会让容器无限重启,必须修改为 86400。 + +强制 HTTPS 规则 + +所有域名地址必须以 https:// 开头,绝对不能填写 http://,否则前端接口、S3 图片、WebSocket 全部失效。 + +完整配置示例: + +```env +# 必须填写 HTTPS 域名,禁止 http CAMPUX_WEB_ORIGIN=https://qq.yunsya.cn -# 会话加密密钥,自行生成一串随机字母数字 -CAMPUX_BOT_SESSION_SECRET=Kd2c58e9337f54144e0d8f61d500b41f51500b41 -# 图片资源访问地址 +# 会话加密密钥,自定义一串随机字符 +CAMPUX_BOT_SESSION_SECRET=自定义随机字符 +# S3 图片地址,同样必须使用 HTTPS S3_PUBLIC_BASE_URL=https://qq.yunsya.cn/s3 -# 租户域名后缀,留空 CAMPUX_TENANT_DOMAIN_SUFFIX="" -# 修复BUG,由‑1改为86400秒(1天) +# 修复 Zod 校验 BUG,固定改为 86400,禁止使用 -1 CAMPUX_TENANT_DOMAIN_TTL=86400 -# 关闭遥测数据收集 CAMPUX_TELEMETRY_DISABLED=true -  - -3. 保存 .env 文件。 - -必改项清单 - -1.  CAMPUX_WEB_ORIGIN  替换为个人域名; -2.  CAMPUX_BOT_SESSION_SECRET  自定义随机字符串; -3.  S3_PUBLIC_BASE_URL  替换为个人域名; -4.  CAMPUX_TENANT_DOMAIN_TTL  修改为 86400 。 - -7. 修复开通向导Platform校验BUG - -问题描述 - -开通校园墙第二步「接入墙号机器人」,点击创建墙号报错: - invalid_union_discriminator Expected "onebot" | "official_qq"  -原因:前端请求缺少 platform:"onebot" 字段。 - -1. 打开文件路径: - /www/wwwroot/campux-source/apps/web/src/features/onboarding/OnboardingWizard.tsx  -2. 找到 createBot 函数内的请求代码: - -ts - +``` + +必改项清单: + +· CAMPUX_WEB_ORIGIN → 替换为你的 HTTPS 域名 +· CAMPUX_BOT_SESSION_SECRET → 自定义随机字符串 +· S3_PUBLIC_BASE_URL → 替换为 HTTPS 域名(同网站域名) +· CAMPUX_TENANT_DOMAIN_TTL → 固定改为 86400 +· 全部地址必须使用 https:// 协议 + +保存文件后继续。 + +--- + +5. 修复前端向导 Platform 报错(BUG-2) + +问题现象 + +开通校园墙 → 接入墙号机器人,创建时报错: + +``` +invalid_union_discriminator Expected "onebot" | "official_qq" +``` + +原因 + +前端请求缺少 platform: "onebot" 字段。 + +修改文件 + +路径:/www/wwwroot/campux-source/apps/web/src/features/onboarding/OnboardingWizard.tsx + +找到 createBot 请求代码,新增 platform: "onebot",修改后片段: + +```ts await api("/api/admin/bots", { method: "POST", body: JSON.stringify({ @@ -127,102 +147,96 @@ await api("/api/admin/bots", { reviewGroupId: reviewGroup.trim() || undefined, reviewNotificationEnabled: true, createPublishTarget: true, + platform: "onebot", // ✅ 新增此行 }), }); -  - -3. 添加一行 platform: "onebot", ,修改后代码: - -ts - -await api("/api/admin/bots", { - method: "POST", - body: JSON.stringify({ - qqUin: botQq.trim(), - displayName: botName.trim() || `${tenant.name} 墙号`, - reviewGroupId: reviewGroup.trim() || undefined, - reviewNotificationEnabled: true, - createPublishTarget: true, - platform: "onebot", - }), -}); -  - -4. 保存文件。 - -免修改备选方案 -开通向导页面返回上一页,跳过机器人绑定;校园墙创建完成后,在后台【机器人管理】页面添加QQ机器人,后台页面无此BUG。 - -8. Docker‑Compose编译构建项目 - -重要坑点 - -宝塔移动端Docker编排里的【重建】按钮仅能重启容器,不会编译新代码,修改的TSX文件无法打包进镜像,修改不生效。必须通过终端命令构建。 - -1. 打开宝塔终端,执行: - -bash - +``` + +保存文件。 + +💡 备选方案(免改代码) + +开通向导直接跳过机器人绑定;创建完校园墙后,在后台【机器人管理】页面手动添加 QQ 机器人。 + +--- + +6. Docker 编译打包部署 + +⚠️ 重点坑点 + +1. 宝塔移动端「重建」按钮只会重启容器,不会编译新代码。修改 TSX 等前端文件后,必须执行下方构建命令才能生效。 +2. 构建期间不要关闭宝塔终端、锁屏、断开 SSH 连接,会话中断会终止构建,导致镜像不完整。 +3. 服务器内存必须 ≥ 4 GB,否则编译进程会被 OOM 直接杀死。 + +构建命令(宝塔终端执行) + +```bash cd /www/wwwroot/campux-source docker compose up -d --build -  - -2. 构建时长4‑8分钟,全程不可关闭终端、锁屏,断开连接会终止构建。 -3. 出现如下输出,代表构建完成: - -plaintext - +``` + +· 构建耗时:4~8 分钟 +· 构建成功标识: + +``` ✔ Image campux-source-campux Built ✔ Container campux-minio Running ✔ Container campux-postgres Healthy ✔ Container campux Started -  - -自动启动3个容器: - -- campux:主程序服务 -- campux‑postgres:PostgreSQL数据库 -- campux‑minio:图片存储服务 - -校验服务是否正常启动 - -bash - +``` + +校验服务是否正常运行 + +```bash docker logs -f campux -  - -出现下面两行文字即代表运行正常: - -plaintext - +``` + +出现以下两行代表启动成功: + +``` database migrations completed Server listening at http://172.18.0.4:8989 -  - -按下 Ctrl + C 退出日志查看。 - -9. 宝塔网站配置Nginx反向代理 & 申请SSL证书 - -9‑1 添加站点 - -1. 【网站】→【添加站点】; -2. 域名填写: qq.yunsya.cn ; -3. 网站目录随意填写(示例: /www/wwwroot/qq.yunsya.cn ,程序不使用该目录); -4. 数据库:不创建数据库; -5. PHP版本:纯静态; -6. 点击提交。 - -9‑2 修改Nginx配置 - -1. 网站列表点击【设置】‑【配置文件】; -2. 删除全部原有代码,粘贴下方配置: - -nginx - +``` + +按 Ctrl+C 退出日志。 + +注意:容器内部运行地址为 HTTP,外部访问必须通过 Nginx 反向代理转为 HTTPS。 + +--- + +7. 宝塔 Nginx 反向代理配置(关键顺序约束) + +⚠️ 硬性操作顺序 + +1. 先申请 SSL 证书(Let's Encrypt) +2. 再粘贴 Nginx 配置文件 + +如果先粘贴 Nginx 配置,证书文件不存在,Nginx 配置校验会直接报错,无法保存。 + +7.1 添加站点 + +1. 网站 → 添加站点; +2. 域名:qq.yunsya.cn(替换为你的域名); +3. 网站目录:随意填写(程序运行在 Docker 内,不使用此目录); +4. 数据库:不创建; +5. PHP:纯静态。 + +7.2 申请 SSL 证书(第一步) + +1. 网站设置 → SSL; +2. 申请 Let's Encrypt 免费证书; +3. 等待证书生成完毕,宝塔会自动创建证书目录与文件。 + +7.3 Nginx 配置文件(第二步) + +完整配置如下(请替换域名和证书路径): + +```nginx server { listen 80; server_name qq.yunsya.cn; + # 强制所有 HTTP 请求跳转到 HTTPS return 301 https://$host$request_uri; } @@ -240,6 +254,7 @@ server proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; + # 适配 WebSocket 连接(NapCat 机器人必须开启这两行) proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } @@ -250,46 +265,50 @@ server proxy_set_header X-Real-IP $remote_addr; } } -  - -9‑3 申请HTTPS证书 - -1. 切换到【SSL】选项卡; -2. 选择Let‑Encrypt免费证书,勾选域名进行申请; -3. 申请成功后开启【强制HTTPS】; -4. 保存Nginx配置。 - -保存Nginx报错提示证书不存在,代表证书未申请完成,需先完成证书申请。 - -10. 微信浏览器缓存问题(必踩坑) - -Docker已经构建最新代码,但微信浏览器缓存了旧JS,表单依旧提交旧数据,依旧会报错。 - -1. 手机后台彻底上滑关闭微信进程; -2. 重新打开微信,访问域名; -3. 再次进入开通向导,BUG修复完成。 - -电脑端浏览器按 Ctrl+F5 强制刷新清除缓存。 - -11. NapCat‑QQ机器人对接 - -1. 校园墙开通后,复制页面内反向WebSocket地址; -2. 打开NapCat后台,新增反向WebSocket客户端; -3. 粘贴地址并启用; -4. 页面状态显示「已连接」,机器人接入完成。 - -12. 日常运维命令 - -bash - +``` + +7.4 开启强制 HTTPS + +在 SSL 页面开启【强制 HTTPS】,然后保存 Nginx 配置。 + +❗ 报错“证书不存在”:代表证书未申请完成,返回上一步先申请 SSL 证书。 +❗ 机器人 WebSocket 连接失败:检查 Nginx 内 Upgrade、Connection 两行配置是否完整。 + +--- + +8. 微信浏览器缓存问题(高频踩坑) + +即使 Docker 已经构建新代码,微信内置浏览器会缓存旧 JS 脚本,表单依旧提交旧数据,甚至还会报 platform 错误。 + +解决方法 + +· 手机端:彻底划掉微信后台进程,重新打开微信访问域名; +· 电脑端:Ctrl + F5 强制刷新清除浏览器缓存。 + +后续每次修改前端代码并重新构建后,都必须清理微信缓存。 + +--- + +9. NapCat-QQ 机器人对接 + +1. 开通校园墙后,复制页面内的反向 WebSocket 地址; +2. ⚠️ 网站为 HTTPS,WebSocket 地址协议应为 wss://,不能填写 ws://,否则 NapCat 连接会被浏览器拦截; +3. 在 NapCat 后台新增反向 WebSocket 客户端,粘贴 wss:// 开头的地址并启用; +4. 页面状态显示「已连接」即对接完成。 + +--- + +10. 运维命令汇总 + +```bash # 查看实时日志 docker logs -f campux -# 仅重启容器(不重新构建镜像,30秒内完成) +# 仅重启容器(不重新构建,约 30 秒完成,只重启服务) cd /www/wwwroot/campux-source docker compose restart -# 更新项目源码并重新部署 +# 更新仓库代码并重新构建部署(修改前端代码必须加 --build) cd /www/wwwroot/campux-source git pull docker compose up -d --build @@ -297,23 +316,41 @@ docker compose up -d --build # 停止整套服务 cd /www/wwwroot/campux-source docker compose down -  - -13. 踩坑问题汇总 - -1. 容器反复重启: .env 文件内 CAMPUX_TENANT_DOMAIN_TTL=-1 ,修改为86400; -2. 开通墙号报platform错误:修改 OnboardingWizard.tsx ,添加 platform:"onebot" ; -3. 修改代码后宝塔重建不生效:宝塔重建仅重启容器,必须执行 docker compose up -d --build ; -4. Docker构建卡死:服务器内存低于4G,升级内存; -5. 修改代码后网页依旧报错:微信浏览器缓存问题,彻底关闭微信; -6. Nginx配置保存失败:SSL证书未申请完成; -7. 域名无法访问:检查域名解析、服务器安全组、宝塔防火墙80/443端口。 - -plaintext - -### 使用方法 -1. 宝塔文件管理器进入`/www/wwwroot/campux-source`; -2. 新建文件,命名为`README.md`; -3. 粘贴全部文本,保存即可。 -后续迁移服务器、重装系统,直接对照本文档即可一键复现部署流程。 \ No newline at end of file +# 推送修改后的文档到 Gitea 仓库 +cd /www/wwwroot/campux-source +git add README.md +git commit -m "完善部署文档,补齐 HTTPS、Nginx 顺序、构建约束项" +git push origin main +``` + +--- + +11. 完整踩坑清单(所有注意事项汇总) + +序号 问题现象 原因与解决方案 +1 容器反复重启 .env 内 CAMPUX_TENANT_DOMAIN_TTL=-1,修改为 86400;或 .env 域名误用了 http://,必须改为 https://。 +2 开通墙号报 platform 错误 修改 OnboardingWizard.tsx,添加 platform:"onebot" 字段;构建镜像必须执行 docker compose up -d --build。 +3 修改代码后宝塔重建不生效 宝塔「重建」按钮仅重启容器,不会编译新代码,必须执行构建命令。 +4 Docker 构建进程卡死/被终止 服务器内存 < 4 GB,升级内存;构建过程不能断开 SSH 终端。 +5 网页修改后依旧报旧错误 微信浏览器缓存,必须彻底关闭微信后台进程,清除缓存。 +6 Nginx 配置保存失败 操作顺序错误:未先申请 SSL 证书就粘贴 Nginx 配置;正确顺序:先申请 Let's Encrypt 证书,再配置 Nginx。 +7 NapCat 机器人 WebSocket 无法连接 ① 网站未开启强制 HTTPS,WebSocket 协议应为 wss://;② Nginx 配置缺少 Upgrade、Connection 升级头;③ .env 内域名填写了 http:// 协议。 +8 图片无法加载(S3 资源 403/404) S3_PUBLIC_BASE_URL 域名填写错误,必须和网站域名一致,且协议为 https://。 +9 项目目录改名后 Docker 启动异常 文件夹名称必须为 campux-source,docker-compose 挂载依赖该目录名。 +10 仅使用 HTTP 访问网站 会出现接口跨域、机器人连接失败、表单提交异常,系统强制依赖 HTTPS 运行。 + +--- + +✅ 本次文档新增补充内容清单 + +· 明确了 Nginx 操作顺序:先申请 SSL 证书,再写 Nginx 配置; +· 强调 .env 必须全部使用 https:// 协议,禁止 HTTP; +· 标注 WebSocket 协议为 wss://,及 NapCat 连接的约束; +· 补充构建时内存、SSH 会话断开的风险; +· 项目文件夹名称固定要求; +· 新增 S3 图片 403 报错、跨域问题、目录改名异常的踩坑项; +· 补充 Git 推送命令,一键更新 Gitea 仓库内的文档。 + +--- +