services: db-a: image: postgres:17 restart: unless-stopped environment: POSTGRES_DB: parrhesia_a POSTGRES_USER: parrhesia POSTGRES_PASSWORD: parrhesia healthcheck: test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] interval: 5s timeout: 5s retries: 12 volumes: - postgres-a-data:/var/lib/postgresql/data db-b: image: postgres:17 restart: unless-stopped environment: POSTGRES_DB: parrhesia_b POSTGRES_USER: parrhesia POSTGRES_PASSWORD: parrhesia healthcheck: test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] interval: 5s timeout: 5s retries: 12 volumes: - postgres-b-data:/var/lib/postgresql/data db-c: image: postgres:17 restart: unless-stopped environment: POSTGRES_DB: parrhesia_c POSTGRES_USER: parrhesia POSTGRES_PASSWORD: parrhesia healthcheck: test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] interval: 5s timeout: 5s retries: 12 volumes: - postgres-c-data:/var/lib/postgresql/data migrate-a: image: ${PARRHESIA_IMAGE:-parrhesia:latest} restart: "no" depends_on: db-a: condition: service_healthy environment: DATABASE_URL: ecto://parrhesia:parrhesia@db-a:5432/parrhesia_a POOL_SIZE: ${POOL_SIZE:-20} PARRHESIA_ACL_PROTECTED_FILTERS: ${PARRHESIA_ACL_PROTECTED_FILTERS} command: ["eval", "Parrhesia.Release.migrate()"] migrate-b: image: ${PARRHESIA_IMAGE:-parrhesia:latest} restart: "no" depends_on: db-b: condition: service_healthy environment: DATABASE_URL: ecto://parrhesia:parrhesia@db-b:5432/parrhesia_b POOL_SIZE: ${POOL_SIZE:-20} PARRHESIA_ACL_PROTECTED_FILTERS: ${PARRHESIA_ACL_PROTECTED_FILTERS} command: ["eval", "Parrhesia.Release.migrate()"] migrate-c: image: ${PARRHESIA_IMAGE:-parrhesia:latest} restart: "no" depends_on: db-c: condition: service_healthy environment: DATABASE_URL: ecto://parrhesia:parrhesia@db-c:5432/parrhesia_c POOL_SIZE: ${POOL_SIZE:-20} PARRHESIA_ACL_PROTECTED_FILTERS: ${PARRHESIA_ACL_PROTECTED_FILTERS} command: ["eval", "Parrhesia.Release.migrate()"] parrhesia-a: image: ${PARRHESIA_IMAGE:-parrhesia:latest} restart: unless-stopped depends_on: db-a: condition: service_healthy environment: DATABASE_URL: ecto://parrhesia:parrhesia@db-a:5432/parrhesia_a POOL_SIZE: ${POOL_SIZE:-20} PORT: 4413 PARRHESIA_RELAY_URL: ${PARRHESIA_NODE_A_RELAY_URL:-ws://parrhesia-a:4413/relay} PARRHESIA_ACL_PROTECTED_FILTERS: ${PARRHESIA_ACL_PROTECTED_FILTERS} PARRHESIA_RELAY_IDENTITY_PATH: /tmp/parrhesia-a/server_identity.json PARRHESIA_RELAY_IDENTITY_AUTO_GENERATE: ${PARRHESIA_RELAY_IDENTITY_AUTO_GENERATE:-true} PARRHESIA_NODE_IDENTITY_PATH: /tmp/parrhesia-a/node_identity.json PARRHESIA_NODE_IDENTITY_AUTO_GENERATE: ${PARRHESIA_NODE_IDENTITY_AUTO_GENERATE:-true} PARRHESIA_SYNC_PATH: /tmp/parrhesia-a/sync_servers.json PARRHESIA_LIMITS_MAX_FILTER_LIMIT: ${PARRHESIA_LIMITS_MAX_FILTER_LIMIT:-30000} PARRHESIA_LIMITS_MAX_QUERY_CANDIDATES: ${PARRHESIA_LIMITS_MAX_QUERY_CANDIDATES:-60000} PARRHESIA_LIMITS_IP_MAX_EVENT_INGEST_PER_WINDOW: ${PARRHESIA_LIMITS_IP_MAX_EVENT_INGEST_PER_WINDOW:-50000} PARRHESIA_LIMITS_RELAY_MAX_EVENT_INGEST_PER_WINDOW: ${PARRHESIA_LIMITS_RELAY_MAX_EVENT_INGEST_PER_WINDOW:-50000} PARRHESIA_LIMITS_MAX_EVENT_INGEST_PER_WINDOW: ${PARRHESIA_LIMITS_MAX_EVENT_INGEST_PER_WINDOW:-50000} ports: - "${PARRHESIA_NODE_A_HOST_PORT:-45231}:4413" parrhesia-b: image: ${PARRHESIA_IMAGE:-parrhesia:latest} restart: unless-stopped depends_on: db-b: condition: service_healthy environment: DATABASE_URL: ecto://parrhesia:parrhesia@db-b:5432/parrhesia_b POOL_SIZE: ${POOL_SIZE:-20} PORT: 4413 PARRHESIA_RELAY_URL: ${PARRHESIA_NODE_B_RELAY_URL:-ws://parrhesia-b:4413/relay} PARRHESIA_ACL_PROTECTED_FILTERS: ${PARRHESIA_ACL_PROTECTED_FILTERS} PARRHESIA_RELAY_IDENTITY_PATH: /tmp/parrhesia-b/server_identity.json PARRHESIA_RELAY_IDENTITY_AUTO_GENERATE: ${PARRHESIA_RELAY_IDENTITY_AUTO_GENERATE:-true} PARRHESIA_NODE_IDENTITY_PATH: /tmp/parrhesia-b/node_identity.json PARRHESIA_NODE_IDENTITY_AUTO_GENERATE: ${PARRHESIA_NODE_IDENTITY_AUTO_GENERATE:-true} PARRHESIA_SYNC_PATH: /tmp/parrhesia-b/sync_servers.json PARRHESIA_LIMITS_MAX_FILTER_LIMIT: ${PARRHESIA_LIMITS_MAX_FILTER_LIMIT:-30000} PARRHESIA_LIMITS_MAX_QUERY_CANDIDATES: ${PARRHESIA_LIMITS_MAX_QUERY_CANDIDATES:-60000} PARRHESIA_LIMITS_IP_MAX_EVENT_INGEST_PER_WINDOW: ${PARRHESIA_LIMITS_IP_MAX_EVENT_INGEST_PER_WINDOW:-50000} PARRHESIA_LIMITS_RELAY_MAX_EVENT_INGEST_PER_WINDOW: ${PARRHESIA_LIMITS_RELAY_MAX_EVENT_INGEST_PER_WINDOW:-50000} PARRHESIA_LIMITS_MAX_EVENT_INGEST_PER_WINDOW: ${PARRHESIA_LIMITS_MAX_EVENT_INGEST_PER_WINDOW:-50000} ports: - "${PARRHESIA_NODE_B_HOST_PORT:-45232}:4413" parrhesia-c: image: ${PARRHESIA_IMAGE:-parrhesia:latest} restart: unless-stopped depends_on: db-c: condition: service_healthy environment: DATABASE_URL: ecto://parrhesia:parrhesia@db-c:5432/parrhesia_c POOL_SIZE: ${POOL_SIZE:-20} PORT: 4413 PARRHESIA_RELAY_URL: ${PARRHESIA_NODE_C_RELAY_URL:-ws://parrhesia-c:4413/relay} PARRHESIA_ACL_PROTECTED_FILTERS: ${PARRHESIA_ACL_PROTECTED_FILTERS} PARRHESIA_RELAY_IDENTITY_PATH: /tmp/parrhesia-c/server_identity.json PARRHESIA_RELAY_IDENTITY_AUTO_GENERATE: ${PARRHESIA_RELAY_IDENTITY_AUTO_GENERATE:-true} PARRHESIA_NODE_IDENTITY_PATH: /tmp/parrhesia-c/node_identity.json PARRHESIA_NODE_IDENTITY_AUTO_GENERATE: ${PARRHESIA_NODE_IDENTITY_AUTO_GENERATE:-true} PARRHESIA_SYNC_PATH: /tmp/parrhesia-c/sync_servers.json PARRHESIA_LIMITS_MAX_FILTER_LIMIT: ${PARRHESIA_LIMITS_MAX_FILTER_LIMIT:-30000} PARRHESIA_LIMITS_MAX_QUERY_CANDIDATES: ${PARRHESIA_LIMITS_MAX_QUERY_CANDIDATES:-60000} PARRHESIA_LIMITS_IP_MAX_EVENT_INGEST_PER_WINDOW: ${PARRHESIA_LIMITS_IP_MAX_EVENT_INGEST_PER_WINDOW:-50000} PARRHESIA_LIMITS_RELAY_MAX_EVENT_INGEST_PER_WINDOW: ${PARRHESIA_LIMITS_RELAY_MAX_EVENT_INGEST_PER_WINDOW:-50000} PARRHESIA_LIMITS_MAX_EVENT_INGEST_PER_WINDOW: ${PARRHESIA_LIMITS_MAX_EVENT_INGEST_PER_WINDOW:-50000} ports: - "${PARRHESIA_NODE_C_HOST_PORT:-45233}:4413" volumes: postgres-a-data: postgres-b-data: postgres-c-data: