From 5a8c7f63a3d99c5b619385b9de61d4e258c74352 Mon Sep 17 00:00:00 2001 From: forgeadm Date: Tue, 7 Apr 2026 15:48:05 +0200 Subject: [PATCH] Add docker-compose.yaml --- docker-compose.yaml | 164 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 docker-compose.yaml diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..9dae43e --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,164 @@ +# Journiv Production Docker Compose (SQLite). +# Journiv recommends using PostgreSQL based deployment instead. +# However, SQLite is still supported if you want to use it. +# +# Usage: +# docker compose -f docker-compose.sqlite.yml up -d +# +# Required Environment Variables: +# SECRET_KEY - Generate with: python -c "import secrets; print(secrets.token_urlsafe(32))" +# DOMAIN_NAME - Needed when running in same-origin SPA mode (ENABLE_CORS=false) + +x-common-valkey-env: &common-valkey-env + REDIS_URL: redis://valkey:6379/0 + CELERY_BROKER_URL: redis://valkey:6379/0 + CELERY_RESULT_BACKEND: redis://valkey:6379/0 + +x-celery-common: &celery-common + image: swalabtech/journiv-app:${APP_VERSION:-latest} + env_file: .env + volumes: + - ./data:/data + environment: + DB_DRIVER: sqlite + DATABASE_URL: sqlite:////data/journiv.db + depends_on: + valkey: + condition: service_healthy + networks: + - homelab + restart: unless-stopped + logging: + driver: "json-file" + options: + max-size: "50m" + max-file: "5" + deploy: + resources: + limits: + cpus: "1.0" + memory: 1g + reservations: + memory: 256m + +x-app-common: &app-common + image: swalabtech/journiv-app:${APP_VERSION:-latest} + env_file: .env + volumes: + - ./data:/data + environment: + DB_DRIVER: sqlite + DATABASE_URL: sqlite:////data/journiv.db + depends_on: + valkey: + condition: service_healthy + networks: + - homelab + restart: unless-stopped + logging: + driver: "json-file" + options: + max-size: "50m" + max-file: "5" + +x-celery-healthcheck: &celery-healthcheck + interval: 30s + timeout: 10s + retries: 5 + start_period: 40s + +services: + # Journiv uses Valkey which is similar to Redis for cache. + valkey: + image: valkey/valkey:9.0-alpine + container_name: journiv-valkey-cache + restart: unless-stopped + volumes: + - ./data/valkey:/data + networks: + - homelab + healthcheck: + test: ["CMD", "valkey-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s + + celery-worker: + <<: *celery-common + container_name: journiv-celery-worker + # Keep idle memory predictable for self-hosted deployments. + # Defaults can be overridden in .env without editing compose. + command: > + celery -A app.core.celery_app worker + --loglevel=info + --concurrency=${CELERY_WORKER_CONCURRENCY:-1} + --max-memory-per-child=${CELERY_WORKER_MAX_MEMORY_PER_CHILD_KB:-300000} + --max-tasks-per-child=${CELERY_WORKER_MAX_TASKS_PER_CHILD:-200} + environment: + <<: *common-valkey-env + SERVICE_ROLE: celery-worker + ENVIRONMENT: production + healthcheck: + <<: *celery-healthcheck + + celery-beat: + <<: *celery-common + container_name: journiv-celery-beat + command: celery -A app.core.celery_app beat --loglevel=info --scheduler redbeat.RedBeatScheduler --pidfile=/tmp/celerybeat.pid + environment: + <<: *common-valkey-env + SERVICE_ROLE: celery-beat + ENVIRONMENT: production + REDBEAT_REDIS_URL: redis://valkey:6379/2 + healthcheck: + <<: *celery-healthcheck + + app: + <<: *app-common + container_name: journiv-sqlite-app + #ports: + # - "${APP_PORT:-8000}:8000" + environment: + <<: *common-valkey-env + SERVICE_ROLE: app + ENVIRONMENT: production + RATE_LIMIT_STORAGE_URI: redis://valkey:6379/1 + networks: + - homelab + healthcheck: + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + deploy: + resources: + limits: + cpus: "2.0" + memory: 2g + reservations: + memory: 512m + + admin-cli: + <<: *app-common + container_name: journiv-sqlite-admin-cli + profiles: ["admin"] + command: ["sleep", "infinity"] + environment: + <<: *common-valkey-env + SERVICE_ROLE: admin-cli + ENVIRONMENT: production + # No healthcheck needed for idle container + healthcheck: + disable: true + deploy: + resources: + limits: + cpus: "1.0" + memory: 1g + reservations: + memory: 256m + +networks: + homelab: + external: true