refactor(deploy): 部署方案改为 1Panel 原生集成
- 移除系统 nginx 配置(1Panel 用内置 OpenResty,系统 nginx 不适用) - 站点反代改用 1Panel 网站-反向代理;容器改用 1Panel Compose 编排 - 定时触发由 systemd timer 改为 1Panel 计划任务(日志面板可视) - 脚本上传改用 1Panel 文件管理器,PULL_DEPLOY.md 全步骤 1Panel 化 - deploy.sh/deploy-watch.sh 核心逻辑不变(原子切换+健康检查+回滚)
This commit is contained in:
@@ -1,8 +1,9 @@
|
|||||||
# lunar-server 容器编排(doc79 同机部署)
|
# lunar-server 容器编排(doc79 同机部署,通过 1Panel Compose 编排创建)
|
||||||
# 用法:保存到 /opt/lunar/docker-compose.yml,先创建 /opt/lunar/production/.env
|
# 用法:1Panel → 容器 → Compose → 创建编排,粘贴本文件内容后部署。
|
||||||
# (包含全部生产环境变量,见 PULL_DEPLOY.md),然后:
|
# 前置:先在 /opt/lunar/production/.env 写入全部生产环境变量(模板见 PULL_DEPLOY.md)。
|
||||||
# docker compose up -d
|
# 之后 CI 产物由 1Panel 计划任务触发的 deploy-watch.sh 自动替换
|
||||||
# 之后 CI 产物由 deploy-watch.sh 自动替换 /opt/lunar/production/current 并重启容器。
|
# /opt/lunar/production/current 并重启容器(container_name 必须保持 lunar-server,
|
||||||
|
# deploy.sh 按此名称重启)。
|
||||||
|
|
||||||
services:
|
services:
|
||||||
lunar-server:
|
lunar-server:
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
# lunar.neatcn.com — Nginx 反向代理配置(doc79 同机部署)
|
|
||||||
# 用法二选一:
|
|
||||||
# A. 1Panel(推荐):网站 → 创建网站 → 反向代理,主机域名 lunar.neatcn.com,
|
|
||||||
# 代理地址 http://127.0.0.1:8080,然后申请 Let's Encrypt 证书并开启 HTTPS。
|
|
||||||
# B. 手工:将本文件放入 nginx conf.d,证书路径按实际填写后 reload。
|
|
||||||
|
|
||||||
server {
|
|
||||||
listen 80;
|
|
||||||
server_name lunar.neatcn.com;
|
|
||||||
# HTTPS 就绪后全部跳转
|
|
||||||
return 301 https://$host$request_uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
server {
|
|
||||||
listen 443 ssl;
|
|
||||||
http2 on;
|
|
||||||
server_name lunar.neatcn.com;
|
|
||||||
|
|
||||||
# 证书路径按实际申请位置调整(1Panel 站点证书在其站点目录下)
|
|
||||||
ssl_certificate /etc/nginx/ssl/lunar.neatcn.com.pem;
|
|
||||||
ssl_certificate_key /etc/nginx/ssl/lunar.neatcn.com.key;
|
|
||||||
ssl_protocols TLSv1.2 TLSv1.3;
|
|
||||||
|
|
||||||
# 小程序 request / 管理后台均走这里 → 本机 Go 服务
|
|
||||||
location / {
|
|
||||||
proxy_pass http://127.0.0.1:8080;
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
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_read_timeout 60s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+74
-59
@@ -1,32 +1,48 @@
|
|||||||
# doc79 同机拉取式部署配置(一次性)
|
# doc79 同机拉取式部署配置(1Panel 原生方式,一次性)
|
||||||
|
|
||||||
> 安全原则:CI 只构建、不部署;任何 AI 与流水线都不允许 SSH 到服务器执行命令。
|
> 安全原则:CI 只构建、不部署;任何 AI 与流水线都不允许 SSH 到服务器执行命令。
|
||||||
> 部署由服务器本地的 watcher 监听 CI 产物目录自动完成。本文档的所有命令由**管理员本人**在 doc79 上执行一次。
|
> 部署由服务器本地定时任务监听 CI 产物目录自动完成。
|
||||||
|
> 本文档所有操作均通过 **1Panel 网页界面**或管理员本人的终端完成,不依赖 AI 远程执行。
|
||||||
|
|
||||||
## 架构
|
## 架构
|
||||||
|
|
||||||
```
|
```
|
||||||
push main → Gitea Actions 构建(runner 与 doc79 同机)→ 产物写入 /ci-artifacts
|
push main → Gitea Actions 构建(runner 与 doc79 同机)→ 产物写入 /ci-artifacts
|
||||||
↓
|
↓
|
||||||
systemd timer 每分钟运行 deploy-watch.sh → 发现新 sha256 → deploy.sh 原子切换 + 重启容器 + 健康检查
|
1Panel 计划任务(每分钟)运行 deploy-watch.sh → 发现新 sha256 → deploy.sh 原子切换 + 重启容器 + 健康检查
|
||||||
↓
|
↓
|
||||||
nginx (lunar.neatcn.com, HTTPS) → 127.0.0.1:8080 lunar-server 容器
|
EdgeOne CDN (HTTPS 终结) → doc79:80 → 1Panel OpenResty 反代 → 127.0.0.1:8080 lunar-server 容器
|
||||||
```
|
```
|
||||||
|
|
||||||
## 一次性安装步骤
|
## 一次性安装步骤(按序执行)
|
||||||
|
|
||||||
### 1. 域名与 HTTPS(lunar.neatcn.com)
|
### 1. EdgeOne 回源配置(控制台)
|
||||||
|
|
||||||
- DNS:将 `lunar.neatcn.com` A 记录指向 doc79 公网 IP;
|
- 回源协议改为 **HTTP**(HTTPS 由 EdgeOne 终结,源站无需证书,消除 525);
|
||||||
- 站点:1Panel → 网站 → 创建反向代理网站,域名 `lunar.neatcn.com` → `http://127.0.0.1:8080`,
|
- 回源地址:doc79 公网 IP,端口 80;回源 Host:`lunar.neatcn.com`。
|
||||||
申请 Let's Encrypt 证书并开启 HTTPS(参考 `.gitea/deploy/nginx-lunar.neatcn.com.conf`);
|
|
||||||
- 微信公众平台 → 开发管理 → 服务器域名:将 `https://lunar.neatcn.com` 加入 request 合法域名。
|
|
||||||
|
|
||||||
### 2. 生产环境变量(切勿写入仓库)
|
### 2. 1Panel 创建反向代理网站
|
||||||
|
|
||||||
```bash
|
1Panel → **网站** → 创建网站 → **反向代理**:
|
||||||
sudo mkdir -p /opt/lunar/production /opt/lunar/backups /opt/lunar/scripts
|
|
||||||
sudo tee /opt/lunar/production/.env > /dev/null <<'EOF'
|
- 主域名:`lunar.neatcn.com`
|
||||||
|
- 代理地址:`http://127.0.0.1:8080`
|
||||||
|
|
||||||
|
创建后如需补充请求头,可在站点「配置文件」中加入:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
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 https;
|
||||||
|
```
|
||||||
|
|
||||||
|
(1Panel 的 OpenResty 默认已带 Host 头转发,以上为可选项。)
|
||||||
|
|
||||||
|
### 3. 生产环境变量(切勿写入仓库)
|
||||||
|
|
||||||
|
1Panel → **文件** → 进入 `/opt/lunar/production/`(不存在先创建),新建 `.env`:
|
||||||
|
|
||||||
|
```ini
|
||||||
SERVER_ENV=production
|
SERVER_ENV=production
|
||||||
SERVER_PORT=8080
|
SERVER_PORT=8080
|
||||||
DB_HOST=<数据库地址>
|
DB_HOST=<数据库地址>
|
||||||
@@ -40,64 +56,63 @@ MINI_APP_SECRET=<小程序AppSecret>
|
|||||||
WECHAT_PAY_APIKEY=<支付API密钥>
|
WECHAT_PAY_APIKEY=<支付API密钥>
|
||||||
WECHAT_PAY_MCHID=<商户号>
|
WECHAT_PAY_MCHID=<商户号>
|
||||||
ADMIN_PASSWORD=<后台登录密码>
|
ADMIN_PASSWORD=<后台登录密码>
|
||||||
# 注意:不要配置 CORS_ORIGINS 白名单。小程序请求的 Origin 为 servicewechat.com,
|
# 注意:不要配置 CORS_ORIGINS 白名单。小程序请求 Origin 为 servicewechat.com,
|
||||||
# 配置白名单会导致跨域头缺失;同源访问不受影响,保持默认即可。
|
# 配置白名单会导致跨域头缺失;保持默认(*)即可,鉴权由 JWT/Cookie 保证。
|
||||||
EOF
|
|
||||||
sudo chmod 600 /opt/lunar/production/.env
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. 启动容器
|
文件权限设为 `600`(1Panel 文件管理器右键可改)。
|
||||||
|
|
||||||
|
### 4. 1Panel Compose 编排创建容器
|
||||||
|
|
||||||
|
1Panel → **容器** → **Compose** → 创建编排,名称 `lunar`,粘贴仓库
|
||||||
|
[.gitea/deploy/docker-compose.yml](../deploy/docker-compose.yml) 的完整内容后部署。
|
||||||
|
|
||||||
|
> 首次部署时 `/opt/lunar/production/current` 尚不存在,容器会启动失败——正常现象。
|
||||||
|
> 待第 6 步首次部署落盘后,在 1Panel 里重启该容器即可恢复。
|
||||||
|
|
||||||
|
### 5. 上传部署脚本
|
||||||
|
|
||||||
|
1Panel → **文件** → 进入 `/opt/lunar/scripts/`(不存在先创建),从仓库
|
||||||
|
`.gitea/scripts/` 上传两个文件并赋予可执行权限(右键 → 权限 755):
|
||||||
|
|
||||||
|
- `deploy.sh`(原子切换 + 健康检查 + 失败回滚)
|
||||||
|
- `deploy-watch.sh`(产物指纹轮询)
|
||||||
|
|
||||||
|
### 6. 1Panel 计划任务触发部署
|
||||||
|
|
||||||
|
1Panel → **计划任务** → 创建任务:
|
||||||
|
|
||||||
|
- 任务类型:**Shell 脚本**
|
||||||
|
- 执行周期:固定间隔 1 分钟(或 cron `*/1 * * * *`)
|
||||||
|
- 脚本内容:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 从仓库 .gitea/deploy/ 复制 docker-compose.yml
|
bash /opt/lunar/scripts/deploy-watch.sh
|
||||||
sudo cp docker-compose.yml /opt/lunar/docker-compose.yml
|
|
||||||
cd /opt/lunar && sudo docker compose up -d
|
|
||||||
```
|
```
|
||||||
|
|
||||||
(首次启动时 /opt/lunar/production/current 还不存在,容器会重启失败,
|
保存后可先点「执行」手动跑一次验证(日志在任务详情里查看)。
|
||||||
待第 5 步 watcher 完成首次部署后自动恢复;或先手工 mkdir 空目录。)
|
|
||||||
|
|
||||||
### 4. 安装部署脚本
|
### 7. 微信公众平台
|
||||||
|
|
||||||
```bash
|
开发管理 → 服务器域名:将 `https://lunar.neatcn.com` 加入 **request 合法域名**。
|
||||||
# 从仓库 .gitea/scripts/ 复制
|
|
||||||
sudo cp deploy.sh deploy-watch.sh /opt/lunar/scripts/
|
|
||||||
sudo chmod +x /opt/lunar/scripts/*.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
### 5. systemd timer(每分钟轮询)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo tee /etc/systemd/system/lunar-deploy-watch.service > /dev/null <<'EOF'
|
|
||||||
[Unit]
|
|
||||||
Description=Lunar pull-based deploy watcher
|
|
||||||
[Service]
|
|
||||||
Type=oneshot
|
|
||||||
ExecStart=/bin/bash /opt/lunar/scripts/deploy-watch.sh
|
|
||||||
EOF
|
|
||||||
|
|
||||||
sudo tee /etc/systemd/system/lunar-deploy-watch.timer > /dev/null <<'EOF'
|
|
||||||
[Unit]
|
|
||||||
Description=Run lunar deploy watcher every minute
|
|
||||||
[Timer]
|
|
||||||
OnBootSec=1min
|
|
||||||
OnUnitActiveSec=1min
|
|
||||||
[Install]
|
|
||||||
WantedBy=timers.target
|
|
||||||
EOF
|
|
||||||
|
|
||||||
sudo systemctl daemon-reload
|
|
||||||
sudo systemctl enable --now lunar-deploy-watch.timer
|
|
||||||
```
|
|
||||||
|
|
||||||
## 验证
|
## 验证
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
systemctl list-timers | grep lunar
|
curl -s https://lunar.neatcn.com/api/version # 应返回含 commitSha 的版本 JSON
|
||||||
tail -f /opt/lunar/deploy-watch.log
|
|
||||||
curl -s https://lunar.neatcn.com/api/version # 应返回版本 JSON
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
- CI 侧:push 后 Gitea Actions 日志显示"后端构建成功",Telegram/Discord 收到通知;
|
||||||
|
- 服务器侧:1Panel 计划任务日志出现"部署成功";容器日志可见 `lunar-server 1.0.x` 启动行。
|
||||||
|
|
||||||
## 回滚
|
## 回滚
|
||||||
|
|
||||||
deploy.sh 健康检查失败会自动回滚;手工回滚使用 `/opt/lunar/backups/` 下的备份包重新执行 deploy.sh。
|
- 自动:deploy.sh 健康检查失败会自动恢复 `current.old` 并重启容器;
|
||||||
|
- 手工:用 `/opt/lunar/backups/` 下的备份包重新执行 `bash /opt/lunar/scripts/deploy.sh <备份包>`;
|
||||||
|
- 紧急:在 1Panel 容器页直接重启/回退。
|
||||||
|
|
||||||
|
## 为什么不用 systemd timer / 裸 nginx / 裸 docker-compose?
|
||||||
|
|
||||||
|
doc79 由 1Panel 统一管理:Web 服务是其内置 OpenResty(非系统 nginx)、容器与定时任务
|
||||||
|
有对应的可视化模块。全部落在 1Panel 能力内,日志、重启、证书都在一个面板里可见可控,
|
||||||
|
避免绕过平台管理造成"幽灵配置"。
|
||||||
|
|||||||
@@ -2,8 +2,9 @@
|
|||||||
# 拉取式部署 watcher - 监听 CI 产物目录,发现新版本自动部署
|
# 拉取式部署 watcher - 监听 CI 产物目录,发现新版本自动部署
|
||||||
# 设计原则:
|
# 设计原则:
|
||||||
# - CI 只负责构建并把产物写入 /ci-artifacts(runner 与本机同宿主)
|
# - CI 只负责构建并把产物写入 /ci-artifacts(runner 与本机同宿主)
|
||||||
# - 部署动作只由服务器本地的本脚本触发,任何 AI/CI 均不通过 SSH 操作服务器
|
# - 部署动作只由服务器本地触发(1Panel 计划任务每分钟调用本脚本),
|
||||||
# 安装方式见 .gitea/docs/PULL_DEPLOY.md(由管理员在服务器上手工执行一次)
|
# 任何 AI/CI 均不通过 SSH 操作服务器
|
||||||
|
# 安装方式见 .gitea/docs/PULL_DEPLOY.md(1Panel 原生方式,一次性配置)
|
||||||
|
|
||||||
set -u
|
set -u
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user