Files
huangjingfen/docs/deploy-hjf.md
2026-05-01 22:21:36 +08:00

9.2 KiB
Raw Blame History

HJF项目代码更新发布部署文档

本文档用于在黄精粉线上环境已经完成初始化部署后进行代码修改后的更新发布。该环境不是首次部署场景服务器目录、Nginx、PHP、Swoole 和宝塔进程守护均已配置并验证正常;发布流程只处理代码同步、管理后台构建产物更新、缓存清理和 Swoole 进程重启。

1. 部署信息

项目
服务器 182.92.142.158
SSH 用户 root
SSH 密码 使用 CI/CD 密钥变量保存,例如 DEPLOY_SSH_PASSWORD
远程部署目录 /www/wwwroot/hjf.suzhouyuqi.com
绑定域名 hjf.fsgx.cn
管理后台 https://hjf.fsgx.cn/admin
后端入口目录 /www/wwwroot/hjf.suzhouyuqi.com/public
管理后台静态目录 /www/wwwroot/hjf.suzhouyuqi.com/public/admin
面板环境 宝塔面板
Nginx 状态 已配置并正常运行
PHP / Swoole 状态 已配置并正常运行
Swoole 管理方式 宝塔进程守护

不要把 SSH 密码写入 Git 仓库。自动化部署建议使用 SSH key如果必须用密码放在 CI/CD Secret 中,并通过 sshpass -p "$DEPLOY_SSH_PASSWORD" 注入。

2. 发布边界

本流程是更新部署,不包含以下首次部署事项:

  • 不初始化服务器目录。
  • 不安装 Nginx、PHP、Composer、Node.js、Swoole 扩展。
  • 不创建站点、不重新绑定域名。
  • 不重新配置 SSL。
  • 不重建数据库。
  • 不覆盖线上 .env
  • 不修改宝塔站点和反向代理配置。

每次发布只做:

  • 拉取指定 Git 分支代码。
  • 安装 / 校验 PHP 依赖。
  • 构建管理后台 view/admin
  • 同步后端代码到 /www/wwwroot/hjf.suzhouyuqi.com
  • 同步管理后台静态产物到 public/admin
  • 清理 ThinkPHP 缓存。
  • 通过宝塔进程守护重启 Swoole 服务。

3. 本地准备

在项目根目录执行:

cd /path/to/huangjingfen
git fetch origin
git checkout fsgx-bypass-auth
git pull --ff-only origin fsgx-bypass-auth

确认 PHP 依赖存在:

cd pro_v3.5.1
composer install --no-dev --prefer-dist --optimize-autoloader

构建管理后台:

cd pro_v3.5.1/view/admin
npm install
npm run build

构建产物路径:

pro_v3.5.1/view/admin/dist/

4. 推荐自动化变量

CI/CD 中建议配置:

DEPLOY_HOST=182.92.142.158
DEPLOY_USER=root
DEPLOY_PATH=/www/wwwroot/hjf.suzhouyuqi.com
DEPLOY_DOMAIN=hjf.fsgx.cn
DEPLOY_SSH_PASSWORD=******

如果使用 SSH key则不需要 DEPLOY_SSH_PASSWORD

5. 服务器备份

虽然不是首次部署,但每次更新发布前仍建议备份当前线上目录:

ssh ${DEPLOY_USER}@${DEPLOY_HOST} "\
  mkdir -p /www/backup && \
  tar -czf /www/backup/hjf_fsgx_$(date +%Y%m%d_%H%M%S).tar.gz \
    -C /www/wwwroot hjf.suzhouyuqi.com"

使用密码自动化时:

sshpass -p "$DEPLOY_SSH_PASSWORD" ssh -o StrictHostKeyChecking=no ${DEPLOY_USER}@${DEPLOY_HOST} "\
  mkdir -p /www/backup && \
  tar -czf /www/backup/hjf_fsgx_$(date +%Y%m%d_%H%M%S).tar.gz \
    -C /www/wwwroot hjf.suzhouyuqi.com"

