version: '3.8' services: # ================================================================= # MariaDB Database Service # ================================================================= mariadb: image: mariadb:11.2 container_name: keepitgoing-db restart: unless-stopped environment: MYSQL_DATABASE: ${DB_NAME:-keepitgoing} MYSQL_USER: ${DB_USER:-keepitgoing} MYSQL_PASSWORD: ${DB_PASSWORD} MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} MYSQL_CHARACTER_SET_SERVER: utf8mb4 MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci volumes: - db_data:/var/lib/mysql networks: - backend healthcheck: test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] interval: 10s timeout: 5s retries: 5 start_period: 30s # ================================================================= # Redis Service - Message broker for Celery # ================================================================= redis: image: redis:7-alpine container_name: keepitgoing-redis restart: unless-stopped command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru volumes: - redis_data:/data networks: - backend healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 # ================================================================= # Django/Gunicorn Web Service # ================================================================= web: build: context: . dockerfile: Dockerfile container_name: keepitgoing-web restart: unless-stopped env_file: - .env.docker environment: DJANGO_SETTINGS_MODULE: config.settings.selfhosted DATABASE_URL: mysql://${DB_USER:-keepitgoing}:${DB_PASSWORD}@mariadb:3306/${DB_NAME:-keepitgoing} REDIS_URL: redis://redis:6379/0 volumes: - ./media:/app/media - static_files:/app/staticfiles ports: - "8000:8000" networks: - frontend - backend depends_on: mariadb: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/api/"] interval: 30s timeout: 10s retries: 3 start_period: 40s # ================================================================= # Celery Worker Service - Background task processor # ================================================================= celery-worker: build: context: . dockerfile: Dockerfile container_name: keepitgoing-celery-worker restart: unless-stopped env_file: - .env.docker environment: DJANGO_SETTINGS_MODULE: config.settings.selfhosted DATABASE_URL: mysql://${DB_USER:-keepitgoing}:${DB_PASSWORD}@mariadb:3306/${DB_NAME:-keepitgoing} REDIS_URL: redis://redis:6379/0 networks: - backend depends_on: mariadb: condition: service_healthy redis: condition: service_healthy command: celery-worker # ================================================================= # Celery Beat Service - Scheduled task scheduler # ================================================================= celery-beat: build: context: . dockerfile: Dockerfile container_name: keepitgoing-celery-beat restart: unless-stopped env_file: - .env.docker environment: DJANGO_SETTINGS_MODULE: config.settings.selfhosted DATABASE_URL: mysql://${DB_USER:-keepitgoing}:${DB_PASSWORD}@mariadb:3306/${DB_NAME:-keepitgoing} REDIS_URL: redis://redis:6379/0 networks: - backend depends_on: mariadb: condition: service_healthy redis: condition: service_healthy command: celery-beat # ================================================================= # Named Volumes # ================================================================= volumes: db_data: name: keepitgoing_db_data redis_data: name: keepitgoing_redis_data static_files: name: keepitgoing_static_files # ================================================================= # Networks # ================================================================= networks: frontend: name: keepitgoing_frontend backend: name: keepitgoing_backend