From 686ec17c430a4758a0762e20d1e4816da8a6925b Mon Sep 17 00:00:00 2001 From: jessikitty Date: Thu, 24 Sep 2026 19:49:04 +1000 Subject: [PATCH] Add compose stack: app + Postgres 16, named volumes --- docker-compose.yml | 61 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..e1c50fd --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,61 @@ +# LEGO Instructions Manager - Docker Compose stack +# +# docker compose up -d --build +# +# Configuration lives in .env next to this file (copy .env.docker.example). +# Created by: Jess Rogerson (yelling commands at Claude.AI) + +services: + db: + image: postgres:16-alpine + container_name: lim-db + restart: unless-stopped + environment: + POSTGRES_DB: ${POSTGRES_DB:-lim} + POSTGRES_USER: ${POSTGRES_USER:-lim} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD must be set in .env} + # Keeps index/sort behaviour stable across Postgres upgrades. + POSTGRES_INITDB_ARGS: "--encoding=UTF8 --locale=C" + volumes: + - lim-db:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-lim} -d ${POSTGRES_DB:-lim}"] + interval: 10s + timeout: 5s + retries: 10 + start_period: 20s + # Not published to the host: only the app container needs to reach it. + expose: + - "5432" + + app: + build: + context: . + dockerfile: Dockerfile + image: lim:latest + container_name: lim-app + restart: unless-stopped + depends_on: + db: + condition: service_healthy + environment: + FLASK_APP: run.py + FLASK_ENV: production + SECRET_KEY: ${SECRET_KEY:?SECRET_KEY must be set in .env} + DATABASE_URL: postgresql+psycopg://${POSTGRES_USER:-lim}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB:-lim} + UPLOAD_FOLDER: /data/uploads + BACKUP_FOLDER: /data/backups + BACKUP_KEEP: ${BACKUP_KEEP:-7} + MAX_CONTENT_LENGTH: ${MAX_CONTENT_LENGTH:-52428800} + SETS_PER_PAGE: ${SETS_PER_PAGE:-20} + BRICKSET_API_KEY: ${BRICKSET_API_KEY:-} + BRICKSET_USERNAME: ${BRICKSET_USERNAME:-} + BRICKSET_PASSWORD: ${BRICKSET_PASSWORD:-} + volumes: + - lim-data:/data + ports: + - "${LIM_PORT:-8000}:8000" + +volumes: + lim-db: + lim-data: