1+ #! /bin/bash
2+ # Docker部署脚本
3+
4+ set -e
5+
6+ echo " 🚀 Java AI Starter Docker部署"
7+ echo " =============================="
8+
9+ # 颜色定义
10+ RED=' \033[0;31m'
11+ GREEN=' \033[0;32m'
12+ YELLOW=' \033[1;33m'
13+ BLUE=' \033[0;34m'
14+ NC=' \033[0m' # No Color
15+
16+ # 检查Docker
17+ check_docker () {
18+ if ! command -v docker & > /dev/null; then
19+ echo -e " ${RED} ❌ Docker未安装${NC} "
20+ exit 1
21+ fi
22+ echo -e " ${GREEN} ✅ Docker已安装${NC} "
23+ }
24+
25+ # 检查环境文件
26+ check_env () {
27+ if [ ! -f " .env.docker" ]; then
28+ echo -e " ${YELLOW} ⚠️ 未找到.env.docker文件${NC} "
29+ echo " 创建默认环境文件..."
30+ cat > .env.docker << EOF
31+ # Docker环境配置
32+ AI_API_KEY=sk-1899062c03f640f090129c4692ccc26f
33+ AI_BASE_URL=https://api.deepseek.com
34+ AI_MODEL=deepseek-chat
35+ AI_MAX_TOKENS=1000
36+ AI_TIMEOUT=30000
37+
38+ SERVER_PORT=8080
39+ SPRING_PROFILES_ACTIVE=docker
40+
41+ # 数据库配置(可选)
42+ # DB_HOST=postgres
43+ # DB_PORT=5432
44+ # DB_PASSWORD=ai_password
45+
46+ # Redis配置(可选)
47+ # REDIS_HOST=redis
48+ # REDIS_PORT=6379
49+ EOF
50+ echo -e " ${GREEN} ✅ 已创建.env.docker文件${NC} "
51+ fi
52+
53+ # 加载环境变量(排除包含特殊字符的行)
54+ if [ -f " .env.docker" ]; then
55+ echo " 加载环境变量..."
56+ # 只加载简单的KEY=VALUE行,排除包含JVM参数的行
57+ while IFS= read -r line; do
58+ # 跳过注释和空行
59+ [[ " $line " =~ ^# .*$ ]] && continue
60+ [[ -z " $line " ]] && continue
61+ # 跳过包含JVM参数的行
62+ [[ " $line " =~ .* = .* -Xmx.* ]] && continue
63+ [[ " $line " =~ .* = .* -Xms.* ]] && continue
64+ [[ " $line " =~ .* = .* -XX:.* ]] && continue
65+
66+ # 导出有效的环境变量
67+ export " $line " 2> /dev/null || echo " 跳过: $line "
68+ done < .env.docker
69+ fi
70+ }
71+
72+ # 构建Docker镜像
73+ build_image () {
74+ echo -e " ${BLUE} 🔨 构建Docker镜像...${NC} "
75+ docker build -t java-ai-starter:latest .
76+
77+ if [ $? -eq 0 ]; then
78+ echo -e " ${GREEN} ✅ Docker镜像构建成功${NC} "
79+ else
80+ echo -e " ${RED} ❌ Docker镜像构建失败${NC} "
81+ exit 1
82+ fi
83+ }
84+
85+ # 运行Docker容器
86+ run_container () {
87+ echo -e " ${BLUE} 🐳 启动Docker容器...${NC} "
88+
89+ # 停止并删除现有容器
90+ if docker ps -a | grep -q " java-ai-starter" ; then
91+ echo " 停止现有容器..."
92+ docker stop java-ai-starter 2> /dev/null || true
93+ docker rm java-ai-starter 2> /dev/null || true
94+ fi
95+
96+ # 运行新容器
97+ docker run -d \
98+ --name java-ai-starter \
99+ --restart unless-stopped \
100+ -p ${SERVER_PORT:- 8080} :8080 \
101+ -e AI_API_KEY=" ${AI_API_KEY} " \
102+ -e AI_BASE_URL=" ${AI_BASE_URL:- https:// api.deepseek.com} " \
103+ -e AI_MODEL=" ${AI_MODEL:- deepseek-chat} " \
104+ -e AI_MAX_TOKENS=" ${AI_MAX_TOKENS:- 1000} " \
105+ -e AI_TIMEOUT=" ${AI_TIMEOUT:- 30000} " \
106+ -e SPRING_PROFILES_ACTIVE=" ${SPRING_PROFILES_ACTIVE:- docker} " \
107+ -e SERVER_PORT=8080 \
108+ -v $( pwd) /logs:/app/logs \
109+ -v $( pwd) /config:/app/config \
110+ java-ai-starter:latest
111+
112+ if [ $? -eq 0 ]; then
113+ echo -e " ${GREEN} ✅ Docker容器启动成功${NC} "
114+ else
115+ echo -e " ${RED} ❌ Docker容器启动失败${NC} "
116+ exit 1
117+ fi
118+ }
119+
120+ # 检查容器状态
121+ check_status () {
122+ echo -e " ${BLUE} 🔍 检查容器状态...${NC} "
123+
124+ sleep 3
125+
126+ # 检查容器是否运行
127+ if docker ps | grep -q " java-ai-starter" ; then
128+ echo -e " ${GREEN} ✅ 容器正在运行${NC} "
129+ else
130+ echo -e " ${RED} ❌ 容器未运行${NC} "
131+ docker logs java-ai-starter --tail 20
132+ exit 1
133+ fi
134+
135+ # 检查健康状态
136+ echo " 等待应用启动..."
137+ sleep 5
138+
139+ # 测试API
140+ local max_attempts=10
141+ local attempt=1
142+
143+ while [ $attempt -le $max_attempts ]; do
144+ echo " 尝试 $attempt /$max_attempts ..."
145+ if curl -s http://localhost:${SERVER_PORT:- 8080} /api/v1/ping > /dev/null 2>&1 ; then
146+ echo -e " ${GREEN} ✅ API响应正常${NC} "
147+ break
148+ fi
149+
150+ if [ $attempt -eq $max_attempts ]; then
151+ echo -e " ${RED} ❌ API未响应${NC} "
152+ docker logs java-ai-starter --tail 30
153+ exit 1
154+ fi
155+
156+ sleep 5
157+ (( attempt++ ))
158+ done
159+ }
160+
161+ # 显示部署信息
162+ show_info () {
163+ local port=${SERVER_PORT:- 8080}
164+
165+ echo " "
166+ echo -e " ${GREEN} 🎉 部署完成!${NC} "
167+ echo " ========================"
168+ echo " 📊 部署信息:"
169+ echo " - 容器名称: java-ai-starter"
170+ echo " - 主机端口: $port "
171+ echo " - 容器端口: 8080"
172+ echo " - 镜像标签: java-ai-starter:latest"
173+ echo " "
174+ echo " 🌐 访问地址:"
175+ echo " - http://localhost:$port "
176+ echo " "
177+ echo " 📋 测试命令:"
178+ echo " curl http://localhost:$port /api/v1/ping"
179+ echo " curl -X POST http://localhost:$port /api/v1/chat/text \\ "
180+ echo " -H \" Content-Type: application/json\" \\ "
181+ echo " -d '{\" message\" :\" 你好\" }'"
182+ echo " "
183+ echo " 🔧 管理命令:"
184+ echo " # 查看日志"
185+ echo " docker logs -f java-ai-starter"
186+ echo " "
187+ echo " # 进入容器"
188+ echo " docker exec -it java-ai-starter sh"
189+ echo " "
190+ echo " # 停止容器"
191+ echo " docker stop java-ai-starter"
192+ echo " "
193+ echo " # 删除容器"
194+ echo " docker rm java-ai-starter"
195+ echo " "
196+ echo " # 删除镜像"
197+ echo " docker rmi java-ai-starter:latest"
198+ }
199+
200+ # 主函数
201+ main () {
202+ check_docker
203+ check_env
204+ build_image
205+ run_container
206+ check_status
207+ show_info
208+ }
209+
210+ # 执行主函数
211+ main " $@ "
0 commit comments