From b7de6912db43ab6bd0f5cfac7b04a54974b46146 Mon Sep 17 00:00:00 2001 From: Egor Deev Date: Fri, 2 Oct 2026 13:31:03 +0000 Subject: [PATCH] =?UTF-8?q?Docker:=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B7=20?= =?UTF-8?q?=D1=81=20Chromium=20=D0=B4=D0=BB=D1=8F=20=D1=8D=D0=BA=D1=81?= =?UTF-8?q?=D0=BF=D0=BE=D1=80=D1=82=D0=B0,=20compose=20=D0=B2=D0=BC=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=B5=20=D1=81=20PostgreSQL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Dockerfile на python:3.12-slim с Playwright/Chromium, миграции при старте, gunicorn, непривилегированный пользователь; - compose.yaml: приложение + PostgreSQL 16 с томом и проверкой готовности; - .env.example переписан: SECRET_KEY, ИИ-провайдер, DATABASE_URL или DB_*; - .gitignore. --- .dockerignore | 10 ++++++++++ .env.example | 26 ++++++++++++-------------- .gitignore | 7 +++++++ Dockerfile | 20 ++++++++++++++++++++ compose.yaml | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 82 insertions(+), 14 deletions(-) create mode 100644 .dockerignore create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 compose.yaml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..1bf77c0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,10 @@ +.git +.github +**/__pycache__ +.venv +venv +.env +tests +docs +*.md +*.pdf diff --git a/.env.example b/.env.example index b6be73b..7ab9fcf 100644 --- a/.env.example +++ b/.env.example @@ -1,17 +1,15 @@ -# ── OpenAI API ────────────────────────────────────────────────── +# Flask: длинная случайная строка, без неё приложение не запустится +SECRET_KEY= +# ИИ-провайдер с OpenAI-совместимым API (распознавание фото и генерация трекеров) OPENAI_API_KEY= -OPENAI_BASE_URL= -OPENAI_MODEL= +# OPENAI_BASE_URL=https://api.openai.com/v1 +OPENAI_MODEL=gpt-4o -# ── PostgreSQL ───────────────────────────────────────────────── - -DB_HOST= -DB_PORT= -DB_NAME= -DB_USER= -DB_PASSWORD= - -# ── Переменные окружения ─────────────────────────────────────── - -PYTHONDONTWRITEBYTECODE=1 \ No newline at end of file +# PostgreSQL: либо DATABASE_URL целиком, либо DB_* по отдельности +# DATABASE_URL=postgresql://tablo:tablo@localhost:5432/tablo +DB_HOST=localhost +DB_PORT=5432 +DB_NAME=tablo +DB_USER=tablo +DB_PASSWORD=tablo diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..986ec87 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +__pycache__/ +*.py[cod] +.venv/ +venv/ +.env +.pytest_cache/ +.ruff_cache/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8848ea1 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +FROM python:3.12-slim + +ENV PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 \ + FLASK_APP=run.py \ + PLAYWRIGHT_BROWSERS_PATH=/ms-playwright + +WORKDIR /app + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt \ + && playwright install --with-deps chromium \ + && rm -rf /var/lib/apt/lists/* + +COPY . . +RUN useradd --create-home --uid 1000 app && chown -R app:app /app +USER app + +EXPOSE 8000 +CMD ["sh", "-c", "flask db upgrade && gunicorn run:app --bind 0.0.0.0:8000 --workers 2 --timeout 120 --access-logfile -"] diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..a3cb58e --- /dev/null +++ b/compose.yaml @@ -0,0 +1,33 @@ +services: + db: + image: postgres:16-alpine + environment: + POSTGRES_USER: tablo + POSTGRES_PASSWORD: ${DB_PASSWORD:-tablo} + POSTGRES_DB: tablo + volumes: + - pgdata:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U tablo"] + interval: 5s + retries: 10 + restart: unless-stopped + + web: + build: . + image: ghcr.io/edeev/tablo:latest + depends_on: + db: + condition: service_healthy + ports: + - "8000:8000" + env_file: + - path: .env + required: false + environment: + SECRET_KEY: ${SECRET_KEY:-change-me-to-a-long-random-string} + DATABASE_URL: postgresql://tablo:${DB_PASSWORD:-tablo}@db:5432/tablo + restart: unless-stopped + +volumes: + pgdata: