services:
  postgresql:
    image: postgres:16
    platform: linux/amd64
    env_file:
      - env.d/development/postgresql
    ports:
      - "15432:5432"
    healthcheck:
      test: [ "CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}" ]
      interval: 1s
      timeout: 2s
      retries: 300

  redis:
    image: redis:5

  maildev:
    image: maildev/maildev:latest
    ports:
      - "1081:1080"

  app-dev:
    build:
      context: .
      target: backend-development
      args:
        DOCKER_USER: ${DOCKER_USER:-1000}
    user: ${DOCKER_USER:-1000}
    image: people:backend-development
    pull_policy: never
    environment:
      - PYLINTHOME=/app/.pylint.d
      - DJANGO_CONFIGURATION=Development
    env_file:
      - env.d/development/common
      - env.d/development/france
      - env.d/development/postgresql
    ports:
      - "8071:8000"
    volumes:
      - ./src/backend:/app
      - ./data/media:/data/media
      - ./data/static:/data/static
    depends_on:
      postgresql:
        condition: service_healthy
        restart: true
      dimail:
        condition: service_started
      maildev:
        condition: service_started
      redis:
        condition: service_started

  frontend-dev:
    user: "${DOCKER_USER:-1000}"
    build:
      context: .
      dockerfile: ./src/frontend/Dockerfile
      target: frontend-dev
    image: people:frontend-development
    pull_policy: never
    volumes:
      - ./src/frontend:/home/frontend
      - /home/frontend/node_modules
      - /home/frontend/apps/desk/node_modules
    ports:
      - "3000:3000"

  app:
    build:
      context: .
      target: backend-production
      args:
        DOCKER_USER: ${DOCKER_USER:-1000}
    user: ${DOCKER_USER:-1000}
    image: people:backend-production
    environment:
      - DJANGO_CONFIGURATION=Development
    env_file:
      - env.d/development/common
      - env.d/development/france
      - env.d/development/postgresql
    ports:
      - "8071:8000"
    volumes:
      - ./data/media:/data/media
    depends_on:
      postgresql:
        condition: service_healthy
        restart: true
      redis:
        condition: service_started

  frontend:
    user: "${DOCKER_USER:-1000}"
    build:
      context: .
      dockerfile: ./src/frontend/Dockerfile
      target: frontend-production
      args:
        API_ORIGIN: "http://localhost:8071"
    image: people:frontend-production
    pull_policy: build
    ports:
      - "3000:3000"

  celery-dev:
    user: ${DOCKER_USER:-1000}
    image: people:backend-development
    command: ["celery", "-A", "people.celery_app", "worker", "-l", "DEBUG"]
    environment:
      - DJANGO_CONFIGURATION=Development
    env_file:
      - env.d/development/common
      - env.d/development/postgresql
    volumes:
      - ./src/backend:/app
      - ./data/media:/data/media
      - ./data/static:/data/static
    depends_on:
      postgresql:
        condition: service_healthy
        restart: true
      app-dev:
        condition: service_started

  celery-beat-dev:
    user: ${DOCKER_USER:-1000}
    image: people:backend-development
    command: ["celery", "-A", "people.celery_app", "beat", "-l", "DEBUG"]
    environment:
      - DJANGO_CONFIGURATION=Development
    env_file:
      - env.d/development/common
      - env.d/development/postgresql
    volumes:
      - ./src/backend:/app
      - ./data/media:/data/media
      - ./data/static:/data/static
    depends_on:
      postgresql:
        condition: service_healthy
        restart: true

  celery:
    user: ${DOCKER_USER:-1000}
    image: people:backend-production
    command: ["celery", "-A", "people.celery_app", "worker", "-l", "INFO"]
    environment:
      - DJANGO_CONFIGURATION=Demo
    env_file:
      - env.d/development/common
      - env.d/development/postgresql
    depends_on:
      postgresql:
        condition: service_healthy
        restart: true
      app:
        condition: service_started

  celery-beat:
    user: ${DOCKER_USER:-1000}
    image: people:backend-production
    command: ["celery", "-A", "people.celery_app", "beat", "-l", "INFO"]
    environment:
      - DJANGO_CONFIGURATION=Demo
    env_file:
      - env.d/development/common
      - env.d/development/postgresql
    volumes:
      - ./src/backend:/app
      - ./data/media:/data/media
      - ./data/static:/data/static
    depends_on:
      postgresql:
        condition: service_healthy
        restart: true

  nginx:
    image: nginx:1.25
    ports:
      - "8083:8083"
    volumes:
      - ./docker/files/etc/nginx/conf.d:/etc/nginx/conf.d:ro
    depends_on:
      keycloak:
        condition: service_healthy
        restart: true

  crowdin:
    image: crowdin/cli:4.6.1
    volumes:
      - ".:/app"
    env_file:
      - env.d/development/crowdin
    user: "${DOCKER_USER:-1000}"
    working_dir: /app

  node:
    image: node:22
    user: "${DOCKER_USER:-1000}"
    environment:
      HOME: /tmp
    volumes:
      - ".:/app"

  kc_postgresql:
    image: postgres:14.3
    ports:
      - "5433:5432"
    env_file:
      - env.d/development/kc_postgresql
    healthcheck:
      test: [ "CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}" ]
      interval: 1s
      timeout: 2s
      retries: 300

  keycloak:
    image: quay.io/keycloak/keycloak:20.0.1
    volumes:
      - ./docker/auth/realm.json:/opt/keycloak/data/import/realm.json
    extra_hosts:
      - "host.docker.internal:host-gateway"
    command:
      - start-dev
      - --features=preview
      - --import-realm
      - --proxy=edge
      - --hostname-url=http://localhost:8083
      - --hostname-admin-url=http://localhost:8083/
      - --hostname-strict=false
      - --hostname-strict-https=false
      - --health-enabled=true
      - --metrics-enabled=true
    environment:
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
      KC_DB: postgres
      KC_DB_URL_HOST: kc_postgresql
      KC_DB_URL_DATABASE: keycloak
      KC_DB_PASSWORD: pass
      KC_DB_USERNAME: people
      KC_DB_SCHEMA: public
      PROXY_ADDRESS_FORWARDING: 'true'
    healthcheck:
      test: [ "CMD", "curl", "--head", "-fsS", "http://localhost:8080/health/ready" ]
      interval: 1s
      timeout: 2s
      retries: 300
    ports:
      - "8080:8080"
    depends_on:
      kc_postgresql:
        condition: service_healthy
        restart: true

  dimail: 
    entrypoint: /opt/dimail-api/start-dev.sh
    image: registry.mim-libre.fr/dimail/dimail-api:v0.5.2
    pull_policy: always
    environment:
      DIMAIL_MODE: FAKE
      DIMAIL_JWT_SECRET: fake_jwt_secret
    ports:
      - "8001:8000"

  flower-dev:
    user: ${DOCKER_USER:-1000}
    image: people:backend-development
    command: ["celery", "-A", "people.celery_app", "flower", "--port=5555"]
    environment:
      - DJANGO_CONFIGURATION=Development
    env_file:
      - env.d/development/common
      - env.d/development/postgresql
    ports:
      - "5555:5555"
    volumes:
      - ./src/backend:/app
    depends_on:
      - celery-dev
      - redis
