Развёртывание
Docker Compose
Полный стек
Файл docker-compose.yml в корне проекта описывает 8 сервисов:
| Сервис | Образ | Назначение |
|---|---|---|
postgres |
postgres:16-alpine |
Реляционная БД (порт 5435:5432) |
minio |
minio/minio:latest |
S3-совместимое хранилище |
nginx |
nginx:alpine |
Реверс-прокси для MinIO |
kafka |
apache/kafka:latest |
Брокер сообщений |
api |
(сборка из Dockerfile) | FastAPI приложение |
worker |
(сборка из Dockerfile) | Фоновый обработчик |
prometheus |
prom/prometheus |
Сбор метрик |
grafana |
grafana/grafana |
Визуализация метрик |
# Запуск
docker compose up -d
# Логи конкретного сервиса
docker compose logs -f api
# Остановка с удалением томов
docker compose down -v
Зависимости между сервисами
Переменные для Production
При деплое в production замените значения в секции environment сервисов api и worker:
VK_SECRET_KEY— сгенерировать надёжный ключDB_PASSWORD— надёжный парольMINIO_ROOT_PASSWORD— надёжный парольMINIO_PUBLIC_URL— публичный домен MinIOANALYSIS_GRPC_URL— адрес gRPC анализатораLOG_LEVEL—WARNINGдля production
Kubernetes (kind)
Предварительные требования
Манифесты
Все манифесты находятся в k8s/ (11 файлов):
| Файл | Ресурсы |
|---|---|
00-namespace.yaml |
Namespace umnaya |
01-configmap.yaml |
ConfigMap с конфигурацией |
02-secret.yaml |
Secret с паролями |
03-postgres.yaml |
Deployment + Service PostgreSQL |
04-minio.yaml |
Deployment + Service MinIO |
05-kafka.yaml |
Deployment + Service Kafka |
06-api-deployment.yaml |
Deployment API + init контейнеры |
07-api-service.yaml |
Service API (ClusterIP) |
08-worker-deployment.yaml |
Deployment Worker |
09-nginx.yaml |
Deployment + Service Nginx proxy |
10-volumes.yaml |
PersistentVolume + PersistentVolumeClaim |
Деплой
# Создать кластер
kind create cluster --name umnaya
# Создать папки для PV на ноде
docker exec umnaya-control-plane mkdir -p /var/lib/umnaya/{postgres,minio,kafka}
# Собрать образ и загрузить в kind
docker build -t umnaya-api .
kind load docker-image umnaya-api --name umnaya
# Применить манифесты
kubectl apply -f k8s/
# Проверить
kubectl get pods -n umnaya
# Открыть доступ к API (в отдельном терминале)
kubectl port-forward -n umnaya svc/api-service 8000:8000 --address 0.0.0.0
Особенности
- initContainer
wait-postgres: ждёт готовности PostgreSQL перед запуском API - initContainer
alembic-upgrade: применяет миграции перед стартом API - livenessProbe:
GET /healthz(порт 8000) - readinessProbe:
GET /readyz(порт 8000) - PersistentVolume: hostPath
/var/lib/umnaya/ - StorageClass:
manual(требует предварительного создания директорий)
Обновление
# Пересобрать и загрузить образ
docker build -t umnaya-api .
kind load docker-image umnaya-api --name umnaya
# Перезапустить поды (подхватят новый образ)
kubectl delete pod -n umnaya -l app=api
kubectl delete pod -n umnaya -l app=worker
Остановка
# Остановить все поды
kubectl scale deployment -n umnaya --all --replicas=0
# Удалить кластер
kind delete cluster --name umnaya
Dockerfile
FROM python:3.14-slim
WORKDIR /app
COPY requirements.txt .
RUN apt-get update && apt-get install -y --no-install-recommends g++ gcc && \
pip install --no-cache-dir -r requirements.txt && \
apt-get purge -y --auto-remove g++ gcc
COPY . .
EXPOSE 8000
CMD ["sh", "-c", "alembic upgrade head && exec uvicorn app.main:app --host 0.0.0.0 --port 8000"]
Образ используется как для API (uvicorn), так и для Worker (python -m app.worker).