Гайды
Деплой FastAPI: Docker, Nginx и healthchecks
Dockerfile и workers, compose, reverse proxy с TLS, proxy headers, liveness/readiness и логи.
~10 мин чтения
Деплой FastAPI: Docker, Nginx и healthchecks
Типичный прод: Docker-образ с приложением, uvicorn (или gunicorn + uvicorn workers) за Nginx как reverse proxy с TLS и лимитами. См. также CORS и лимиты запросов и Быстрый старт с FastAPI.
1. Dockerfile (одностадийный пример)
FROM python:3.12-slim
WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1
RUN pip install --no-cache-dir uvicorn fastapi pydantic-settings
COPY . .
# pip install -r requirements.txt при наличии
EXPOSE 8000
USER nobody
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]
--workers — несколько процессов; каждый со своим event loop. Подбирайте под CPU. Для async часто 1–2× ядра; профилируйте.
2. Multi-stage (кратко)
Стадия builder: pip wheel в каталог. Стадия runtime: только wheels + slim image — меньше attack surface.
3. docker-compose
services:
api:
build: .
env_file: .env
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: app
POSTGRES_DB: app
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata: {}
Не коммитьте секреты; в проде — secrets orchestrator.
4. Nginx: reverse proxy
upstream api {
server api:8000;
keepalive 32;
}
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/privkey.pem;
client_max_body_size 5m;
location / {
proxy_pass http://api;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 120s;
}
}
Запускайте uvicorn с --proxy-headers и --forwarded-allow-ips (или настройка Uvicorn) чтобы request.client и схемы URL были корректны.
5. WebSockets
Nginx:
location /ws/ {
proxy_pass http://api;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
Практический разбор — WebSockets и чат на FastAPI; официально — раздел FastAPI.
6. Health для оркестратора
from fastapi import Request
@app.get("/health/live")
def liveness():
return {"ok": True}
@app.get("/health/ready")
async def readiness(request: Request):
pool = request.app.state.db # пул asyncpg из lifespan
await pool.execute("SELECT 1")
return {"ok": True}
Liveness не должен ходить в БД; readiness — да. Пул и lifespan — в гайде по asyncpg.
7. Логи
Структурированный JSON в stdout → сборщик (Loki, CloudWatch). Уровень логирования через env.
8. Чек-лист
- Несколько worker'ов или горизонтальный scale + sticky sessions только если нужно.
- TLS на границе; внутри кластера mTLS по политике.
- Таймауты proxy согласованы с долгими запросами.
- Образ не под root.
Дальше: asyncpg · тег Docker