# ./docker-compose.dev.yml name: gallery-archivist-dev services: # Backend Service (Django API) backend: build: context: ./backend/ dockerfile: Dockerfile # --- Add build arguments --- args: UID: ${UID:-1000} # Use UID from env, default to 1000 GID: ${GID:-1000} # Use GID from env, default to 1000 container_name: backend_dev command: python manage.py runserver 0.0.0.0:8080 volumes: - ./backend:/app # Mount local code for hot-reloading - ./media:/app/media # Mount the media folder outside of the container - ./tmp/test-data:/app/test-data:ro # Mount the test data folder ports: - "8080:8080" # Map host port 8080 to container port 8080 environment: # --- Django Settings --- - DJANGO_SETTINGS_MODULE=core.settings # Adjust 'core' if your settings are elsewhere - SECRET_KEY=django-insecure-replace-this-in-prod! # CHANGE THIS FOR PRODUCTION - DEBUG=1 # Development mode - ALLOWED_HOSTS=northpaw.aroy.hs.tun, backend # --- Initial Admin --- - DJANGO_SUPERUSER_USERNAME=aroy - DJANGO_SUPERUSER_PASSWORD=debitor12 - DJANGO_SUPERUSER_EMAIL=aroy-art@pm.me # --- Database Settings --- - DB_HOST=db # Use the database service #- DATABASE_URL=postgres://archivist:password@db:5432/archivist # --- Valkey/Celery Broker Settings --- - CELERY_BROKER_URL=redis://valkey:6379/0 # --- Celery Result Backend Settings --- - CELERY_RESULT_BACKEND=django-db # Using django-celery-results # --- Other Env Vars --- # Add any other environment variables your Django app needs depends_on: - db - valkey restart: unless-stopped # Frontend Service (React/Vite Dev Server) frontend: build: context: ./frontend dockerfile: Dockerfile # --- Add build arguments --- args: UID: ${UID:-1000} # Use UID from env, default to 1000 GID: ${GID:-1000} # Use GID from env, default to 1000 container_name: frontend_dev command: npm run dev -- --host # Runs the Vite dev server, accessible externally volumes: - ./frontend:/app # Mount local code - /app/node_modules # Use a volume for node_modules to avoid overwriting ports: - "5173:5173" # Map host port 5173 to container port 5173 environment: - NODE_ENV=development - VITE_PROXY_TARGET_API=http://backend:8080 # URL for frontend to reach backend API (via host) depends_on: - backend # Optional, ensures backend starts first, but not strictly needed for API calls restart: unless-stopped # Database Service (PostgreSQL) db: image: postgres:16-alpine # Use a specific version container_name: postgres_db_dev volumes: - postgres_data:/var/lib/postgresql/data # Persist data environment: - POSTGRES_DB=archivist - POSTGRES_USER=archivist - POSTGRES_PASSWORD=password - TZ=Europe/Berlin ports: - "5433:5432" # Map host port 5433 to container 5432 (avoids conflicts) restart: unless-stopped # Cache Service (Valkey) valkey: image: valkey/valkey:7.2 # Use official Valkey image container_name: valkey_cache_dev ports: - "6379:6379" # Map host port 6379 to container 6379 volumes: - valkey_data:/data # Persist Valkey data (optional for dev) restart: unless-stopped # Celery Worker Service celery_worker: build: context: ./backend dockerfile: Dockerfile # --- Add build arguments --- args: UID: ${UID:-1000} # Use UID from env, default to 1000 GID: ${GID:-1000} # Use GID from env, default to 1000 container_name: celery_worker_dev entrypoint: [""] # Adjust 'core' if your Celery app instance is named differently in core/celery.py command: celery -A core worker --loglevel=info volumes: - ./backend:/app # Mount code environment: # Inherit environment variables from backend (or redefine as needed) - DJANGO_SETTINGS_MODULE=core.settings - SECRET_KEY=django-insecure-replace-this-in-prod! - DEBUG=1 - DB_HOST=db # Use the database service - CELERY_BROKER_URL=redis://valkey:6379/0 - CELERY_RESULT_BACKEND=django-db depends_on: - backend # Depends on backend code - db - valkey restart: unless-stopped # Celery Beat Service (Scheduled Tasks) celery_beat: build: context: ./backend dockerfile: Dockerfile # --- Add build arguments --- args: UID: ${UID:-1000} # Use UID from env, default to 1000 GID: ${GID:-1000} # Use GID from env, default to 1000 container_name: celery_beat_dev entrypoint: [""] # Adjust 'core' if your Celery app instance is named differently # Requires django-celery-beat to be installed and configured command: celery -A core beat --loglevel=info --scheduler django_celery_beat.schedulers:DatabaseScheduler volumes: - ./backend:/app # Mount code environment: # Inherit environment variables from backend (or redefine as needed) - DJANGO_SETTINGS_MODULE=core.settings - SECRET_KEY=django-insecure-replace-this-in-prod! - DEBUG=1 - DB_HOST=db # Use the database service - DATABASE_URL=postgres://archivist:password@db:5432/archivist - CELERY_BROKER_URL=redis://valkey:6379/0 - CELERY_RESULT_BACKEND=django-db depends_on: - backend # Depends on backend code - db - valkey restart: unless-stopped # Flower Service (Celery Monitoring) flower: image: mher/flower:latest # Use official Flower image container_name: flower_monitor_dev ports: - "5555:5555" # Map host port 5555 to container 5555 environment: # Tell Flower how to connect to the Valkey broker - CELERY_BROKER_URL=redis://valkey:6379/0 # Set Flower's port inside the container (must match the 'ports' mapping) - FLOWER_PORT=5555 # Optional: Add basic auth for Flower UI # - FLOWER_BASIC_AUTH=user:password depends_on: - valkey - celery_worker # Wait for worker to likely be up restart: unless-stopped # pgAdmin Service (Database GUI) pgadmin: image: dpage/pgadmin4:latest # Use official pgAdmin image container_name: pgadmin_dev environment: - PGADMIN_DEFAULT_EMAIL=aroy-art@pm.me # Change as needed - PGADMIN_DEFAULT_PASSWORD=admin # CHANGE THIS! - PGADMIN_LISTEN_PORT=80 # Port inside the container pgAdmin listens on ports: - "5050:80" # Map host port 5050 to container port 80 volumes: - pgadmin_data:/var/lib/pgadmin # Persist pgAdmin configuration depends_on: - db # Wait for the database to be ready restart: unless-stopped # Define named volumes for data persistence volumes: postgres_data: valkey_data: pgadmin_data: # Define a default network networks: default: driver: bridge