version: '3.4'

services:
  nginx:
    image: nginx:stable-alpine
    volumes:
      - ./.docker/nginx/default.conf.template:/etc/nginx/templates/default.conf.template:ro
    ports:
      - '8080:80'
    environment:
      CORE_API_URI: http://core-api:8081
      STATEMENTS_API_URI: http://statements-api:8081
      WIDGETS_API_URI: http://widgets-api:8081
      FRONTEND_URI: http://frontend:5173
      LOGIN_SERVICE_URI: http://login-service:8081
    depends_on:
      - core-api
      - statements-api
      - widgets-api
      - frontend
      - login-service

  frontend:
    build: ./pefi-frontend
    ports:
      - '5173:5173'

  login-service:
    build: ./pefi-login-service
    ports:
      - '8084:8081'
    environment:
      SERVER_PORT: 8081
      FRONTEND_URI: http://localhost:8080
      AUTHENTIK_ISSUER_URI: ${AUTHENTIK_ISSUER_URL}
      AUTHENTIK_BACK_CHANNEL_LOGOUT_URL: ${AUTHENTIK_BACK_CHANNEL_LOGOUT_URL}
      AUTHENTIK_CLIENT_ID: ${AUTHENTIK_CLIENT_ID}
      AUTHENTIK_CLIENT_SECRET: ${AUTHENTIK_CLIENT_SECRET}

  core-api:
    build: ./pefi-core-api
    ports:
      - '8081:8081'
    environment:
      SERVER_PORT: 8081
      PROFILE: 'development'
      AUTHENTIK_ISSUER_URI: ${AUTHENTIK_ISSUER_URL}
      DATASOURCE_URL: jdbc:postgresql://database:5432/${POSTGRES_DB}
      DATASOURCE_USER: ${POSTGRES_USER}
      DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD}
      KAFKA_SERVERS: localhost:9092
    depends_on:
      - kafka1
      - database

  statements-api:
    build: ./pefi-statements-api
    ports:
      - '8082:8081'
    environment:
      SERVER_PORT: 8081
      PROFILE: 'development'
      AUTHENTIK_ISSUER_URI: ${AUTHENTIK_ISSUER_URL}
      DATASOURCE_URL: jdbc:postgresql://database:5432/${POSTGRES_DB}
      DATASOURCE_USER: ${POSTGRES_USER}
      DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD}
      KAFKA_SERVERS: localhost:9092
    depends_on:
      - kafka1
      - database

  widgets-api:
    build: ./pefi-widgets-api
    ports:
      - '8083:8081'
    environment:
      SERVER_PORT: 8081
      PROFILE: 'development'
      AUTHENTIK_ISSUER_URI: ${AUTHENTIK_ISSUER_URL}
      DATASOURCE_URL: jdbc:postgresql://database:5432/${POSTGRES_DB}
      DATASOURCE_USER: ${POSTGRES_USER}
      DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD}
    depends_on:
      - database

  database:
    image: postgres:16.1-alpine
    ports:
      - '5432:5432'
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}

  zoo1:
    image: confluentinc/cp-zookeeper:7.3.2
    hostname: zoo1
    container_name: zoo1
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_SERVER_ID: 1
      ZOOKEEPER_SERVERS: zoo1:2888:3888

  kafka1:
    image: confluentinc/cp-kafka:7.3.2
    hostname: kafka1
    container_name: kafka1
    ports:
      - "9092:9092"
      - "29092:29092"
      - "9999:9999"
    environment:
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka1:19092,EXTERNAL://${DOCKER_HOST_IP:-127.0.0.1}:9092,DOCKER://host.docker.internal:29092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT,DOCKER:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181"
      KAFKA_BROKER_ID: 1
      KAFKA_LOG4J_LOGGERS: "kafka.controller=INFO,kafka.producer.async.DefaultEventHandler=INFO,state.change.logger=INFO"
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_JMX_PORT: 9999
      KAFKA_JMX_HOSTNAME: ${DOCKER_HOST_IP:-127.0.0.1}
      KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.authorizer.AclAuthorizer
      KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: "true"
    depends_on:
      - zoo1