Перейти к содержанию

Docker Compose

Сервисы

flowchart LR
    App[aima-app]
    Worker[aima-celery-worker]
    Beat[aima-celery-beat]
    Redis[aima-redis]
    PG[aima-postgres]
    Chroma[aima-chroma volume]
    App --> Redis
    Worker --> Redis
    Beat --> Redis
    App --> PG
    App --> Chroma
    App --> Storage[(aima-data / storage)]
    Worker --> Storage
Сервис Образ / build Назначение
app (aima-app) aima-app:latest FastAPI + static
celery_worker same Celery worker
celery_beat same Celery Beat (бэкап, self-heal)
redis (aima-redis) redis:7-alpine Брокер, кэш
postgres (aima-postgres) postgres Prod DB
mock_rag (aima-mock-rag) profile mock-rag Демо внешний RAG

Файлы

Файл Назначение
docker-compose.yml Локальная разработка / база
docker-compose.prod.yml Продакшен VPS overlay
Dockerfile Multi-stage build

Локальный запуск

cp .env.example .env
# Отредактируйте SECRET_KEY, AGE keys

docker compose up -d --build
docker compose logs -f app

Приложение: http://localhost:8001

Опционально mock RAG:

docker compose --profile mock-rag up -d mock_rag

Продакшен

docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build

Volumes и mounts

Volume / mount Путь Данные
aima-data / ./medinsight.db БД (SQLite path из .env.example)
aima-postgres PostgreSQL data
aima-chroma Chroma RAG
./storage Документы, DICOM
./backups / aima-backups Архивы
./site:/app/site:ro Собранная MkDocs-документация

Warning

Не удаляйте volumes при docker compose down без бэкапа.

Переменные в compose

Передаются через env_file: .env или environment: в compose-файле.

Перезапуск vs пересоздание

docker compose restart app не подхватывает новые ключи из .env. Используйте docker compose up -d --force-recreate app celery_worker или ./deploy.sh production.

Сборка

Dockerfile оптимизирован для VPS:

  • PIP_DEFAULT_TIMEOUT=300
  • PIP_RETRIES=5

Полезные команды

# Пересборка одного сервиса
docker compose build app

# Shell в контейнере
docker compose exec app bash

# Миграции (legacy или Alembic)
docker compose exec app bash -c 'python scripts/run_alembic_migrate.py'  # если ALEMBIC_ENABLED=true
# иначе deploy.sh / lifespan применяют create_all + app/db/migrations

# Очистка (без volumes)
./scripts/docker_cleanup.sh deploy

Healthcheck

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:8001/health/ready"]
  interval: 30s
  timeout: 10s
  retries: 3

Порты

Сервис Host:Container
app 8001:8001 (APP_PORT)
redis 6380:6379 (REDIS_HOST_PORT)
mock_rag см. compose profile