services: api: depends_on: api-migrator: condition: service_completed_successfully keydb: condition: service_healthy minio: condition: service_healthy postgres: condition: service_healthy rabbitmq: condition: service_started environment: ADMIN_HOST: ${ADMIN_HOST?} APP_DEBUG: ${DEBUG?} APP_ENV: self-hosted APP_KEY: ${API_APP_KEY?} APP_NAME: ${PROJECT_NAME?} APP_URL: https://${BASE_HOST?} BASE_HOST: ${BASE_HOST?} CONTROL_HOST: ${CONTROL_HOST?} DB_CONNECTION: pgsql DB_DATABASE: ${API_DB_DATABASE?} DB_HOST: ${API_DB_HOST?} DB_PASSWORD: ${API_DB_PASSWORD?} DB_PORT: ${API_DB_PORT?} DB_USERNAME: ${API_DB_USERNAME?} DOCS_HOST: docs.sinica.ru GITLAB_API_V4_URL: ${GITLAB_API_V4_URL?} GITLAB_PROJECT_ID: ${GITLAB_PROJECT_ID?} GITLAB_SERVICE_DESK_ISSUE_TEMPLATE: ${GITLAB_SERVICE_DESK_ISSUE_TEMPLATE?} GITLAB_TOKEN: ${GITLAB_TOKEN?} KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD?} KEYCLOAK_ADMIN_USERNAME: ${KEYCLOAK_ADMIN_USERNAME?} KEYCLOAK_HOST: ${KEYCLOAK_HOST?} KEYCLOAK_IGNORE_RESOURCES_VALIDATION: "true" KEYCLOAK_INTERNAL_HOST: keycloak:8080 MAIL_FROM_ADDRESS: ${SMTP_FROM?} MAIL_FROM_NAME: ${SMTP_FROM_NAME?} MAIL_HOST: ${SMTP_HOST?} MAIL_PASSWORD: ${SMTP_AUTHENTICATION_PASSWORD?} MAIL_PORT: ${SMTP_PORT?} MAIL_USERNAME: ${SMTP_AUTHENTICATION_USERNAME?} RABBITMQ_ADMIN: ${RABBITMQ_ADMIN?} RABBITMQ_HOST: ${RABBITMQ_HOST?} RABBITMQ_PASSWORD: ${RABBITMQ_PASSWORD?} RABBITMQ_PORT: ${RABBITMQ_PORT?} REDIS_HOST: keydb RESERVED_SPACE_SLUGS: ${RESERVED_SPACE_SLUGS} S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID?} S3_DEFAULT_REGION: ${S3_DEFAULT_REGION?} S3_ENDPOINT: ${S3_ENDPOINT?} S3_PROVIDER: ${S3_PROVIDER?} S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY?} S3_URL: ${S3_URL?} SCORMS_S3_BUCKET: ${SCORMS_S3_BUCKET?} URL_SIGNER_SIGNATURE_KEY: ${API_URL_SIGNER_SIGNATURE_KEY?} image: delovoytech/sinica:api-${VERSION?} labels: traefik.enable: "true" traefik.http.routers.api-admin.entrypoints: web,websecure traefik.http.routers.api-admin.middlewares: ${WHITELIST_IPS:+admin-whitelist@docker} traefik.http.routers.api-admin.priority: "4" traefik.http.routers.api-admin.rule: ( Host(`admin.${BASE_HOST?}`) || Host(`control.${BASE_HOST?}`) ) && PathPrefix(`/api`) traefik.http.routers.api.entrypoints: web,websecure traefik.http.routers.api.priority: "3" traefik.http.routers.api.rule: ( Host(`${BASE_HOST?}`) || HostRegexp(`{subdomain:[a-z0-9-]+}.${BASE_HOST?}`) ) && PathPrefix(`/api`) traefik.http.services.api.loadbalancer.server.port: "8000" logging: options: max-file: "5" max-size: 10m networks: default: null restart: unless-stopped api-ghost: command: - /bin/sh - -c - " echo '\n server {\n listen 80;\n listen [::]:80;\n server_name localhost;\n location / {\n return 503;\n }\n }\n' > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;' " image: nginx labels: traefik.enable: "true" traefik.http.routers.api-ghost.entrypoints: web,websecure traefik.http.routers.api-ghost.priority: "2" traefik.http.routers.api-ghost.rule: ( Host(`${BASE_HOST?}`) || HostRegexp(`{subdomain:[a-z0-9-]+}.${BASE_HOST?}`) ) && PathPrefix(`/api`) traefik.http.services.api-ghost.loadbalancer.server.port: "80" networks: default: null restart: unless-stopped api-migrator: depends_on: postgres: condition: service_healthy environment: ADMIN_HOST: ${ADMIN_HOST?} APP_DEBUG: ${DEBUG?} APP_ENV: self-hosted APP_KEY: ${API_APP_KEY?} APP_NAME: ${PROJECT_NAME?} APP_URL: https://${BASE_HOST?} BASE_HOST: ${BASE_HOST?} CONTROL_HOST: ${CONTROL_HOST?} DB_CONNECTION: pgsql DB_DATABASE: ${API_DB_DATABASE?} DB_HOST: ${API_DB_HOST?} DB_PASSWORD: ${API_DB_PASSWORD?} DB_PORT: ${API_DB_PORT?} DB_USERNAME: ${API_DB_USERNAME?} DOCS_HOST: docs.sinica.ru GITLAB_API_V4_URL: ${GITLAB_API_V4_URL?} GITLAB_PROJECT_ID: ${GITLAB_PROJECT_ID?} GITLAB_SERVICE_DESK_ISSUE_TEMPLATE: ${GITLAB_SERVICE_DESK_ISSUE_TEMPLATE?} GITLAB_TOKEN: ${GITLAB_TOKEN?} KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD?} KEYCLOAK_ADMIN_USERNAME: ${KEYCLOAK_ADMIN_USERNAME?} KEYCLOAK_HOST: ${KEYCLOAK_HOST?} KEYCLOAK_IGNORE_RESOURCES_VALIDATION: "true" KEYCLOAK_INTERNAL_HOST: keycloak:8080 MAIL_FROM_ADDRESS: ${SMTP_FROM?} MAIL_FROM_NAME: ${SMTP_FROM_NAME?} MAIL_HOST: ${SMTP_HOST?} MAIL_PASSWORD: ${SMTP_AUTHENTICATION_PASSWORD?} MAIL_PORT: ${SMTP_PORT?} MAIL_USERNAME: ${SMTP_AUTHENTICATION_USERNAME?} RABBITMQ_ADMIN: ${RABBITMQ_ADMIN?} RABBITMQ_HOST: ${RABBITMQ_HOST?} RABBITMQ_PASSWORD: ${RABBITMQ_PASSWORD?} RABBITMQ_PORT: ${RABBITMQ_PORT?} REDIS_HOST: keydb RESERVED_SPACE_SLUGS: ${RESERVED_SPACE_SLUGS} S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID?} S3_DEFAULT_REGION: ${S3_DEFAULT_REGION?} S3_ENDPOINT: ${S3_ENDPOINT?} S3_PROVIDER: ${S3_PROVIDER?} S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY?} S3_URL: ${S3_URL?} SCORMS_S3_BUCKET: ${SCORMS_S3_BUCKET?} URL_SIGNER_SIGNATURE_KEY: ${API_URL_SIGNER_SIGNATURE_KEY?} image: delovoytech/sinica:api-migrator-${VERSION?} logging: options: max-file: "5" max-size: 10m networks: default: null restart: "no" api-operations-processor: depends_on: api-migrator: condition: service_completed_successfully keycloak: condition: service_healthy keydb: condition: service_healthy minio: condition: service_healthy postgres: condition: service_healthy environment: ADMIN_HOST: ${ADMIN_HOST?} APP_DEBUG: ${DEBUG?} APP_ENV: self-hosted APP_KEY: ${API_APP_KEY?} APP_NAME: ${PROJECT_NAME?} APP_URL: https://${BASE_HOST?} BASE_HOST: ${BASE_HOST?} CONTROL_HOST: ${CONTROL_HOST?} DB_CONNECTION: pgsql DB_DATABASE: ${API_DB_DATABASE?} DB_HOST: ${API_DB_HOST?} DB_PASSWORD: ${API_DB_PASSWORD?} DB_PORT: ${API_DB_PORT?} DB_USERNAME: ${API_DB_USERNAME?} DOCS_HOST: docs.sinica.ru GITLAB_API_V4_URL: ${GITLAB_API_V4_URL?} GITLAB_PROJECT_ID: ${GITLAB_PROJECT_ID?} GITLAB_SERVICE_DESK_ISSUE_TEMPLATE: ${GITLAB_SERVICE_DESK_ISSUE_TEMPLATE?} GITLAB_TOKEN: ${GITLAB_TOKEN?} KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD?} KEYCLOAK_ADMIN_USERNAME: ${KEYCLOAK_ADMIN_USERNAME?} KEYCLOAK_HOST: ${KEYCLOAK_HOST?} KEYCLOAK_IGNORE_RESOURCES_VALIDATION: "true" KEYCLOAK_INTERNAL_HOST: keycloak:8080 MAIL_FROM_ADDRESS: ${SMTP_FROM?} MAIL_FROM_NAME: ${SMTP_FROM_NAME?} MAIL_HOST: ${SMTP_HOST?} MAIL_PASSWORD: ${SMTP_AUTHENTICATION_PASSWORD?} MAIL_PORT: ${SMTP_PORT?} MAIL_USERNAME: ${SMTP_AUTHENTICATION_USERNAME?} RABBITMQ_ADMIN: ${RABBITMQ_ADMIN?} RABBITMQ_HOST: ${RABBITMQ_HOST?} RABBITMQ_PASSWORD: ${RABBITMQ_PASSWORD?} RABBITMQ_PORT: ${RABBITMQ_PORT?} REDIS_HOST: keydb RESERVED_SPACE_SLUGS: ${RESERVED_SPACE_SLUGS} S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID?} S3_DEFAULT_REGION: ${S3_DEFAULT_REGION?} S3_ENDPOINT: ${S3_ENDPOINT?} S3_PROVIDER: ${S3_PROVIDER?} S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY?} S3_URL: ${S3_URL?} SCORMS_S3_BUCKET: ${SCORMS_S3_BUCKET?} URL_SIGNER_SIGNATURE_KEY: ${API_URL_SIGNER_SIGNATURE_KEY?} image: delovoytech/sinica:api-operations-processor-${VERSION?} logging: options: max-file: "5" max-size: 10m networks: default: null restart: on-failure api-queue: depends_on: api-migrator: condition: service_completed_successfully keycloak: condition: service_healthy keydb: condition: service_healthy minio: condition: service_healthy postgres: condition: service_healthy rabbitmq: condition: service_started environment: ADMIN_HOST: ${ADMIN_HOST?} APP_DEBUG: ${DEBUG?} APP_ENV: self-hosted APP_KEY: ${API_APP_KEY?} APP_NAME: ${PROJECT_NAME?} APP_URL: https://${BASE_HOST?} BASE_HOST: ${BASE_HOST?} CONTROL_HOST: ${CONTROL_HOST?} DB_CONNECTION: pgsql DB_DATABASE: ${API_DB_DATABASE?} DB_HOST: ${API_DB_HOST?} DB_PASSWORD: ${API_DB_PASSWORD?} DB_PORT: ${API_DB_PORT?} DB_USERNAME: ${API_DB_USERNAME?} DOCS_HOST: docs.sinica.ru GITLAB_API_V4_URL: ${GITLAB_API_V4_URL?} GITLAB_PROJECT_ID: ${GITLAB_PROJECT_ID?} GITLAB_SERVICE_DESK_ISSUE_TEMPLATE: ${GITLAB_SERVICE_DESK_ISSUE_TEMPLATE?} GITLAB_TOKEN: ${GITLAB_TOKEN?} KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD?} KEYCLOAK_ADMIN_USERNAME: ${KEYCLOAK_ADMIN_USERNAME?} KEYCLOAK_HOST: ${KEYCLOAK_HOST?} KEYCLOAK_IGNORE_RESOURCES_VALIDATION: "true" KEYCLOAK_INTERNAL_HOST: keycloak:8080 MAIL_FROM_ADDRESS: ${SMTP_FROM?} MAIL_FROM_NAME: ${SMTP_FROM_NAME?} MAIL_HOST: ${SMTP_HOST?} MAIL_PASSWORD: ${SMTP_AUTHENTICATION_PASSWORD?} MAIL_PORT: ${SMTP_PORT?} MAIL_USERNAME: ${SMTP_AUTHENTICATION_USERNAME?} RABBITMQ_ADMIN: ${RABBITMQ_ADMIN?} RABBITMQ_HOST: ${RABBITMQ_HOST?} RABBITMQ_PASSWORD: ${RABBITMQ_PASSWORD?} RABBITMQ_PORT: ${RABBITMQ_PORT?} REDIS_HOST: keydb RESERVED_SPACE_SLUGS: ${RESERVED_SPACE_SLUGS} S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID?} S3_DEFAULT_REGION: ${S3_DEFAULT_REGION?} S3_ENDPOINT: ${S3_ENDPOINT?} S3_PROVIDER: ${S3_PROVIDER?} S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY?} S3_URL: ${S3_URL?} SCORMS_S3_BUCKET: ${SCORMS_S3_BUCKET?} URL_SIGNER_SIGNATURE_KEY: ${API_URL_SIGNER_SIGNATURE_KEY?} image: delovoytech/sinica:api-queue-${VERSION?} logging: options: max-file: "5" max-size: 10m networks: default: null restart: unless-stopped api-scheduler: depends_on: api-migrator: condition: service_completed_successfully keycloak: condition: service_healthy keydb: condition: service_healthy minio: condition: service_healthy postgres: condition: service_healthy rabbitmq: condition: service_started environment: ADMIN_HOST: ${ADMIN_HOST?} APP_DEBUG: ${DEBUG?} APP_ENV: self-hosted APP_KEY: ${API_APP_KEY?} APP_NAME: ${PROJECT_NAME?} APP_URL: https://${BASE_HOST?} BASE_HOST: ${BASE_HOST?} CONTROL_HOST: ${CONTROL_HOST?} DB_CONNECTION: pgsql DB_DATABASE: ${API_DB_DATABASE?} DB_HOST: ${API_DB_HOST?} DB_PASSWORD: ${API_DB_PASSWORD?} DB_PORT: ${API_DB_PORT?} DB_USERNAME: ${API_DB_USERNAME?} DOCS_HOST: docs.sinica.ru GITLAB_API_V4_URL: ${GITLAB_API_V4_URL?} GITLAB_PROJECT_ID: ${GITLAB_PROJECT_ID?} GITLAB_SERVICE_DESK_ISSUE_TEMPLATE: ${GITLAB_SERVICE_DESK_ISSUE_TEMPLATE?} GITLAB_TOKEN: ${GITLAB_TOKEN?} KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD?} KEYCLOAK_ADMIN_USERNAME: ${KEYCLOAK_ADMIN_USERNAME?} KEYCLOAK_HOST: ${KEYCLOAK_HOST?} KEYCLOAK_IGNORE_RESOURCES_VALIDATION: "true" KEYCLOAK_INTERNAL_HOST: keycloak:8080 MAIL_FROM_ADDRESS: ${SMTP_FROM?} MAIL_FROM_NAME: ${SMTP_FROM_NAME?} MAIL_HOST: ${SMTP_HOST?} MAIL_PASSWORD: ${SMTP_AUTHENTICATION_PASSWORD?} MAIL_PORT: ${SMTP_PORT?} MAIL_USERNAME: ${SMTP_AUTHENTICATION_USERNAME?} RABBITMQ_ADMIN: ${RABBITMQ_ADMIN?} RABBITMQ_HOST: ${RABBITMQ_HOST?} RABBITMQ_PASSWORD: ${RABBITMQ_PASSWORD?} RABBITMQ_PORT: ${RABBITMQ_PORT?} REDIS_HOST: keydb RESERVED_SPACE_SLUGS: ${RESERVED_SPACE_SLUGS} S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID?} S3_DEFAULT_REGION: ${S3_DEFAULT_REGION?} S3_ENDPOINT: ${S3_ENDPOINT?} S3_PROVIDER: ${S3_PROVIDER?} S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY?} S3_URL: ${S3_URL?} SCORMS_S3_BUCKET: ${SCORMS_S3_BUCKET?} URL_SIGNER_SIGNATURE_KEY: ${API_URL_SIGNER_SIGNATURE_KEY?} image: delovoytech/sinica:api-scheduler-${VERSION?} logging: options: max-file: "5" max-size: 10m networks: default: null restart: unless-stopped cert-copier: entrypoint: - sh - -c - cp -r /source/cert/* /destination/cert/ image: busybox networks: default: null volumes: - type: bind source: /home/gitlab-runner/builds/DxHrz1AWQ/0/delovoytech/sinica/infrastructure/traefik/cert target: /source/cert bind: create_host_path: true - type: volume source: certs target: /destination/cert volume: {} keycloak: command: - start-dev - --features=account3 environment: KC_PROXY: edge KEYCLOAK_ADMIN: ${KEYCLOAK_ADMIN_USERNAME:-admin} KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD?} PROXY_ADDRESS_FORWARDING: "true" hostname: keycloak healthcheck: test: - CMD-SHELL - curl --fail http://localhost:8080/realms/master timeout: 5s interval: 5s retries: 24 start_period: 10s image: delovoytech/sinica:keycloak-${VERSION?} labels: traefik.enable: "true" traefik.http.routers.keycloak.entrypoints: web,websecure traefik.http.routers.keycloak.rule: Host(`${KEYCLOAK_HOST?}`) traefik.http.services.keycloak.loadbalancer.server.port: "8080" logging: options: max-file: "5" max-size: 10m networks: default: null restart: unless-stopped volumes: - type: volume source: keycloak-database-data target: /opt/keycloak/data volume: {} keydb: healthcheck: test: - CMD - echo timeout: 5s interval: 10s retries: 3 image: eqalpha/keydb logging: options: max-file: "5" max-size: 10m networks: default: null restart: unless-stopped minio: command: - server - /data - --console-address - :9001 environment: MINIO_BROWSER_REDIRECT_URL: http://${MINIO_CONSOLE_HOST?} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD?} MINIO_ROOT_USER: ${MINIO_ROOT_USER?} hostname: minio healthcheck: test: - CMD - curl - -f - http://localhost:9000/minio/health/live timeout: 20s interval: 30s retries: 3 image: quay.io/minio/minio:RELEASE.2023-09-07T02-05-02Z labels: traefik.enable: "true" traefik.http.routers.minio-console.entrypoints: web,websecure traefik.http.routers.minio-console.rule: Host(`${MINIO_CONSOLE_HOST?}`) traefik.http.routers.minio-console.service: minio-console traefik.http.routers.minio.entrypoints: web,websecure traefik.http.routers.minio.rule: Host(`${MINIO_HOST?}`) traefik.http.routers.minio.service: minio traefik.http.services.minio-console.loadbalancer.server.port: "9001" traefik.http.services.minio.loadbalancer.server.port: "9000" logging: options: max-file: "5" max-size: 10m networks: default: null restart: unless-stopped volumes: - type: volume source: minio target: /data volume: {} postgres: environment: POSTGRES_DB: ${API_DB_DATABASE?} POSTGRES_PASSWORD: ${API_DB_PASSWORD?} POSTGRES_USER: ${API_DB_USERNAME?} healthcheck: test: - CMD-SHELL - pg_isready --username=$${POSTGRES_USER?} --dbname=$${POSTGRES_DB?} image: postgres:15 logging: options: max-file: "5" max-size: 10m networks: default: null restart: unless-stopped volumes: - type: volume source: postgres target: /var/lib/postgresql/data volume: {} rabbitmq: environment: RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD?} RABBITMQ_DEFAULT_USER: ${RABBITMQ_ADMIN?} RABBITMQ_NODENAME: rabbit@localhost image: rabbitmq:4.0.5-management labels: traefik.enable: "true" traefik.http.routers.rabbitmq.entrypoints: web,websecure traefik.http.routers.rabbitmq.rule: Host(`${RABBITMQ_MANAGER_HOST?}`) traefik.http.services.rabbitmq.loadbalancer.server.port: "15672" networks: default: null ports: - mode: ingress target: 15672 published: "15672" protocol: tcp restart: unless-stopped volumes: - type: volume source: rabbitmq target: /var/lib/rabbitmq volume: {} scorms-proxy: command: - /bin/sh - -c - " echo '\n server {\n listen 80;\n listen [::]:80;\n server_name localhost;\n location / {\n proxy_pass http://${SCORMS_S3_BUCKET?}.website.yandexcloud.net;\n }\n }\n' > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;' " image: nginx labels: traefik.enable: "true" traefik.http.middlewares.scorms-proxy-strip-path-prefix.stripprefix.prefixes: /scorms traefik.http.routers.scorms-proxy.entrypoints: web,websecure traefik.http.routers.scorms-proxy.middlewares: scorms-proxy-strip-path-prefix traefik.http.routers.scorms-proxy.priority: "3" traefik.http.routers.scorms-proxy.rule: ( Host(`${BASE_HOST?}`) || HostRegexp(`{subdomain:[a-z0-9-]+}.${BASE_HOST?}`) ) && PathPrefix(`/scorms`) traefik.http.services.scorms-proxy.loadbalancer.server.port: "80" logging: options: max-file: "5" max-size: 10m networks: default: null restart: unless-stopped swagger-ui: environment: URL: https://${CONTROL_HOST?}/api/swagger-specs image: swaggerapi/swagger-ui labels: traefik.enable: "true" traefik.http.routers.swagger-ui.entrypoints: web,websecure traefik.http.routers.swagger-ui.rule: Host(`${SWAGGER_HOST?}`) traefik.http.services.swagger-ui.loadbalancer.server.port: "8080" logging: options: max-file: "5" max-size: 10m networks: default: null restart: unless-stopped traefik: command: - --providers.docker - --providers.docker.exposedbydefault=false - --log - --api - --api.insecure=true - --ping=true - --entrypoints.web.address=:80 - --entrypoints.websecure.address=:443 - --entrypoints.websecure.http.tls=true environment: WHITELIST_IPS: ${WHITELIST_IPS} image: traefik:v2.10 labels: traefik.enable: "true" traefik.http.middlewares.admin-whitelist.ipwhitelist.sourcerange: ${WHITELIST_IPS} traefik.http.routers.traefik.entrypoints: web,websecure traefik.http.routers.traefik.middlewares: ${WHITELIST_IPS:+admin-whitelist@docker} traefik.http.routers.traefik.rule: Host(`${TRAEFIK_HOST?}`) traefik.http.routers.traefik.service: traefik traefik.http.services.traefik.loadbalancer.server.port: "8080" logging: options: max-file: "5" max-size: 10m networks: default: null ports: - target: 80 published: "80" protocol: tcp - target: 443 published: "443" protocol: tcp restart: unless-stopped volumes: - type: bind source: /var/run/docker.sock target: /var/run/docker.sock read_only: true bind: create_host_path: true web: image: delovoytech/sinica:web-${VERSION?} labels: traefik.enable: "true" traefik.http.routers.web.entrypoints: web,websecure traefik.http.routers.web.priority: "1" traefik.http.routers.web.rule: Host(`${BASE_HOST?}`) || HostRegexp(`{subdomain:[a-z0-9-]+}.${BASE_HOST?}`) traefik.http.services.web.loadbalancer.server.port: "3000" logging: options: max-file: "5" max-size: 10m networks: default: null restart: unless-stopped networks: default: {} volumes: certs: {} keycloak-database-data: {} minio: {} postgres: {} rabbitmq: {}