services: app: container_name: ledger-api build: . ports: - "8080:8080" env_file: - .env environment: - SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE} - DB_HOST=postgres - DB_PORT=5432 - DB_NAME=${DB_NAME} - DB_USER=${DB_USER} - DB_PASSWORD=${DB_PASSWORD} - REDIS_HOST=redis - REDIS_PORT=6379 - KAFKA_BOOTSTRAP_SERVERS=kafka:29092 - ENCRYPTION_KEY=${ENCRYPTION_KEY} - JWT_SECRET=${JWT_SECRET} - JWT_EXPIRATION_MS=${JWT_EXPIRATION_MS} - ADMIN_USER=${ADMIN_USER} - ADMIN_PASSWORD=${ADMIN_PASSWORD} - USER_NAME=${ADMIN_USER} - USER_PASSWORD=${ADMIN_PASSWORD} - LOG_LEVEL=${LOG_LEVEL} depends_on: postgres: condition: service_healthy redis: condition: service_healthy kafka: condition: service_healthy deploy: resources: limits: cpus: '1' memory: 1G postgres: image: docker.io/library/postgres:16-alpine container_name: ledger-postgres environment: POSTGRES_DB: ${DB_NAME} POSTGRES_USER: ${DB_USER} POSTGRES_PASSWORD: ${DB_PASSWORD} ports: - "${DB_PORT}:5432" volumes: - postgres_data:/var/lib/postgresql/data - ./init-scripts:/docker-entrypoint-initdb.d healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}"] interval: 5s timeout: 5s retries: 5 deploy: resources: limits: cpus: '1' memory: 512M pgadmin: image: docker.io/dpage/pgadmin4:8 container_name: ledger-pgadmin restart: unless-stopped depends_on: postgres: condition: service_healthy ports: - "5050:80" environment: PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL:-admin@ledger.local} PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD:-admin} PGADMIN_CONFIG_ENHANCED_COOKIE_PROTECTION: 'True' PGADMIN_CONFIG_CONSOLE_LOG_LEVEL: 10 volumes: - pgadmin_data:/var/lib/pgadmin deploy: resources: limits: cpus: '0.5' memory: 512M redis: image: docker.io/library/redis:7-alpine container_name: ledger-redis ports: - "${REDIS_PORT}:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 5 deploy: resources: limits: cpus: '0.5' memory: 256M redis-commander: image: rediscommander/redis-commander:latest container_name: redis-commander restart: unless-stopped environment: - REDIS_HOSTS=local:ledger-redis:6379:0 ports: - "8081:8081" depends_on: - redis kafka: image: docker.io/confluentinc/cp-kafka:7.6.0 container_name: ledger-kafka ports: - "9092:9092" environment: KAFKA_NODE_ID: 1 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 KAFKA_PROCESS_ROLES: broker,controller KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka:29093 KAFKA_LISTENERS: PLAINTEXT://kafka:29092,CONTROLLER://kafka:29093,PLAINTEXT_HOST://0.0.0.0:9092 KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER KAFKA_LOG_DIRS: /tmp/kraft-combined-logs CLUSTER_ID: 'MkU3OEVBNTcwNTJENDM2Qk' healthcheck: test: ["CMD", "kafka-broker-api-versions", "--bootstrap-server", "localhost:9092"] interval: 10s timeout: 10s retries: 5 deploy: resources: limits: cpus: '1' memory: 1G kafka-ui: image: docker.io/provectuslabs/kafka-ui:latest container_name: ledger-kafka-ui restart: unless-stopped depends_on: kafka: condition: service_healthy ports: - "8090:8080" environment: KAFKA_CLUSTERS_0_NAME: local KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:29092 KAFKA_CLUSTERS_0_METRICS_PORT: 9090 DYNAMIC_CONFIG_ENABLED: 'true' prometheus: image: docker.io/prom/prometheus:v2.50.1 container_name: ledger-prometheus volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml ports: - "9090:9090" command: - --config.file=/etc/prometheus/prometheus.yml depends_on: app: condition: service_started grafana: image: docker.io/grafana/grafana:10.3.3 container_name: ledger-grafana ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_PASSWORD=admin - GF_USERS_ALLOW_SIGN_UP=false depends_on: - prometheus volumes: - grafana_data:/var/lib/grafana - ./grafana/provisioning/datasources:/etc/grafana/provisioning/datasources sonarqube: image: sonarqube:community container_name: ledger-sonarqube ports: - "9000:9000" environment: - SONAR_JDBC_URL=jdbc:postgresql://postgres:5432/sonar - SONAR_JDBC_USERNAME=sonar - SONAR_JDBC_PASSWORD=sonar volumes: - sonar_data:/opt/sonarqube/data - sonar_extensions:/opt/sonarqube/extensions - sonar_logs:/opt/sonarqube/logs depends_on: postgres: condition: service_healthy deploy: resources: limits: cpus: '2' memory: 2G volumes: postgres_data: redis_data: pgadmin_data: grafana_data: sonar_data: sonar_extensions: sonar_logs: