FastAPI + 前端(Vue/React)Docker 部署全流程

适用于 Ubuntu 服务器 | Nginx 反向代理 | 独立前后端容器


📁 一、项目结构(推荐)

复制代码

bash

编辑

复制代码
~/app/
├── backend/                # FastAPI 后端
│   ├── app/
│   │   ├── __init__.py
│   │   ├── main.py
│   │   ├── routers/
│   │   │   ├── __init__.py
│   │   │   ├── note.py
│   │   │   └── health.py
│   │   └── database.py
│   ├── requirements.txt
│   └── Dockerfile
│
├── frontend/               # Vue/React 前端
│   ├── src/
│   ├── dist/               # 构建输出目录
│   ├── package.json
│   └── Dockerfile
│
└── docker-compose.yml      # (可选)一键编排

⚙️ 二、后端(FastAPI)关键配置

1. backend/app/routers/__init__.py

复制代码

python

编辑

复制代码
from fastapi import APIRouter
from . import note, health

api_router = APIRouter()

# ❗注意:prefix 不能以 / 结尾!
api_router.include_router(note.router, prefix="/notes")     # ✅ 正确
api_router.include_router(health.router, tags=["health"])

2. backend/app/main.py

复制代码

python

编辑

复制代码
from fastapi import FastAPI
from app.routers import api_router

app = FastAPI()

# 注册路由,带 API 版本前缀
app.include_router(api_router, prefix="/api/v1")

✅ 最终路径:POST /api/v1/notes/

3. backend/Dockerfile

复制代码

dockerfile

编辑

复制代码
FROM python:3.10-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

# ✅ 关键:模块路径是 app.main
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

4. 构建并运行后端

复制代码

bash

编辑

复制代码
cd ~/app/backend
docker build --no-cache -t fastapi-backend .
docker run -d --name backend --network app-network fastapi-backend

🔍 验证:docker logs backend 应看到 Uvicorn 启动成功


🌐 三、Nginx 配置(反向代理)

nginx.conf 或站点配置

复制代码

nginx

编辑

复制代码
server {
    listen 80;
    server_name your-domain.com;

    # 前端静态资源
    location / {
        root /usr/share/nginx/html;
        index index.html;
        try_files $uri $uri/ /index.html;
    }

    # 后端 API 代理
    location /api/ {
        proxy_pass http://backend:8000;   # ❗结尾不能有 /api/
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

✅ 请求 /api/v1/notes/ → 转发到 http://backend:8000/api/v1/notes/


🖥️ 四、前端(Vue/React)部署

1. 构建前端

复制代码

bash

编辑

复制代码
cd ~/app/frontend
npm install
npm run build   # 输出到 dist/ 目录

2. frontend/Dockerfile

复制代码

dockerfile

编辑

复制代码
FROM nginx:alpine
COPY ./dist /usr/share/nginx/html
EXPOSE 80

3. 构建并运行前端(含 Nginx)

复制代码

bash

编辑

复制代码
cd ~/app/frontend
docker build --no-cache -t frontend .

docker rm -f nginx
docker run -d \
  --name nginx \
  --network app-network \
  -p 80:80 \
  frontend

✅ 前端请求 /api/v1/notes/ 会自动被 Nginx 代理到后端


🧪 五、验证部署是否成功

1. 检查容器状态

复制代码

bash

编辑

复制代码
docker ps
# 应看到 backend (Up) 和 nginx (Up)

2. 测试 API(绕过 Nginx)

复制代码

bash

编辑

复制代码
curl http://localhost:8000/api/v1/health
# 应返回 {"status": "ok"}

3. 测试前端访问

  • 浏览器打开 http://your-server-ip
  • 打开开发者工具 → Network → 查看 /api/v1/... 请求是否 200

4. 查看日志

复制代码

bash

编辑

复制代码
docker logs backend    # 看 API 请求日志
docker logs nginx      # 看前端访问日志

🚫 六、常见错误 & 解决方案(你踩过的坑)

问题现象 根本原因 解决方法
容器启动后立即退出 (Exited (1)) uvicorn main:app 路径错误 改为 uvicorn app.main:app
路由变成 /api/notes/(无 /v1) Nginx proxy_pass 写成 .../api/ 改为 proxy_pass http://backend:8000;
404 on /api/v1/notes/ prefix="/notes/" 多了 / 改为 prefix="/notes"
导入失败(ModuleNotFoundError) 构建时不在 backend/ 目录 cd backend && docker build .
数据库连接失败 容器内 localhost ≠ 宿主机 使用 Docker 网络 + 服务名(如 db:5432)

🧰 七、推荐优化(后续可做)

  1. 使用 docker-compose.yml 统一管理

    复制代码

    yaml

    编辑

    复制代码
    version: '3'
    services:
      backend:
        build: ./backend
        networks: [app-net]
      nginx:
        build: ./frontend
        ports: ["80:80"]
        networks: [app-net]
    networks:
      app-net:
  2. 添加 .dockerignore

    复制代码

    txt

    编辑

    复制代码
    __pycache__
    *.pyc
    node_modules
    .git
  3. 前端 API 地址写相对路径

    复制代码

    js

    编辑

    复制代码
    // 前端代码中
    fetch("/api/v1/notes")  // 自动走 Nginx 代理,无跨域
  4. 加健康检查接口

    复制代码

    python

    编辑

    复制代码
    @router.get("/health")
    def health(): return {"status": "ok"}

🎉 总结

你完成了一套 生产级 Web 应用部署流程:

  • ✅ 模块化 FastAPI 路由(带版本)
  • ✅ Docker 容器化前后端
  • ✅ Nginx 反向代理 + 静态资源托管
  • ✅ 网络隔离与服务通信

这份文档不仅记录了你的成果,更是未来快速部署新项目的标准模板。

相关推荐
前端snow2 小时前
ai agent --- 异步处理之 Rabbit MQ
前端
念何架构之路2 小时前
zap扩展生态与总结
java·前端·数据库
独孤九剑打醒他2 小时前
【原创开源】【概念设计】源 - 栅 - 漏 - 栅 - 源 横向双栅 MOS,低压交流多值逻辑芯片探索
前端·其他·架构·开源·硬件工程
mantou1322 小时前
我给 AI Agent 做了个「油猴」:让 Claude Code / Codex 直接用你已登录的浏览器
前端·javascript·后端
默_笙2 小时前
🍕 一个主编、三个工种、两本手册:搭一支 AI 调研队
前端·javascript
纸片人2 小时前
Blender 建模 + Three.js 展示:和 AI 一起做一个光储充超充站数字孪生大屏
前端
智能直播2 小时前
网络RTMP拉流不卡顿、声音不同步?一文讲透缓冲区、时间戳与MEDAI V2实战调优
前端
第七页独白2 小时前
汽车零件厂如何通过 QMS 真正落地 IATF 16949——QMS软件系统:品质检验-内审稽核-8d客诉管理:全星质量管理软件系统
java·前端·数据库
纸片人3 小时前
只用 three.js + OpenStreetMap,手搓一个「成都城市 3D」数据大屏
前端
星若生辉3 小时前
Hugo 静态站点搭建|从本地调试到上线部署实操指南
前端