6. 上传后端代码

从仓库根目录执行:

rsync -avz --delete \
  --exclude='.git' \
  --exclude='.DS_Store' \
  --exclude='.env' \
  --exclude='.env-*' \
  --exclude='runtime/cache' \
  --exclude='runtime/log' \
  --exclude='runtime/temp' \
  --exclude='public/uploads' \
  --exclude='view/admin/node_modules' \
  --exclude='view/admin/dist' \
  --exclude='view/uniapp/node_modules' \
  pro_v3.5.1/ \
  ${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_PATH}/

使用密码自动化时,在 rsync 中指定 SSH

rsync -avz --delete \
  -e "sshpass -p '$DEPLOY_SSH_PASSWORD' ssh -o StrictHostKeyChecking=no" \
  --exclude='.git' \
  --exclude='.DS_Store' \
  --exclude='.env' \
  --exclude='.env-*' \
  --exclude='runtime/cache' \
  --exclude='runtime/log' \
  --exclude='runtime/temp' \
  --exclude='public/uploads' \
  --exclude='view/admin/node_modules' \
  --exclude='view/admin/dist' \
  --exclude='view/uniapp/node_modules' \
  pro_v3.5.1/ \
  ${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_PATH}/

线上 .env 不建议由代码仓库覆盖,应在服务器保留并单独维护。

7. 上传管理后台

rsync -avz --delete \
  pro_v3.5.1/view/admin/dist/ \
  ${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_PATH}/public/admin/

使用密码自动化时:

rsync -avz --delete \
  -e "sshpass -p '$DEPLOY_SSH_PASSWORD' ssh -o StrictHostKeyChecking=no" \
  pro_v3.5.1/view/admin/dist/ \
  ${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_PATH}/public/admin/

8. 远程收尾命令

ssh ${DEPLOY_USER}@${DEPLOY_HOST} "\
  cd ${DEPLOY_PATH} && \
  php think clear && \
  chown -R www:www runtime public/uploads public/admin 2>/dev/null || true && \
  chmod -R 755 runtime public/admin 2>/dev/null || true"

重启后端常驻服务。按服务器实际进程管理方式选择其一:

# 宝塔进程守护
# 推荐在宝塔面板中重启对应的 Swoole 进程守护任务。
# 如果宝塔进程守护任务配置了命令行启动 php think swoole可在面板点击“重启”。

# 命令行兜底,仅当确认不会和宝塔进程守护冲突时使用:
pkill -f 'php think swoole' || true
cd /www/wwwroot/hjf.suzhouyuqi.com
nohup php think swoole > runtime/swoole.log 2>&1 &

当前环境使用 SwoolePHP-FPM 不是主要入口。只有在站点同时依赖 PHP-FPM 时才需要重载:

systemctl reload php-fpm || true

9. Nginx 配置要点

当前服务器 Nginx 已经由宝塔配置并运行正常,更新发布一般不需要修改 Nginx。下面只作为检查项和故障排查参考。

站点根目录应指向 public

server {
    listen 80;
    listen 443 ssl http2;
    server_name hjf.fsgx.cn;
    root /www/wwwroot/hjf.suzhouyuqi.com/public;
    index index.html index.php;

    location /admin/ {
        try_files $uri $uri/ /admin/index.html;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        # 按服务器现有方式转发到 Swoole 或 PHP-FPM
    }
}

如果管理后台访问白屏,重点检查:

/www/wwwroot/hjf.suzhouyuqi.com/public/admin/index.html
/www/wwwroot/hjf.suzhouyuqi.com/public/admin/static/

10. 验证清单

部署完成后执行:

curl -I https://hjf.fsgx.cn/admin
curl -I https://hjf.fsgx.cn/admin/
curl -I https://hjf.fsgx.cn/admin/index.html

