version: '3.8' # Demo stack secrets — override via .env file or environment variables. # These are NOT production credentials. Generate your own before deploying. x-dd-secrets: &dd-secrets DD_SECRET_KEY: ${DD_SECRET_KEY:-CHANGE_ME_generate_a_random_secret_key} DD_CREDENTIAL_AES_256_KEY: ${DD_CREDENTIAL_AES_256_KEY:-CHANGE_ME_generate_a_base64_aes_key} services: # PostgreSQL for Charybdis postgres-charybdis: image: postgres:15-alpine container_name: charybdis-postgres environment: POSTGRES_DB: charybdis POSTGRES_USER: charybdis POSTGRES_PASSWORD: ${CHARYBDIS_DB_PASSWORD:-charybdis} ports: - "5432:5432" volumes: - charybdis-postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U charybdis"] interval: 10s timeout: 5s retries: 5 networks: - charybdis-network # PostgreSQL for DefectDojo postgres-defectdojo: image: postgres:15-alpine container_name: defectdojo-postgres environment: POSTGRES_DB: defectdojo POSTGRES_USER: defectdojo POSTGRES_PASSWORD: ${DD_DB_PASSWORD:-defectdojo} volumes: - defectdojo-postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U defectdojo"] interval: 10s timeout: 5s retries: 5 networks: - charybdis-network # Redis for DefectDojo redis-defectdojo: image: redis:7-alpine container_name: defectdojo-redis networks: - charybdis-network # DefectDojo defectdojo-uwsgi: image: defectdojo/defectdojo-django:2.38.1 platform: linux/amd64 # Force x86_64 emulation for ARM64 (Mac Silicon) container_name: defectdojo-uwsgi depends_on: postgres-defectdojo: condition: service_healthy redis-defectdojo: condition: service_started environment: DD_DEBUG: 'True' DD_ALLOWED_HOSTS: '*' DD_DATABASE_URL: postgresql://defectdojo:${DD_DB_PASSWORD:-defectdojo}@postgres-defectdojo:5432/defectdojo DD_CELERY_BROKER_URL: redis://redis-defectdojo:6379/0 <<: *dd-secrets DD_INITIALIZE: 'true' DD_ADMIN_USER: ${DD_ADMIN_USER:-admin} DD_ADMIN_PASSWORD: ${DD_ADMIN_PASSWORD:-admin} DD_ADMIN_MAIL: 'admin@example.com' ports: - "8080:8081" # DefectDojo HTTP endpoint is on 8081 inside container volumes: - defectdojo-media:/app/media networks: - charybdis-network # Healthcheck disabled - DefectDojo takes time to initialize # Access will be available after ~2 minutes # healthcheck: # test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8080/').read()"] # interval: 30s # timeout: 10s # retries: 5 # start_period: 120s # DefectDojo Celery Worker defectdojo-celery: image: defectdojo/defectdojo-django:2.38.1 platform: linux/amd64 # Force x86_64 emulation for ARM64 (Mac Silicon) container_name: defectdojo-celery depends_on: - defectdojo-uwsgi - redis-defectdojo environment: DD_DATABASE_URL: postgresql://defectdojo:${DD_DB_PASSWORD:-defectdojo}@postgres-defectdojo:5432/defectdojo DD_CELERY_BROKER_URL: redis://redis-defectdojo:6379/0 <<: *dd-secrets entrypoint: ['/entrypoint-celery-worker.sh'] networks: - charybdis-network # DefectDojo Celery Beat defectdojo-beat: image: defectdojo/defectdojo-django:2.38.1 platform: linux/amd64 # Force x86_64 emulation for ARM64 (Mac Silicon) container_name: defectdojo-beat depends_on: - defectdojo-celery environment: DD_DATABASE_URL: postgresql://defectdojo:${DD_DB_PASSWORD:-defectdojo}@postgres-defectdojo:5432/defectdojo DD_CELERY_BROKER_URL: redis://redis-defectdojo:6379/0 <<: *dd-secrets entrypoint: ['/entrypoint-celery-beat.sh'] networks: - charybdis-network # Keycloak (Identity Provider) keycloak: image: quay.io/keycloak/keycloak:24.0 container_name: charybdis-keycloak command: start-dev --import-realm environment: KEYCLOAK_ADMIN: admin KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD:-admin} ports: - "8082:8080" volumes: - ./scripts/keycloak/charybdis-realm.json:/opt/keycloak/data/import/charybdis-realm.json:ro healthcheck: test: ["CMD-SHELL", "exec 3<>/dev/tcp/localhost/8080 && echo -e 'GET /health/ready HTTP/1.1\r\nHost: localhost\r\n\r\n' >&3 && cat <&3 | grep -q '200'"] interval: 10s timeout: 5s retries: 15 start_period: 30s networks: - charybdis-network # Charybdis charybdis: build: context: .. dockerfile: Dockerfile container_name: charybdis depends_on: postgres-charybdis: condition: service_healthy keycloak: condition: service_healthy defectdojo-uwsgi: condition: service_started # Changed from service_healthy since healthcheck is disabled environment: DATABASE_URL: postgresql://charybdis:${CHARYBDIS_DB_PASSWORD:-charybdis}@postgres-charybdis:5432/charybdis RUST_LOG: info DEFECTDOJO_API_URL: http://defectdojo-uwsgi:8081 DEFECTDOJO_API_TOKEN: ${DEFECTDOJO_API_TOKEN:-changeme} ports: - "50051:50051" # gRPC - "8081:8080" # YAML adapter volumes: - ./config.toml:/app/config.toml:ro networks: - charybdis-network restart: unless-stopped # Backstage (commented out - requires custom build) # To enable Backstage: # 1. Follow https://backstage.io/docs/getting-started/create-an-app # 2. Build Docker image: cd backstage-app && yarn install && yarn build # 3. Uncomment this section and postgres-backstage below # backstage: # build: # context: ./backstage-app # dockerfile: Dockerfile # container_name: backstage # depends_on: # - charybdis # - postgres-backstage # environment: # POSTGRES_HOST: postgres-backstage # POSTGRES_PORT: 5432 # POSTGRES_USER: backstage # POSTGRES_PASSWORD: backstage # CHARYBDIS_URL: http://charybdis:8080 # ports: # - "3000:3000" # - "7007:7007" # volumes: # - ./backstage/app-config.yaml:/app/app-config.yaml:ro # networks: # - charybdis-network # restart: unless-stopped # postgres-backstage: # image: postgres:15-alpine # container_name: backstage-postgres # environment: # POSTGRES_DB: backstage # POSTGRES_USER: backstage # POSTGRES_PASSWORD: backstage # volumes: # - backstage-postgres-data:/var/lib/postgresql/data # healthcheck: # test: ["CMD-SHELL", "pg_isready -U backstage"] # interval: 10s # timeout: 5s # retries: 5 # networks: # - charybdis-network # Helper: grpcurl for testing grpcurl: image: fullstorydev/grpcurl:latest container_name: charybdis-grpcurl network_mode: service:charybdis entrypoint: ["/bin/sh"] command: ["-c", "sleep infinity"] profiles: - tools volumes: charybdis-postgres-data: defectdojo-postgres-data: defectdojo-media: # backstage-postgres-data: # Uncomment if enabling Backstage networks: charybdis-network: driver: bridge