# kepo.net 商业版 Web 拉取式部署配置(一次性) > 安全原则同 [PULL_DEPLOY.md](./PULL_DEPLOY.md):CI 只构建、不部署;任何 AI 与流水线都不允许 SSH 到服务器执行命令。 > 部署由 kepo 服务器本地定时任务轮询 Gitea Release 自动完成。 > 本文档所有操作均由管理员本人在服务器终端执行,不依赖 AI 远程执行。 ## 架构 ``` push main → Gitea Actions 构建 cmd/web + web-commercial 前端 → web-deploy.tar.gz 发布为 web-v* Release ↓ kepo 服务器 cron(每分钟)运行 deploy-watch.sh(TAG_PREFIX=web-v)→ 发现新 release → HTTPS 拉取 ↓ deploy-web.sh 原子切换 + systemctl restart lunar-web + 健康检查(失败自动回滚) ↓ Cloudflare (HTTPS 终结) → kepo 源站 :8080 lunar-web systemd 服务 ``` ## 与小程序接口部署的差异 | | lunar.neatcn.com | kepo.net | |---|---|---| | 二进制 | `cmd/mini` | `cmd/web` | | Release 前缀 | `server-v*` | `web-v*` | | 部署包 | `deploy.tar.gz` | `web-deploy.tar.gz` | | 运行方式 | Docker 容器 | systemd 服务 `lunar-web` | | 部署目录 | `/opt/lunar/production` | `/opt/lunar-web/production` | ## 一次性安装步骤(按序执行) ### 1. 准备目录与脚本 ```bash mkdir -p /opt/lunar-web/{production,scripts,backups} # 从仓库复制脚本(任选其一): # git clone 后 cp .gitea/scripts/{deploy-watch.sh,deploy-web.sh} /opt/lunar-web/scripts/ # 或直接下载原始文件写入 chmod +x /opt/lunar-web/scripts/*.sh ``` ### 2. 生产环境变量 写入 `/opt/lunar-web/production/.env`,权限 `600`: ```ini SERVER_ENV=production SERVER_PORT=8080 PUBLIC_BASE_URL=https://kepo.net WEB_APP_URL=https://kepo.net CORS_ORIGINS=https://kepo.net,https://www.kepo.net DB_TYPE=mysql DB_HOST=<数据库地址> DB_PORT=3306 DB_USER=<用户名> DB_PASSWORD=<密码> DB_NAME=lunar_web # 建议与小程序库分开;若暂时共用,填 lunar JWT_SECRET=<强随机值,至少32位> ADMIN_PASSWORD=<后台登录密码> SMTP_HOST=smtp.qq.com SMTP_PORT=465 SMTP_USERNAME= SMTP_PASSWORD= SMTP_FROM_EMAIL=z@kepo.net SMTP_TLS_MODE=implicit STRIPE_SECRET_KEY= STRIPE_WEBHOOK_SECRET= BINANCE_PAY_API_KEY= BINANCE_PAY_SECRET_KEY= BINANCE_PAY_WEBHOOK_PUBLIC_KEY= ``` > kepo 侧不需要 `MINI_APP_ID` / `MINI_APP_SECRET` / `WECHAT_PAY_*`; > lunar 侧则不需要 SMTP / Stripe / Binance 变量。 ### 3. systemd 服务 `/etc/systemd/system/lunar-web.service`: ```ini [Unit] Description=Lunar Commercial Web (kepo.net) After=network.target [Service] Type=simple WorkingDirectory=/opt/lunar-web/production/current EnvironmentFile=/opt/lunar-web/production/.env ExecStart=/opt/lunar-web/production/current/bin/server Restart=always RestartSec=3 [Install] WantedBy=multi-user.target ``` ```bash systemctl daemon-reload systemctl enable lunar-web # 首次启动前需要先手工放一版部署包,或等待第一次 Release 拉取 ``` ### 4. 定时拉取任务 crontab(`crontab -e`)添加: ```cron * * * * * TAG_PREFIX=web-v ASSET_NAME=web-deploy.tar.gz \ STATE_FILE=/opt/lunar-web/production/.last-deployed-release \ DEPLOY_SCRIPT=/opt/lunar-web/scripts/deploy-web.sh \ LOG_FILE=/opt/lunar-web/deploy-watch.log \ /opt/lunar-web/scripts/deploy-watch.sh ``` 首次运行后会自动部署最新 `web-v*` Release。日志:`/opt/lunar-web/deploy-watch.log`。 ### 5. Cloudflare 回源 kepo.net 已走 Cloudflare。确认回源指向本机 8080(或 Nginx 反代到 8080)。 服务只监听 `127.0.0.1` 或由防火墙限制 8080 仅本机访问。 ## 验证 ```bash curl -s http://127.0.0.1:8080/api/version # 应返回 version/buildTime/commitSha curl -s -o /dev/null -w '%{http_code}' https://kepo.net/ curl -s -o /dev/null -w '%{http_code}' https://kepo.net/admin/ ``` ## 注意 - **数据库**:短期内两边共用 `lunar` 库(后台 `/admin` 在 kepo 侧统一查看订单与小程序数据)。后续如需分离,新建 `lunar_web` 库并改 `DB_NAME`。 - **回滚**:`deploy-web.sh` 健康检查失败会自动恢复 `current.old`;也可手动 `systemctl restart lunar-web`。 - **小程序端**:部署包结构不变(`deploy/bin/server`),doc79 上的 watcher 无需改动。