
Eco²
Backend · Cloud infrastructure
Rady k triedeniu odpadu z jednej fotky a rozhovoru.
Univerzálny asistent AI, ktorý rozumie tomu, ako funguje triedenie odpadu v Kórei.
Eco² vocabulary
- edge
- auth offload
- domain api
- task queue
- scan pipeline
- chat agent
- event bus
- cluster
- gitops
- autoscaling
- observability
- load test
- evaluation
Edge: ROUTE 53 · ALB · HTTPS 443 · internet-facing · external-dns · istio-ingressgateway · NodePort · eco2-gateway · VirtualService · x-canary · AuthorizationPolicy · ENVOY SIDECAR · kiali-serverAuth Offload: AuthorizationPolicy · action: CUSTOM · notPaths · envoyExtAuthzGrpc · failOpen: false · CheckRequest · x-user-id · BlacklistCache · BootstrapFromRedis · outbox:blacklist · blacklist.events · UsersServiceDomain API: VirtualService · x-user-id · /api/v1/scan · X-Idempotency-Key · job_id · stream_url · 202 ACCEPTED · Retry-After · ScanTask · UsersService · ImageService · ENVOY SIDECARTask Queue: outbox:blacklist · blacklist.events · RabbitmqCluster · scan.direct · reward.events · dlx · x-dead-letter-exchange · chat.process · AioPikaBroker · task_acks_late · apply_async · gevent · scan.vision · scan.rule · scan.answer · scan.reward · CELERY CHAIN · QueueLength · inspect ping · QUEUE SATURATIONScan Pipeline: ScanTask · scan.direct · reward.events · apply_async · gevent · scan.vision · scan.rule · scan.answer · scan.reward · CELERY CHAIN · RewardStep · item_class_list.yaml · situation_tags.yaml · LITE RAG · JsonRegulationRetriever · PipelineStage · waste_rag · XADD · domain: worker-ai · pipeline_duration · vision_stage_durationChat Agent: ImageService · chat.process · AioPikaBroker · create_chat_graph · route_by_intent · MULTI-INTENT FANOUT · waste_rag · recyclable_price · collection_point · image_generation · aggregator · thread_id · SyncableRedisSaver · AsyncPostgresSaver · LANGSMITH_TRACING · regenerateEvent Bus: job_id · stream_url · PipelineStage · XADD · scan:events:{shard} · XREADGROUP · XACK · XAUTOCLAIM · PendingReclaimer · STATE KV · scan:state:{job_id} · sse:events:{shard} · SSEBroadcastManager · Last-Event-ID · scan_sse_connections_active · ServiceMonitor · traceparentCluster: NodePort · kubeadm init · kubeadm join · vxlanMode · BGPConfiguration · module "vpc" · worker_ai · nodeSelector · domain: worker-ai · NoSchedule · 24-NODE CLUSTERGitOps: external-dns · x-canary · dev-root · ApplicationSet · sync-wave · selfHeal · ignoreDifferences · argocd-image-updater · update-strategy: digest · write-back-method · targetRevision · ci-services.ymlAutoscaling: ignoreDifferences · ScaledObject · QueueLength · cooldownPeriod · pollingInterval · fallback · maxReplicaCount · stabilizationWindowSeconds · HorizontalPodAutoscaler · scan_sse_connections_active · prometheus-adapterObservability: 24-NODE CLUSTER · prometheus-adapter · FLUENT BIT · Elasticsearch · Kibana · kube-prometheus-stack · AlertmanagerConfig · ServiceMonitor · JAEGER · OPENTELEMETRY · traceparent · kiali-server · LANGSMITH_TRACINGLoad Test: k6 · ramping-vus · thresholds · pipeline_duration · vision_stage_duration · poll_timeout · inspect ping · WORKER RESTART · POLLING TIMEOUT · QUEUE SATURATIONEvaluation: EvalConfig · eval_mode · eval_sample_rate · eval_cost_budget_daily_usd · EvalResult · EvalGrade · code_grader · llm_grader · CUSUM · regenerate · OpenAIBARSEvaluator
Ako sa 24 uzlov skutočne prepája, tok po toku.
Samostatne spravovaný Kubernetes zostavený pomocou kubeadm. Mapa umiestňuje 24 fyzických uzlov a workloady na nich do piatich vrstiev z README a spája ich skutočnými spojeniami. Výber toku zvýrazní len túto cestu s očíslovanými krokmi.
Rozpozná odpad na fotografii a vysvetlí, ako s ním naložiť, a v konverzácii volá nástroje pre miesta, počasie, výkupné ceny druhotných surovín a vyhľadávanie na webe a generuje obrázky. V tomto tímovom projekte sa môj rozsah začal pri klastri a základe nasadenia a postupne sa rozšíril o doménový backend, asynchrónne spracovanie, konverzačného agenta a overovanie.
Od súťažného vývoja po spevnenie backendu a prevádzky
Služba ukončila prevádzku; nahraté demo a technická správa ju ukazujú v činnosti.
Požiadavka Scan → živé doručenie
Požiadavka na analýzu fotografie sa stane prácou vo fronte a jej udalosti o postupe sa vracajú do toho istého prehliadača.
Prehliadačdopyt DNS: dopyt DNSRoute 53
Zo záznamov Route 53 sa prekladá len názov. Požiadavky cez DNS neprechádzajú.
Prehliadačdátový tok: HTTPS 443AWS ALB
TLS končí na ALB.
AWS ALBdátový tok: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayOdovzdané ingress Envoy Istio cez NodePort cieľa typu inštancia EC2.
Istio ingress Envoy
k8s-ingress-gatewaydátový tok: VirtualServiceScan APIk8s-api-scanSmerované do Scan API, ktoré prácu zaradí do frontu a okamžite vráti job_id; dopyt na výsledok odpovedá 202, kým úloha neskončí.
Scan API
k8s-api-scandátový tok: Úloha CeleryRabbitMQk8s-rabbitmqÚloha Scan ide do RabbitMQ.
RabbitMQ
k8s-rabbitmqdátový tok: consumescan-workerk8s-worker-ai · k8s-worker-ai-2scan-worker (Celery · gevent) v poole AI ju prevezme a spustí Vision → Rule → Answer → Reward. Štyri fázy sú zreťazené úlohy Celery, nie uzly.
Pool AI
k8s-worker-ai · k8s-worker-ai-2dátový tok: HTTPSLLM APIWorkery scan a chat volajú API OpenAI a Google.
scan-worker
k8s-worker-ai · k8s-worker-ai-2dátový tok: XADD scan:eventsStreamsk8s-redis-streamsUdalosti o postupe sa zapisujú do jedného zo štyroch shardov Streams.
Streams
k8s-redis-streamsdátový tok: XREADGROUPEvent Routerk8s-event-routerEvent Router ich číta ako consumer group a po spracovaní vykoná XACK; pending a reclaim udržiavajú doručenie typu at-least-once.
Event Router
k8s-event-routerdátový tok: SETEX stateState KVk8s-redis-streamsZapisuje najnovší stav a značku duplicitného spracovania do State KV na tom istom uzle Redis.
Event Router
k8s-event-routerdátový tok: PUBLISHPub/Subk8s-redis-pubsubDoručované v reálnom čase na kanáli úlohy v shardovanom Pub/Sub.
Pub/Sub
k8s-redis-pubsubdátový tok: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway sa prihlasuje na odber cez jeden zdieľaný listener na proces a rozosiela do každého pripojeného prehliadača.
SSE Gateway
k8s-sse-gatewaydátový tok: Stream SSEPrehliadačSpojenie otvorené tou istou cestou cez ALB a ingress. Doručenie typu at-least-once; duplicity sa spracúvajú idempotentne.
State KV
k8s-redis-streamsdátový tok: Obnova po opätovnom pripojeníSSE Gatewayk8s-sse-gatewayPo opätovnom pripojení s Last-Event-ID doplnia State KV a uchované Streams zmeškané udalosti.
Chat · tokeny a ukladanie
Tokeny Chat idú tou istou cestou udalostí ako Scan; checkpointy a správy ukladajú dva rôzne workloady.
Prehliadačdátový tok: HTTPS 443AWS ALB
TLS končí na ALB.
AWS ALBdátový tok: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayOdovzdané ingress Envoy Istio cez NodePort cieľa typu inštancia EC2.
Istio ingress Envoy
k8s-ingress-gatewaydátový tok: VirtualServiceChat APIk8s-api-chatSmerované do Chat API.
Chat API
k8s-api-chatdátový tok: Úloha TaskiqRabbitMQk8s-rabbitmqÚloha Chat ide do RabbitMQ.
RabbitMQ
k8s-rabbitmqdátový tok: consumechat-workerk8s-worker-ai · k8s-worker-ai-2chat-worker (Taskiq · asyncio) klasifikuje zámer pomocou LangGraph, potom podľa potreby spustí vision, vybrané nástroje, aggregator a podľa potreby zhrnutie a odpovie. Každá požiadavka spúšťa len vetvy, ktoré potrebuje.
Pool AI
k8s-worker-ai · k8s-worker-ai-2dátový tok: HTTPSLLM APIWorkery scan a chat volajú API OpenAI a Google.
chat-worker
k8s-worker-ai · k8s-worker-ai-2dátový tok: XADD chat:eventsStreamsk8s-redis-streamsTokeny a udalosti fáz sa zapisujú do štyroch shardov Streams; odtiaľ je cesta doručenia rovnaká ako pri Scan.
Streams
k8s-redis-streamsdátový tok: XREADGROUPEvent Routerk8s-event-routerEvent Router ich číta ako consumer group a po spracovaní vykoná XACK; pending a reclaim udržiavajú doručenie typu at-least-once.
Event Router
k8s-event-routerdátový tok: PUBLISHPub/Subk8s-redis-pubsubDoručované v reálnom čase na kanáli úlohy v shardovanom Pub/Sub.
Pub/Sub
k8s-redis-pubsubdátový tok: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway sa prihlasuje na odber cez jeden zdieľaný listener na proces a rozosiela do každého pripojeného prehliadača.
SSE Gateway
k8s-sse-gatewaydátový tok: Stream SSEPrehliadačSpojenie otvorené tou istou cestou cez ALB a ingress. Doručenie typu at-least-once; duplicity sa spracúvajú idempotentne.
chat-worker
k8s-worker-ai · k8s-worker-ai-2dátový tok: checkpointCachek8s-redis-cacheCheckpoint LangGraph sa uchováva v Redis Cache.
Cache
k8s-redis-cachedátový tok: čítanie checkpointucheckpoint-syncerk8s-worker-ai · k8s-worker-ai-2checkpoint-syncer číta checkpoint z Redis.
checkpoint-syncer
k8s-worker-ai · k8s-worker-ai-2dátový tok: synchronizácia do PostgreSQLPostgreSQLk8s-postgresqlAsyncPostgresSaver ho asynchrónne ukladá do PostgreSQL.
Streams
k8s-redis-streamsdátový tok: chat-persistence grouppersistence consumerk8s-api-chatPersistence consumer na uzle Chat číta udalosti done ako consumer group.
persistence consumer
k8s-api-chatdátový tok: uloženie správPostgreSQLk8s-postgresqlSprávy Chat sa ukladajú do PostgreSQL. Je to iný workload ako checkpoint-syncer.
Vstup · autentifikácia
Synchrónna cesta od vstupu do klastra k doménovému API. Autentifikáciu najprv kontrolujú len cesty chránené politikou; prevádzka podov medzi uzlami beží na Calico VXLAN.
Prehliadačdopyt DNS: dopyt DNSRoute 53
Zo záznamov Route 53 sa prekladá len názov. Požiadavky cez DNS neprechádzajú.
Prehliadačdátový tok: HTTPS 443AWS ALB
TLS končí na ALB.
AWS ALBdátový tok: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayOdovzdané ingress Envoy Istio cez NodePort cieľa typu inštancia EC2.
Istio ingress Envoy
k8s-ingress-gatewaydátový tok: ext-authz · gRPC 50051ext-authzk8s-api-authLen cesty pod politikou CUSTOM sa najprv pýtajú Go ext-authz (timeout 2 s, failOpen false). Cesty ako prihlásenie, health a docs sú vylúčené.
ext-authz
k8s-api-authdátový tok: vyhľadanie v blacklisteblacklistk8s-redis-authToken sa kontroluje voči blacklistu v Redis.
Istio ingress Envoy
k8s-ingress-gatewaydátový tok: VirtualServiceChat APIk8s-api-chatSmerované do Chat API.
Chat API
k8s-api-chatdátový tok: gRPCimages APIk8s-api-imageSynchrónne volanie chat → images uvedené v README.
auth API
k8s-api-authdátový tok: gRPCusers APIk8s-api-usersSynchrónne volanie auth → users uvedené v README.
Pool storage · asynchrónne zápisy
Blacklist autentifikácie a vlastníctvo postáv ukladajú workery poolu storage, ktoré berú prácu z RabbitMQ.
blacklist
k8s-redis-authdátový tok: outbox:blacklistauth-relayk8s-worker-storage · k8s-worker-storage-2auth-relay (auth-Bus z README) číta outbox v Redis.
auth-relay
k8s-worker-storage · k8s-worker-storage-2dátový tok: blacklist.eventsRabbitMQk8s-rabbitmqZnova publikuje do RabbitMQ, s opakovaním a DLQ.
RabbitMQ
k8s-rabbitmqdátový tok: blacklist.eventsauth-workerk8s-worker-storage · k8s-worker-storage-2auth-worker prijíma udalosti blacklistu.
auth-worker
k8s-worker-storage · k8s-worker-storage-2dátový tok: uloženie blacklistublacklistk8s-redis-authUkladajú sa do blacklistu v Redis.
RabbitMQ
k8s-rabbitmqdátový tok: Celery batchusers-workerk8s-worker-storage · k8s-worker-storage-2users-worker prijíma prácu na vlastníctve postáv v dávkach.
users-worker
k8s-worker-storage · k8s-worker-storage-2dátový tok: UPSERTPostgreSQLk8s-postgresqlTá sa premieta do PostgreSQL.
Konfigurácia · škálovanie · pozorovanie
Platform Layer nie je krokom, ktorým prechádzajú požiadavky; nasadzuje, konfiguruje, škáluje a pozoruje ostatné vrstvy. Uzly sú inštancie EC2 vytvorené pomocou Terraform, s kubeadm a Calico nainštalovanými cez Ansible; CI Terraform len validuje a nikdy ho automaticky neaplikuje.
GitHub Actions · Docker Hubkonfigurácia · škálovanie: obraz · revízia manifestuArgo CD image updater
k8s-masterArgo CD zosúlaďuje konfiguráciu klastra cez App-of-Apps a Sync Waves. Potvrdené bolo len umiestnenie image updatera na control-plane.
ALB Controller · ExternalDNS
k8s-masterkonfigurácia · škálovanie: Ingress → ALB · záznamy DNSSpravované AWSALB Controller a ExternalDNS konfigurujú prostriedky na strane AWS. Nejde o cestu, ktorou prechádzajú požiadavky.
Istiod
k8s-masterkonfigurácia · škálovanie: konfigurácia xDSIstio ingress Envoyk8s-ingress-gatewayIstiod posiela konfiguráciu Gateway, VirtualService a EnvoyFilter cez xDS do ingress Envoy a do sidecaru Envoy každého API.
KEDA
k8s-monitoringkonfigurácia · škálovanie: počet podovPool AIk8s-worker-ai · k8s-worker-ai-2KEDA upravuje počet podov workerov. Počet uzlov sa nemení.
KEDA
k8s-monitoringkonfigurácia · škálovanie: počet podovpool storagek8s-worker-storage · k8s-worker-storage-2Pody workerov v poole storage sa škálujú rovnako.
Fluent Bitpozorovateľnosť: logyElasticsearch
k8s-loggingFluent Bit je DaemonSet na každom uzle a posiela logy do Elasticsearch.
Pool AI
k8s-worker-ai · k8s-worker-ai-2pozorovateľnosť: trasovanie behov LLMLangSmithStopy volaní LLM idú do LangSmith, externej služby SaaS.
Každé spojenie s rovnakou váhou. Výber toku zvýrazní len jeho cestu s očíslovanými krokmi.
- Plná čiara · smer toku požiadaviek, práce, udalostí a zápisov
- Bodkovaná · dopyt DNS; požiadavky ním neprechádzajú
- Prerušovaná čiara · konfigurácia alebo škálovanie; nie je to dátová cesta
- Dlhá bodkočiarkovaná · logy a trasovanie behov
- Hrubá čierna čiara · zvolený tok; čísla udávajú poradie
- Rámček · fyzický uzol, názov hostiteľa v hlavičke
- Vnútorný štítok · workload bežiaci na tomto uzle
- Prerušovaný rám · dvojuzlový plánovací pool
- Prerušovaný rámček · mimo klastra, nepočíta sa ako uzol
- Oranžový obrys · miesto, kde rozhoduje model
- Control plane1 uzol
- Domain API8 uzlov
- Pool AI2 uzly
- pool storage2 uzly
- Data5 uzlov
- Platform6 uzlov
Päť vrstiev z README (pásy) a fyzické skupiny (odtieň hlavičky každého uzla) zoskupujú tie isté 24 uzly inak. State KV zdieľa uzol so Streams a nepočíta sa osobitne; Route 53, ALB a služby mimo klastra nie sú uzly. Pool je rozsah plánovania, nie tvrdenie, že každý pod beží na oboch uzloch.
24uzlov
24 = 1 control plane + 8 API + 4 worker + 5 data + 6 platform
1Control plane
role: control-planekube-apiserver · scheduler · controller-manager · etcd a platformové kontroléry.
- k8s-master
8Domain API
domain: <služba>Jeden uzol na doménu. Interné volania používajú gRPC.
- k8s-api-auth
- k8s-api-users
- k8s-api-scan
- k8s-api-character
- k8s-api-location
- k8s-api-image
- k8s-api-chat
- k8s-api-info
4Execution worker
Dva plánovacie pooly po dvoch uzloch. KEDA mení počet podov; počet uzlov zostáva rovnaký.
pool storage
domain: worker-storage- k8s-worker-storage
- k8s-worker-storage-2
Pool AI
domain: worker-ai- k8s-worker-ai
- k8s-worker-ai-2
5Data
Redis je rozdelený podľa účelu na štyri uzly. Úložisko PostgreSQL je EBS CSI · gp3.
- k8s-postgresql
- k8s-redis-auth
- k8s-redis-streams
- k8s-redis-cache
- k8s-redis-pubsub
6Platform
Zasielanie správ, pozorovateľnosť, ingress a doručovanie v reálnom čase majú každé vlastný uzol.
- k8s-rabbitmq
- k8s-monitoring
- k8s-logging
- k8s-ingress-gateway
- k8s-sse-gateway
- k8s-event-router
- Každý uzol
- Fluent Bit · DaemonSet
- Calico
Nastavené modely · podľa poskytovateľa
Služba bola ukončená, takže ide o modely nastavené v repozitári, nie o dnes dostupné voľby. Každá rola je uvedená osobitne; nejde o zoznam overených behov.
OpenAI
Predvolený poskytovateľ Chat
Chat
openai/gpt-5.2predvolený
Predvoleným modelom je gpt-5.2; model uvedený v požiadavke má prednosť.
Scan
gpt-5.2predvolenýgpt-5.2-progpt-5.1gpt-5gpt-5-progpt-5-mini
Modely mimo mapovania 13 modelov sa odmietajú.
Mapovanie obrázkov
gpt-image-1.5
Oddelený od gpt-5.2, orchestračného modelu Responses. Generovanie obrázkov je predvolene vypnuté.
Evaluácia
gpt-4o-minipredvolený
Hodnotiteľ LLM na evaluáciu konverzácií, oddelený od modelu Chat.
Google
Keď Chat zvolí Google
Chat
google/gemini-3-pro-previewgoogle/gemini-3-flash-preview
Pri zvolenom Google je predvolený gemini-3-flash-preview.
Scan
gemini-3-pro-previewgemini-3-flash-previewgemini-2.5-progemini-2.5-flashgemini-2.5-flash-litegemini-2.0-flashgemini-2.0-flash-lite
Mapovanie obrázkov
gemini-3-pro-image-preview
Zdrojbackend main d8840c7Verejný commit September 29, 2026 · overené October 8, 2026