Files
campux-source_Nkeim/README.md
T
2026-07-14 14:58:49 +00:00

12 KiB
Raw Blame History

# Campux-idoknow 校园墙系统部署文档

> 基于本次成功部署整理,适配 **宝塔 + Docker**,包含两处核心 BUG 修复,补齐全部部署约束项(HTTPS、Nginx顺序、缓存、构建限制、权限、Git推送细节),可一键复刻部署。

---

## 📑 目录

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** 亦可兼容

### 端口放行(安全组 + 宝塔防火墙)
- 必须放行端口:`22``80``443`
- Postgres、MinIO 仅容器内部通信,无需对外开放端口

### 域名硬性规则(⚠️ 重点)
1. 域名必须**完成备案**
2. 域名 A 记录解析指向服务器公网 IP;
3. **系统必须使用 HTTPS 协议运行,不可仅使用 HTTP**
   - 前端、WebSocket 机器人通信、图片 S3 存储全部依赖 HTTPS;
   - 若只配置 HTTP,页面会出现接口跨域、机器人连接失败、提交表单报错;
4. `.env``CAMPUX_WEB_ORIGIN``S3_PUBLIC_BASE_URL` **必须填写 `https://` 开头的域名**,不能写 `http://`。

---

## 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

安装完成后记录面板地址、账号、密码,并放行宝塔 8888 端口。

2.2 宝塔安装 Docker

  1. 软件商店 → 搜索 Docker,一键安装;
  2. Docker 会自动附带 docker-compose
  3. 左侧菜单栏出现 Docker 图标代表安装成功。

⚠️ 禁止使用 Docker 兼容模式,否则会导致构建镜像异常。


  1. 下载项目源码

打开宝塔【终端】执行:

cd /www/wwwroot
git clone https://git.grxiao.cn/yuns/campux-source_Nkeim.git campux-source
cd campux-source

⚠️ 项目目录名称必须为 campux-sourcedocker-compose 配置文件依赖该文件夹名称,改名会导致挂载异常。


  1. 配置环境文件 .env

路径:/www/wwwroot/campux-source/.env

⚠️ BUG-1 修复

原版 CAMPUX_TENANT_DOMAIN_TTL=-1 会让容器无限重启,必须修改为 86400。

强制 HTTPS 规则

所有域名地址必须以 https:// 开头,绝对不能填写 http://,否则前端接口、S3 图片、WebSocket 全部失效。

完整配置示例:

# 必须填写 HTTPS 域名,禁止 http
CAMPUX_WEB_ORIGIN=https://qq.yunsya.cn
# 会话加密密钥,自定义一串随机字符
CAMPUX_BOT_SESSION_SECRET=自定义随机字符
# S3 图片地址,同样必须使用 HTTPS
S3_PUBLIC_BASE_URL=https://qq.yunsya.cn/s3
CAMPUX_TENANT_DOMAIN_SUFFIX=""
# 修复 Zod 校验 BUG,固定改为 86400,禁止使用 -1
CAMPUX_TENANT_DOMAIN_TTL=86400
CAMPUX_TELEMETRY_DISABLED=true

必改项清单:

· CAMPUX_WEB_ORIGIN → 替换为你的 HTTPS 域名 · CAMPUX_BOT_SESSION_SECRET → 自定义随机字符串 · S3_PUBLIC_BASE_URL → 替换为 HTTPS 域名(同网站域名) · CAMPUX_TENANT_DOMAIN_TTL → 固定改为 86400 · 全部地址必须使用 https:// 协议

保存文件后继续。


  1. 修复前端向导 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",修改后片段:

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",   // ✅ 新增此行
  }),
});

保存文件。

💡 备选方案(免改代码)

开通向导直接跳过机器人绑定;创建完校园墙后,在后台【机器人管理】页面手动添加 QQ 机器人。


  1. Docker 编译打包部署

⚠️ 重点坑点

  1. 宝塔移动端「重建」按钮只会重启容器,不会编译新代码。修改 TSX 等前端文件后,必须执行下方构建命令才能生效。
  2. 构建期间不要关闭宝塔终端、锁屏、断开 SSH 连接,会话中断会终止构建,导致镜像不完整。
  3. 服务器内存必须 ≥ 4 GB,否则编译进程会被 OOM 直接杀死。

构建命令(宝塔终端执行)

cd /www/wwwroot/campux-source
docker compose up -d --build

· 构建耗时:4~8 分钟 · 构建成功标识:

✔ Image campux-source-campux Built
✔ Container campux-minio     Running
✔ Container campux-postgres  Healthy
✔ Container campux           Started

校验服务是否正常运行

docker logs -f campux

出现以下两行代表启动成功:

database migrations completed
Server listening at http://172.18.0.4:8989

按 Ctrl+C 退出日志。

注意:容器内部运行地址为 HTTP,外部访问必须通过 Nginx 反向代理转为 HTTPS。


  1. 宝塔 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 配置文件(第二步)

完整配置如下(请替换域名和证书路径):

server
{
    listen 80;
    server_name qq.yunsya.cn;
    # 强制所有 HTTP 请求跳转到 HTTPS
    return 301 https://$host$request_uri;
}

server
{
    listen 443 ssl;
    server_name qq.yunsya.cn;
    ssl_certificate /www/server/panel/vhost/cert/qq.yunsya.cn/fullchain.pem;
    ssl_certificate_key /www/server/panel/vhost/cert/qq.yunsya.cn/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8989;
        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;
        proxy_http_version 1.1;
        # 适配 WebSocket 连接(NapCat 机器人必须开启这两行)
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location /s3/ {
        proxy_pass http://127.0.0.1:9000/campux-next/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

7.4 开启强制 HTTPS

在 SSL 页面开启【强制 HTTPS】,然后保存 Nginx 配置。

报错“证书不存在”:代表证书未申请完成,返回上一步先申请 SSL 证书。 机器人 WebSocket 连接失败:检查 Nginx 内 Upgrade、Connection 两行配置是否完整。


  1. 微信浏览器缓存问题(高频踩坑)

即使 Docker 已经构建新代码,微信内置浏览器会缓存旧 JS 脚本,表单依旧提交旧数据,甚至还会报 platform 错误。

解决方法

· 手机端:彻底划掉微信后台进程,重新打开微信访问域名; · 电脑端:Ctrl + F5 强制刷新清除浏览器缓存。

后续每次修改前端代码并重新构建后,都必须清理微信缓存。


  1. NapCat-QQ 机器人对接

  2. 开通校园墙后,复制页面内的反向 WebSocket 地址;

  3. ⚠️ 网站为 HTTPSWebSocket 地址协议应为 wss://,不能填写 ws://,否则 NapCat 连接会被浏览器拦截;

  4. 在 NapCat 后台新增反向 WebSocket 客户端,粘贴 wss:// 开头的地址并启用;

  5. 页面状态显示「已连接」即对接完成。


  1. 运维命令汇总
# 查看实时日志
docker logs -f campux

# 仅重启容器(不重新构建,约 30 秒完成,只重启服务)
cd /www/wwwroot/campux-source
docker compose restart

# 更新仓库代码并重新构建部署(修改前端代码必须加 --build)
cd /www/wwwroot/campux-source
git pull
docker compose up -d --build

# 停止整套服务
cd /www/wwwroot/campux-source
docker compose down

# 推送修改后的文档到 Gitea 仓库
cd /www/wwwroot/campux-source
git add README.md
git commit -m "完善部署文档,补齐 HTTPS、Nginx 顺序、构建约束项"
git push origin main

  1. 完整踩坑清单(所有注意事项汇总)

序号 问题现象 原因与解决方案 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 无法连接 ① 网站未开启强制 HTTPSWebSocket 协议应为 wss://;② Nginx 配置缺少 Upgrade、Connection 升级头;③ .env 内域名填写了 http:// 协议。 8 图片无法加载(S3 资源 403/404 S3_PUBLIC_BASE_URL 域名填写错误,必须和网站域名一致,且协议为 https://。 9 项目目录改名后 Docker 启动异常 文件夹名称必须为 campux-sourcedocker-compose 挂载依赖该目录名。 10 仅使用 HTTP 访问网站 会出现接口跨域、机器人连接失败、表单提交异常,系统强制依赖 HTTPS 运行。


本次文档新增补充内容清单

· 明确了 Nginx 操作顺序:先申请 SSL 证书,再写 Nginx 配置; · 强调 .env 必须全部使用 https:// 协议,禁止 HTTP · 标注 WebSocket 协议为 wss://,及 NapCat 连接的约束; · 补充构建时内存、SSH 会话断开的风险; · 项目文件夹名称固定要求; · 新增 S3 图片 403 报错、跨域问题、目录改名异常的踩坑项; · 补充 Git 推送命令,一键更新 Gitea 仓库内的文档。