services:
  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: onewallet
      POSTGRES_USER: sa
      POSTGRES_PASSWORD: Asd123321
    ports:
      - "127.0.0.1:5432:5432"
    volumes:
      - pg-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U sa"]
      interval: 5s
      timeout: 3s
      retries: 5

  pgbouncer:
    image: edoburu/pgbouncer:1.22.1
    environment:
      DATABASE_URL: "postgres://sa:Asd123321@postgres:5432/onewallet"
      POOL_MODE: transaction
      MAX_CLIENT_CONN: "100"
      DEFAULT_POOL_SIZE: "10"
      AUTH_TYPE: plain
      AUTH_USER: pm_user
      AUTH_PASSWORD: pm_password
      SERVER_RESET_QUERY: DISCARD ALL
    ports:
      - "127.0.0.1:5433:5432"
    depends_on:
      postgres:
        condition: service_healthy

  tigerbeetle:
    image: ghcr.io/tigerbeetle/tigerbeetle:latest
    # io_uring requires removing Docker's default seccomp restrictions
    security_opt:
      - seccomp:unconfined
    volumes:
      - tb-data:/data
      - ./scripts/tb-init.sh:/tb-init.sh:ro
    entrypoint: ["/bin/sh", "/tb-init.sh"]
    ports:
      - "127.0.0.1:3001:3000"

  pm:
    build: .
    env_file: .env
    environment:
      DATABASE_URL: postgres://sa:Asd123321@pgbouncer:5432/onewallet
      REDIS_URL: redis://:Asd123321@redis:6379
      TB_ADDRESS: tigerbeetle:3000
      WORKER_ROLES: api,outbox-worker,psp-worker
      PSP_NAMES: IPPS
    security_opt:
      - seccomp=unconfined
    ports:
      - "127.0.0.1:3000:3000"
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    command: ["node", "dist/server.js"]

volumes:
  pg-data:
  tb-data:
