http: routers: # ── Hub (Portfolio SPA) ── hub: rule: 'Host(`asepharyana.my.id`) || Host(`www.asepharyana.my.id`) || Host(`asepharyana.web.id`) || Host(`www.asepharyana.web.id`)' entryPoints: - websecure tls: {} middlewares: - common-chain@file service: hub-service # ── Scraper API ── scraper: rule: 'Host(`scraper.asepharyana.my.id`) || Host(`api.asepharyana.my.id`) || Host(`scraper.asepharyana.web.id`) || Host(`api.asepharyana.web.id`)' entryPoints: - websecure tls: {} middlewares: - common-chain@file service: scraper-service # ── LLM API (MiniCPM-V) ── llm-api: rule: 'Host(`ai.asepharyana.my.id`) || Host(`ai.asepharyana.web.id`)' entryPoints: - websecure tls: {} middlewares: - llm-chain@file service: llm-api-service # ── Tools (Document Scanner & Media Processing) ── tools: rule: 'Host(`tools.asepharyana.my.id`) || Host(`tools.asepharyana.web.id`)' entryPoints: - websecure tls: {} middlewares: - common-chain@file service: tools-service # ── Jaeger UI ── jaeger: rule: 'Host(`jaeger.asepharyana.my.id`) || Host(`jaeger.asepharyana.web.id`)' entryPoints: - websecure tls: {} middlewares: - common-chain@file service: jaeger-service services: hub-service: loadBalancer: servers: - url: 'http://host.docker.internal:3099' scraper-service: loadBalancer: servers: - url: 'http://scraper-api:4091' tools-service: loadBalancer: servers: - url: 'http://tools:3000' llm-api-service: loadBalancer: servers: - url: 'http://llm-api:8080' jaeger-service: loadBalancer: servers: - url: 'http://jaeger:16686'