services: frontend: build: context: . target: frontend container_name: "NeraBBS-Frontend" restart: on-failure expose: - "3000" networks: - frontend healthcheck: test: [ "CMD", "curl", "--fail", "--silent", "http://localhost:3000" ] interval: 30s timeout: 5s retries: 5 start_period: 30s gateway: build: context: . target: gateway container_name: "NeraBBS-Gateway-Application" restart: on-failure depends_on: redis: condition: service_healthy consul: condition: service_healthy frontend: condition: service_started service-auth: condition: service_started service-user: condition: service_started service-post: condition: service_started service-webauthn: condition: service_started service-oss: condition: service_started expose: - "8080" ports: - "8090:8080" networks: - services - redis - consul - frontend - gateway - hyperdx healthcheck: test: [ "CMD", "curl", "--fail", "--silent", "http://localhost:80/actuator/health" ] interval: 30s timeout: 5s retries: 5 start_period: 30s environment: - OTEL_EXPORTER_OTLP_ENDPOINT=http://hyperdx:4318 - OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf - OTEL_LOGS_EXPORTER=otlp - OTEL_INSTRUMENTATION_HTTP_CLIENT_CAPTURE_REQUEST_HEADERS=X-User-ID middleware-config: build: context: . target: middleware-config container_name: "NeraBBS-Middleware-Config" restart: on-failure expose: - "8888" networks: - services - consul - hyperdx healthcheck: test: [ "CMD", "curl", "--fail", "--silent", "http://localhost:8888/actuator/health" ] interval: 30s timeout: 5s retries: 5 start_period: 30s environment: - OTEL_EXPORTER_OTLP_ENDPOINT=http://hyperdx:4318 - OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf - OTEL_LOGS_EXPORTER=otlp service-auth: build: context: . target: service-auth container_name: "NeraBBS-Service-Auth" restart: on-failure depends_on: redis: condition: service_healthy postgres: condition: service_healthy consul: condition: service_healthy expose: - "8080" networks: - services - redis - postgres - consul - hyperdx - seata healthcheck: test: [ "CMD", "curl", "--fail", "--silent", "http://localhost:8080/actuator/health" ] interval: 30s timeout: 5s retries: 5 start_period: 30s environment: - OTEL_EXPORTER_OTLP_ENDPOINT=http://hyperdx:4318 - OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf - OTEL_LOGS_EXPORTER=otlp service-user: build: context: . target: service-user container_name: "NeraBBS-Service-User" restart: on-failure depends_on: redis: condition: service_healthy postgres: condition: service_healthy consul: condition: service_healthy expose: - "8080" networks: - services - redis - postgres - consul - hyperdx - seata healthcheck: test: [ "CMD", "curl", "--fail", "--silent", "http://localhost:8080/actuator/health" ] interval: 30s timeout: 5s retries: 5 start_period: 30s environment: - OTEL_EXPORTER_OTLP_ENDPOINT=http://hyperdx:4318 - OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf - OTEL_LOGS_EXPORTER=otlp service-post: build: context: . target: service-post container_name: "NeraBBS-Service-Post" restart: on-failure depends_on: redis: condition: service_healthy postgres: condition: service_healthy consul: condition: service_healthy expose: - "8080" networks: - services - redis - postgres - consul - hyperdx - seata healthcheck: test: [ "CMD", "curl", "--fail", "--silent", "http://localhost:8080/actuator/health" ] interval: 30s timeout: 5s retries: 5 start_period: 30s environment: - OTEL_EXPORTER_OTLP_ENDPOINT=http://hyperdx:4318 - OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf - OTEL_LOGS_EXPORTER=otlp service-webauthn: build: context: . target: service-webauthn container_name: "NeraBBS-Service-Webauthn" restart: on-failure depends_on: redis: condition: service_healthy postgres: condition: service_healthy consul: condition: service_healthy expose: - "8080" networks: - services - redis - postgres - consul - hyperdx - seata healthcheck: test: [ "CMD", "curl", "--fail", "--silent", "http://localhost:8080/actuator/health" ] interval: 30s timeout: 5s retries: 5 start_period: 30s environment: - nerabbs.webauthn.relying-party.id=localhost - nerabbs.webauthn.relying-party.name=Nerabbs - OTEL_EXPORTER_OTLP_ENDPOINT=http://hyperdx:4318 - OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf - OTEL_LOGS_EXPORTER=otlp service-oss: build: context: . target: service-oss container_name: "NeraBBS-Service-OSS" restart: on-failure depends_on: consul: condition: service_healthy minio: condition: service_healthy expose: - "8080" networks: - services - consul - minio - hyperdx - seata healthcheck: test: [ "CMD", "curl", "--fail", "--silent", "http://localhost:8080/actuator/health" ] interval: 30s timeout: 5s retries: 5 start_period: 30s environment: - OTEL_EXPORTER_OTLP_ENDPOINT=http://hyperdx:4318 - OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf - OTEL_LOGS_EXPORTER=otlp service-user-profile: build: context: . target: service-user-profile container_name: "NeraBBS-Service-UserProfile" restart: on-failure depends_on: redis: condition: service_healthy postgres: condition: service_healthy consul: condition: service_healthy expose: - "8080" networks: - services - redis - postgres - consul - hyperdx - seata healthcheck: test: [ "CMD", "curl", "--fail", "--silent", "http://localhost:8080/actuator/health" ] interval: 30s timeout: 5s retries: 5 start_period: 30s environment: - OTEL_EXPORTER_OTLP_ENDPOINT=http://hyperdx:4318 - OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf - OTEL_LOGS_EXPORTER=otlp service-search: build: context: . target: service-search container_name: "NeraBBS-Service-Search" restart: on-failure depends_on: consul: condition: service_healthy meilisearch: condition: service_healthy expose: - "8080" networks: - services - consul - meilisearch - redis - postgres - hyperdx - seata healthcheck: test: [ "CMD", "curl", "--fail", "--silent", "http://localhost:8080/actuator/health" ] interval: 30s timeout: 5s retries: 5 start_period: 30s environment: - OTEL_EXPORTER_OTLP_ENDPOINT=http://hyperdx:4318 - OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf - OTEL_LOGS_EXPORTER=otlp service-comment: build: context: . target: service-comment container_name: "NeraBBS-Service-Comment" restart: on-failure depends_on: redis: condition: service_healthy postgres: condition: service_healthy consul: condition: service_healthy expose: - "8080" networks: - services - redis - postgres - consul - hyperdx - seata healthcheck: test: [ "CMD", "curl", "--fail", "--silent", "http://localhost:8080/actuator/health" ] interval: 30s timeout: 5s retries: 5 start_period: 30s environment: - OTEL_EXPORTER_OTLP_ENDPOINT=http://hyperdx:4318 - OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf - OTEL_LOGS_EXPORTER=otlp redis: image: redis:latest container_name: "NeraBBS-Middleware-Redis" restart: on-failure expose: - "6379" networks: - redis volumes: - ./data/redis:/data healthcheck: test: [ "CMD", "redis-cli", "--raw", "incr", "ping" ] interval: 10s timeout: 5s retries: 5 command: [ "redis-server", "--bind", "0.0.0.0", "--port", "6379" ] postgres: image: postgres:latest container_name: "NeraBBS-Middleware-Postgres" restart: on-failure expose: - "5432" networks: - postgres volumes: - ./data/postgres:/var/lib/postgresql/data healthcheck: test: [ "CMD", "pg_isready", "-U", "nerabbs", "-d", "nerabbs" ] interval: 10s timeout: 5s retries: 5 environment: - POSTGRES_PASSWORD=nerabbs - POSTGRES_USER=nerabbs - POSTGRES_DB=nerabbs consul: image: hashicorp/consul:latest container_name: "NeraBBS-Middleware-Consul" restart: on-failure expose: - "8500" networks: - consul volumes: - ./data/consul:/consul/data healthcheck: test: [ "CMD", "curl", "--fail", "--silent", "localhost:8500/v1/status/leader" ] interval: 1s timeout: 3s retries: 60 command: [ "consul", "agent", "-server", "-data-dir=/consul/data", "-bootstrap-expect=1", "-client=0.0.0.0" ] minio: image: minio/minio container_name: "NeraBBS-Middleware-Minio" restart: on-failure expose: - "9000" networks: - minio volumes: - ./data/minio:/data healthcheck: test: [ "CMD", "curl", "--fail", "--silent", "localhost:9000/minio/health/live" ] interval: 1s timeout: 3s retries: 60 environment: - MINIO_ROOT_USER=nerabbs - MINIO_ROOT_PASSWORD=nerabbs#strong_password@2023 command: [ "server", "/data" ] meilisearch: image: getmeili/meilisearch container_name: "NeraBBS-Middleware-Meilisearch" restart: on-failure expose: - "7700" networks: - meilisearch volumes: - ./data/meilisearch:/meili_data healthcheck: test: set -o pipefail; curl -fsS http://localhost:7700/health | grep -q '{"status":"available"}' interval: 1s timeout: 3s retries: 60 environment: - MEILI_MASTER_KEY=nerabbs#strong_password@2023 caddy: image: caddy container_name: "NeraBBS-Gateway-Caddy" restart: on-failure ports: - "80:80" - "443:443" networks: - gateway volumes: - ./data/caddy:/data/caddy - ./:/etc/caddy # mount Caddyfile healthcheck: test: [ "CMD", "curl", "--fail", "--silent", "http://localhost" ] interval: 5s timeout: 1s retries: 3 hyperdx: image: hyperdx/hyperdx-local container_name: "NeraBBS-Middleware-HyperDX" restart: on-failure expose: - "4318" - "4317" - "8082" ports: - "8000:8000" - "8080:8080" networks: - hyperdx seata-server: image: seataio/seata-server container_name: "NeraBBS-Middleware-Seata" restart: on-failure ports: - "7091:7091" expose: - "8091" networks: - seata environment: - SEATA_PORT=8091 - STORE_MODE=file networks: frontend: services: redis: postgres: consul: minio: meilisearch: gateway: hyperdx: seata: