name: ${PROJECT_NAME:-diode}
services:
  ingress-nginx:
    image: nginx:latest
    command: >
      /bin/sh -c "echo 'upstream diode-ingester {
        server diode-ingester:8081;
      }
      upstream diode-reconciler {
        server diode-reconciler:8081;
      }
      server {
        listen 80;
        http2 on;
        server_name localhost;
        client_max_body_size 25m;
        location /diode/diode.v1.IngesterService {
          rewrite /diode/(.*) /$$1 break;
          grpc_pass grpc://diode-ingester;
        }
        location /diode/diode.v1.ReconcilerService {
          rewrite /diode/(.*) /$$1 break;
          grpc_pass grpc://diode-reconciler;
        }
      }'
      > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
    restart: always
    environment:
      - DIODE_NGINX_PORT=${DIODE_NGINX_PORT}
    ports:
      - ${DIODE_NGINX_PORT}:80
    depends_on:
      - diode-ingester
      - diode-reconciler

  diode-ingester:
    image: netboxlabs/diode-ingester:${DIODE_TAG:-latest}
    environment:
      - REDIS_PASSWORD=${REDIS_PASSWORD}
      - REDIS_HOST=${REDIS_HOST}
      - REDIS_PORT=${REDIS_PORT}
      - RECONCILER_GRPC_HOST=${RECONCILER_GRPC_HOST}
      - RECONCILER_GRPC_PORT=${RECONCILER_GRPC_PORT}
      - INGESTER_TO_RECONCILER_API_KEY=${INGESTER_TO_RECONCILER_API_KEY}
      - SENTRY_DSN=${SENTRY_DSN}
    restart: always
    ports: [ ]
    depends_on:
      - diode-redis
      - diode-reconciler

  diode-reconciler:
    image: netboxlabs/diode-reconciler:${DIODE_TAG:-latest}
    environment:
      - REDIS_PASSWORD=${REDIS_PASSWORD}
      - REDIS_HOST=${REDIS_HOST}
      - REDIS_PORT=${REDIS_PORT}
      - NETBOX_DIODE_PLUGIN_API_BASE_URL=${NETBOX_DIODE_PLUGIN_API_BASE_URL}
      - NETBOX_DIODE_PLUGIN_SKIP_TLS_VERIFY=${NETBOX_DIODE_PLUGIN_SKIP_TLS_VERIFY}
      - DIODE_TO_NETBOX_API_KEY=${DIODE_TO_NETBOX_API_KEY}
      - NETBOX_TO_DIODE_API_KEY=${NETBOX_TO_DIODE_API_KEY}
      - INGESTER_TO_RECONCILER_API_KEY=${INGESTER_TO_RECONCILER_API_KEY}
      - DIODE_API_KEY=${DIODE_API_KEY}
      - LOGGING_LEVEL=${LOGGING_LEVEL}
      - SENTRY_DSN=${SENTRY_DSN}
      - MIGRATION_ENABLED=${MIGRATION_ENABLED}
      - RECONCILER_RATE_LIMITER_RPS=${RECONCILER_RATE_LIMITER_RPS}
      - RECONCILER_RATE_LIMITER_BURST=${RECONCILER_RATE_LIMITER_BURST}
      - POSTGRES_HOST=${POSTGRES_HOST}
      - POSTGRES_PORT=${POSTGRES_PORT}
      - POSTGRES_DB_NAME=${POSTGRES_DB_NAME}
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    restart: always
    ports: [ ]
    volumes:
      - ../dbstore/postgres/migrations:/etc/diode/migrations:z,ro
    depends_on:
      diode-redis:
        condition: service_started
      postgres:
        condition: service_healthy

  diode-redis:
    image: redis/redis-stack-server:latest
    command:
      - sh
      - -c
      - redis-server --appendonly yes --dir /data --save 60 1 --requirepass $$REDIS_PASSWORD --loadmodule /opt/redis-stack/lib/rejson.so --loadmodule /opt/redis-stack/lib/redisearch.so --port $$REDIS_PORT
    environment:
      - REDIS_PASSWORD=${REDIS_PASSWORD}
      - REDIS_PORT=${REDIS_PORT}
    ports: [ ]
    volumes:
      - diode-redis-data:/data

  postgres:
    image: docker.io/postgres:16-alpine
    environment:
      - POSTGRES_DB=${POSTGRES_DB_NAME}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_USER=${POSTGRES_USER}
    ports:
      - ${POSTGRES_PORT:-5432}:5432
    healthcheck:
      test: pg_isready -q -t 2 -d $$POSTGRES_DB -U $$POSTGRES_USER
      start_period: 20s
      interval: 1s
      timeout: 5s
      retries: 5
    volumes:
      - diode-postgres-data:/var/lib/postgresql/data

volumes:
  diode-redis-data:
    driver: local
  diode-postgres-data:
    driver: local