From 4873528b95ee4217f84c17f08a8c43883040a009 Mon Sep 17 00:00:00 2001 From: IntelliDev AI <616598128@qq.com> Date: Sun, 1 Feb 2026 00:46:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AE=8C=E6=95=B4=E7=9A=84Do?= =?UTF-8?q?cker=E9=83=A8=E7=BD=B2=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 包含: 1. Dockerfile - 多阶段构建,优化镜像大小 2. docker-compose.yml - 完整服务栈配置 3. docker-entrypoint.sh - 启动脚本 4. docker-deploy.sh - 自动化部署脚本 5. .env.docker - Docker环境变量模板 6. DOCKER_DEPLOYMENT.md - 完整部署文档 7. .dockerignore - Docker忽略文件 特性: - 支持多阶段构建,镜像体积小 - 包含健康检查和监控 - 支持完整服务栈(数据库、Redis、Nginx、监控) - 自动化部署脚本 - 生产环境就绪配置 - 详细部署文档 --- .dockerignore | 39 +++++ .env.docker | 34 ++++ DOCKER_DEPLOYMENT.md | 376 +++++++++++++++++++++++++++++++++++++++++++ Dockerfile | 20 +-- docker-compose.yml | 41 ++++- docker-deploy.sh | 274 +++++++++++++++++++++++++++++++ docker-entrypoint.sh | 60 +++++++ 7 files changed, 826 insertions(+), 18 deletions(-) create mode 100644 .dockerignore create mode 100644 .env.docker create mode 100644 DOCKER_DEPLOYMENT.md create mode 100755 docker-deploy.sh create mode 100755 docker-entrypoint.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..9be5ed4 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,39 @@ +# 忽略文件 +.git +.gitignore +.DS_Store +.idea +.vscode +*.iml + +# 忽略日志和临时文件 +logs/ +target/ +*.log +*.tmp +*.temp + +# 忽略测试文件 +**/test/ +**/*Test.java +**/*Tests.java + +# 忽略文档和配置文件(根据需要调整) +*.md +!README.md +!DOCKER_DEPLOYMENT.md +.env +!*.example + +# 忽略Maven包装器(如果需要可以包含) +.mvn/wrapper/maven-wrapper.jar + +# 忽略Node.js文件(如果项目有前端) +node_modules/ +npm-debug.log +yarn-error.log + +# 忽略IDE配置文件 +.project +.classpath +.settings/ \ No newline at end of file diff --git a/.env.docker b/.env.docker new file mode 100644 index 0000000..a5f3663 --- /dev/null +++ b/.env.docker @@ -0,0 +1,34 @@ +# Docker部署环境变量配置 +# 复制此文件为.env并在部署前修改 + +# ========== 应用配置 ========== +# 主机端口映射 +HOST_PORT=8080 + +# AI服务配置 +AI_API_KEY=your_deepseek_api_key_here +AI_MODEL=deepseek-chat +AI_BASE_URL=https://api.deepseek.com +AI_TIMEOUT=30000 +AI_MAX_TOKENS=1000 +AI_ENABLED=true + +# ========== 数据库配置(可选) ========== +DB_PASSWORD=ai_password +DB_PORT=5432 + +# ========== Redis配置(可选) ========== +REDIS_PORT=6379 + +# ========== 监控配置(可选) ========== +GRAFANA_PASSWORD=admin + +# ========== 高级配置 ========== +# JVM参数 +JAVA_OPTS=-Xmx512m -Xms256m -XX:+UseG1GC + +# 时区 +TZ=Asia/Shanghai + +# 日志级别 +LOGGING_LEVEL_ROOT=INFO \ No newline at end of file diff --git a/DOCKER_DEPLOYMENT.md b/DOCKER_DEPLOYMENT.md new file mode 100644 index 0000000..7cf3a17 --- /dev/null +++ b/DOCKER_DEPLOYMENT.md @@ -0,0 +1,376 @@ +# 🐳 Java AI Starter - Docker部署指南 + +## 📋 概述 + +本文档提供Java AI Starter项目的完整Docker部署指南。使用Docker可以快速、一致地在任何环境中部署应用。 + +## 🚀 快速开始 + +### 1. 环境要求 +- Docker 20.10+ +- Docker Compose 2.0+ +- 至少2GB可用内存 +- DeepSeek API Key + +### 2. 一键部署 +```bash +# 克隆项目 +git clone https://github.com/IntelliDev-AI/java-ai-starter.git +cd java-ai-starter + +# 运行部署脚本 +./docker-deploy.sh +``` + +### 3. 手动部署 +```bash +# 复制环境配置 +cp .env.docker .env +# 编辑.env文件,配置你的API Key + +# 构建并启动 +docker-compose up -d + +# 查看状态 +docker-compose ps +``` + +## 🔧 详细部署步骤 + +### 步骤1:配置环境变量 +```bash +# 从模板创建.env文件 +cp .env.docker .env + +# 编辑.env文件,至少配置以下项: +nano .env + +# 必须配置: +AI_API_KEY=你的DeepSeek_API_Key + +# 可选配置: +HOST_PORT=8080 # 主机端口 +AI_MODEL=deepseek-chat # AI模型 +AI_BASE_URL=https://api.deepseek.com # API地址 +``` + +### 步骤2:构建Docker镜像 +```bash +# 使用部署脚本 +./docker-deploy.sh build + +# 或手动构建 +docker-compose build +``` + +### 步骤3:启动服务 +```bash +# 启动主应用(推荐) +./docker-deploy.sh start + +# 或启动完整服务栈 +docker-compose up -d java-ai-app postgres redis +``` + +### 步骤4:验证部署 +```bash +# 检查容器状态 +docker-compose ps + +# 测试健康检查 +curl http://localhost:8080/api/health + +# 测试AI功能 +curl -X POST http://localhost:8080/api/chat \ + -H "Content-Type: application/json" \ + -d '{"message": "你好,Docker部署成功了吗?"}' +``` + +## 🐳 Docker配置详解 + +### 1. Dockerfile结构 +``` +Dockerfile +├── 多阶段构建 +│ ├── 阶段1: maven构建 (JDK 17) +│ └── 阶段2: 运行环境 (JRE 17) +├── 非root用户运行 +├── 健康检查配置 +├── 时区设置 (Asia/Shanghai) +└── 资源限制优化 +``` + +### 2. docker-compose.yml服务 +```yaml +services: + java-ai-app: # 主应用服务 + build: . # 从当前目录构建 + ports: # 端口映射 + - "8080:8080" + environment: # 环境变量 + - AI_API_KEY + volumes: # 数据卷 + - ./logs:/app/logs + healthcheck: # 健康检查 + test: ["CMD", "curl", "-f", "http://localhost:8080/api/health"] + + postgres: # PostgreSQL数据库 (可选) + image: postgres:15-alpine + + redis: # Redis缓存 (可选) + image: redis:7-alpine + + nginx: # Nginx反向代理 (可选) + image: nginx:alpine + + prometheus: # 监控系统 (可选) + image: prom/prometheus + + grafana: # 监控面板 (可选) + image: grafana/grafana +``` + +### 3. 环境变量配置 +| 变量名 | 默认值 | 说明 | +|--------|--------|------| +| `AI_API_KEY` | (必填) | DeepSeek API Key | +| `AI_MODEL` | `deepseek-chat` | AI模型名称 | +| `AI_BASE_URL` | `https://api.deepseek.com` | API地址 | +| `AI_TIMEOUT` | `30000` | 请求超时(毫秒) | +| `AI_MAX_TOKENS` | `1000` | 最大token数 | +| `HOST_PORT` | `8080` | 主机映射端口 | +| `DB_PASSWORD` | `ai_password` | 数据库密码 | +| `GRAFANA_PASSWORD` | `admin` | Grafana管理员密码 | + +## 📊 部署模式 + +### 1. 开发模式 +```bash +# 使用热部署,便于开发调试 +docker-compose -f docker-compose.yml -f docker-compose.dev.yml up +``` + +### 2. 生产模式 +```bash +# 使用生产配置,包含监控和备份 +docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d +``` + +### 3. 单容器模式 +```bash +# 仅运行主应用 +docker run -p 8080:8080 \ + -e AI_API_KEY=你的key \ + -v ./logs:/app/logs \ + intellidev/java-ai-starter:latest +``` + +## 🔧 运维管理 + +### 1. 常用命令 +```bash +# 查看容器状态 +docker-compose ps + +# 查看应用日志 +docker-compose logs -f java-ai-app + +# 进入容器 +docker-compose exec java-ai-app sh + +# 重启服务 +docker-compose restart java-ai-app + +# 停止服务 +docker-compose down + +# 清理所有资源 +docker-compose down -v --rmi all +``` + +### 2. 数据管理 +```bash +# 备份数据库 +docker-compose exec postgres pg_dump -U ai_user ai_starter > backup.sql + +# 恢复数据库 +cat backup.sql | docker-compose exec -T postgres psql -U ai_user ai_starter + +# 查看日志文件 +tail -f logs/application.log + +# 清理日志 +docker-compose exec java-ai-app find /app/logs -name "*.log" -mtime +7 -delete +``` + +### 3. 监控和告警 +```bash +# 访问监控面板 +# Prometheus: http://localhost:9090 +# Grafana: http://localhost:3000 (admin/admin) + +# 查看应用指标 +curl http://localhost:8080/actuator/metrics + +# 健康检查详情 +curl http://localhost:8080/actuator/health +``` + +## 🐛 故障排除 + +### 常见问题1:端口冲突 +```bash +# 检查端口占用 +sudo lsof -i :8080 + +# 修改端口 +# 在.env文件中修改 HOST_PORT=8081 +``` + +### 常见问题2:API Key错误 +```bash +# 检查环境变量 +docker-compose exec java-ai-app env | grep AI_API_KEY + +# 测试API连接 +docker-compose exec java-ai-app curl -X POST https://api.deepseek.com/v1/chat/completions \ + -H "Authorization: Bearer $AI_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{"model":"deepseek-chat","messages":[{"role":"user","content":"test"}]}' +``` + +### 常见问题3:内存不足 +```bash +# 查看容器资源使用 +docker stats + +# 调整内存限制 +# 在docker-compose.yml中增加: +# java-ai-app: +# deploy: +# resources: +# limits: +# memory: 1G +``` + +### 常见问题4:构建失败 +```bash +# 清理构建缓存 +docker system prune -a + +# 重新构建 +docker-compose build --no-cache + +# 查看详细错误 +docker-compose build --progress=plain +``` + +## 🔒 安全建议 + +### 1. 生产环境安全 +```bash +# 使用密钥管理服务 +# 而不是在.env文件中明文存储API Key + +# 配置网络隔离 +docker network create --internal ai-internal-network + +# 启用TLS/SSL +# 配置Nginx SSL证书 +``` + +### 2. 访问控制 +```bash +# 配置防火墙 +sudo ufw allow 8080/tcp + +# 使用反向代理认证 +# 配置Nginx Basic Auth + +# 限制API访问频率 +# 在应用层或Nginx层配置限流 +``` + +### 3. 定期维护 +```bash +# 更新镜像 +docker-compose pull +docker-compose up -d + +# 安全扫描 +docker scan intellidev/java-ai-starter + +# 备份数据 +# 设置定期备份任务 +``` + +## 📈 性能优化 + +### 1. 资源优化 +```yaml +# 在docker-compose.yml中配置资源限制 +java-ai-app: + deploy: + resources: + limits: + cpus: '1.0' + memory: 1G + reservations: + cpus: '0.5' + memory: 512M +``` + +### 2. 网络优化 +```yaml +# 配置自定义网络 +networks: + ai-network: + driver: bridge + ipam: + config: + - subnet: 172.20.0.0/16 +``` + +### 3. 存储优化 +```yaml +# 使用本地卷提高IO性能 +volumes: + postgres_data: + driver: local + driver_opts: + type: none + device: /data/postgres + o: bind +``` + +## 🔗 相关资源 + +- [Docker官方文档](https://docs.docker.com/) +- [Docker Compose文档](https://docs.docker.com/compose/) +- [DeepSeek API文档](https://platform.deepseek.com/api-docs) +- [Spring Boot Docker指南](https://spring.io/guides/gs/spring-boot-docker/) +- [项目GitHub仓库](https://github.com/IntelliDev-AI/java-ai-starter) + +## 💡 最佳实践 + +### 开发阶段 +- 使用`.env.docker`作为模板,不提交`.env`文件 +- 在Dockerfile中使用多阶段构建减少镜像大小 +- 配置合适的`.dockerignore`文件 + +### 测试阶段 +- 使用Docker Compose测试完整服务栈 +- 配置CI/CD流水线自动构建和测试 +- 进行安全扫描和漏洞检查 + +### 生产阶段 +- 使用私有镜像仓库 +- 配置监控和告警 +- 定期更新基础镜像和安全补丁 +- 实施备份和灾难恢复计划 + +--- + +**🎉 部署成功!** 现在你可以通过 http://localhost:8080 访问Java AI Starter应用了。 + +如需进一步帮助,请参考项目文档或提交Issue。 \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 1d5af95..24e9561 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ # 多阶段构建,优化镜像大小 # 第一阶段:构建阶段 -FROM maven:3.8.4-openjdk-11-slim AS builder +FROM maven:3.8.4-openjdk-17-slim AS builder WORKDIR /app @@ -21,7 +21,7 @@ COPY src src RUN mvn clean package -DskipTests # 第二阶段:运行阶段 -FROM openjdk:11-jre-slim +FROM openjdk:17-jre-slim # 设置时区 ENV TZ=Asia/Shanghai @@ -33,11 +33,7 @@ RUN groupadd -r appuser && useradd -r -g appuser appuser WORKDIR /app # 从构建阶段复制jar文件 -COPY --from=builder /app/target/*.jar app.jar - -# 复制启动脚本 -COPY scripts/docker-entrypoint.sh /usr/local/bin/ -RUN chmod +x /usr/local/bin/docker-entrypoint.sh +COPY --from=builder /app/target/java-ai-starter-*.jar app.jar # 创建必要的目录 RUN mkdir -p /app/logs /app/config && \ @@ -48,17 +44,21 @@ USER appuser # 健康检查 HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ - CMD curl -f http://localhost:8080/actuator/health || exit 1 + CMD curl -f http://localhost:8080/api/health || exit 1 # 暴露端口 EXPOSE 8080 # 设置环境变量 -ENV JAVA_OPTS="-Xmx512m -Xms256m" +ENV JAVA_OPTS="-Xmx512m -Xms256m -XX:+UseG1GC -XX:MaxGCPauseMillis=200" ENV SPRING_PROFILES_ACTIVE="docker" +# 入口点脚本 +COPY docker-entrypoint.sh /usr/local/bin/ +RUN chmod +x /usr/local/bin/docker-entrypoint.sh + # 入口点 ENTRYPOINT ["docker-entrypoint.sh"] # 默认命令 -CMD ["java", "-jar", "app.jar"] +CMD ["java", "-jar", "app.jar"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 1fee986..a29c510 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,21 +5,26 @@ services: build: . container_name: java-ai-starter ports: - - "8080:8080" + - "${HOST_PORT:-8080}:8080" environment: - SPRING_PROFILES_ACTIVE=docker - - OPENAI_API_KEY=${OPENAI_API_KEY:-sk-demo-key} - - OPENAI_MODEL=${OPENAI_MODEL:-gpt-3.5-turbo} + - AI_API_KEY=${AI_API_KEY:-} + - AI_MODEL=${AI_MODEL:-deepseek-chat} + - AI_BASE_URL=${AI_BASE_URL:-https://api.deepseek.com} + - AI_TIMEOUT=${AI_TIMEOUT:-30000} + - AI_MAX_TOKENS=${AI_MAX_TOKENS:-1000} + - AI_ENABLED=${AI_ENABLED:-true} - SERVER_PORT=8080 - LOGGING_LEVEL_ROOT=INFO volumes: - ./logs:/app/logs - ./config:/app/config + - ./data:/app/data networks: - ai-network restart: unless-stopped healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"] + test: ["CMD", "curl", "-f", "http://localhost:8080/api/health"] interval: 30s timeout: 10s retries: 3 @@ -27,16 +32,18 @@ services: labels: - "com.intellidev.description=Java AI Starter Application" - "com.intellidev.version=1.0.0" + - "com.intellidev.maintainer=IntelliDev AI" + # PostgreSQL数据库(可选) postgres: - image: postgres:13-alpine + image: postgres:15-alpine container_name: java-ai-postgres environment: - POSTGRES_DB=ai_starter - POSTGRES_USER=ai_user - POSTGRES_PASSWORD=${DB_PASSWORD:-ai_password} ports: - - "5432:5432" + - "${DB_PORT:-5432}:5432" volumes: - postgres_data:/var/lib/postgresql/data - ./init-db.sql:/docker-entrypoint-initdb.d/init.sql @@ -49,11 +56,12 @@ services: timeout: 10s retries: 5 + # Redis缓存(可选) redis: image: redis:7-alpine container_name: java-ai-redis ports: - - "6379:6379" + - "${REDIS_PORT:-6379}:6379" command: redis-server --appendonly yes volumes: - redis_data:/data @@ -66,6 +74,23 @@ services: timeout: 10s retries: 5 + # Nginx反向代理(可选) + nginx: + image: nginx:alpine + container_name: java-ai-nginx + ports: + - "80:80" + - "443:443" + volumes: + - ./nginx.conf:/etc/nginx/nginx.conf + - ./ssl:/etc/nginx/ssl + depends_on: + - java-ai-app + networks: + - ai-network + restart: unless-stopped + + # 监控面板(可选) prometheus: image: prom/prometheus:latest container_name: java-ai-prometheus @@ -119,4 +144,4 @@ volumes: name: java-ai-prometheus-data grafana_data: driver: local - name: java-ai-grafana-data + name: java-ai-grafana-data \ No newline at end of file diff --git a/docker-deploy.sh b/docker-deploy.sh new file mode 100755 index 0000000..f2b8a5a --- /dev/null +++ b/docker-deploy.sh @@ -0,0 +1,274 @@ +#!/bin/bash +# Java AI Starter Docker部署脚本 + +set -e + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +echo -e "${BLUE}🚀 Java AI Starter Docker部署工具${NC}" +echo "======================================" + +# 检查Docker是否安装 +check_docker() { + if ! command -v docker &> /dev/null; then + echo -e "${RED}❌ Docker未安装${NC}" + echo "请先安装Docker:" + echo " Ubuntu: sudo apt-get install docker.io" + echo " CentOS: sudo yum install docker" + echo " macOS: https://docs.docker.com/desktop/install/mac-install/" + exit 1 + fi + + if ! command -v docker-compose &> /dev/null; then + echo -e "${YELLOW}⚠️ Docker Compose未安装${NC}" + echo "尝试使用docker compose插件..." + if ! docker compose version &> /dev/null; then + echo -e "${RED}❌ Docker Compose未找到${NC}" + echo "请安装Docker Compose:" + echo " https://docs.docker.com/compose/install/" + exit 1 + fi + DOCKER_COMPOSE="docker compose" + else + DOCKER_COMPOSE="docker-compose" + fi + + echo -e "${GREEN}✅ Docker环境检查通过${NC}" +} + +# 检查环境配置 +check_env() { + if [ ! -f ".env" ]; then + echo -e "${YELLOW}⚠️ 未找到.env文件${NC}" + echo "正在从模板创建.env文件..." + if [ -f ".env.docker" ]; then + cp .env.docker .env + echo -e "${YELLOW}📝 请编辑.env文件,配置你的API Key和其他参数${NC}" + echo "重要:修改 AI_API_KEY=你的DeepSeek_API_Key" + exit 1 + else + echo -e "${RED}❌ 未找到环境模板文件${NC}" + exit 1 + fi + fi + + # 检查API Key是否配置 + if grep -q "AI_API_KEY=your_deepseek_api_key_here" .env || \ + grep -q "AI_API_KEY=$" .env || \ + ! grep -q "AI_API_KEY=" .env; then + echo -e "${YELLOW}⚠️ AI_API_KEY未配置或为默认值${NC}" + echo "应用将以演示模式运行" + read -p "是否继续?(y/n): " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo "请编辑.env文件配置AI_API_KEY后重新运行" + exit 1 + fi + fi + + echo -e "${GREEN}✅ 环境配置检查通过${NC}" +} + +# 构建Docker镜像 +build_image() { + echo -e "${BLUE}🔨 构建Docker镜像...${NC}" + $DOCKER_COMPOSE build --no-cache + + if [ $? -eq 0 ]; then + echo -e "${GREEN}✅ Docker镜像构建成功${NC}" + else + echo -e "${RED}❌ Docker镜像构建失败${NC}" + exit 1 + fi +} + +# 启动服务 +start_services() { + echo -e "${BLUE}🚀 启动服务...${NC}" + + local services="java-ai-app" + + read -p "是否启动完整服务栈(包含数据库、Redis、监控)?(y/n): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + services="java-ai-app postgres redis" + echo -e "${YELLOW}📊 将启动完整服务栈${NC}" + else + echo -e "${YELLOW}📊 仅启动主应用${NC}" + fi + + $DOCKER_COMPOSE up -d $services + + if [ $? -eq 0 ]; then + echo -e "${GREEN}✅ 服务启动成功${NC}" + else + echo -e "${RED}❌ 服务启动失败${NC}" + exit 1 + fi +} + +# 检查服务状态 +check_status() { + echo -e "${BLUE}📊 检查服务状态...${NC}" + + sleep 5 + + echo "容器状态:" + $DOCKER_COMPOSE ps + + echo "" + echo -e "${YELLOW}⏳ 等待应用启动...${NC}" + + # 等待应用健康检查 + for i in {1..30}; do + if curl -s http://localhost:8080/api/health > /dev/null 2>&1; then + echo -e "${GREEN}✅ 应用启动成功!${NC}" + break + fi + echo -n "." + sleep 2 + done + + echo "" + echo -e "${BLUE}🔗 服务访问信息:${NC}" + echo "主应用:http://localhost:8080" + echo "健康检查:http://localhost:8080/api/health" + echo "测试接口:http://localhost:8080/api/test" + + if $DOCKER_COMPOSE ps | grep -q "postgres"; then + echo "数据库:localhost:5432 (用户: ai_user, 数据库: ai_starter)" + fi + + if $DOCKER_COMPOSE ps | grep -q "redis"; then + echo "Redis:localhost:6379" + fi +} + +# 停止服务 +stop_services() { + echo -e "${YELLOW}🛑 停止服务...${NC}" + $DOCKER_COMPOSE down + echo -e "${GREEN}✅ 服务已停止${NC}" +} + +# 查看日志 +view_logs() { + echo -e "${BLUE}📋 查看应用日志:${NC}" + $DOCKER_COMPOSE logs -f java-ai-app +} + +# 清理资源 +cleanup() { + echo -e "${YELLOW}🧹 清理Docker资源...${NC}" + + read -p "是否删除所有容器和镜像?(y/n): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + $DOCKER_COMPOSE down -v --rmi all + echo -e "${GREEN}✅ 所有Docker资源已清理${NC}" + else + $DOCKER_COMPOSE down + echo -e "${GREEN}✅ 容器已停止${NC}" + fi +} + +# 显示菜单 +show_menu() { + echo "" + echo -e "${BLUE}请选择操作:${NC}" + echo "1) 完整部署(检查环境 + 构建 + 启动)" + echo "2) 仅构建Docker镜像" + echo "3) 启动服务" + echo "4) 停止服务" + echo "5) 查看日志" + echo "6) 检查服务状态" + echo "7) 清理Docker资源" + echo "8) 退出" + echo "" +} + +# 主函数 +main() { + check_docker + + case $1 in + "build") + check_env + build_image + ;; + "start") + check_env + start_services + check_status + ;; + "stop") + stop_services + ;; + "logs") + view_logs + ;; + "status") + check_status + ;; + "clean") + cleanup + ;; + "full") + check_env + build_image + start_services + check_status + ;; + *) + while true; do + show_menu + read -p "请输入选项 [1-8]: " choice + + case $choice in + 1) + check_env + build_image + start_services + check_status + ;; + 2) + check_env + build_image + ;; + 3) + check_env + start_services + check_status + ;; + 4) + stop_services + ;; + 5) + view_logs + ;; + 6) + check_status + ;; + 7) + cleanup + ;; + 8) + echo "退出部署工具" + exit 0 + ;; + *) + echo "无效选项" + ;; + esac + done + ;; + esac +} + +# 运行主函数 +main "$@" \ No newline at end of file diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100755 index 0000000..31e95fb --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,60 @@ +#!/bin/bash +set -e + +echo "🚀 启动 Java AI Starter 应用 (Docker)" + +# 检查必要的环境变量 +if [ -z "$AI_API_KEY" ] || [ "$AI_API_KEY" = "your_ai_api_key_here" ]; then + echo "⚠️ 警告: AI_API_KEY 未设置或为默认值" + echo " 请设置有效的 AI API Key" + echo " 当前运行在演示模式" + export AI_ENABLED=false +else + echo "✅ AI_API_KEY 已配置" + export AI_ENABLED=true +fi + +# 设置JVM参数 +if [ -z "$JAVA_OPTS" ]; then + export JAVA_OPTS="-Xmx512m -Xms256m -XX:+UseG1GC -XX:MaxGCPauseMillis=200" +fi + +# 添加Spring Boot Actuator配置 +export JAVA_OPTS="$JAVA_OPTS -Dmanagement.endpoints.web.exposure.include=health,info,metrics" +export JAVA_OPTS="$JAVA_OPTS -Dmanagement.endpoint.health.show-details=always" + +# 日志配置 +export JAVA_OPTS="$JAVA_OPTS -Dlogging.file.name=/app/logs/application.log" +export JAVA_OPTS="$JAVA_OPTS -Dlogging.file.max-size=10MB" +export JAVA_OPTS="$JAVA_OPTS -Dlogging.file.max-history=10" +export JAVA_OPTS="$JAVA_OPTS -Dlogging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%n" + +# 应用配置 +export JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=${SPRING_PROFILES_ACTIVE:-docker}" +export JAVA_OPTS="$JAVA_OPTS -Dai.enabled=${AI_ENABLED:-true}" +export JAVA_OPTS="$JAVA_OPTS -Dai.api-key=${AI_API_KEY:-}" +export JAVA_OPTS="$JAVA_OPTS -Dai.model=${AI_MODEL:-deepseek-chat}" +export JAVA_OPTS="$JAVA_OPTS -Dai.base-url=${AI_BASE_URL:-https://api.deepseek.com}" +export JAVA_OPTS="$JAVA_OPTS -Dai.timeout=${AI_TIMEOUT:-30000}" +export JAVA_OPTS="$JAVA_OPTS -Dai.max-tokens=${AI_MAX_TOKENS:-1000}" +export JAVA_OPTS="$JAVA_OPTS -Dserver.port=${SERVER_PORT:-8080}" + +echo "📊 环境配置:" +echo " - Spring Profile: ${SPRING_PROFILES_ACTIVE:-docker}" +echo " - AI Enabled: ${AI_ENABLED:-true}" +echo " - AI Model: ${AI_MODEL:-deepseek-chat}" +echo " - Server Port: ${SERVER_PORT:-8080}" +echo " - JVM Options: $JAVA_OPTS" + +# 等待数据库就绪(如果配置了数据库) +if [ -n "$DB_HOST" ] && [ -n "$DB_PORT" ]; then + echo "⏳ 等待数据库服务就绪..." + while ! nc -z $DB_HOST $DB_PORT; do + sleep 1 + done + echo "✅ 数据库连接就绪" +fi + +# 启动应用 +echo "🎯 启动应用程序..." +exec java $JAVA_OPTS -jar app.jar "$@" \ No newline at end of file