127 lines
4.6 KiB
Markdown
127 lines
4.6 KiB
Markdown
|
|
# 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`
|