浏览器验证:

https://hjf.fsgx.cn/admin

后台登录后重点验证:

  • 商品列表可打开。
  • 商品 type_header 接口不再返回 config/auth.php:82
  • 系统菜单、首页统计、订单列表、用户列表可以正常请求。
  • 静态资源没有返回 HTML浏览器控制台无 Unexpected token '<'

11. 一键更新部署脚本模板

该脚本面向“代码更新发布”,默认不修改宝塔站点配置、不覆盖线上 .env。Swoole 重启优先通过宝塔面板完成;脚本末尾保留 supervisorctl/命令行兜底示例,需要按服务器实际进程守护名称调整。

#!/usr/bin/env bash
set -euo pipefail

DEPLOY_HOST="${DEPLOY_HOST:-182.92.142.158}"
DEPLOY_USER="${DEPLOY_USER:-root}"
DEPLOY_PATH="${DEPLOY_PATH:-/www/wwwroot/hjf.suzhouyuqi.com}"
SSH_CMD="ssh -o StrictHostKeyChecking=no"

if [ -n "${DEPLOY_SSH_PASSWORD:-}" ]; then
  SSH_CMD="sshpass -p ${DEPLOY_SSH_PASSWORD} ssh -o StrictHostKeyChecking=no"
  RSYNC_SSH="sshpass -p ${DEPLOY_SSH_PASSWORD} ssh -o StrictHostKeyChecking=no"
else
  RSYNC_SSH="ssh -o StrictHostKeyChecking=no"
fi

git fetch origin
git checkout fsgx-bypass-auth
git pull --ff-only origin fsgx-bypass-auth

cd pro_v3.5.1
composer install --no-dev --prefer-dist --optimize-autoloader

cd view/admin
npm install
npm run build
cd ../../..

$SSH_CMD ${DEPLOY_USER}@${DEPLOY_HOST} "\
  mkdir -p /www/backup && \
  tar -czf /www/backup/hjf_fsgx_\$(date +%Y%m%d_%H%M%S).tar.gz \
    -C /www/wwwroot hjf.suzhouyuqi.com"

rsync -avz --delete -e "$RSYNC_SSH" \
  --exclude='.git' \
  --exclude='.DS_Store' \
  --exclude='.env' \
  --exclude='.env-*' \
  --exclude='runtime/cache' \
  --exclude='runtime/log' \
  --exclude='runtime/temp' \
  --exclude='public/uploads' \
  --exclude='view/admin/node_modules' \
  --exclude='view/admin/dist' \
  --exclude='view/uniapp/node_modules' \
  pro_v3.5.1/ \
  ${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_PATH}/

rsync -avz --delete -e "$RSYNC_SSH" \
  pro_v3.5.1/view/admin/dist/ \
  ${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_PATH}/public/admin/

$SSH_CMD ${DEPLOY_USER}@${DEPLOY_HOST} "\
  cd ${DEPLOY_PATH} && \
  php think clear && \
  chown -R www:www runtime public/uploads public/admin 2>/dev/null || true && \
  chmod -R 755 runtime public/admin 2>/dev/null || true && \
  echo '请通过宝塔进程守护重启 Swoole 服务'"

curl -I https://hjf.fsgx.cn/admin

12. 回滚

查看备份:

ssh ${DEPLOY_USER}@${DEPLOY_HOST} "ls -lh /www/backup | grep hjf_fsgx"

回滚示例:

ssh ${DEPLOY_USER}@${DEPLOY_HOST} "\
  cd /www/wwwroot && \
  mv hjf.suzhouyuqi.com hjf.suzhouyuqi.com.bad.$(date +%Y%m%d_%H%M%S) && \
  mkdir -p hjf.suzhouyuqi.com && \
  tar -xzf /www/backup/备份文件名.tar.gz -C /www/wwwroot && \
  supervisorctl restart hjfshop-swoole || true"