#!/usr/bin/env bash # ============================================================ # 服务器侧:加载镜像包并按需启动(无需联网、无需 sdk 镜像) # # 用法: # # 1) 加载完整包并启动全部 # bash deploy/load-and-up.sh deploy/dist/buyu-images-.tar # # # 2) 只加载某个服务的包并只重启该服务(增量更新) # bash deploy/load-and-up.sh deploy/dist/buyu-images-admin-.tar admin # bash deploy/load-and-up.sh deploy/dist/buyu-images-admin-fishgame-.tar admin fishgame # # 说明:镜像内的配置(网关 ocelot 下游改写、捕鱼对外地址)已在构建时固化; # 服务器只做「加载镜像 + 按需重启」,不涉及编译。 # ============================================================ set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" COMPOSE="$ROOT/deploy/docker-compose.yml" TAR="${1:-}" shift || true SERVICES=("$@") log() { echo -e "\033[1;32m[部署]\033[0m $*"; } [ -n "$TAR" ] || { echo "用法: bash deploy/load-and-up.sh <镜像包.tar> [服务名...]"; exit 1; } [ -f "$TAR" ] || { echo "找不到镜像包: $TAR"; exit 1; } command -v docker >/dev/null 2>&1 || { echo "未检测到 docker,请先安装 Docker"; exit 1; } docker compose version >/dev/null 2>&1 || { echo "未检测到 docker compose v2"; exit 1; } log "1/3 加载镜像(tar 较大,需要一点时间)..." docker load -i "$TAR" log "2/3 启动容器..." mkdir -p "$ROOT/deploy"/logs/{gateway,admin,user,customer,chess,fishroom,fishgame} mkdir -p "$ROOT/deploy"/uploads/{admin,user,customer} if [ ${#SERVICES[@]} -gt 0 ]; then log "仅重建/重启: ${SERVICES[*]}" docker compose -f "$COMPOSE" up -d --force-recreate "${SERVICES[@]}" CHECK=("${SERVICES[@]}") else docker compose -f "$COMPOSE" up -d CHECK=(gateway admin user customer chess fishroom fishgame) fi log "3/3 健康检查..." sleep 6 declare -A PORT=( [gateway]=8001 [admin]=5241 [user]=5245 [customer]=5247 [chess]=5242 [fishroom]=5244 [fishgame]=5248 ) for name in "${CHECK[@]}"; do port="${PORT[$name]:-}" [ -n "$port" ] || continue ok="" for _ in $(seq 1 20); do if curl -fsS -o /dev/null --max-time 2 "http://localhost:$port/health"; then ok="✔"; break; fi sleep 2 done echo " ${ok:-✘} $name http://localhost:$port/health" done echo "" log "完成。网关统一入口: http://<服务器IP或域名>:8001"