From bc96a584fe23231dcc47770be6ef96e35b719295 Mon Sep 17 00:00:00 2001 From: dazhuang Date: Fri, 27 Mar 2026 06:04:58 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20Docker=E5=8C=96=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E5=AE=8C=E6=88=90=20-=20=E5=89=8D=E7=AB=AF=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=90=8E=E5=8F=B0=E5=92=8CAI=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 hzhub-admin Dockerfile (Nginx) - 添加 hzhub-admin nginx.conf (API代理、SSE支持、Gzip) - 添加 hzhub-ai Dockerfile (Spring Boot) - 添加 hzhub-gateway Dockerfile - 更新 docker-compose.yml 添加前端和AI服务 - 更新 README.md 完善部署文档 - 配置 application-dev.yml 数据库连接 所有服务现在可通过 docker-compose up -d 一键启动: - hzhub-admin:5666 (管理后台) - hzhub-ai:6039 (AI服务) - mysql:3306, redis:6379, weaviate:28080, n8n:5678 --- README.md | 98 ++++++++++++++----- hzhub-admin/Dockerfile | 14 +++ hzhub-admin/nginx.conf | 54 ++++++++++ hzhub-ai/Dockerfile | 28 ++++++ .../src/main/resources/application-dev.yml | 4 +- hzhub-deploy/docker-compose.yml | 93 +++++++++++------- hzhub-gateway/Dockerfile | 9 ++ hzhub-gateway/pom.xml | 38 ------- lefthook.yml | 42 ++++++++ 9 files changed, 280 insertions(+), 100 deletions(-) create mode 100644 hzhub-admin/Dockerfile create mode 100644 hzhub-admin/nginx.conf create mode 100644 hzhub-ai/Dockerfile create mode 100644 hzhub-gateway/Dockerfile create mode 100644 lefthook.yml diff --git a/README.md b/README.md index 1240908..e92be55 100644 --- a/README.md +++ b/README.md @@ -85,63 +85,107 @@ hzhub/ | 管理后台UI | Ant Design Vue (Vben Admin) | | 门户UI | Element Plus X | | 网关 | Spring Cloud Gateway | -| AI服务 | Spring Boot 3.x + Spring AI + LangChain4j | +| AI服务 | Spring Boot 3.5.8 + LangChain4j 1.11.0 | | ERP服务 | Spring Boot 3.x + JDBC | -| 向量数据库 | Milvus | -| 关系数据库 | MySQL 8.0 + SQL Server 2008 R2 | +| 向量数据库 | Weaviate 1.25.0 | +| 关系数据库 | MySQL 8.0 | +| 缓存 | Redis 7 | | 工作流 | n8n | +| 对象存储 | MinIO | | 部署 | Docker Compose | +## 项目状态 + +- ✅ 基础设施 Docker 化 (MySQL, Redis, Weaviate, n8n, MinIO) +- ✅ AI服务 Docker 化 (hzhub-ai) +- ✅ 前端管理后台 Docker 化 (hzhub-admin) +- ⏳ ERP服务 (开发中) +- ⏳ API网关 (开发中) +- ⏳ 公司门户 (待配置) +- ⏳ 经销商门户 (待配置) + ## 快速开始 ### 环境准备 -- JDK 17+ -- Node.js 20+ -- pnpm 9+ -- Maven 3.8+ - Docker & Docker Compose +- JDK 17+ (本地开发) +- Node.js 22+ (本地开发) +- pnpm 10+ (本地开发) +- Maven 3.9+ (本地开发) -### 启动基础设施 +### 一键启动(Docker Compose) ```bash cd hzhub-deploy docker-compose up -d ``` -### 启动后端服务 +启动完成后访问: +- 🌐 管理后台: http://localhost:5666 +- 🔧 AI服务API: http://localhost:6039 +- 🔄 n8n工作流: http://localhost:5678 + +### 服务清单 + +| 服务名 | 容器名 | 端口 | 说明 | +|--------|--------|------|------| +| hzhub-admin | hzhub-deploy-hzhub-admin | 5666 | 管理后台前端(Nginx) | +| hzhub-ai | hzhub-deploy-hzhub-ai | 6039 | AI后端服务(Spring Boot) | +| mysql | hzhub-mysql | 3306 | MySQL 8.0数据库 | +| redis | hzhub-redis | 6379 | Redis 7缓存 | +| weaviate | hzhub-weaviate | 28080 | Weaviate向量数据库 | +| n8n | hzhub-n8n | 5678 | n8n工作流引擎 | +| minio | hzhub-deploy-minio-1 | 9000 | MinIO对象存储 | +| etcd | hzhub-deploy-etcd-1 | 2379 | etcd服务发现 | + +### 本地开发启动 + +#### 后端服务 ```bash # AI服务 cd hzhub-ai/ruoyi-admin -mvn spring-boot:run - -# ERP服务 -cd hzhub-erp -mvn spring-boot:run - -# 网关服务 -cd hzhub-gateway -mvn spring-boot:run +mvn spring-boot:run -Dspring-boot.run.profiles=dev ``` -### 启动前端 +#### 前端开发 ```bash # 管理后台 cd hzhub-admin pnpm install pnpm dev +``` -# 公司门户 -cd hzhub-portal-company -pnpm install -pnpm dev +#### 前端生产构建 -# 经销商门户 -cd hzhub-portal-dealer -pnpm install -pnpm dev +```bash +cd hzhub-admin +# 先构建依赖包 +pnpm build +# 再构建前端 +pnpm --filter=@vben/web-antd build:prod +``` + +### 常用命令 + +```bash +# 查看所有服务状态 +docker-compose ps + +# 查看服务日志 +docker-compose logs -f hzhub-ai +docker-compose logs -f hzhub-admin + +# 重启服务 +docker-compose restart hzhub-ai + +# 停止所有服务 +docker-compose down + +# 停止并删除数据卷(谨慎使用) +docker-compose down -v ``` ## 文档 diff --git a/hzhub-admin/Dockerfile b/hzhub-admin/Dockerfile new file mode 100644 index 0000000..c75bea4 --- /dev/null +++ b/hzhub-admin/Dockerfile @@ -0,0 +1,14 @@ +# 使用 Nginx 托管已构建的前端 +FROM nginx:alpine + +# 复制构建产物到 Nginx 目录 +COPY apps/web-antd/dist /usr/share/nginx/html + +# 复制 Nginx 配置 +COPY nginx.conf /etc/nginx/conf.d/default.conf + +# 暴露端口 +EXPOSE 5666 + +# 启动 Nginx +CMD ["nginx", "-g", "daemon off;"] diff --git a/hzhub-admin/nginx.conf b/hzhub-admin/nginx.conf new file mode 100644 index 0000000..341608c --- /dev/null +++ b/hzhub-admin/nginx.conf @@ -0,0 +1,54 @@ +server { + listen 5666; + server_name localhost; + root /usr/share/nginx/html; + index index.html; + + # Gzip 压缩 + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; + + # 静态资源缓存 + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + } + + # API 代理到后端服务 + location /api/ { + proxy_pass http://hzhub-ai:6039/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_cache_bypass $http_upgrade; + proxy_read_timeout 86400; + } + + # SSE 支持 + location /api/sse/ { + proxy_pass http://hzhub-ai:6039/sse/; + proxy_http_version 1.1; + proxy_set_header Connection ''; + proxy_buffering off; + proxy_cache off; + proxy_read_timeout 86400; + } + + # 前端路由支持 - 所有路径指向 index.html + location / { + try_files $uri $uri/ /index.html; + } + + # 健康检查 + location /health { + access_log off; + return 200 "healthy\n"; + add_header Content-Type text/plain; + } +} diff --git a/hzhub-ai/Dockerfile b/hzhub-ai/Dockerfile new file mode 100644 index 0000000..be1363c --- /dev/null +++ b/hzhub-ai/Dockerfile @@ -0,0 +1,28 @@ +# 构建阶段 +FROM maven:3.9-eclipse-temurin-17-alpine AS builder + +WORKDIR /app + +# 复制pom文件和源码 +COPY pom.xml . +COPY ruoyi-admin ./ruoyi-admin +COPY ruoyi-common ./ruoyi-common +COPY ruoyi-extend ./ruoyi-extend +COPY ruoyi-modules ./ruoyi-modules + +# 构建项目(跳过测试) +RUN mvn clean package -DskipTests -pl ruoyi-admin -am + +# 运行阶段 +FROM eclipse-temurin:17-jre-alpine + +WORKDIR /app + +# 复制构建产物 +COPY --from=builder /app/ruoyi-admin/target/ruoyi-admin.jar app.jar + +# 暴露端口 +EXPOSE 6039 + +# 启动命令 +ENTRYPOINT ["java", "-jar", "app.jar"] diff --git a/hzhub-ai/ruoyi-admin/src/main/resources/application-dev.yml b/hzhub-ai/ruoyi-admin/src/main/resources/application-dev.yml index 5168f7a..df7e179 100644 --- a/hzhub-ai/ruoyi-admin/src/main/resources/application-dev.yml +++ b/hzhub-ai/ruoyi-admin/src/main/resources/application-dev.yml @@ -58,9 +58,9 @@ spring: driverClassName: com.mysql.cj.jdbc.Driver # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) - url: jdbc:mysql://127.0.0.1:3306/ruoyi-ai?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + url: jdbc:mysql://127.0.0.1:3306/ruoyi_ai?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true username: root - password: root + password: hzhub123 # agent: # url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # # url: jdbc:mysql://localhost:3306/agent_db diff --git a/hzhub-deploy/docker-compose.yml b/hzhub-deploy/docker-compose.yml index ec2c13c..a3ea309 100644 --- a/hzhub-deploy/docker-compose.yml +++ b/hzhub-deploy/docker-compose.yml @@ -14,6 +14,11 @@ services: - mysql_data:/var/lib/mysql networks: - hzhub-network + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD:-hzhub123}"] + interval: 10s + timeout: 5s + retries: 5 # Redis redis: @@ -25,42 +30,50 @@ services: - redis_data:/data networks: - hzhub-network + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 - # Milvus (向量数据库) - milvus-standalone: - image: milvusdb/milvus:v2.4.5 - container_name: hzhub-milvus - environment: - ETCD_ENDPOINTS: etcd:2379 - MINIO_ADDRESS: minio:9000 + # Weaviate (向量数据库) + weaviate: + image: semitechnologies/weaviate:1.25.0 + container_name: hzhub-weaviate ports: - - "19530:19530" - - "9091:9091" + - "28080:8080" + environment: + QUERY_DEFAULTS_LIMIT: 25 + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' + PERSISTENCE_DATA_PATH: '/var/lib/weaviate' + DEFAULT_VECTORIZER_MODULE: 'none' + ENABLE_MODULES: '' + CLUSTER_HOSTNAME: 'node1' + volumes: + - weaviate_data:/var/lib/weaviate networks: - hzhub-network + + # hzhub-ai (AI服务) + hzhub-ai: + build: + context: ../hzhub-ai + dockerfile: Dockerfile + container_name: hzhub-ai + ports: + - "6039:6039" + environment: + SPRING_PROFILES_ACTIVE: dev + SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_URL: jdbc:mysql://hzhub-mysql:3306/ruoyi_ai?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_USERNAME: root + SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD: hzhub123 + SPRING_DATA_REDIS_HOST: hzhub-redis + SPRING_DATA_REDIS_PORT: 6379 depends_on: - - etcd - - minio - - etcd: - image: quay.io/coreos/etcd:v3.5.5 - environment: - - ETCD_AUTO_COMPACTION_MODE=revision - - ETCD_AUTO_COMPACTION_RETENTION=1000 - - ETCD_QUOTA_BACKEND_BYTES=4294967296 - volumes: - - etcd_data:/etcd - networks: - - hzhub-network - - minio: - image: minio/minio:latest - environment: - MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:-minioadmin} - MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:-minioadmin} - volumes: - - minio_data:/minio_data - command: minio server /minio_data + mysql: + condition: service_healthy + redis: + condition: service_healthy networks: - hzhub-network @@ -79,11 +92,25 @@ services: networks: - hzhub-network + # hzhub-admin (前端管理后台) + hzhub-admin: + build: + context: ../hzhub-admin + dockerfile: Dockerfile + container_name: hzhub-admin + ports: + - "5666:5666" + environment: + - NGINX_PORT=5666 + depends_on: + - hzhub-ai + networks: + - hzhub-network + volumes: mysql_data: redis_data: - etcd_data: - minio_data: + weaviate_data: n8n_data: networks: diff --git a/hzhub-gateway/Dockerfile b/hzhub-gateway/Dockerfile new file mode 100644 index 0000000..33a9385 --- /dev/null +++ b/hzhub-gateway/Dockerfile @@ -0,0 +1,9 @@ +FROM eclipse-temurin:17-jre-alpine + +WORKDIR /app + +COPY target/hzhub-gateway.jar app.jar + +EXPOSE 8080 + +ENTRYPOINT ["java", "-jar", "app.jar"] diff --git a/hzhub-gateway/pom.xml b/hzhub-gateway/pom.xml index 7501bc6..03e4366 100644 --- a/hzhub-gateway/pom.xml +++ b/hzhub-gateway/pom.xml @@ -22,55 +22,17 @@ 17 2024.0.0 - 1.44.0 - org.springframework.cloud spring-cloud-starter-gateway - - org.springframework.cloud spring-cloud-starter-loadbalancer - - - - cn.dev33 - sa-token-reactor-spring-boot3-starter - ${sa-token.version} - - - - - cn.dev33 - sa-token-redis-jackson - ${sa-token.version} - - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - - org.projectlombok - lombok - true - - - - - org.springframework.boot - spring-boot-starter-test - test - diff --git a/lefthook.yml b/lefthook.yml new file mode 100644 index 0000000..3ac5730 --- /dev/null +++ b/lefthook.yml @@ -0,0 +1,42 @@ +# EXAMPLE USAGE: +# +# Refer for explanation to following link: +# https://lefthook.dev/configuration/ +# +# pre-push: +# jobs: +# - name: packages audit +# tags: +# - frontend +# - security +# run: yarn audit +# +# - name: gems audit +# tags: +# - backend +# - security +# run: bundle audit +# +# pre-commit: +# parallel: true +# jobs: +# - run: yarn eslint {staged_files} +# glob: "*.{js,ts,jsx,tsx}" +# +# - name: rubocop +# glob: "*.rb" +# exclude: +# - config/application.rb +# - config/routes.rb +# run: bundle exec rubocop --force-exclusion {all_files} +# +# - name: govet +# files: git ls-files -m +# glob: "*.go" +# run: go vet {files} +# +# - script: "hello.js" +# runner: node +# +# - script: "hello.go" +# runner: go run