From 61f4e63ff1dca136e1c52f2fd79ada4ef44d6529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=AF=E8=88=AA=E8=80=81=E9=BD=90?= <280645618@qq.com> Date: Mon, 29 Dec 2025 08:12:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9EDockerfile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/erp-api/Dockerfile | 7 +++ api/gateway/Dockerfile | 2 +- api/oms-api/Dockerfile | 7 +++ api/sys-api/Dockerfile | 7 +++ docker-compose.yml | 136 +++++++++++++++++++++++++++++++++++++++++ docs/知识星球.jpg | Bin 78548 -> 0 bytes vue/Dockerfile | 18 ++++++ vue/nginx.conf | 91 +++++++++++++++++++++++++++ 8 files changed, 267 insertions(+), 1 deletion(-) create mode 100644 api/erp-api/Dockerfile create mode 100644 api/oms-api/Dockerfile create mode 100644 api/sys-api/Dockerfile create mode 100644 docker-compose.yml delete mode 100644 docs/知识星球.jpg create mode 100644 vue/Dockerfile create mode 100644 vue/nginx.conf diff --git a/api/erp-api/Dockerfile b/api/erp-api/Dockerfile new file mode 100644 index 00000000..e290e49c --- /dev/null +++ b/api/erp-api/Dockerfile @@ -0,0 +1,7 @@ +FROM openjdk:17-jdk-slim + +WORKDIR /app + +COPY ./target/erp-api-2.12.0.jar erp-api.jar + +CMD ["java", "-Duser.timezone=Asia/Shanghai", "-jar", "erp-api.jar"] \ No newline at end of file diff --git a/api/gateway/Dockerfile b/api/gateway/Dockerfile index 85ae2683..33cb50ce 100644 --- a/api/gateway/Dockerfile +++ b/api/gateway/Dockerfile @@ -2,6 +2,6 @@ FROM openjdk:17-jdk-slim WORKDIR /app -COPY ./target/gateway-1.0.0.jar gateway.jar +COPY ./target/gateway-2.12.0.jar gateway.jar CMD ["java", "-Duser.timezone=Asia/Shanghai", "-jar", "gateway.jar"] \ No newline at end of file diff --git a/api/oms-api/Dockerfile b/api/oms-api/Dockerfile new file mode 100644 index 00000000..fc4e0a87 --- /dev/null +++ b/api/oms-api/Dockerfile @@ -0,0 +1,7 @@ +FROM openjdk:17-jdk-slim + +WORKDIR /app + +COPY ./target/oms-api-2.12.0.jar sys-api.jar + +CMD ["java", "-Duser.timezone=Asia/Shanghai", "-jar", "oms-api.jar"] \ No newline at end of file diff --git a/api/sys-api/Dockerfile b/api/sys-api/Dockerfile new file mode 100644 index 00000000..0a0a42fa --- /dev/null +++ b/api/sys-api/Dockerfile @@ -0,0 +1,7 @@ +FROM openjdk:17-jdk-slim + +WORKDIR /app + +COPY ./target/sys-api-2.12.0.jar sys-api.jar + +CMD ["java", "-Duser.timezone=Asia/Shanghai", "-jar", "sys-api.jar"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..02007200 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,136 @@ +version: '3.8' + +services: + redis: + image: redis:7 + container_name: redis + ports: + - "6379:6379" # 映射6379端口 + command: ["redis-server"] # 允许所有IP访问 + volumes: + - redis_data:/data + restart: always + networks: + - my-network + + nacos: + image: nacos/nacos-server:v2.3.2 + container_name: nacos + environment: + MODE: standalone # 单机模式 + NACOS_AUTH_ENABLED: "false" # 禁用认证 + ports: + - "8848:8848" + - "9848:9848" + restart: always + volumes: + - nacos_data:/home/nacos/data + networks: + - my-network # 自定义网络 + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8848/nacos/v1/ns/operator/servers"] + interval: 10s + retries: 5 + start_period: 20s + timeout: 5s + + gateway: + image: crpi-km68smz26eegv27m.cn-shenzhen.personal.cr.aliyuncs.com/qihang-open/gateway + container_name: qihangerp-gateway + environment: + SPRING_CLOUD_NACOS_DISCOVERY_SERVER-ADDR: "nacos:8848" + SPRING_CLOUD_NACOS_DISCOVERY_USERNAME: "nacos" + SPRING_CLOUD_NACOS_DISCOVERY_PASSWORD: "nacos" + ports: + - "8088:8088" + depends_on: + - redis + - nacos + restart: always + networks: + - my-network + + sys-api: + image: crpi-km68smz26eegv27m.cn-shenzhen.personal.cr.aliyuncs.com/qihang-open/sys-api + container_name: qihangerp-sys-api + environment: + SPRING_CLOUD_NACOS_DISCOVERY_SERVER-ADDR: "nacos:8848" + SPRING_CLOUD_NACOS_DISCOVERY_USERNAME: "nacos" + SPRING_CLOUD_NACOS_DISCOVERY_PASSWORD: "nacos" + SPRING_CLOUD_NACOS_CONFIG_SERVER-ADDR: "nacos:8848" + SPRING_CLOUD_NACOS_CONFIG_USERNAME: "nacos" + SPRING_CLOUD_NACOS_CONFIG_PASSWORD: "nacos" + spring.data.redis.host: "redis" + spring.data.redis.port: 6379 + spring.data.redis.password: "" + spring.profiles.active: dev + depends_on: + - redis + - nacos + restart: always + networks: + - my-network + + oms-api: + image: crpi-km68smz26eegv27m.cn-shenzhen.personal.cr.aliyuncs.com/qihang-open/oms-api + container_name: qihangerp-oms-api + environment: + SPRING_CLOUD_NACOS_DISCOVERY_SERVER-ADDR: "nacos:8848" + SPRING_CLOUD_NACOS_DISCOVERY_USERNAME: "nacos" + SPRING_CLOUD_NACOS_DISCOVERY_PASSWORD: "nacos" + SPRING_CLOUD_NACOS_CONFIG_SERVER-ADDR: "nacos:8848" + SPRING_CLOUD_NACOS_CONFIG_USERNAME: "nacos" + SPRING_CLOUD_NACOS_CONFIG_PASSWORD: "nacos" + spring.data.redis.host: "redis" + spring.data.redis.port: 6379 + spring.data.redis.password: "" + spring.profiles.active: dev + depends_on: + - redis + - nacos + restart: always + networks: + - my-network + + erp-api: + image: crpi-km68smz26eegv27m.cn-shenzhen.personal.cr.aliyuncs.com/qihang-open/erp-api + container_name: qihangerp-erp-api + environment: + SPRING_CLOUD_NACOS_DISCOVERY_SERVER-ADDR: "nacos:8848" + SPRING_CLOUD_NACOS_DISCOVERY_USERNAME: "nacos" + SPRING_CLOUD_NACOS_DISCOVERY_PASSWORD: "nacos" + SPRING_CLOUD_NACOS_CONFIG_SERVER-ADDR: "nacos:8848" + SPRING_CLOUD_NACOS_CONFIG_USERNAME: "nacos" + SPRING_CLOUD_NACOS_CONFIG_PASSWORD: "nacos" + spring.data.redis.host: "redis" + spring.data.redis.port: 6379 + spring.data.redis.password: "" + spring.profiles.active: dev + depends_on: + - redis + - nacos + restart: always + networks: + - my-network + + vue: + image: crpi-km68smz26eegv27m.cn-shenzhen.personal.cr.aliyuncs.com/qihang-open/vue-erp + container_name: qihangerp-vue + ports: + - "80:80" # 映射88端口 + - "443:443" # 映射88端口 +# volumes: +# - /opt/qihangerp/nginx/dist:/usr/share/nginx/html # HTML 文件目录 +# - /opt/qihangerp/nginx/nginx_conf/nginx:/etc/nginx # Nginx 配置目录 +# - /opt/qihangerp/nginx/nginx_logs:/var/log/nginx # Nginx 日志目录 + networks: + - my-network # 使用 my-network 网络 + restart: always # 容器崩溃后自动重启 + + +volumes: + redis_data: # 定义持久化数据卷 + nacos_data: +networks: + my-network: + driver: bridge \ No newline at end of file diff --git a/docs/知识星球.jpg b/docs/知识星球.jpg deleted file mode 100644 index a479f558623fb84c5bd7261571b56ed21f82a2e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78548 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 AhX4Qo diff --git a/vue/Dockerfile b/vue/Dockerfile new file mode 100644 index 00000000..7714bcbf --- /dev/null +++ b/vue/Dockerfile @@ -0,0 +1,18 @@ +# 使用官方 Nginx 镜像作为基础镜像 +FROM nginx:alpine +# COPY ./cert /etc/nginx/cert + +# 删除默认的 Nginx 配置文件 +RUN rm /etc/nginx/conf.d/default.conf + +# 将自定义的 nginx.conf 配置文件复制到容器中的 Nginx 配置目录 +COPY ./nginx.conf /etc/nginx/nginx.conf + +# 将 Vue 项目的构建文件复制到 Nginx 的 html 目录 +COPY ./dist /usr/share/nginx/html + +# 暴露容器的端口(80 是 Nginx 默认的 HTTP 端口) +EXPOSE 88 + +# 启动 Nginx 服务 +CMD ["nginx", "-g", "daemon off;"] diff --git a/vue/nginx.conf b/vue/nginx.conf new file mode 100644 index 00000000..0a68eb40 --- /dev/null +++ b/vue/nginx.conf @@ -0,0 +1,91 @@ +worker_processes 1; + +events { + worker_connections 1024; +} + +http { + include mime.types; # 引入 MIME 类型 + default_type application/octet-stream; # 默认 MIME 类型 + + server { + listen 80; + server_name erp.benshutech.com; + + # 设置 Vue 应用的静态文件路径 + root /usr/share/nginx/html; + index index.html; + + # 默认 location 配置 + location / { + try_files $uri $uri/ /index.html; + } + + # 处理 /prod-api/ 的代理请求 + location /prod-api/ { + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header REMOTE-HOST $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + # --- 新增 SSE 关键配置 --- + proxy_http_version 1.1; # 必须使用 HTTP/1.1 + proxy_buffering off; # 关闭缓冲,确保数据实时发送 + proxy_read_timeout 1800s; # 增加读取超时时间 (例如 30 分钟) + proxy_send_timeout 1800s; # 增加发送超时时间 (例如 30 分钟) + proxy_connect_timeout 60s; # 连接超时时间 + # --- 结束新增 --- + + #proxy_pass http://10.0.2.22:8088/; + proxy_pass http://172.17.62.227:8088/; + } + + } + + server { + listen 443 ssl; + server_name erp.benshutech.com; + + #charset koi8-r; + + #access_log logs/host.access.log main;/opt/cert + + ssl_certificate /etc/nginx/cert/benshutech.com.pem; + ssl_certificate_key /etc/nginx/cert/benshutech.com.key; + ssl_session_timeout 5m; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + try_files $uri $uri/ /index.html; + } + + # 处理 /prod-api/ 的代理请求 + location /prod-api/ { + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header REMOTE-HOST $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + # --- 新增 SSE 关键配置 --- + proxy_http_version 1.1; # 必须使用 HTTP/1.1 + proxy_buffering off; # 关闭缓冲,确保数据实时发送 + proxy_read_timeout 1800s; # 增加读取超时时间 (例如 30 分钟) + proxy_send_timeout 1800s; # 增加发送超时时间 (例如 30 分钟) + proxy_connect_timeout 60s; # 连接超时时间 + # --- 结束新增 --- + proxy_pass http://172.17.62.227:8088/; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root html; + } + + } +} +