name: docs

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

  redis:
    image: redis:5

  mailcatcher:
    image: sj26/mailcatcher:latest
    ports:
      - "1081:1080"

  minio:
    user: ${DOCKER_USER:-1000}
    image: minio/minio
    environment:
      - MINIO_ROOT_USER=impress
      - MINIO_ROOT_PASSWORD=password
    ports:
      - '9000:9000'
      - '9001:9001'
    healthcheck:
      test: ["CMD", "mc", "ready", "local"]
      interval: 1s
      timeout: 20s
      retries: 300
    entrypoint: ""
    command: minio server --console-address :9001 /data
    volumes:
      - ./data/media:/data

  createbuckets:
    image: minio/mc
    depends_on:
      minio:
        condition: service_healthy
        restart: true
    entrypoint: >
      sh -c "
      /usr/bin/mc alias set impress http://minio:9000 impress password && \
      /usr/bin/mc mb impress/impress-media-storage && \
      /usr/bin/mc version enable impress/impress-media-storage && \
      exit 0;"

  app-dev:
    build:
      context: .
      target: backend-development
      args:
        DOCKER_USER: ${DOCKER_USER:-1000}
    user: ${DOCKER_USER:-1000}
    image: impress:backend-development
    environment:
      - PYLINTHOME=/app/.pylint.d
      - DJANGO_CONFIGURATION=Development
    env_file:
      - env.d/development/common
      - env.d/development/common.local
      - env.d/development/postgresql
      - env.d/development/postgresql.local
    ports:
      - "8071:8000"
    networks:
      - default
      - lasuite-net
    volumes:
      - ./src/backend:/app
      - ./data/static:/data/static
    depends_on:
        postgresql:
            condition: service_healthy
            restart: true
        mailcatcher:
          condition: service_started
        redis:
          condition: service_started
        createbuckets:
          condition: service_started
  
  celery-dev:
    user: ${DOCKER_USER:-1000}
    image: impress:backend-development
    command: ["celery", "-A", "impress.celery_app", "worker", "-l", "DEBUG"]
    environment:
      - DJANGO_CONFIGURATION=Development
    env_file:
      - env.d/development/common
      - env.d/development/common.local
      - env.d/development/postgresql
      - env.d/development/postgresql.local
    volumes:
      - ./src/backend:/app
      - ./data/static:/data/static
    depends_on:
      - app-dev

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

  frontend-development:
    user: "${DOCKER_USER:-1000}"
    build: 
      context: .
      dockerfile: ./src/frontend/Dockerfile
      target: impress-dev
      args:
        API_ORIGIN: "http://localhost:8071"
        PUBLISH_AS_MIT: "false"
        SW_DEACTIVATED: "true"
    image: impress:frontend-development
    volumes:
      - ./src/frontend:/home/frontend
      - /home/frontend/node_modules
      - /home/frontend/apps/impress/node_modules
    ports:
      - "3000:3000"

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

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

  y-provider-development:
    user: ${DOCKER_USER:-1000}
    build: 
      context: .
      dockerfile: ./src/frontend/servers/y-provider/Dockerfile
      target: y-provider-development
    image: impress:y-provider-development
    restart: unless-stopped
    env_file:
      - env.d/development/common
      - env.d/development/common.local
    ports:
      - "4444:4444"
    volumes:
      - ./src/frontend/:/home/frontend
      - /home/frontend/node_modules
      - /home/frontend/servers/y-provider/node_modules

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

  keycloak:
    image: quay.io/keycloak/keycloak:26.3
    volumes:
      - ./docker/auth/realm.json:/opt/keycloak/data/import/realm.json
    command:
      - start-dev
      - --features=preview
      - --import-realm
      - --hostname=http://localhost:8083
      - --hostname-strict=false
      - --health-enabled=true
      - --metrics-enabled=true
    healthcheck:
      test: ['CMD-SHELL', 'exec 3<>/dev/tcp/localhost/9000; echo -e "GET /health/live HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n" >&3; grep "HTTP/1.1 200 OK" <&3']
      start_period: 5s
      interval: 1s
      timeout: 2s
      retries: 300
    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: impress
      KC_DB_SCHEMA: public
      PROXY_ADDRESS_FORWARDING: 'true'
    ports:
      - "8080:8080"
    depends_on:
      kc_postgresql:
        condition: service_healthy
        restart: true

networks:
  lasuite-net:
    name: lasuite-net
    driver: bridge
