diff --git a/infra/docker-compose.yaml b/infra/docker-compose.yaml index 6a4fef0..c73f218 100644 --- a/infra/docker-compose.yaml +++ b/infra/docker-compose.yaml @@ -17,6 +17,13 @@ services: interval: 10s timeout: 5s retries: 5 + networks: + - call-review-network volumes: postgres_data: + +networks: + call-review-network: + name: call-review-network + driver: bridge diff --git a/services/ingest-service/.dockerignore b/services/ingest-service/.dockerignore new file mode 100644 index 0000000..20a1267 --- /dev/null +++ b/services/ingest-service/.dockerignore @@ -0,0 +1,40 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +venv/ +env/ +ENV/ +.venv + +# IDEs +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# Git +.git/ +.gitignore + +# Documentation +README.md +*.md + +# Environment files +.env +.env.* + +# Testing +.pytest_cache/ +.coverage +htmlcov/ +*.log + +# OS +.DS_Store +Thumbs.db + diff --git a/services/ingest-service/Dockerfile b/services/ingest-service/Dockerfile index afea30f..b38f071 100644 --- a/services/ingest-service/Dockerfile +++ b/services/ingest-service/Dockerfile @@ -1,11 +1,40 @@ -FROM python:3.9-slim +# Multi-stage build для уменьшения размера образа +FROM python:3.9-slim as builder WORKDIR /app COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt +RUN pip install --user --no-cache-dir -r requirements.txt -COPY app ./app +# Финальный образ +FROM python:3.9-slim +WORKDIR /app + +# Создаем непривилегированного пользователя для безопасности +RUN useradd -m -u 1000 appuser && \ + chown -R appuser:appuser /app + +# Копируем установленные пакеты из builder stage +COPY --from=builder --chown=appuser:appuser /root/.local /home/appuser/.local + +# Копируем код приложения +COPY --chown=appuser:appuser app ./app + +# Копируем файлы миграций Alembic +COPY --chown=appuser:appuser alembic ./alembic +COPY --chown=appuser:appuser alembic.ini . + +# Переключаемся на непривилегированного пользователя +USER appuser + +# Добавляем установленные пакеты в PATH +ENV PATH=/home/appuser/.local/bin:$PATH + +# Healthcheck для проверки состояния сервиса +HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \ + CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health').read()" || exit 1 + +# Запуск приложения CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/services/ingest-service/README.md b/services/ingest-service/README.md index 07ad648..47e383b 100644 --- a/services/ingest-service/README.md +++ b/services/ingest-service/README.md @@ -40,14 +40,37 @@ ingest-service/ ### 1. Запуск через Docker Compose (рекомендуется) +**Шаг 1: Запустить инфраструктуру (PostgreSQL)** ```bash -# Запустить все сервисы (PostgreSQL + приложение) +# Из корня проекта +cd infra +docker-compose up -d + +# Проверить, что PostgreSQL запущен +docker-compose ps +``` + +**Шаг 2: Запустить микросервис ingest-service** +```bash +# Из папки микросервиса +cd ../services/ingest-service docker-compose up -d # Проверить логи -docker-compose logs -f app +docker-compose logs -f -# Остановить сервисы +# Проверить статус +docker-compose ps +``` + +**Остановка сервисов:** +```bash +# Остановить микросервис +cd services/ingest-service +docker-compose down + +# Остановить инфраструктуру +cd ../../infra docker-compose down ``` @@ -58,6 +81,13 @@ Swagger документация: http://localhost:8000/docs ### 2. Локальный запуск для разработки ```bash +# Запустить только PostgreSQL через Docker +cd ../../infra +docker-compose up -d postgres + +# Вернуться в папку сервиса +cd ../services/ingest-service + # Создать виртуальное окружение python -m venv venv source venv/bin/activate # для Linux/Mac @@ -67,10 +97,11 @@ venv\Scripts\activate # для Windows # Установить зависимости pip install -r requirements.txt -# Запустить только PostgreSQL через Docker -docker-compose up -d postgres - # Убедиться, что файл .env настроен правильно +# DATABASE_URL=postgresql+asyncpg://postgres:postgres@localhost:5432/ingest_db + +# Применить миграции +alembic upgrade head # Запустить приложение uvicorn app.main:app --reload --host 0.0.0.0 --port 8000 diff --git a/services/ingest-service/docker-compose.yaml b/services/ingest-service/docker-compose.yaml new file mode 100644 index 0000000..16711bf --- /dev/null +++ b/services/ingest-service/docker-compose.yaml @@ -0,0 +1,32 @@ +version: "3.8" + +services: + ingest-service: + build: + context: . + dockerfile: Dockerfile + container_name: ingest-service + environment: + # Подключение к PostgreSQL из infra/docker-compose.yaml + DATABASE_URL: postgresql+asyncpg://postgres:postgres@ingest-postgres:5432/ingest_db + APP_HOST: 0.0.0.0 + APP_PORT: 8000 + ports: + - "8000:8000" + networks: + - call-review-network + restart: unless-stopped + # Запускаем миграции перед стартом приложения + command: > + sh -c "alembic upgrade head && uvicorn app.main:app --host 0.0.0.0 --port 8000" + healthcheck: + test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health').read()"] + interval: 30s + timeout: 3s + start_period: 10s + retries: 3 + +networks: + call-review-network: + external: true + name: call-review-network