# Local microservices stack: one Postgres PER service (database-per-service), a # single-broker Kafka (KRaft, no Zookeeper) for the saga, the three services, and # the API gateway in front. # # Build the service images first: ./gradlew bootJar # Then: docker compose up -d # # Each service has its own Dockerfile that copies its build/libs/*.jar. services: # ── Databases (one per service) ─────────────────────────────────────────── wallet-db: image: postgres:17 environment: POSTGRES_DB: walletdb POSTGRES_USER: wallet POSTGRES_PASSWORD: wallet ports: ["5442:5432"] # host 5442 -> container 5432 (avoids a local Postgres on 5432) volumes: ["wallet-pgdata:/var/lib/postgresql/data"] healthcheck: test: ["CMD-SHELL", "pg_isready -U wallet -d walletdb"] interval: 5s timeout: 3s retries: 10 transaction-db: image: postgres:17 environment: POSTGRES_DB: transactiondb POSTGRES_USER: wallet POSTGRES_PASSWORD: wallet ports: ["5443:5432"] volumes: ["transaction-pgdata:/var/lib/postgresql/data"] healthcheck: test: ["CMD-SHELL", "pg_isready -U wallet -d transactiondb"] interval: 5s timeout: 3s retries: 10 ledger-db: image: postgres:17 environment: POSTGRES_DB: ledgerdb POSTGRES_USER: wallet POSTGRES_PASSWORD: wallet ports: ["5444:5432"] volumes: ["ledger-pgdata:/var/lib/postgresql/data"] healthcheck: test: ["CMD-SHELL", "pg_isready -U wallet -d ledgerdb"] interval: 5s timeout: 3s retries: 10 auth-db: image: postgres:17 environment: POSTGRES_DB: authdb POSTGRES_USER: auth POSTGRES_PASSWORD: auth ports: ["5445:5432"] volumes: ["auth-pgdata:/var/lib/postgresql/data"] healthcheck: test: ["CMD-SHELL", "pg_isready -U auth -d authdb"] interval: 5s timeout: 3s retries: 10 # ── Messaging (saga / outbox relay target) ──────────────────────────────── # Official Apache image, single-node KRaft (no Zookeeper). The image entrypoint # auto-formats storage on first boot. Apache uses KAFKA_* env vars holding the # real server.properties keys (Bitnami's KAFKA_CFG_* prefix is not used here). kafka: image: apache/kafka:3.9.0 ports: ["9092:9092"] environment: KAFKA_NODE_ID: 1 KAFKA_PROCESS_ROLES: broker,controller KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka:9093 KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT # Single broker: every replication factor / ISR must be 1. KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 # ── Services ────────────────────────────────────────────────────────────── wallet-service: build: ./wallet-service depends_on: wallet-db: { condition: service_healthy } kafka: { condition: service_started } environment: SPRING_DATASOURCE_URL: jdbc:postgresql://wallet-db:5432/walletdb KAFKA_BOOTSTRAP: kafka:9092 ports: ["8081:8081"] transaction-service: build: ./transaction-service depends_on: transaction-db: { condition: service_healthy } kafka: { condition: service_started } environment: SPRING_DATASOURCE_URL: jdbc:postgresql://transaction-db:5432/transactiondb KAFKA_BOOTSTRAP: kafka:9092 ports: ["8082:8082"] ledger-service: build: ./ledger-service depends_on: ledger-db: { condition: service_healthy } kafka: { condition: service_started } environment: SPRING_DATASOURCE_URL: jdbc:postgresql://ledger-db:5432/ledgerdb KAFKA_BOOTSTRAP: kafka:9092 ports: ["8083:8083"] auth-service: build: ./auth-service depends_on: auth-db: { condition: service_healthy } kafka: { condition: service_started } environment: SPRING_DATASOURCE_URL: jdbc:postgresql://auth-db:5432/authdb KAFKA_BOOTSTRAP: kafka:9092 ports: ["8084:8084"] api-gateway: build: ./api-gateway depends_on: - wallet-service - transaction-service - ledger-service - auth-service environment: WALLET_SERVICE_URI: http://wallet-service:8081 TRANSACTION_SERVICE_URI: http://transaction-service:8082 LEDGER_SERVICE_URI: http://ledger-service:8083 AUTH_SERVICE_URI: http://auth-service:8084 ports: ["8080:8080"] volumes: wallet-pgdata: transaction-pgdata: ledger-pgdata: auth-pgdata: