topfans/docker/start.sh
2026-04-07 22:28:50 +08:00

184 lines
5.1 KiB
Bash
Executable File

#!/bin/bash
# ===================================================================
# TopFans Docker 一键启动脚本
# 功能:构建并启动所有后端服务
# ===================================================================
#
# 使用方式:
# ./start.sh # 构建并启动所有服务(本地)
# ./start.sh --profile prod # 使用生产配置
# ./start.sh --build-only # 仅构建,不启动
# ./start.sh --no-cache # 无缓存构建
#
# 示例:
# ./start.sh # 本地开发模式
# ./start.sh --profile prod # 生产部署模式
# ===================================================================
set -e
# ==================== 颜色定义 ====================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
# ==================== 路径配置 ====================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
# ==================== 默认设置 ====================
PROFILE="local"
BUILD_ONLY=false
NO_CACHE=""
# ==================== 解析参数 ====================
while [[ $# -gt 0 ]]; do
case $1 in
--profile)
PROFILE="$2"
shift 2
;;
--build-only)
BUILD_ONLY=true
shift
;;
--no-cache)
NO_CACHE="--no-cache"
shift
;;
--help|-h)
echo "用法: $0 [选项]"
echo ""
echo "选项:"
echo " --profile <env> 配置文件 (local/prod),默认 local"
echo " --build-only 仅构建,不启动服务"
echo " --no-cache 无缓存构建"
echo " --help, -h 显示帮助"
exit 0
;;
*)
echo -e "${RED}错误: 未知选项 '$1'${NC}"
exit 1
;;
esac
done
# ==================== 配置检查 ====================
COMPOSE_FILE="docker-compose.${PROFILE}.yml"
ENV_FILE=".env.${PROFILE}"
if [ ! -f "$COMPOSE_FILE" ]; then
echo -e "${RED}错误: 配置文件 $COMPOSE_FILE 不存在${NC}"
exit 1
fi
if [ ! -f "$ENV_FILE" ]; then
echo -e "${YELLOW}警告: $ENV_FILE 不存在,复制 .env.local 作为模板${NC}"
if [ -f ".env.local" ]; then
cp .env.local "$ENV_FILE"
else
echo -e "${RED}错误: 缺少环境配置文件${NC}"
exit 1
fi
fi
# ==================== 打印信息 ====================
print_step() {
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${BLUE} $1${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
}
# ==================== 停止现有容器 ====================
print_step "🛑 停止现有容器"
# 停止并移除旧容器
docker-compose -f "$COMPOSE_FILE" down 2>/dev/null || true
echo -e "${GREEN}✅ 已停止旧容器${NC}"
# ==================== 构建镜像 ====================
print_step "🔨 构建 Docker 镜像"
# 调用构建脚本
if [ -n "$NO_CACHE" ]; then
./build.sh --no-cache
else
./build.sh
fi
if [ $? -ne 0 ]; then
echo -e "${RED}❌ 构建失败${NC}"
exit 1
fi
echo -e "${GREEN}✅ 镜像构建完成${NC}"
# 如果仅构建则退出
if [ "$BUILD_ONLY" = true ]; then
echo ""
echo -e "${GREEN}🎉 构建完成(未启动服务)${NC}"
exit 0
fi
# ==================== 启动服务 ====================
print_step "🚀 启动服务"
echo -e "${YELLOW}使用配置: ${PROFILE}${NC}"
echo -e "${YELLOW}配置文件: ${COMPOSE_FILE}${NC}"
echo ""
# 启动所有服务(-d 后台运行)
docker-compose -f "$COMPOSE_FILE" --profile ${PROFILE} up -d
# ==================== 等待健康检查 ====================
print_step "⏳ 等待服务就绪"
# 等待时间(秒)
WAIT_TIME=60
INTERVAL=5
ELAPSED=0
echo -e "${YELLOW}正在等待服务启动...${NC}"
while [ $ELAPSED -lt $WAIT_TIME ]; do
# 检查 Gateway 健康状态
if curl -s http://localhost:8080/health > /dev/null 2>&1; then
echo -e "${GREEN}✅ Gateway 就绪${NC}"
break
fi
sleep $INTERVAL
ELAPSED=$((ELAPSED + INTERVAL))
echo -e "${YELLOW} 已等待 ${ELAPSED}s...${NC}"
done
if [ $ELAPSED -ge $WAIT_TIME ]; then
echo -e "${RED}⚠️ 服务启动超时,请检查日志${NC}"
echo "查看日志: docker-compose -f ${COMPOSE_FILE} logs"
fi
# ==================== 显示结果 ====================
print_step "📊 服务状态"
docker-compose -f "$COMPOSE_FILE" ps
echo ""
print_step "🌐 服务地址"
echo ""
echo -e " ${CYAN}Gateway:${NC} http://localhost:8080"
echo -e " ${CYAN}Swagger UI:${NC} http://localhost:8080/swagger/index.html"
echo -e " ${CYAN}PostgreSQL:${NC} localhost:5432"
echo ""
echo -e "${GREEN}🎉 启动完成!${NC}"
echo ""
echo "常用命令:"
echo " 查看日志: docker-compose -f ${COMPOSE_FILE} logs -f"
echo " 查看状态: docker-compose -f ${COMPOSE_FILE} ps"
echo " 停止服务: docker-compose -f ${COMPOSE_FILE} down"
echo ""