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>
4.6 KiB
4.6 KiB
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 单元示例:
# /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.targetsystemctl daemon-reload && systemctl enable --now syj-swoole -
Nginx 反代关键片段(端口 443 → Swoole 20199):
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 → 同机 RedisAPP_DEBUG = true⚠️ 生产建议改为 false(脚本不强制改,避免吞掉用户配置)
2. 日常发布
cd /Users/mac/scott2026/huangjingfen/pro_v3.5.1
bash deploy/release-syj.sh
阶段日志说明:
Pre-flight checks— 校验分支、.env-syj存在、远端目录可达Build admin—view/admin下npm run build,产物view/admin/dist/Release tag: 20260510-093015-79436c01— 时间戳 + git short SHArsync ->— 推送代码(带--backup-dir把被覆盖的旧文件备份到远端/www/wwwroot/syj.fsgx.cn-bak/<tag>/)Remote: switch .env, php think clear, Swoole reload— 远端拷贝.env-syj→.env、清缓存、kill -USR1 masterHealthcheck— 串行 curlhttps://syj.fsgx.cn/api/version与/admin/,每个 URL 重试 5 次- 成功:写
deploy/.last-release并清理超出KEEP_BACKUPS=10的旧备份
可选标志:
--dry-run只打印 rsync 改动,不动远端--skip-build复用已有view/admin/dist/--rollback <tag>回滚到指定备份(见下)
3. 回滚
3.1 自动回滚
健康检查失败时脚本自动执行:用 <tag> 备份覆盖远端代码 → 清缓存 → reload → 再次健康检查。仍失败则脚本退出 2,备份目录保留供人工排查。
3.2 手动回滚
查看远端备份:
ssh root@8.140.50.89 'ls -1t /www/wwwroot/syj.fsgx.cn-bak | head -10'
执行:
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