#!/usr/bin/env bash # ============================================================================ # FastapiAdmin 成品部署脚本(本地构建 → 服务器只接收成品) # # 设计目标: # 1. 服务器上不放业务源码、不跑构建,只接收构建好的成品; # 2. 后端用「镜像」交付(docker save | ssh docker load),前端用 tar 管道交付; # 3. 每次上线前先在服务器 backups/ 留一份备份,可一键回滚; # 4. 只重建变化的那一个容器,MySQL/Redis/Nginx 不重启。 # # 用法: # ./deploy-artifacts.sh web # Web 管理后台(nginx /web) # ./deploy-artifacts.sh app # 移动端 H5(nginx /app) # ./deploy-artifacts.sh backend # 构建并部署 MySQL 版后端镜像(切换线上) # ./deploy-artifacts.sh backend-pg # 只构建并自检 PostgreSQL 版镜像,不切换线上 # ./deploy-artifacts.sh all # 三样全发(后端默认 MySQL 版) # ./deploy-artifacts.sh verify # 公网四端验证 # ./deploy-artifacts.sh backups # 列出服务器上的备份 # ./deploy-artifacts.sh rollback web # 回滚 Web 到最近一次备份 # ./deploy-artifacts.sh rollback app # 回滚 H5 到最近一次备份 # # 前置条件: # - 本机 SSH 密钥可免密登录 root@$FA_SERVER # - backend 目标需要本机 docker(Colima / Docker Desktop 均可) # - frontend/web、frontend/app 依赖已安装(pnpm install) # # 环境变量覆盖:FA_SERVER、FA_REMOTE_ROOT、FA_BACKUP_DIR # ============================================================================ set -euo pipefail SERVER="${FA_SERVER:-8.137.99.5}" REMOTE_ROOT="${FA_REMOTE_ROOT:-/home/FastapiAdmin}" BACKUP_DIR="${FA_BACKUP_DIR:-/home/FastapiAdmin/backups}" BACKUP_KEEP="${FA_BACKUP_KEEP:-5}" # 每个标签最多保留的备份份数 IMAGE_KEEP="${FA_IMAGE_KEEP:-2}" # 每类镜像最多保留的版本数(当前 + 回滚点) STAMP="$(date +%Y%m%d-%H%M%S)" KEY="$HOME/.ssh/id_ed25519" SSH_OPTS=(-o BatchMode=yes -o ConnectTimeout=15) log() { printf '\033[0;34m[%s]\033[0m %s\n' "$(date +%H:%M:%S)" "$*"; } ok() { printf '\033[0;32m ✅ %s\033[0m\n' "$*"; } die() { printf '\033[0;31m ❌ %s\033[0m\n' "$*"; exit 1; } ssh_do() { ssh "${SSH_OPTS[@]}" -i "$KEY" "root@${SERVER}" "$@"; } # 把本地目录内容流式发到服务器目标目录。 # 服务器侧流程:解包到暂存区 → 校验入口文件 → 备份旧目录到 backups/