diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..8cc6d8e --- /dev/null +++ b/.dockerignore @@ -0,0 +1,71 @@ +__pycache__ +*.pyc +*.pyo +*.pyd +.Python +env +pip-log.txt +pip-delete-this-directory.txt +.tox +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.log +.git +.mypy_cache +.pytest_cache +.hypothesis +.ruff_cache + +.DS_Store +.vscode +.idea +*.swp +*.swo +*~ + +*.md +!README.md + +.env +.env.local +.env.*.local +.env.production +.env.staging + +storage/chroma/* +!storage/chroma/.gitkeep + +articles_konsol_pro/* +!articles_konsol_pro/.gitkeep + +scripts/ +src/tests/ +src/__pycache__/ + +*.tmp +*.temp +*.bak +*.backup + +Dockerfile* +docker-compose* +.dockerignore + +.github +.gitlab-ci.yml +.travis.yml +.circleci +.gitea + +logs/ +*.log + +.venv/ +venv/ +env/ + +Техническое задание.md \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2d81b2d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,38 @@ +FROM python:3.10-slim + +LABEL maintainer="AI Email Assistant Team" +LABEL version="1.0.0" +LABEL description="AI Email Assistant with RAG and LangGraph" + +RUN groupadd -r appuser && useradd -r -g appuser appuser + +WORKDIR /app + +RUN apt-get update && apt-get install -y \ + gcc \ + g++ \ + curl \ + && rm -rf /var/lib/apt/lists/* \ + && apt-get clean + +COPY requirements.txt . +RUN pip install --no-cache-dir --upgrade pip && \ + pip install --no-cache-dir -r requirements.txt + +COPY . . + +RUN mkdir -p /app/storage/chroma /app/data/articles_konsol_pro && \ + chown -R appuser:appuser /app + +USER appuser + +ENV PYTHONPATH=/app +ENV PYTHONUNBUFFERED=1 +ENV PYTHONDONTWRITEBYTECODE=1 + +EXPOSE 8000 + +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD curl -f http://localhost:8000/healthz || exit 1 + +CMD ["uvicorn", "src.app.main:app", "--host", "0.0.0.0", "--port", "8000"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..9b0e5dd --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,51 @@ +version: '3.8' + +services: + ai-email-assistant: + build: + context: . + dockerfile: Dockerfile + container_name: ai-email-assistant + ports: + - "8000:8000" + environment: + - LLM_PROVIDER=openai + - LLM_MODEL=gpt-4o + - EMBEDDING_MODEL=text-embedding-3-large + - OPENAI_API_KEY=${OPENAI_API_KEY} + - GEMINI_API_KEY=${GEMINI_API_KEY} + - CHROMA_PERSIST_DIR=/app/storage/chroma + - TOP_K=30 + - TOP_N_CONTEXT=6 + - MAX_TOKENS_COMPLETION=1024 + - LANGGRAPH_TRACING=false + - SERVICE_LANG=ru + - SALES_REP_NAME=Команда Консоль.Про + - CHUNK_SIZE=500 + - CHUNK_OVERLAP=100 + - API_SECRET_KEY=${API_SECRET_KEY:-secret} + - PYTHONPATH=/app + - PYTHONUNBUFFERED=1 + - PYTHONDONTWRITEBYTECODE=1 + volumes: + - ./storage/chroma:/app/storage/chroma:rw + - ./data:/app/data:ro + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8000/healthz"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + restart: unless-stopped + deploy: + resources: + limits: + memory: 2G + cpus: '1.0' + reservations: + memory: 512M + cpus: '0.5' + security_opt: + - no-new-privileges:true + tmpfs: + - /tmp:noexec,nosuid,size=100m