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

4.6 KiB
Raw Blame History

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 本机

  • 安装 rsyncssh、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.target
    

    systemctl 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 → 同机 Redis
  • APP_DEBUG = true ⚠️ 生产建议改为 false(脚本不强制改,避免吞掉用户配置)

2. 日常发布

cd /Users/mac/scott2026/huangjingfen/pro_v3.5.1
bash deploy/release-syj.sh

阶段日志说明:

  1. Pre-flight checks — 校验分支、.env-syj 存在、远端目录可达
  2. Build adminview/adminnpm 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 手动回滚

查看远端备份:

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-swooleps 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.txtpublic/uploads/,不会被同步;若已被覆盖,从 <tag> 备份恢复
分支不对脚本仍要继续 输入 y 二次确认;建议先 git checkout syj-bypass-auth

远端 Swoole 日志:/www/wwwroot/syj.fsgx.cn/runtime/swoole/swoole.log 本地最近一次发布的 tagpro_v3.5.1/deploy/.last-release