#!/bin/bash # ============================================================ # live.fuhua91.com 一键部署脚本 # # 用法: # ./deploy.sh 拉取 latest 最新镜像并重启 # ./deploy.sh v1.0.0 部署指定版本 # # 建议: 放到 /root/deploy.sh,执行 chmod 700 /root/deploy.sh # 依赖: 服务器已安装 docker,且能访问 harbor.fuhua91.com # ============================================================ set -euo pipefail # ---------- 可按需调整的参数 ---------- REGISTRY="harbor.fuhua91.com" PROJECT="live" # Harbor 机器人账号(也可通过环境变量 HARBOR_USER / HARBOR_PASSWORD 覆盖) HARBOR_USER_DEFAULT='robot$live+live' HARBOR_PASSWORD_DEFAULT='R4p6ieacIogXE779eL1HXhCpA4bx4SA7' BASE_DIR="/www/wwwroot/live.fuhua91.com" CONFIG_DIR="$BASE_DIR/config" # 后端配置目录 -> 容器内 /data/conf LOG_DIR="$BASE_DIR/log" # 后端日志目录 -> 容器内 /app/logs UPLOADS_DIR="$BASE_DIR/uploads" # 上传文件目录 -> 容器内 /app/uploads FRONTEND_PORT=9501 # 前端 nginx 容器 BACKEND_PORT=9502 # 后端 API/WebSocket 容器 NETWORK="live-net" BACKEND_NAME="live-backend" FRONTEND_NAME="live-frontend" # -------------------------------------- TAG="${1:-latest}" BACKEND_IMAGE="$REGISTRY/$PROJECT/backend:$TAG" FRONTEND_IMAGE="$REGISTRY/$PROJECT/frontend:$TAG" echo "==> 部署版本: $TAG" # 1. 准备挂载目录 mkdir -p "$CONFIG_DIR" "$LOG_DIR" "$UPLOADS_DIR" # 2. 首次运行检查配置文件 if [ ! -f "$CONFIG_DIR/config.yaml" ]; then echo "错误: 缺少 $CONFIG_DIR/config.yaml" echo "请先将项目 configs/config.yaml 复制到该路径," echo "并修改其中的 MySQL / Redis 等连接信息后重新执行本脚本。" exit 1 fi # 3. 登录 Harbor(优先使用环境变量 HARBOR_USER / HARBOR_PASSWORD) HARBOR_USER="${HARBOR_USER:-$HARBOR_USER_DEFAULT}" HARBOR_PASSWORD="${HARBOR_PASSWORD:-$HARBOR_PASSWORD_DEFAULT}" echo "==> 登录 $REGISTRY" echo "$HARBOR_PASSWORD" | docker login "$REGISTRY" --username "$HARBOR_USER" --password-stdin >/dev/null # 4. 拉取最新镜像 echo "==> 拉取镜像" docker pull "$BACKEND_IMAGE" docker pull "$FRONTEND_IMAGE" # 5. 重建容器 echo "==> 重启容器" docker network create "$NETWORK" >/dev/null 2>&1 || true docker rm -f "$BACKEND_NAME" "$FRONTEND_NAME" 2>/dev/null || true # 容器内进程以 uid 1000 (kra) 运行,日志/上传目录需要写权限 chown -R 1000:1000 "$LOG_DIR" "$UPLOADS_DIR" 2>/dev/null || \ chmod -R 777 "$LOG_DIR" "$UPLOADS_DIR" # 后端: 配置 /data/conf,日志 /app/logs,上传 /app/uploads docker run -d --name "$BACKEND_NAME" \ --restart always \ --network "$NETWORK" \ -p "$BACKEND_PORT:8000" \ -v "$CONFIG_DIR:/data/conf" \ -v "$LOG_DIR:/app/logs" \ -v "$UPLOADS_DIR:/app/uploads" \ "$BACKEND_IMAGE" # 前端: nginx 静态站点,容器内已配置 /api -> live-backend:8000 docker run -d --name "$FRONTEND_NAME" \ --restart always \ --network "$NETWORK" \ -p "$FRONTEND_PORT:80" \ "$FRONTEND_IMAGE" docker logout "$REGISTRY" >/dev/null 2>&1 || true echo "==> 部署完成" docker ps --filter "name=$BACKEND_NAME" --filter "name=$FRONTEND_NAME" echo "" echo "前端容器: http://<服务器IP>:$FRONTEND_PORT" echo "后端容器: http://<服务器IP>:$BACKEND_PORT" echo "提示: 网站正常访问走宝塔 nginx 反代(80/443),9501/9502 为直连调试端口,记得放行防火墙。"