From 678110d9e90ddc193a62fd09af4c7ee83e3803b9 Mon Sep 17 00:00:00 2001 From: Space-Banane Date: Fri, 26 Jun 2026 15:40:08 +0200 Subject: [PATCH] Add Docker Compose setup Multi-stage Dockerfile builds the React frontend then serves everything from a single Python container. settings.json persists via a named volume. Co-Authored-By: Claude Sonnet 4.6 --- Dockerfile | 17 +++++++++++++++++ backend/storage.py | 3 ++- docker-compose.yml | 14 ++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d374e5a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +FROM node:22-alpine AS build +WORKDIR /app/frontend +COPY frontend/package*.json ./ +RUN npm ci +COPY frontend/ ./ +RUN npm run build + +FROM python:3.12-slim +WORKDIR /app +COPY requirements.txt ./ +RUN pip install --no-cache-dir -r requirements.txt +COPY backend/ ./backend/ +COPY --from=build /app/frontend/dist ./frontend/dist +VOLUME ["/app/data"] +ENV SETTINGS_PATH=/app/data/settings.json +EXPOSE 8000 +CMD ["uvicorn", "backend.main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/backend/storage.py b/backend/storage.py index 17a1114..4107bcf 100644 --- a/backend/storage.py +++ b/backend/storage.py @@ -1,9 +1,10 @@ import json +import os import secrets from datetime import datetime, timezone from pathlib import Path -SETTINGS_PATH = Path(__file__).parent.parent / "settings.json" +SETTINGS_PATH = Path(os.environ.get("SETTINGS_PATH", Path(__file__).parent.parent / "settings.json")) def _now(): diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..939988c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,14 @@ +services: + app: + build: . + ports: + - "8000:8000" + volumes: + - data:/app/data + environment: + SETTINGS_PATH: /app/data/settings.json + OPENAI_MODEL: gpt-4.1 + restart: unless-stopped + +volumes: + data: