Files
huangjingfen/docs/project-syj/deploy.md
danaisuiyuan b8643e085f feat: add syj variant automated deploy script
One-shot release pipeline for syj-shop variant: admin build -> rsync to
8.140.50.89 -> remote .env switch + cache clear + Swoole reload ->
healthcheck with auto-rollback on failure. Includes operations manual
under docs/project-syj/.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 09:13:29 +08:00

127 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# syj 商城变体发布手册
一键脚本:`pro_v3.5.1/deploy/release-syj.sh`
覆盖范围:后端 PHP + admin 前端dist+ `.env` 切换 + Swoole 平滑 reload + 健康检查 + 失败自动回滚。
**不覆盖**`view/uniapp_v2/`HBuilderX 手动)、`view/uniapp/`本次不发布、composer 依赖、数据库迁移。
---
## 1. 首次配置
### 1.1 本机
- 安装 `rsync``ssh`、Node 16+admin 构建)
- 配置 SSH 免密:`ssh-copy-id -p 22 root@8.140.50.89`
- 验证:`ssh root@8.140.50.89 "ls /www/wwwroot/syj.fsgx.cn"`
- 脚本参数集中在 `pro_v3.5.1/deploy/syj.conf`,按实际环境修改
### 1.2 服务器(首次部署后)
- 路径:`/www/wwwroot/syj.fsgx.cn/`CRMEB 项目根,对应仓库的 `pro_v3.5.1/`
- PHP 8.0 + Swoole 4.x 已装好;`config/swoole.php` 建议显式设置 `pid_file => runtime/swoole/swoole.pid`
- Swoole 进程通过 systemd 或 screen 长驻。systemd 单元示例:
```ini
# /etc/systemd/system/syj-swoole.service
[Unit]
Description=syj-shop Swoole HTTP/WS
After=network.target mysql.service redis.service
[Service]
Type=simple
WorkingDirectory=/www/wwwroot/syj.fsgx.cn
ExecStart=/usr/bin/php think swoole
ExecReload=/bin/kill -USR1 $MAINPID
Restart=on-failure
RestartSec=2
User=www
Group=www
[Install]
WantedBy=multi-user.target
```
`systemctl daemon-reload && systemctl enable --now syj-swoole`
- Nginx 反代关键片段(端口 443 → Swoole 20199
```nginx
location / {
proxy_pass http://127.0.0.1:20199;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /admin/ {
alias /www/wwwroot/syj.fsgx.cn/view/admin/dist/;
try_files $uri $uri/ /admin/index.html;
}
```
### 1.3 `.env-syj` 字段含义
- `[DATABASE]` HOSTNAME=8.140.50.89 → 与 web 同机的 MySQL
- `[REDIS]` HOSTNAME=8.140.50.89 → 同机 Redis
- `APP_DEBUG = true` ⚠️ **生产建议改为 false**(脚本不强制改,避免吞掉用户配置)
---
## 2. 日常发布
```bash
cd /Users/mac/scott2026/huangjingfen/pro_v3.5.1
bash deploy/release-syj.sh
```
阶段日志说明:
1. `Pre-flight checks` — 校验分支、`.env-syj` 存在、远端目录可达
2. `Build admin` — `view/admin` 下 `npm run build`,产物 `view/admin/dist/`
3. `Release tag: 20260510-093015-79436c01` — 时间戳 + git short SHA
4. `rsync ->` — 推送代码(带 `--backup-dir` 把被覆盖的旧文件备份到远端 `/www/wwwroot/syj.fsgx.cn-bak/<tag>/`
5. `Remote: switch .env, php think clear, Swoole reload` — 远端拷贝 `.env-syj` → `.env`、清缓存、`kill -USR1 master`
6. `Healthcheck` — 串行 curl `https://syj.fsgx.cn/api/version` 与 `/admin/`,每个 URL 重试 5 次
7. 成功:写 `deploy/.last-release` 并清理超出 `KEEP_BACKUPS=10` 的旧备份
可选标志:
- `--dry-run` 只打印 rsync 改动,不动远端
- `--skip-build` 复用已有 `view/admin/dist/`
- `--rollback <tag>` 回滚到指定备份(见下)
---
## 3. 回滚
### 3.1 自动回滚
健康检查失败时脚本自动执行:用 `<tag>` 备份覆盖远端代码 → 清缓存 → reload → 再次健康检查。仍失败则脚本退出 2备份目录保留供人工排查。
### 3.2 手动回滚
查看远端备份:
```bash
ssh root@8.140.50.89 'ls -1t /www/wwwroot/syj.fsgx.cn-bak | head -10'
```
执行:
```bash
bash deploy/release-syj.sh --rollback 20260510-093015-79436c01
```
`.env` 不在回滚范围内(`rsync --exclude='.env'`),避免误覆盖运行中的环境配置。
---
## 4. 故障排查
| 现象 | 排查 |
|------|------|
| admin 502 | Swoole 是否在跑:`systemctl status syj-swoole` 或 `ps aux \| grep "think swoole"` |
| `/api/version` 不是 200 | 看远端 `runtime/log/<日期>/cli.log`、Swoole 是否成功 reload |
| reload 后代码未生效 | 检查 `runtime/swoole/swoole.pid` 是否过期;删除后让 Swoole 重启重生 |
| `.env` 错配(连不上 DB | `cat /www/wwwroot/syj.fsgx.cn/.env` 对比 `.env-syj` |
| 健康检查超时 | 调大 `HEALTH_INTERVAL` / `HEALTH_RETRY`(在 `syj.conf` |
| `public/uploads/` 被清掉 | `rsync-exclude.txt` 有 `public/uploads/`,不会被同步;若已被覆盖,从 `<tag>` 备份恢复 |
| 分支不对脚本仍要继续 | 输入 `y` 二次确认;建议先 `git checkout syj-bypass-auth` |
远端 Swoole 日志:`/www/wwwroot/syj.fsgx.cn/runtime/swoole/swoole.log`
本地最近一次发布的 tag`pro_v3.5.1/deploy/.last-release`