
Eco²
Backend · Cloud infrastructure
Taaskasutusjuhised ühest fotost ja vestlusest.
Kõik-ühes AI-assistent, mis mõistab, kuidas Koreas jäätmeid sorteeritakse.
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
Kuidas 24 sõlme tegelikult ühenduvad, üks voog korraga.
Kubeadmiga ehitatud iseseisvalt hallatav Kubernetes. Kaart paigutab 24 füüsilist sõlme ja nendel töötavad töökoormused README viide kihti ning ühendab need tegelike ühendustega. Vali voog ja esile tõstetakse ainult selle tee nummerdatud sammudega.
See tuvastab jäätmed fotolt ja selgitab, kuidas neid käidelda, ning vestluses kutsub tööriistu kohtade, ilma, taaskasutushindade ja veebiotsingu jaoks ning genereerib pilte. Selles meeskonnaprojektis alustasin klastri ja juurutamise alusest ning laiendasin oma ulatust domeeni taustasüsteemile, asünkroonsele töötlusele, vestlusagendile ja verifitseerimisele.
Võistluse arendusest kuni taustasüsteemi ja käitamise tugevdamiseni
Teenus on oma töö lõpetanud; salvestatud demo ja tehniline aruanne näitavad seda töös.
Scani päring → reaalajas edastamine
Fotoanalüüsi päringust saab järjekorras töö ja selle edenemissündmused jõuavad tagasi samasse brauserisse.
BrauserDNS-päring: DNS-päringRoute 53
Route 53 kirjetest leitakse ainult nimi. Päringud DNS-ist läbi ei lähe.
Brauserandmevoog: HTTPS 443AWS ALB
TLS lõpeb ALB-s.
AWS ALBandmevoog: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayAntakse EC2 instance target'i NodePorti kaudu üle Istio ingress Envoyle.
Istio ingress Envoy
k8s-ingress-gatewayandmevoog: VirtualServiceScan APIk8s-api-scanSuunatakse Scan API-le, mis paneb töö järjekorda ja tagastab kohe job_id; tulemuse päring vastab koodiga 202, kuni töö on valmis.
Scan API
k8s-api-scanandmevoog: Celery ülesanneRabbitMQk8s-rabbitmqScani ülesanne läheb RabbitMQ-sse.
RabbitMQ
k8s-rabbitmqandmevoog: consumescan-workerk8s-worker-ai · k8s-worker-ai-2AI-kogumi scan-worker (Celery · gevent) võtab selle ja käivitab etapid Vision → Rule → Answer → Reward. Neli etappi on aheldatud Celery ülesanded, mitte sõlmed.
AI-kogum
k8s-worker-ai · k8s-worker-ai-2andmevoog: HTTPSLLM APIScan- ja chat-workerid kutsuvad OpenAI ja Google'i API-sid.
scan-worker
k8s-worker-ai · k8s-worker-ai-2andmevoog: XADD scan:eventsStreamsk8s-redis-streamsEdenemissündmused kirjutatakse ühte neljast Streamsi killust.
Streams
k8s-redis-streamsandmevoog: XREADGROUPEvent Routerk8s-event-routerEvent Router loeb need tarbijarühmana ja kinnitab pärast töötlemist käsuga XACK; pending ja reclaim hoiavad edastuse vähemalt korra põhimõttel.
Event Router
k8s-event-routerandmevoog: SETEX stateState KVk8s-redis-streamsSee kirjutab viimase oleku ja topelttöötluse märgi sama Redise sõlme State KV-sse.
Event Router
k8s-event-routerandmevoog: PUBLISHPub/Subk8s-redis-pubsubEdastatakse reaalajas töö kanalil shard Pub/Subis.
Pub/Sub
k8s-redis-pubsubandmevoog: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway tellib need ühe protsessipõhise jagatud kuulaja kaudu ja jagab edasi igale ühendatud brauserile.
SSE Gateway
k8s-sse-gatewayandmevoog: SSE voogBrauserÜhendus avatakse sama ALB ja ingress'i tee kaudu. Edastamine on vähemalt korra; duplikaate käsitletakse idempotentselt.
State KV
k8s-redis-streamsandmevoog: Taastamine uuesti ühendumiselSSE Gatewayk8s-sse-gatewayKui brauser ühendub uuesti Last-Event-ID-ga, täidavad State KV ja säilitatud Streams vahele jäänud sündmused.
Chat · tokenid ja salvestamine
Chati tokenid liiguvad sama sündmusteed mööda kui Scani omad; checkpoint'e ja sõnumeid salvestavad kaks eri töökoormust.
Brauserandmevoog: HTTPS 443AWS ALB
TLS lõpeb ALB-s.
AWS ALBandmevoog: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayAntakse EC2 instance target'i NodePorti kaudu üle Istio ingress Envoyle.
Istio ingress Envoy
k8s-ingress-gatewayandmevoog: VirtualServiceChat APIk8s-api-chatSuunatakse Chat API-le.
Chat API
k8s-api-chatandmevoog: Taskiq ülesanneRabbitMQk8s-rabbitmqChati ülesanne läheb RabbitMQ-sse.
RabbitMQ
k8s-rabbitmqandmevoog: consumechat-workerk8s-worker-ai · k8s-worker-ai-2chat-worker (Taskiq · asyncio) liigitab kavatsuse LangGraphiga, käivitab seejärel vajaduse korral vision-etapi, valitud tööriistad, aggregatori ja vajaduse korral kokkuvõtte ning vastab. Iga päring käivitab ainult vajalikud harud.
AI-kogum
k8s-worker-ai · k8s-worker-ai-2andmevoog: HTTPSLLM APIScan- ja chat-workerid kutsuvad OpenAI ja Google'i API-sid.
chat-worker
k8s-worker-ai · k8s-worker-ai-2andmevoog: XADD chat:eventsStreamsk8s-redis-streamsTokenid ja etapisündmused kirjutatakse nelja Streamsi killu; sealt edasi on edastamise tee sama mis Scanil.
Streams
k8s-redis-streamsandmevoog: XREADGROUPEvent Routerk8s-event-routerEvent Router loeb need tarbijarühmana ja kinnitab pärast töötlemist käsuga XACK; pending ja reclaim hoiavad edastuse vähemalt korra põhimõttel.
Event Router
k8s-event-routerandmevoog: PUBLISHPub/Subk8s-redis-pubsubEdastatakse reaalajas töö kanalil shard Pub/Subis.
Pub/Sub
k8s-redis-pubsubandmevoog: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway tellib need ühe protsessipõhise jagatud kuulaja kaudu ja jagab edasi igale ühendatud brauserile.
SSE Gateway
k8s-sse-gatewayandmevoog: SSE voogBrauserÜhendus avatakse sama ALB ja ingress'i tee kaudu. Edastamine on vähemalt korra; duplikaate käsitletakse idempotentselt.
chat-worker
k8s-worker-ai · k8s-worker-ai-2andmevoog: checkpointCachek8s-redis-cacheLangGraphi checkpoint hoitakse Redis Cache'is.
Cache
k8s-redis-cacheandmevoog: checkpoint'i lugeminecheckpoint-syncerk8s-worker-ai · k8s-worker-ai-2checkpoint-syncer loeb checkpoint'i Redisest.
checkpoint-syncer
k8s-worker-ai · k8s-worker-ai-2andmevoog: sünkroonimine PostgreSQL-iPostgreSQLk8s-postgresqlAsyncPostgresSaver salvestab selle PostgreSQL-i asünkroonselt.
Streams
k8s-redis-streamsandmevoog: chat-persistence grouppersistence consumerk8s-api-chatChati sõlme persistence consumer loeb done-sündmusi tarbijarühmana.
persistence consumer
k8s-api-chatandmevoog: sõnumite salvestaminePostgreSQLk8s-postgresqlChati sõnumid salvestatakse PostgreSQL-i. See on checkpoint-syncerist erinev töökoormus.
Sisenemine · autentimine
Sünkroonne tee klastri sisenemispunktist domeeni API-ni. Ainult poliitikaga kaitstud teed kontrollivad esmalt autentimist; sõlmedevaheline podide liiklus käib üle Calico VXLAN-i.
BrauserDNS-päring: DNS-päringRoute 53
Route 53 kirjetest leitakse ainult nimi. Päringud DNS-ist läbi ei lähe.
Brauserandmevoog: HTTPS 443AWS ALB
TLS lõpeb ALB-s.
AWS ALBandmevoog: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayAntakse EC2 instance target'i NodePorti kaudu üle Istio ingress Envoyle.
Istio ingress Envoy
k8s-ingress-gatewayandmevoog: ext-authz · gRPC 50051ext-authzk8s-api-authAinult CUSTOM-poliitika all olevad teed küsivad kõigepealt Go ext-authzilt (ajalõpp 2 s, failOpen false). Näiteks sisselogimise, health'i ja docs'i teed on välja jäetud.
ext-authz
k8s-api-authandmevoog: keelunimekirja päringblacklistk8s-redis-authTokenit kontrollitakse Redise keelunimekirja vastu.
Istio ingress Envoy
k8s-ingress-gatewayandmevoog: VirtualServiceChat APIk8s-api-chatSuunatakse Chat API-le.
Chat API
k8s-api-chatandmevoog: gRPCimages APIk8s-api-imageREADME-s nimetatud sünkroonne kutse chat → images.
auth API
k8s-api-authandmevoog: gRPCusers APIk8s-api-usersREADME-s nimetatud sünkroonne kutse auth → users.
Salvestuskogum · asünkroonsed kirjutused
Autentimise keelunimekirja ja tegelaste omandiõigused salvestavad salvestuskogumi workerid, mis võtavad oma töö RabbitMQ-st.
blacklist
k8s-redis-authandmevoog: outbox:blacklistauth-relayk8s-worker-storage · k8s-worker-storage-2auth-relay (README auth-Bus) loeb Redise outbox'i.
auth-relay
k8s-worker-storage · k8s-worker-storage-2andmevoog: blacklist.eventsRabbitMQk8s-rabbitmqSee avaldab uuesti RabbitMQ-sse korduste ja DLQ-ga.
RabbitMQ
k8s-rabbitmqandmevoog: blacklist.eventsauth-workerk8s-worker-storage · k8s-worker-storage-2auth-worker võtab vastu keelunimekirja sündmused.
auth-worker
k8s-worker-storage · k8s-worker-storage-2andmevoog: keelunimekirja salvestamineblacklistk8s-redis-authNeed salvestatakse Redise keelunimekirja.
RabbitMQ
k8s-rabbitmqandmevoog: Celery batchusers-workerk8s-worker-storage · k8s-worker-storage-2users-worker võtab tegelaste omandiõiguse tööd vastu partiidena.
users-worker
k8s-worker-storage · k8s-worker-storage-2andmevoog: UPSERTPostgreSQLk8s-postgresqlNeed rakendatakse PostgreSQL-is.
Seadistamine · skaleerimine · jälgimine
Platform Layer ei ole samm, mida päringud läbivad; see juurutab, seadistab, skaleerib ja jälgib teisi kihte. Sõlmed on Terraformiga loodud EC2 instantsid, millele Ansible paigaldas kubeadmi ja Calico; CI ainult valideerib Terraformi ega rakenda seda kunagi automaatselt.
GitHub Actions · Docker Hubkonfigureerimine · skaleerimine: tõmmis · manifesti redaktsioonArgo CD image updater
k8s-masterArgo CD viib klastri konfiguratsiooni vastavusse App-of-Apps'i ja Sync Waves'i abil. Kinnitatud on ainult image updater'i paiknemine control-plane'il.
ALB Controller · ExternalDNS
k8s-masterkonfigureerimine · skaleerimine: Ingress → ALB · DNS-kirjedAWS-i hallatudALB Controller ja ExternalDNS seadistavad AWS-i poole ressursid. See ei ole tee, mida päringud läbivad.
Istiod
k8s-masterkonfigureerimine · skaleerimine: xDS konfiguratsioonIstio ingress Envoyk8s-ingress-gatewayIstiod lükkab Gateway, VirtualService'i ja EnvoyFilteri konfiguratsiooni xDS-i kaudu ingress Envoyle ja iga API Envoy sidecar'ile.
KEDA
k8s-monitoringkonfigureerimine · skaleerimine: podide arvAI-kogumk8s-worker-ai · k8s-worker-ai-2KEDA reguleerib worker-podide arvu. Sõlmede arv ei muutu.
KEDA
k8s-monitoringkonfigureerimine · skaleerimine: podide arvsalvestuskogumk8s-worker-storage · k8s-worker-storage-2Salvestuskogumi worker-pode skaleeritakse samamoodi.
Fluent Bitjälgitavus: logidElasticsearch
k8s-loggingFluent Bit on iga sõlme DaemonSet ja saadab logid Elasticsearchi.
AI-kogum
k8s-worker-ai · k8s-worker-ai-2jälgitavus: LLM-käivituste jälitusLangSmithLLM-kutsete jäljed lähevad LangSmithi, välisesse SaaS-i.
Kõik ühendused sama kaaluga. Vali voog, et tõsta esile ainult selle tee koos nummerdatud sammudega.
- Pidevjoon · päringute, tööde, sündmuste ja kirjutuste liikumise suund
- Punktiirjoon · DNS-päring; päringud selle kaudu ei liigu
- Kriipsjoon · konfigureerimine või skaleerimine; mitte andmetee
- Pikk kriips-punktjoon · logid ja käivituste jälitus
- Paks must joon · valitud voog; numbrid näitavad järjekorda
- Kast · füüsiline sõlm, hostinimi päises
- Sisemine silt · selles sõlmes töötav töökoormus
- Kriipsjoonega raam · kahe sõlme ajastuskogum
- Kriipsjoonega kast · klastrist väljas, sõlmeks ei loeta
- Oranž kontuur · koht, kus mudel otsustab
- Control plane1 sõlm
- Domain API8 sõlme
- AI-kogum2 sõlme
- salvestuskogum2 sõlme
- Data5 sõlme
- Platform6 sõlme
README viis kihti (vööndid) ja füüsilised rühmad (iga sõlme päise toon) rühmitavad samu 24 sõlme erinevalt. State KV jagab Streamsi sõlme ja seda eraldi ei loeta; Route 53, ALB ja klastrist väljaspool olevad teenused ei ole sõlmed. Kogum on ajastamisvahemik, mitte väide, et iga pod töötab mõlemal sõlmel.
24sõlme
24 = 1 control plane + 8 API + 4 worker + 5 data + 6 platform
1Control plane
role: control-planekube-apiserver · scheduler · controller-manager · etcd ning platvormi kontrollerid.
- k8s-master
8Domain API
domain: <teenus>Üks sõlm domeeni kohta. Sisekutsed kasutavad gRPC-d.
- 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
Kaks ajastamiskogumit, kummaski kaks sõlme. KEDA muudab podide arvu; sõlmede arv jääb samaks.
salvestuskogum
domain: worker-storage- k8s-worker-storage
- k8s-worker-storage-2
AI-kogum
domain: worker-ai- k8s-worker-ai
- k8s-worker-ai-2
5Data
Redis on jagatud nelja kasutusotstarbepõhise sõlme vahel. PostgreSQL-i salvestus on EBS CSI · gp3.
- k8s-postgresql
- k8s-redis-auth
- k8s-redis-streams
- k8s-redis-cache
- k8s-redis-pubsub
6Platform
Sõnumivahetusel, jälgitavusel, sisenemisel ja reaalajas edastamisel on igaühel oma sõlm.
- k8s-rabbitmq
- k8s-monitoring
- k8s-logging
- k8s-ingress-gateway
- k8s-sse-gateway
- k8s-event-router
- Iga sõlm
- Fluent Bit · DaemonSet
- Calico
Seadistatud mudelid · pakkujate kaupa
Teenus on suletud, seega on need repositooriumis seadistatud mudelid, mitte praegu valitavad võimalused. Iga roll on loetletud eraldi; see ei ole verifitseeritud käivituste loend.
OpenAI
Chati vaikepakkuja
Chat
openai/gpt-5.2vaikimisi
Vaikemudel on gpt-5.2; päringus nimetatud mudelit kasutatakse selle asemel.
Scan
gpt-5.2vaikimisigpt-5.2-progpt-5.1gpt-5gpt-5-progpt-5-mini
13 mudeli vastenduse välised mudelid lükatakse tagasi.
Pildivastendus
gpt-image-1.5
Eraldi Responsesi orkestreerimismudelist gpt-5.2. Piltide genereerimine on vaikimisi välja lülitatud.
Hindamine
gpt-4o-minivaikimisi
Vestluste hindamise LLM-hindaja, Chati mudelist eraldi.
Google
Kui Chat valib Google'i
Chat
google/gemini-3-pro-previewgoogle/gemini-3-flash-preview
Kui Google on valitud, on vaikimisi 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
Pildivastendus
gemini-3-pro-image-preview
Allikasbackend main d8840c7Avalik commit 29. september 2026 · kontrollitud 8. oktoobril 2026