From 054eac098716c0150acc0014249de4c835a88a18 Mon Sep 17 00:00:00 2001 From: wangys <3401275564@qq.com> Date: Mon, 24 Nov 2025 14:33:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=82=E8=BD=BD=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 +- build.sh | 54 ++--------- docker/Dockerfile.base-web | 41 --------- docker/Dockerfile.web | 97 +++++++------------- docker/docker-compose.yml | 149 +++++++++++++++++++++++++++---- docker/init-volumes.bat | 65 ++++++++++++++ docker/init-volumes.sh | 69 ++++++++++++++ docker/nginx/conf.d/default.conf | 74 +++++++++++++++ docker/nginx/nginx.conf | 44 +++++++++ schoolNewsWeb/docker/start.sh | 22 ++--- 10 files changed, 438 insertions(+), 182 deletions(-) delete mode 100644 docker/Dockerfile.base-web create mode 100644 docker/init-volumes.bat create mode 100644 docker/init-volumes.sh create mode 100644 docker/nginx/conf.d/default.conf create mode 100644 docker/nginx/nginx.conf diff --git a/.gitignore b/.gitignore index 161e0bb..7219b53 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ .idea -build_output \ No newline at end of file +build_output + +# Docker volumes(运行时数据,不纳入版本控制) +docker/volumes/ \ No newline at end of file diff --git a/build.sh b/build.sh index 4b973b8..13bf200 100755 --- a/build.sh +++ b/build.sh @@ -14,13 +14,14 @@ # # 目标(target): # base-serv - 构建后端基础镜像(包含Python依赖) -# base-web - 构建前端基础镜像(Nginx) +# base-web - 构建前端基础镜像(Node) # base-all - 构建所有基础镜像 # serv - 构建后端服务镜像 -# web - 构建前端服务镜像 +# web - 构建前端服务镜像(Node + Vite Preview) # mysql - 构建MySQL镜像 # all - 构建所有应用镜像(默认) # +# # 选项(options): # build - 编译代码(serv和web需要) # save - 保存镜像到tar文件(配合build自动保存构建版本) @@ -166,24 +167,6 @@ build_base_serv() { echo "" } -# 构建前端基础镜像 -build_base_web() { - log_step "构建前端基础镜像(Base Web)" - cd "${PROJECT_ROOT}" - - log_info "执行: docker build -t school-news-base-web:${IMAGE_VERSION} -f docker/Dockerfile.base-web ." - if docker build -t school-news-base-web:${IMAGE_VERSION} -f docker/Dockerfile.base-web .; then - docker tag school-news-base-web:${IMAGE_VERSION} school-news-base-web:latest - log_info "✅ 前端基础镜像构建成功" - log_info " 镜像标签: school-news-base-web:${IMAGE_VERSION}" - log_info " 镜像标签: school-news-base-web:latest" - else - log_error "❌ 前端基础镜像构建失败" - exit 1 - fi - echo "" -} - # 构建MySQL镜像 build_mysql() { log_step "构建MySQL镜像" @@ -239,13 +222,6 @@ build_web() { log_step "构建前端服务镜像(Web)" cd "${PROJECT_ROOT}" - # 检查基础镜像 - if ! docker images | grep -q "school-news-base-web.*latest"; then - log_error "基础镜像不存在: school-news-base-web:latest" - log_error "请先构建基础镜像:./build.sh base-web" - exit 1 - fi - # 检查dist目录 if [ ! -d "${WEB_PATH}/dist" ]; then log_error "dist目录不存在: ${WEB_PATH}/dist" @@ -315,13 +291,6 @@ save_images() { base-serv) save_image "school-news-base-serv" ;; - base-web) - save_image "school-news-base-web" - ;; - base-all) - save_image "school-news-base-serv" - save_image "school-news-base-web" - ;; mysql) save_image "school-news-mysql" ;; @@ -406,13 +375,6 @@ case ${BUILD_TARGET} in base-serv) build_base_serv ;; - base-web) - build_base_web - ;; - base-all) - build_base_serv - build_base_web - ;; mysql) build_mysql ;; @@ -431,13 +393,15 @@ case ${BUILD_TARGET} in log_error "未知的构建目标: ${BUILD_TARGET}" echo "" echo "可用的构建目标:" - echo " base-serv - 构建后端基础镜像" - echo " base-web - 构建前端基础镜像" - echo " base-all - 构建所有基础镜像" + echo " base-serv - 构建后端基础镜像(包含Python依赖)" echo " mysql - 构建MySQL镜像" echo " serv - 构建后端服务镜像" - echo " web - 构建前端服务镜像" + echo " web - 构建前端服务镜像(基于node:20-alpine)" echo " all - 构建所有应用镜像(默认)" + echo "" + echo "注意:" + echo " - Nginx使用官方镜像 nginx:alpine,无需构建" + echo " - Web基于官方Node镜像 node:20-alpine,无需base-web" exit 1 ;; esac diff --git a/docker/Dockerfile.base-web b/docker/Dockerfile.base-web deleted file mode 100644 index 6f57b66..0000000 --- a/docker/Dockerfile.base-web +++ /dev/null @@ -1,41 +0,0 @@ -# ==================================== -# 前端基础镜像 - Base Web -# 包含:Nginx + 基础配置 -# 用途:作为前端服务镜像的基础 -# ==================================== -FROM nginx:alpine - -# 设置环境变量 -ENV TZ=Asia/Shanghai - -# 安装必要工具 -RUN apk add --no-cache \ - # 时区数据 - tzdata \ - # 基础工具 - bash \ - curl \ - # 日志处理 - && mkdir -p /app/logs - -# 设置时区 -RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ - echo "Asia/Shanghai" > /etc/timezone - -# 创建应用目录 -WORKDIR /app -RUN mkdir -p /app/config /app/logs - -# Nginx基础配置(可被覆盖) -RUN rm -f /etc/nginx/conf.d/default.conf - -# 镜像元数据 -LABEL maintainer="School News Team" \ - description="Base image for school-news frontend service with Nginx" \ - version="1.0" - -# 暴露端口 -EXPOSE 80 - -# 默认命令(会被子镜像覆盖) -CMD ["nginx", "-g", "daemon off;"] diff --git a/docker/Dockerfile.web b/docker/Dockerfile.web index 6d0b07e..9c9c366 100644 --- a/docker/Dockerfile.web +++ b/docker/Dockerfile.web @@ -1,88 +1,53 @@ # ==================================== # 前端服务镜像 - School News Web -# 基于:school-news-base-web(Nginx Alpine) +# 使用Node运行Vite预览服务器 # 注意:dist目录需要在主机中先构建好 # ==================================== -FROM school-news-base-web:latest +FROM node:20-alpine -# 创建前端目录 -RUN mkdir -p /usr/share/nginx/html/schoolNewsWeb +# 设置环境变量 +ENV TZ=Asia/Shanghai \ + NODE_ENV=production + +# 安装基础工具 +RUN apk add --no-cache tzdata bash curl && \ + ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ + echo "Asia/Shanghai" > /etc/timezone + +# 创建应用目录 +WORKDIR /app + +# 创建必要目录 +RUN mkdir -p /app/dist /app/config /app/logs + +# 复制package.json和package-lock.json +COPY schoolNewsWeb/package*.json ./ + +# 安装生产依赖(包括vite用于preview) +RUN npm ci --only=production && \ + npm install -g vite # 从主机复制已构建的dist目录 -COPY schoolNewsWeb/dist/ /usr/share/nginx/html/schoolNewsWeb/ +COPY schoolNewsWeb/dist/ /app/dist/ # 复制配置文件模板(可整个替换) COPY schoolNewsWeb/public/app-config.js /app/config/app-config.js.template -# 确保dist中有默认配置文件(如果build时没有复制) -RUN if [ ! -f /usr/share/nginx/html/schoolNewsWeb/app-config.js ]; then \ - cp /app/config/app-config.js.template /usr/share/nginx/html/schoolNewsWeb/app-config.js; \ +# 确保dist中有默认配置文件 +RUN if [ ! -f /app/dist/app-config.js ]; then \ + cp /app/config/app-config.js.template /app/dist/app-config.js; \ fi -# 创建Nginx配置 -RUN echo 'server {\n\ - listen 80;\n\ - server_name localhost;\n\ - \n\ - # 日志配置\n\ - access_log /app/logs/nginx-access.log;\n\ - error_log /app/logs/nginx-error.log;\n\ - \n\ - # 根路径重定向\n\ - location = / {\n\ - return 301 /schoolNewsWeb/;\n\ - }\n\ - \n\ - # 前端应用\n\ - location /schoolNewsWeb/ {\n\ - alias /usr/share/nginx/html/schoolNewsWeb/;\n\ - try_files $uri $uri/ /schoolNewsWeb/index.html;\n\ - \n\ - # 静态资源缓存\n\ - location ~* \\.(js|css|png|jpg|jpeg|gif|ico|svg)$ {\n\ - expires 1y;\n\ - add_header Cache-Control "public, immutable";\n\ - }\n\ - }\n\ - \n\ - # 后端API代理\n\ - location /schoolNewsServ/ {\n\ - proxy_pass http://school-news-serv:8081;\n\ - proxy_set_header Host $host;\n\ - proxy_set_header X-Real-IP $remote_addr;\n\ - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n\ - proxy_set_header X-Forwarded-Proto $scheme;\n\ - \n\ - # WebSocket支持\n\ - proxy_http_version 1.1;\n\ - proxy_set_header Upgrade $http_upgrade;\n\ - proxy_set_header Connection "upgrade";\n\ - \n\ - # 超时设置\n\ - proxy_connect_timeout 300s;\n\ - proxy_send_timeout 300s;\n\ - proxy_read_timeout 300s;\n\ - }\n\ - \n\ - # 错误页面\n\ - error_page 404 /schoolNewsWeb/index.html;\n\ - error_page 500 502 503 504 /50x.html;\n\ - location = /50x.html {\n\ - root /usr/share/nginx/html;\n\ - }\n\ -}\n\ -' > /etc/nginx/conf.d/default.conf - # 复制启动脚本 COPY schoolNewsWeb/docker/start.sh /app/start.sh RUN chmod +x /app/start.sh -# 暴露端口 -EXPOSE 80 +# 暴露端口(Vite preview默认4173) +EXPOSE 4173 # 健康检查 -HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \ - CMD wget --quiet --tries=1 --spider http://localhost/schoolNewsWeb/ || exit 1 +HEALTHCHECK --interval=30s --timeout=10s --start-period=20s --retries=3 \ + CMD curl -f http://localhost:4173/ || exit 1 # 启动应用 CMD ["/app/start.sh"] diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 47ae603..59be0f4 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -15,7 +15,7 @@ services: ports: - "${MYSQL_PORT:-3306}:3306" volumes: - # 数据持久化 + # 数据持久化(命名卷) - mysql-data:/var/lib/mysql # 自定义配置文件(可选,取消注释以启用) # 如需自定义MySQL配置,取消下面的注释并修改mysql/my.cnf @@ -45,8 +45,10 @@ services: ports: - "${REDIS_PORT:-6379}:6379" volumes: + # 数据持久化(命名卷) - redis-data:/data - - ./redis/redis.conf:/usr/local/etc/redis/redis.conf + # Redis配置文件(命名卷) + - redis-config:/usr/local/etc/redis command: redis-server /usr/local/etc/redis/redis.conf --requirepass ${REDIS_PASSWORD:-123456} networks: - school-news-network @@ -83,15 +85,15 @@ services: ports: - "${SERV_PORT:-8081}:8081" volumes: - # 配置文件挂载 - - ./config/application.yml:/app/config/application.yml - - ./config/log4j2-spring.xml:/app/config/log4j2-spring.xml - # 日志目录挂载 - - ./logs/serv:/app/logs - # 上传文件目录 - - ./uploads:/app/uploads - # 爬虫脚本目录(如果需要更新爬虫脚本) - - ../schoolNewsCrawler:/app/crawler + # 配置文件(命名卷) + - serv-config:/app/config + # 日志目录(命名卷) + - serv-logs:/app/logs + # 上传文件目录(命名卷) + - serv-uploads:/app/uploads + # 爬虫脚本目录(默认不挂载,保留在镜像内) + # 注意:挂载会覆盖镜像内容,如需运行时更新爬虫脚本可取消注释 + - serv-crawler:/app/crawler networks: - school-news-network healthcheck: @@ -101,7 +103,7 @@ services: retries: 3 start_period: 60s - # 前端服务 + # 前端服务(Node + Vite Preview) school-news-web: image: school-news-web:latest container_name: school-news-web @@ -110,17 +112,45 @@ services: - school-news-serv environment: TZ: Asia/Shanghai - ports: - - "${WEB_PORT:-8080}:80" + NODE_ENV: production + # 不直接暴露端口,通过nginx反向代理访问 + expose: + - "4173" volumes: - # 运行时配置文件挂载(可整个替换,修改后重启容器即可生效) - - ./config/web-app-config.js:/app/config/app-config.js - # 日志目录挂载 - - ./logs/web:/app/logs + # 运行时配置文件(命名卷) + - web-config:/app/config + # 日志目录(命名卷) + - web-logs:/app/logs networks: - school-news-network healthcheck: - test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/schoolNewsWeb/"] + test: ["CMD", "curl", "-f", "http://localhost:4173/"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 20s + + # Nginx反向代理 + nginx: + image: nginx:alpine # 直接使用官方镜像,无需自定义构建 + container_name: school-news-nginx + restart: always + depends_on: + - school-news-web + - school-news-serv + environment: + TZ: Asia/Shanghai + ports: + - "${NGINX_PORT:-80}:80" + volumes: + # Nginx配置文件(命名卷) + - nginx-config:/etc/nginx:ro + # 日志目录(命名卷) + - nginx-logs:/var/log/nginx + networks: + - school-news-network + healthcheck: + test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/"] interval: 30s timeout: 10s retries: 3 @@ -130,8 +160,89 @@ networks: school-news-network: driver: bridge +# 命名卷定义(数据存储在当前目录下的volumes/子目录) +# 使用前请先运行初始化脚本:./init-volumes.sh 或 init-volumes.bat volumes: + # ===== MySQL ===== mysql-data: driver: local + driver_opts: + type: none + o: bind + device: ./volumes/mysql/data + + # ===== Redis ===== redis-data: driver: local + driver_opts: + type: none + o: bind + device: ./volumes/redis/data + + redis-config: + driver: local + driver_opts: + type: none + o: bind + device: ./volumes/redis/config + + # ===== 后端服务 ===== + serv-config: + driver: local + driver_opts: + type: none + o: bind + device: ./volumes/serv/config + + serv-logs: + driver: local + driver_opts: + type: none + o: bind + device: ./volumes/serv/logs + + serv-uploads: + driver: local + driver_opts: + type: none + o: bind + device: ./volumes/serv/uploads + + # 爬虫脚本目录(可选,默认不启用) + # 注意:启用后会覆盖镜像内的爬虫脚本,需先复制镜像内容到volumes/serv/crawler + serv-crawler: + driver: local + driver_opts: + type: none + o: bind + device: ./volumes/serv/crawler + + # ===== 前端服务 ===== + web-config: + driver: local + driver_opts: + type: none + o: bind + device: ./volumes/web/config + + web-logs: + driver: local + driver_opts: + type: none + o: bind + device: ./volumes/web/logs + + # ===== Nginx ===== + nginx-config: + driver: local + driver_opts: + type: none + o: bind + device: ./volumes/nginx/config + + nginx-logs: + driver: local + driver_opts: + type: none + o: bind + device: ./volumes/nginx/logs diff --git a/docker/init-volumes.bat b/docker/init-volumes.bat new file mode 100644 index 0000000..13956f4 --- /dev/null +++ b/docker/init-volumes.bat @@ -0,0 +1,65 @@ +@echo off +REM ============================================ +REM 初始化 Docker Volumes 目录 (Windows) +REM ============================================ + +echo ======================================== +echo 初始化 Docker Volumes 目录 +echo ======================================== +echo. + +REM 创建所有卷目录(分层结构) +echo 创建数据目录... +if not exist "volumes" mkdir "volumes" +if not exist "volumes\mysql\data" mkdir "volumes\mysql\data" +if not exist "volumes\redis\data" mkdir "volumes\redis\data" +if not exist "volumes\redis\config" mkdir "volumes\redis\config" +if not exist "volumes\serv\config" mkdir "volumes\serv\config" +if not exist "volumes\serv\logs" mkdir "volumes\serv\logs" +if not exist "volumes\serv\uploads" mkdir "volumes\serv\uploads" +REM if not exist "volumes\serv\crawler" mkdir "volumes\serv\crawler" REM 可选,如需运行时更新爬虫可取消注释 +if not exist "volumes\web\config" mkdir "volumes\web\config" +if not exist "volumes\web\logs" mkdir "volumes\web\logs" +if not exist "volumes\nginx\config" mkdir "volumes\nginx\config" +if not exist "volumes\nginx\logs" mkdir "volumes\nginx\logs" + +REM 复制配置文件模板 +echo 复制配置文件模板... +if exist "redis\redis.conf" (copy /Y "redis\redis.conf" "volumes\redis\config\" >nul) else (echo ⚠️ redis.conf 不存在) +if exist "config\application.yml" (copy /Y "config\application.yml" "volumes\serv\config\" >nul) else (echo ⚠️ application.yml 不存在) +if exist "config\log4j2-spring.xml" (copy /Y "config\log4j2-spring.xml" "volumes\serv\config\" >nul) else (echo ⚠️ log4j2-spring.xml 不存在) +if exist "config\web-app-config.js" (copy /Y "config\web-app-config.js" "volumes\web\config\app-config.js" >nul) else (echo ⚠️ web-app-config.js 不存在) +if exist "nginx\nginx.conf" (xcopy /E /Y "nginx\*" "volumes\nginx\config\" >nul) else (echo ⚠️ nginx配置 不存在) +REM if exist "..\schoolNewsCrawler" (xcopy /E /Y "..\schoolNewsCrawler\*" "volumes\serv\crawler\" >nul) else (echo ⚠️ 爬虫脚本 不存在) REM 可选 + +echo. +echo ✅ 目录创建完成: +dir /b volumes +echo. + +echo ======================================== +echo 目录结构说明: +echo ======================================== +echo volumes\ +echo ├── mysql\ +echo │ └── data\ - MySQL数据库数据 +echo ├── redis\ +echo │ ├── data\ - Redis缓存数据 +echo │ └── config\ - Redis配置文件 +echo ├── serv\ +echo │ ├── config\ - 后端配置文件 +echo │ ├── logs\ - 后端服务日志 +echo │ ├── uploads\ - 后端上传文件 +echo │ └── crawler\ - 爬虫脚本(可选,默认在镜像内) +echo ├── web\ +echo │ ├── config\ - 前端配置文件 +echo │ └── logs\ - 前端服务日志 +echo └── nginx\ +echo ├── config\ - Nginx配置文件 +echo └── logs\ - Nginx访问日志 +echo. +echo ✅ 初始化完成!现在可以启动服务了: +echo docker-compose up -d +echo ======================================== + +pause diff --git a/docker/init-volumes.sh b/docker/init-volumes.sh new file mode 100644 index 0000000..a2fbe08 --- /dev/null +++ b/docker/init-volumes.sh @@ -0,0 +1,69 @@ +#!/bin/bash + +############################################## +# 初始化 Docker Volumes 目录 +# 用途:创建所有命名卷需要的本地目录 +############################################## + +echo "========================================" +echo "初始化 Docker Volumes 目录" +echo "========================================" + +# 获取脚本所在目录 +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +VOLUMES_DIR="${SCRIPT_DIR}/volumes" + +echo "创建目录: ${VOLUMES_DIR}" + +# 创建所有卷目录(分层结构) +echo "创建数据目录..." +mkdir -p "${VOLUMES_DIR}/mysql/data" +mkdir -p "${VOLUMES_DIR}/redis/data" +mkdir -p "${VOLUMES_DIR}/redis/config" +mkdir -p "${VOLUMES_DIR}/serv/config" +mkdir -p "${VOLUMES_DIR}/serv/logs" +mkdir -p "${VOLUMES_DIR}/serv/uploads" +mkdir -p "${VOLUMES_DIR}/serv/crawler" # 可选,如需运行时更新爬虫可取消注释 +mkdir -p "${VOLUMES_DIR}/web/config" +mkdir -p "${VOLUMES_DIR}/web/logs" +mkdir -p "${VOLUMES_DIR}/nginx/config" +mkdir -p "${VOLUMES_DIR}/nginx/logs" + +# 复制配置文件模板 +echo "复制配置文件模板..." +[ -f redis/redis.conf ] && cp redis/redis.conf "${VOLUMES_DIR}/redis/config/" || echo " ⚠️ redis.conf 不存在" +[ -f config/application.yml ] && cp config/application.yml "${VOLUMES_DIR}/serv/config/" || echo " ⚠️ application.yml 不存在" +[ -f config/log4j2-spring.xml ] && cp config/log4j2-spring.xml "${VOLUMES_DIR}/serv/config/" || echo " ⚠️ log4j2-spring.xml 不存在" +[ -f config/web-app-config.js ] && cp config/web-app-config.js "${VOLUMES_DIR}/web/config/app-config.js" || echo " ⚠️ web-app-config.js 不存在" +[ -f nginx/nginx.conf ] && cp -r nginx/* "${VOLUMES_DIR}/nginx/config/" || echo " ⚠️ nginx配置 不存在" +[ -d ../schoolNewsCrawler ] && cp -r ../schoolNewsCrawler/* "${VOLUMES_DIR}/serv/crawler/" || echo " ⚠️ 爬虫脚本 不存在" # 可选 + +echo "" +echo "✅ 目录创建完成:" +tree -L 2 "${VOLUMES_DIR}" 2>/dev/null || ls -la "${VOLUMES_DIR}" + +echo "" +echo "========================================" +echo "目录结构说明:" +echo "========================================" +echo "volumes/" +echo "├── mysql/" +echo "│ └── data/ - MySQL数据库数据" +echo "├── redis/" +echo "│ ├── data/ - Redis缓存数据" +echo "│ └── config/ - Redis配置文件" +echo "├── serv/" +echo "│ ├── config/ - 后端配置文件" +echo "│ ├── logs/ - 后端服务日志" +echo "│ ├── uploads/ - 后端上传文件" +echo "│ └── crawler/ - 爬虫脚本(可选,默认在镜像内)" +echo "├── web/" +echo "│ ├── config/ - 前端配置文件" +echo "│ └── logs/ - 前端服务日志" +echo "└── nginx/" +echo " ├── config/ - Nginx配置文件" +echo " └── logs/ - Nginx访问日志" +echo "" +echo "✅ 初始化完成!现在可以启动服务了:" +echo " docker-compose up -d" +echo "========================================" diff --git a/docker/nginx/conf.d/default.conf b/docker/nginx/conf.d/default.conf new file mode 100644 index 0000000..cdf69cc --- /dev/null +++ b/docker/nginx/conf.d/default.conf @@ -0,0 +1,74 @@ +# ==================================== +# 校园新闻系统 - Nginx反向代理配置 +# ==================================== + +# 上游服务定义 +upstream web_backend { + server school-news-web:4173; +} + +upstream api_backend { + server school-news-serv:8081; +} + +server { + listen 80; + server_name localhost; + + # 日志配置 + access_log /var/log/nginx/school-news-access.log; + error_log /var/log/nginx/school-news-error.log; + + # 客户端上传大小限制 + client_max_body_size 100M; + + # 根路径重定向到前端 + location = / { + return 301 /schoolNewsWeb/; + } + + # 前端应用代理(Node Vite Preview) + location /schoolNewsWeb/ { + proxy_pass http://web_backend/; + 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; + + # WebSocket支持(如果需要HMR) + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + + # 超时设置 + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + } + + # 后端API代理 + location /schoolNewsServ/ { + proxy_pass http://api_backend/schoolNewsServ/; + 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_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + + # 缓冲设置 + proxy_buffering on; + proxy_buffer_size 4k; + proxy_buffers 8 4k; + } + + # 错误页面 + error_page 404 /schoolNewsWeb/; + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} diff --git a/docker/nginx/nginx.conf b/docker/nginx/nginx.conf new file mode 100644 index 0000000..b2973da --- /dev/null +++ b/docker/nginx/nginx.conf @@ -0,0 +1,44 @@ +# ==================================== +# Nginx主配置文件 +# 可通过docker-compose.yml挂载自定义配置 +# ==================================== + +user nginx; +worker_processes auto; + +error_log /var/log/nginx/error.log notice; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + # 日志格式 + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + + # Gzip压缩 + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_types text/plain text/css text/xml text/javascript + application/json application/javascript application/xml+rss + application/rss+xml font/truetype font/opentype + application/vnd.ms-fontobject image/svg+xml; + + # 包含站点配置 + include /etc/nginx/conf.d/*.conf; +} diff --git a/schoolNewsWeb/docker/start.sh b/schoolNewsWeb/docker/start.sh index d01e04e..0f29ab4 100644 --- a/schoolNewsWeb/docker/start.sh +++ b/schoolNewsWeb/docker/start.sh @@ -1,15 +1,14 @@ -#!/bin/sh -set -e +#!/bin/bash echo "========================================" -echo "校园新闻管理系统 - 前端服务启动" +echo "[INFO] 校园新闻系统 - 前端Web服务启动" echo "========================================" -# 确保日志目录存在 +# 创建日志目录 mkdir -p /app/logs # 处理配置文件 -CONFIG_TARGET="/usr/share/nginx/html/schoolNewsWeb/app-config.js" +CONFIG_TARGET="/app/dist/app-config.js" if [ -f /app/config/app-config.js ]; then echo "[INFO] 检测到外部配置文件,替换默认配置" @@ -29,12 +28,15 @@ else fi echo "========================================" -echo "[INFO] Nginx版本: $(nginx -v 2>&1)" -echo "[INFO] 前端路径: /usr/share/nginx/html/schoolNewsWeb" +echo "[INFO] Node版本: $(node --version)" +echo "[INFO] Vite版本: $(vite --version)" +echo "[INFO] 前端路径: /app/dist" echo "[INFO] 配置文件: $CONFIG_TARGET" echo "[INFO] 日志路径: /app/logs" +echo "[INFO] 监听端口: 4173" echo "========================================" -echo "[INFO] 启动Nginx..." +echo "[INFO] 启动Vite Preview服务器..." -# 启动Nginx -exec nginx -g "daemon off;" +# 启动Vite Preview(前台运行) +cd /app +vite preview --host 0.0.0.0 --port 4173