diff --git a/deploy/Dockerfile.all b/deploy/Dockerfile.all new file mode 100644 index 0000000..d526c24 --- /dev/null +++ b/deploy/Dockerfile.all @@ -0,0 +1,125 @@ +# 全栈 Dockerfile (多阶段构建) +FROM node:22-alpine AS frontend-builder + +# 设置前端工作目录 +WORKDIR /frontend + +# 复制 package.json 和 package-lock.json +COPY web/package.json web/package-lock.json* ./ + +# 安装前端依赖 +RUN npm ci + +# 复制前端源代码并构建 +COPY web/ . +RUN npm run build + +# 后端构建阶段 +FROM python:3.12-slim AS backend-builder + +# 设置后端工作目录 +WORKDIR /backend + +# 安装系统依赖 +RUN apt-get update && apt-get install -y \ + gcc \ + g++ \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# 复制依赖文件 +COPY requirements.txt . + +# 安装 Python 依赖 清华园镜像源 +RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple + +# 复制后端项目代码 +COPY src/ ./src/ +COPY static/ ./static/ + +# 最终生产阶段 - 使用 Nginx 和 Python +FROM python:3.12-slim + +# 安装系统依赖 +RUN apt-get update && apt-get install -y \ + gcc \ + g++ \ + curl \ + nginx \ + && rm -rf /var/lib/apt/lists/* + +# 设置工作目录 +WORKDIR /app + +# 复制依赖文件并在最终阶段重新安装 +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple + +# 从后端构建阶段复制代码 +COPY --from=backend-builder /backend/src ./src +COPY --from=backend-builder /backend/static ./static + +# 修改 Nginx 配置以适配单容器部署,并屏蔽健康检查日志 +COPY deploy/nginx.conf /tmp/nginx.conf +RUN sed 's/backend:8002/127.0.0.1:8002/g' /tmp/nginx.conf > /etc/nginx/sites-available/default \ + && sed -i '/^}$/i\ + \ + # 屏蔽健康检查日志\ + location = /api/init-status {\ + access_log off;\ + proxy_pass http://127.0.0.1:8002;\ + 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;\ + }\ + \ + # 屏蔽其他健康检查相关API的日志\ + location ~ ^/api/(state|health|ping) {\ + access_log off;\ + proxy_pass http://127.0.0.1:8002;\ + 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;\ + }' /etc/nginx/sites-available/default +RUN ln -sf /etc/nginx/sites-available/default /etc/nginx/sites-enabled/ + +# 从前端构建阶段复制构建产物 +COPY --from=frontend-builder /frontend/dist /usr/share/nginx/html + +# 创建必要的目录 +RUN mkdir -p /app/assets/saves /app/logs /app/assets + +# 复制资产文件 +COPY assets/ /app/assets/ + +# 暴露端口 +EXPOSE 80 8002 + +# 创建启动脚本 - 同时启动 Nginx 和 Python 后端,屏蔽健康检查日志 +RUN echo '#!/bin/bash\n\ +set -e\n\ +\n\ +# 启动后端 Python 应用作为后台进程,禁用访问日志\n\ +echo "Starting backend server..."\n\ +uvicorn src.server.main:app --host 0.0.0.0 --port 8002 &\n\ +BACKEND_PID=$!\n\ +\n\ +# 等待后端服务启动\n\ +sleep 5\n\ +\n\ +# 启动 Nginx\n\ +echo "Starting nginx..."\n\ +nginx -g "daemon off;" &\n\ +NGINX_PID=$!\n\ +\n\ +# 等待所有进程\n\ +wait $BACKEND_PID $NGINX_PID' > /start.sh + +RUN chmod +x /start.sh + +CMD ["/start.sh"] + + +# docker build -f deploy/Dockerfile.all -t cultivation-world-simulator:20260206 . \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 4003512..7dcf7b5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: # 后端服务 backend: @@ -37,4 +35,22 @@ services: interval: 30s timeout: 10s retries: 3 - + # 全栈服务 + all: + build: + context: . + dockerfile: deploy/Dockerfile.all + container_name: cultivation-all + ports: + - "8002:8002" + - "8123:80" + restart: unless-stopped + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8002/api/state"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 30s + volumes: + - ./data/saves:/app/assets/saves + - ./data/logs:/app/logs