Files
lunar-mini/.gitea/docs/PULL_DEPLOY_WEB.md
T
goukiandDevin <158243242+devin-ai-integration[bot]@users.noreply.github.com> 12fa2b0d19
Build and Publish Commercial Web / build (push) Failing after 1m25s
Build and Publish Server / build (push) Successful in 3m25s
refactor(server): 拆分 cmd/mini 与 cmd/web 两个部署入口
小程序接口(lunar.neatcn.com)与商业版 Web(kepo.net)此前共用一个
二进制,导致小程序域名暴露商业后台与 Stripe Webhook,商业站点也
暴露了许愿树等小程序接口。现拆为两个入口:

- cmd/mini:微信登录、生辰档案、许愿树、百科、版本号
- cmd/web:邮箱登录、commerce、报告/订单、/admin 后台、商业前端
  静态托管与 SPA 回退
- internal/app 承载共用启动与路由注册;图片资源移至 internal/assets

CI:server-deploy.yml 改构建 cmd/mini 并随包移除后台静态资源;
新增 web-deploy.yml 构建 cmd/web + web-commercial 前端,发布
web-v* Release;deploy-watch.sh 支持 TAG_PREFIX/ASSET_NAME 变量;
新增 deploy-web.sh(systemd 版)与 kepo 一次性配置文档
.gitea/docs/PULL_DEPLOY_WEB.md。

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-18 11:31:51 +00:00

4.4 KiB
Raw Blame History

kepo.net 商业版 Web 拉取式部署配置(一次性)

安全原则同 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. 准备目录与脚本

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:

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=<QQ邮箱>
SMTP_PASSWORD=<SMTP授权码>
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:

[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
systemctl daemon-reload
systemctl enable lunar-web
# 首次启动前需要先手工放一版部署包,或等待第一次 Release 拉取

4. 定时拉取任务

crontab(crontab -e)添加:

* * * * * 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 仅本机访问。

验证

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 无需改动。