添加Docker部署方案

- 多阶段Dockerfile:第一阶段构建前端(npm),第二阶段Python运行时(uv+opencv)
- docker-compose.yml:单服务,data/logs目录挂载持久化
- deploy.sh一键部署脚本:自动构建+启动+健康检查
- .dockerignore排除不必要文件减小构建上下文
- main.py添加前端静态文件服务(生产环境单端口部署)
- README更新部署文档和代理配置说明
This commit is contained in:
yml2213
2026-06-23 00:54:48 +08:00
parent da2fedd484
commit 93d358f214
6 changed files with 265 additions and 1 deletions
+30 -1
View File
@@ -1,9 +1,13 @@
"""FastAPI 入口"""
import os
from pathlib import Path
import uvicorn
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi.responses import FileResponse
from .database import init_db
from .routers import auth, users, accounts, login, proxy, cookies, logs
@@ -45,6 +49,31 @@ def health():
return {"status": "ok"}
# ---- 生产环境:serve 前端静态文件 ----
# Docker 部署时前端构建产物会被复制到 web/frontend/dist
_FRONTEND_DIST = Path(__file__).resolve().parents[2] / "web" / "frontend" / "dist"
_INDEX_HTML = _FRONTEND_DIST / "index.html"
if _INDEX_HTML.exists():
# 挂载静态资源目录(js/css/图片等)
_ASSETS_DIR = _FRONTEND_DIST / "assets"
if _ASSETS_DIR.exists():
app.mount("/assets", StaticFiles(directory=str(_ASSETS_DIR)), name="assets")
@app.get("/{full_path:path}")
async def serve_spa(full_path: str, request: Request):
"""SPA fallback:非 /api 路径返回 index.html"""
# 排除 API 路径
if full_path.startswith("api"):
return {"detail": "Not Found"}
# 尝试返回静态文件
file_path = _FRONTEND_DIST / full_path
if file_path.is_file():
return FileResponse(str(file_path))
# SPA fallback 到 index.html
return FileResponse(str(_INDEX_HTML))
def run():
uvicorn.run("web.backend.main:app", host="0.0.0.0", port=8000, reload=True)