Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 03a65f8b0f | |||
| 6de705075a | |||
| 1a2f6abaca | |||
| b5f0844a61 |
126
deploy/Dockerfile.all
Normal file
126
deploy/Dockerfile.all
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
# 全栈 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 tag cultivation-world-simulator-all registry.cn-chengdu.aliyuncs.com/yexuejc/cultivation-world-simulator:20260207
|
||||||
|
# docker push registry.cn-chengdu.aliyuncs.com/yexuejc/cultivation-world-simulator:20260207
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
version: '3.8'
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
# 后端服务
|
# 后端服务
|
||||||
backend:
|
backend:
|
||||||
@@ -37,4 +35,22 @@ services:
|
|||||||
interval: 30s
|
interval: 30s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 3
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user