Worker de ingestão de analytics opcional para self-hosted Enterprise. Alimenta os dashboards do Cockpit (DORA, ciclo de vida, classifier).
O analytics worker é um add-on exclusivo do Enterprise. Ele roda o cron
de ingestão que alimenta os dashboards do Cockpit (métricas tipo DORA,
ciclo de vida de PR, classifier de PR baseado em LLM).
O instalador padrão não inclui esse worker. Deploys self-hosted da
versão community não precisam dele e essas vars são filtradas do
.env.example padrão. Pare por aqui a menos que você tenha uma licença
self-hosted Enterprise e queira os relatórios do Cockpit.
Um processo Node separado rodando a mesma imagem do worker
(kodus-ai-worker), selecionado no boot via WORKER_ROLE=analytics.
Dois crons disparam desse processo e somente dele:
Ingestão (ANALYTICS_INGESTION_CRON, default */30 * * * *) — lê
pull requests e sessões de review do Mongo + do Postgres OLTP, projeta
no schema analytics.
Classifier (ANALYTICS_CLASSIFIER_CRON, default */15 * * * *) —
chama uma LLM pra classificar cada PR (feature/bugfix/refactor/etc).
Isolar do worker principal mantém o event loop de code review livre
de queries de ingestão longas.
O warehouse de analytics é um schema Postgres, não um banco
separado. Dois layouts suportados:
Postgres compartilhado (recomendado para self-hosted) — deixe
ANALYTICS_PG_DB_HOST vazio. O config loader cai no fallback das vars
API_PG_DB_* e cria o schema analytics na mesma instância. Um banco
só pra fazer backup e operar.
Postgres dedicado — preencha o bloco ANALYTICS_PG_DB_* apontando
pra outra instância. Use isso quando quer queries analíticas totalmente
isoladas do write path do OLTP.
O container worker-analytics compartilha o mesmo prod-entrypoint.sh
do api/worker/webhooks. Com RUN_MIGRATIONS=true (default do
installer), as migrations do warehouse de analytics
(pnpm run analytics:migration:run:prod) rodam no primeiro boot, criando
o schema analytics e suas tabelas.
Pra parar a ingestão em runtime sem remover o container, defina
ANALYTICS_INGESTION_DISABLED=true e/ou ANALYTICS_CLASSIFIER_DISABLED=true
e reinicie o worker-analytics. O cron continua agendado mas cada tick
faz short-circuit. Use isso pra triagem de incidente, não como config
de longo prazo — essas vars são gerenciadas primariamente para cloud e
podem não aparecer no template do installer.
Após o boot, acompanhe os logs do analytics worker:
docker compose logs -f worker-analytics
Você deve ver linhas como analytics ingestion done in NNNms — {...} a
cada 30 minutos e analytics classifier done ... a cada 15 minutos.
Se não, confirme que WORKER_ROLE=analytics está setado só nesse
container (não no worker principal — esse tem que continuar
code-review).
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"Kodus","colors":{"primary":"#F8B76D","light":"#F8B76D","dark":"#443024"},"logo":{"light":"https://mintcdn.com/kodus/AF97E4sqQ0bDm2vv/logo/light.svg?fit=max\u0026auto=format\u0026n=AF97E4sqQ0bDm2vv\u0026q=85\u0026s=f936e2273166bb149af32c25f012a088","dark":"https://mintcdn.com/kodus/AF97E4sqQ0bDm2vv/logo/dark.svg?fit=max\u0026auto=format\u0026n=AF97E4sqQ0bDm2vv\u0026q=85\u0026s=25fb99797bf5f026442124edd13ca06c","href":"https://kodus.io"},"favicon":"https://mintcdn.com/kodus/AF97E4sqQ0bDm2vv/favicon.svg?fit=max\u0026auto=format\u0026n=AF97E4sqQ0bDm2vv\u0026q=85\u0026s=20fa3480d131c22d3c2f971dec149d41","background":{"color":{"dark":"#101019"}},"navbar":{"links":[{"href":"https://discord.gg/TFZBRk9fT6","label":"Community"},{"href":"https://github.com/kodustech","label":"Github"}],"primary":{"type":"button","label":"Try Kodus","href":"https://kodus.io/"}},"footer":{"socials":{"twitter":"https://twitter.com/kodustech","github":"https://github.com/kodustech","linkedin":"https://www.linkedin.com/company/kodustech"}},"integrations":{"gtm":{"tagId":"GTM-5MWMVQDC"},"posthog":{"apiKey":"phc_eXdASBHYhvHzYCLktmceTdRKmF3jMLnrH4iCXXUGjJI"}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"styling":{"latex":true},"navigation":{"languages":[{"language":"en","href":"en/how_to_use/overview"},{"language":"es","href":"es/how_to_use/overview"},{"language":"pt-BR","href":"pt-BR/how_to_use/overview"},{"language":"ja","href":"ja/how_to_use/overview"},{"language":"zh","href":"zh/how_to_use/overview"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"kodus","hasAudioNarration":false,"actualSubdomain":"kodus","customDomains":["docs.kodus.io"],"gitSource":{"type":"github","owner":"kodustech","repo":"kodus-ai","deployBranch":"main","contentDirectory":"docs","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aebbaf91919761fe16dbc20","collectionId":"a1740fe2-55dc-4398-a1bf-fbbf11cb6e28","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aebbaf91919761fe16dbc20"},"feedback":{"thumbs":true,"edits":true,"issues":true},"entitlements":{},"buildId":"6aebbaf91919761fe16dbc20","clientVersion":"0.0.4067","searchFilterCounts":[{"language":"en","tag":"How to use","count":60},{"language":"es","tag":"Cómo usar","count":60},{"language":"ja","tag":"使い方","count":60},{"language":"pt-BR","tag":"Como usar","count":60},{"language":"zh","tag":"如何使用","count":60},{"language":"en","tag":"Knowledge Base","count":26},{"language":"es","tag":"Base de Conocimiento","count":26},{"language":"ja","tag":"ナレッジベース","count":26},{"language":"pt-BR","tag":"Base de Conhecimento","count":26},{"language":"zh","tag":"知识库","count":26},{"language":"en","tag":"AI Code Review","count":25},{"language":"es","tag":"Revisión de Código con IA","count":25},{"language":"ja","tag":"AIコードレビュー","count":25},{"language":"pt-BR","tag":"Revisão de Código com IA","count":25},{"language":"zh","tag":"AI 代码审查","count":25},{"language":"en","tag":"How to deploy","count":19},{"language":"es","tag":"Cómo desplegar","count":19},{"language":"ja","tag":"デプロイ方法","count":19},{"language":"pt-BR","tag":"Como implantar","count":19},{"language":"zh","tag":"如何部署","count":19},{"language":"en","tag":"Cookbook","count":18},{"language":"es","tag":"Recetario","count":18},{"language":"ja","tag":"クックブック","count":18},{"language":"pt-BR","tag":"Cookbook","count":18},{"language":"zh","tag":"食谱","count":18},{"language":"en","tag":"Cockpit","count":12},{"language":"es","tag":"Cockpit","count":12},{"language":"ja","tag":"コックピット","count":12},{"language":"pt-BR","tag":"Cockpit","count":12},{"language":"zh","tag":"驾驶舱","count":12},{"language":"en","tag":"Advanced Configs","count":10},{"language":"es","tag":"Configuraciones Avanzadas","count":10},{"language":"ja","tag":"詳細設定","count":10},{"language":"pt-BR","tag":"Configurações Avançadas","count":10},{"language":"zh","tag":"高级配置","count":10},{"language":"en","tag":"Metrics","count":9},{"language":"es","tag":"Métricas","count":9},{"language":"ja","tag":"メトリクス","count":9},{"language":"pt-BR","tag":"Métricas","count":9},{"language":"zh","tag":"指标","count":9},{"language":"en","tag":"LLM Provider Setup","count":8},{"language":"en","tag":"Deploy with Docker","count":8},{"language":"es","tag":"Configuración de Proveedor LLM","count":8},{"language":"es","tag":"Despliegue con Docker","count":8},{"language":"ja","tag":"LLM プロバイダー設定","count":8},{"language":"ja","tag":"Dockerでデプロイ","count":8},{"language":"pt-BR","tag":"Configuração de Provedor LLM","count":8},{"language":"pt-BR","tag":"Implantar com Docker","count":8},{"language":"zh","tag":"LLM 提供商配置","count":8},{"language":"zh","tag":"使用 Docker 部署","count":8},{"language":"default","tag":"Changelog","count":1}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"#content-area:has(.kodus-changelog-release) #header .eyebrow{display:none}body:has(.kodus-changelog-release) div.ml-4.flex.text-sm.leading-6.whitespace-nowrap.min-w-0.space-x-3.overflow-hidden{display:none}body:has(.kodus-changelog-release) #content-side-layout,body:has(.kodus-changelog-release) #table-of-contents-layout,body:has(.kodus-changelog-release) #table-of-contents{display:none!important}body:has(.kodus-changelog-release) #content-container{max-width:none!important;padding-right:24rem!important}body:has(.kodus-changelog-release) #content-area{width:100%!important;max-width:54rem!important;margin-right:auto!important;margin-left:0!important}body:has(.kodus-changelog-release) header a[href*=\"changelog\"]{position:relative;color:#faf8f6!important}body:has(.kodus-changelog-release) header a[href*=\"changelog\"] *,body:has(.kodus-changelog-release) header a[href*=\"changelog\"] svg{color:#faf8f6!important;stroke:currentColor}body:has(.kodus-changelog-release) header a[href*=\"changelog\"]::after{content:\"\";position:absolute;right:0;bottom:-1px;left:0;height:2px;background:#f8b76d}body:has(.kodus-changelog-release) header a[href*=\"changelog\"]:hover,header a[href*=\"changelog\"]:hover{color:#f8b76d!important}body:has(.kodus-changelog-release) header a[href*=\"changelog\"]:hover *,body:has(.kodus-changelog-release) header a[href*=\"changelog\"]:hover svg,header a[href*=\"changelog\"]:hover *,header a[href*=\"changelog\"]:hover svg{color:#f8b76d!important;stroke:currentColor}.kodus-changelog-release{display:grid;grid-template-columns:minmax(6.5rem, 8rem) minmax(0, 36rem);column-gap:1.75rem;align-items:start;margin-top:2.5rem;padding-top:2rem;border-top:1px solid rgba(248, 183, 109, 0.18)}.kodus-changelog-release[hidden]{display:none!important}.kodus-changelog-meta{position:sticky;top:8.5rem;align-self:start;display:flex;flex-direction:column;align-items:flex-start;gap:0.65rem}.kodus-changelog-date{color:inherit;font:inherit;font-weight:600;line-height:inherit}.kodus-changelog-rss-source{display:none}.kodus-changelog-content{min-width:0;max-width:36rem}.kodus-changelog-shell{position:relative}.kodus-changelog-filter-panel{margin-top:0}.kodus-changelog-filter-control{position:absolute;inset:0;z-index:1;width:100%;height:100%;margin:0;appearance:none;border:1px solid transparent;border-radius:inherit;background:transparent;cursor:pointer}.kodus-changelog-filter-sidebar{position:fixed;top:12rem;right:max(2rem, calc((100vw - 88rem) / 2 + 2rem));width:20rem;z-index:9999;pointer-events:auto}.kodus-changelog-filter-heading{margin:0 0 0.7rem;color:#faf8f6;font:inherit;font-size:0.78em;font-weight:600;line-height:1.2}.kodus-changelog-filter-options{display:flex;flex-wrap:wrap;gap:0.55rem}.kodus-changelog-filter-button{position:relative;display:inline-flex;align-items:center;min-height:1.85rem;border:0;border-radius:999px;background:rgba(255, 255, 255, 0.06);color:inherit;cursor:pointer;padding:0.24rem 0.78rem;font:inherit;font-size:0.78em;font-weight:500;line-height:1;white-space:nowrap;user-select:none;overflow:hidden;transition:background-color 140ms ease,\n color 140ms ease}.kodus-changelog-filter-button span{position:relative;z-index:2;pointer-events:none}.kodus-changelog-filter-button:hover .kodus-changelog-filter-control:not(:checked){background:rgba(248, 183, 109, 0.12)}.kodus-changelog-filter-button:hover span{color:#f8b76d}.kodus-changelog-filter-button.is-selected,.kodus-changelog-filter-button:has(.kodus-changelog-filter-control:checked){border-color:rgba(248, 183, 109, 0.22)!important;background:rgba(248, 183, 109, 0.14)!important;color:#f8b76d!important}.kodus-changelog-filter-control:checked{border-color:rgba(248, 183, 109, 0.22)!important;background:rgba(248, 183, 109, 0.14)!important}.kodus-changelog-filter-control:checked+span{color:#f8b76d!important}.kodus-changelog-shell:has(.kodus-changelog-filter-control:checked) .kodus-changelog-filterable,.kodus-changelog-shell:has(.kodus-changelog-filter-control:checked) .kodus-changelog-section{display:none}.kodus-changelog-shell:has(.kodus-changelog-filter-control:checked) .kodus-changelog-release{display:none}.kodus-changelog-shell:has(#kodus-filter-security:checked) .filter-security,.kodus-changelog-shell:has(#kodus-filter-cockpit:checked) .filter-cockpit,.kodus-changelog-shell:has(#kodus-filter-byok:checked) .filter-byok,.kodus-changelog-shell:has(#kodus-filter-ai-engine:checked) .filter-ai-engine,.kodus-changelog-shell:has(#kodus-filter-self-hosted:checked) .filter-self-hosted,.kodus-changelog-shell:has(#kodus-filter-git-provider:checked) .filter-git-provider,.kodus-changelog-shell:has(#kodus-filter-performance:checked) .filter-performance,.kodus-changelog-shell:has(#kodus-filter-ux-interface:checked) .filter-ux-interface,.kodus-changelog-shell:has(#kodus-filter-notifications:checked) .filter-notifications,.kodus-changelog-shell:has(#kodus-filter-kody-rules:checked) .filter-kody-rules,.kodus-changelog-shell:has(#kodus-filter-mcp:checked) .filter-mcp,.kodus-changelog-shell:has(#kodus-filter-custom-agents:checked) .filter-custom-agents,.kodus-changelog-shell:has(#kodus-filter-billing-licenses:checked) .filter-billing-licenses,.kodus-changelog-shell:has(#kodus-filter-cli:checked) .filter-cli,.kodus-changelog-shell:has(#kodus-filter-security:checked) .kodus-changelog-section:has(.filter-security),.kodus-changelog-shell:has(#kodus-filter-cockpit:checked) .kodus-changelog-section:has(.filter-cockpit),.kodus-changelog-shell:has(#kodus-filter-byok:checked) .kodus-changelog-section:has(.filter-byok),.kodus-changelog-shell:has(#kodus-filter-ai-engine:checked) .kodus-changelog-section:has(.filter-ai-engine),.kodus-changelog-shell:has(#kodus-filter-self-hosted:checked) .kodus-changelog-section:has(.filter-self-hosted),.kodus-changelog-shell:has(#kodus-filter-git-provider:checked) .kodus-changelog-section:has(.filter-git-provider),.kodus-changelog-shell:has(#kodus-filter-performance:checked) .kodus-changelog-section:has(.filter-performance),.kodus-changelog-shell:has(#kodus-filter-ux-interface:checked) .kodus-changelog-section:has(.filter-ux-interface),.kodus-changelog-shell:has(#kodus-filter-notifications:checked) .kodus-changelog-section:has(.filter-notifications),.kodus-changelog-shell:has(#kodus-filter-kody-rules:checked) .kodus-changelog-section:has(.filter-kody-rules),.kodus-changelog-shell:has(#kodus-filter-mcp:checked) .kodus-changelog-section:has(.filter-mcp),.kodus-changelog-shell:has(#kodus-filter-custom-agents:checked) .kodus-changelog-section:has(.filter-custom-agents),.kodus-changelog-shell:has(#kodus-filter-billing-licenses:checked) .kodus-changelog-section:has(.filter-billing-licenses),.kodus-changelog-shell:has(#kodus-filter-cli:checked) .kodus-changelog-section:has(.filter-cli){display:block}.kodus-changelog-shell:has(#kodus-filter-security:checked) .kodus-changelog-release:has(.filter-security),.kodus-changelog-shell:has(#kodus-filter-cockpit:checked) .kodus-changelog-release:has(.filter-cockpit),.kodus-changelog-shell:has(#kodus-filter-byok:checked) .kodus-changelog-release:has(.filter-byok),.kodus-changelog-shell:has(#kodus-filter-ai-engine:checked) .kodus-changelog-release:has(.filter-ai-engine),.kodus-changelog-shell:has(#kodus-filter-self-hosted:checked) .kodus-changelog-release:has(.filter-self-hosted),.kodus-changelog-shell:has(#kodus-filter-git-provider:checked) .kodus-changelog-release:has(.filter-git-provider),.kodus-changelog-shell:has(#kodus-filter-performance:checked) .kodus-changelog-release:has(.filter-performance),.kodus-changelog-shell:has(#kodus-filter-ux-interface:checked) .kodus-changelog-release:has(.filter-ux-interface),.kodus-changelog-shell:has(#kodus-filter-notifications:checked) .kodus-changelog-release:has(.filter-notifications),.kodus-changelog-shell:has(#kodus-filter-kody-rules:checked) .kodus-changelog-release:has(.filter-kody-rules),.kodus-changelog-shell:has(#kodus-filter-mcp:checked) .kodus-changelog-release:has(.filter-mcp),.kodus-changelog-shell:has(#kodus-filter-custom-agents:checked) .kodus-changelog-release:has(.filter-custom-agents),.kodus-changelog-shell:has(#kodus-filter-billing-licenses:checked) .kodus-changelog-release:has(.filter-billing-licenses),.kodus-changelog-shell:has(#kodus-filter-cli:checked) .kodus-changelog-release:has(.filter-cli){display:grid}.kodus-changelog-empty{display:none;margin:0;color:inherit;font:inherit;line-height:inherit}.kodus-changelog-section+.kodus-changelog-section{margin-top:3rem;padding-top:2rem;border-top:1px solid rgba(248, 183, 109, 0.16)}.kodus-changelog-section-label{display:block;margin:0 0 2rem;color:#f8b76d;font:inherit;font-size:1em;font-weight:700;letter-spacing:0;line-height:inherit;text-transform:none}.kodus-changelog-item+.kodus-changelog-item{margin-top:2.5rem}.kodus-changelog-copy+.kodus-changelog-title,.kodus-changelog-list+.kodus-changelog-title,.kodus-changelog-video+.kodus-changelog-title{margin-top:1.75rem}.kodus-changelog-title{margin:0;color:#ffffff;font:inherit;font-size:1.25em;font-weight:700;letter-spacing:0;line-height:1.35}.kodus-changelog-copy{display:block;margin:0.85rem 0 0;color:inherit;font:inherit;line-height:inherit}.kodus-changelog-link{color:#f8b76d;font-weight:700;text-decoration:underline;text-decoration-color:rgba(248, 183, 109, 0.7);text-underline-offset:0.2em}.kodus-changelog-code{border-radius:0.35rem;background:rgba(248, 183, 109, 0.14);color:#f8b76d;padding:0.1rem 0.35rem;font-size:0.9em}.kodus-changelog-video{display:block;width:100%;margin:1.25rem 0 0;border:1px solid rgba(248, 183, 109, 0.22);border-radius:8px;background:rgba(0, 0, 0, 0.25)}.kodus-changelog-list{margin:0.85rem 0 0;padding-left:1.25rem;color:inherit;font:inherit;line-height:inherit}.kodus-changelog-list li+li{margin-top:0.5rem}.kodus-changelog-fix-list{margin-top:0.85rem}.kodus-changelog-fix{padding-left:1.25rem;position:relative}.kodus-changelog-fix .kodus-changelog-copy{margin-top:0}.kodus-changelog-fix-label{color:#ffffff;font-weight:700}.kodus-changelog-fix::before{content:\"\";position:absolute;top:0.75em;left:0.15rem;width:0.35rem;height:0.35rem;border-radius:999px;background:currentColor;opacity:0.68}.kodus-changelog-fix+.kodus-changelog-fix{margin-top:1.1rem}@media (max-width: 1120px){.kodus-changelog-release{grid-template-columns:6.5rem minmax(0, 1fr);column-gap:1.25rem}.kodus-changelog-filter-sidebar{grid-column:1 / -1;grid-row:1;position:static;margin-bottom:1.5rem;width:auto}.kodus-changelog-meta{grid-column:1;grid-row:2}.kodus-changelog-content{grid-column:2;grid-row:2}}@media (prefers-color-scheme: light){.kodus-changelog-title{color:#111827}.kodus-changelog-fix-label{color:#111827}}"}],"page":{"pagePath":"pt-BR/how_to_deploy/deploy_kodus/analytics_worker","slug":"/pt-BR/how_to_deploy/deploy_kodus/analytics_worker","pageMetadata":{"title":"Analytics Worker","description":"Worker de ingestão de analytics opcional para self-hosted Enterprise. Alimenta os dashboards do Cockpit (DORA, ciclo de vida, classifier).","icon":"chart-line","tag":"enterprise","href":"/pt-BR/how_to_deploy/deploy_kodus/analytics_worker"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Worker de ingestão de analytics opcional para self-hosted Enterprise. Alimenta os dashboards do Cockpit (DORA, ciclo de vida, classifier).\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,em:`em`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Mermaid,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Mermaid)_missingMdxReference(`Mermaid`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`O analytics worker é um add-on `,_jsx(_components.strong,{children:`exclusivo do Enterprise`}),`. Ele roda o cron\nde ingestão que alimenta os dashboards do Cockpit (métricas tipo DORA,\nciclo de vida de PR, classifier de PR baseado em LLM).`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`O instalador padrão `,_jsx(_components.strong,{children:`não`}),` inclui esse worker. Deploys self-hosted da\nversão community não precisam dele e essas vars são filtradas do\n`,_jsx(_components.code,{children:`.env.example`}),` padrão. Pare por aqui a menos que você tenha uma licença\nself-hosted Enterprise e queira os relatórios do Cockpit.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`o-que-ele-faz`,children:`O que ele faz`}),`\n`,_jsxs(_components.p,{children:[`Um processo Node separado rodando a `,_jsxs(_components.strong,{children:[`mesma imagem do `,_jsx(_components.code,{children:`worker`})]}),`\n(`,_jsx(_components.code,{children:`kodus-ai-worker`}),`), selecionado no boot via `,_jsx(_components.code,{children:`WORKER_ROLE=analytics`}),`.\nDois crons disparam desse processo e somente dele:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Ingestão`}),` (`,_jsx(_components.code,{children:`ANALYTICS_INGESTION_CRON`}),`, default `,_jsx(_components.code,{children:`*/30 * * * *`}),`) — lê\npull requests e sessões de review do Mongo + do Postgres OLTP, projeta\nno schema `,_jsx(_components.code,{children:`analytics`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Classifier`}),` (`,_jsx(_components.code,{children:`ANALYTICS_CLASSIFIER_CRON`}),`, default `,_jsx(_components.code,{children:`*/15 * * * *`}),`) —\nchama uma LLM pra classificar cada PR (feature/bugfix/refactor/etc).`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Isolar do `,_jsx(_components.code,{children:`worker`}),` principal mantém o event loop de code review livre\nde queries de ingestão longas.`]}),`\n`,_jsx(Heading,{level:`2`,id:`topologia`,children:`Topologia`}),`\n`,_jsxs(_components.p,{children:[`O warehouse de analytics é um `,_jsx(_components.strong,{children:`schema`}),` Postgres, não um banco\nseparado. Dois layouts suportados:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Postgres compartilhado (recomendado para self-hosted)`}),` — deixe\n`,_jsx(_components.code,{children:`ANALYTICS_PG_DB_HOST`}),` vazio. O config loader cai no fallback das vars\n`,_jsx(_components.code,{children:`API_PG_DB_*`}),` e cria o schema `,_jsx(_components.code,{children:`analytics`}),` na mesma instância. Um banco\nsó pra fazer backup e operar.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Postgres dedicado`}),` — preencha o bloco `,_jsx(_components.code,{children:`ANALYTICS_PG_DB_*`}),` apontando\npra outra instância. Use isso quando quer queries analíticas totalmente\nisoladas do write path do OLTP.`]}),`\n`]}),`\n`,_jsx(Mermaid,{chart:`flowchart LR\n api[api] --> pg[(Postgres OLTP)]\n worker[worker] --> rabbitmq[(RabbitMQ)]\n aw[worker-analytics] --> rabbitmq\n aw --> pg\n aw --> mg[(MongoDB)]\n aw -.->|escreve| analytics[(Postgres • schema analytics)]\n cockpit[Cockpit UI] --> analytics`}),`\n`,_jsx(Heading,{level:`2`,id:`habilitando-no-self-hosted-enterprise`,children:`Habilitando no self-hosted Enterprise`}),`\n`,_jsxs(Heading,{level:`3`,id:`1-adicione-o-serviço-ao-docker-compose-yml`,children:[`1. Adicione o serviço ao `,_jsx(_components.code,{children:`docker-compose.yml`})]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`18`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`18`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`worker-analytics`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` image`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`ghcr.io/kodustech/kodus-ai-worker:latest`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` platform`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`linux/amd64`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` container_name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`kodus-worker-analytics`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` environment`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`ENV=production`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`NODE_ENV=production`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`WORKER_ROLE=analytics`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` networks`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`shared-network`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`kodus-backend-services`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` restart`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`unless-stopped`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` env_file`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`.env`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` depends_on`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`db_kodus_postgres`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`db_kodus_mongodb`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`rabbitmq`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`A imagem é idêntica à do serviço `,_jsx(_components.code,{children:`worker`}),` — só `,_jsx(_components.code,{children:`WORKER_ROLE=analytics`}),`\nmuda pra modo ingestão.`]}),`\n`,_jsxs(Heading,{level:`3`,id:`2-adicione-o-bloco-de-analytics-ao-env`,children:[`2. Adicione o bloco de analytics ao `,_jsx(_components.code,{children:`.env`})]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Postgres compartilhado (recomendado):`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# ANALYTICS_PG_DB_HOST vazio → loader reusa API_PG_DB_* e cria o`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:\"# schema `analytics` na instância principal.\"})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ANALYTICS_PG_DB_HOST`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ANALYTICS_PG_DB_SCHEMA`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`analytics`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Cron schedules (UTC).`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ANALYTICS_INGESTION_CRON`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`*/30`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` *`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ANALYTICS_CLASSIFIER_CRON`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`*/15`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` *`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Postgres dedicado:`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`9`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`9`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ANALYTICS_PG_DB_HOST`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`seu-host-de-analytics`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ANALYTICS_PG_DB_PORT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`5432`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ANALYTICS_PG_DB_USERNAME`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`analytics`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ANALYTICS_PG_DB_PASSWORD`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`...`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ANALYTICS_PG_DB_DATABASE`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`kodus_analytics`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ANALYTICS_PG_DB_SCHEMA`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`analytics`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ANALYTICS_INGESTION_CRON`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`*/30`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` *`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ANALYTICS_CLASSIFIER_CRON`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`*/15`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` *`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`3-boot-—-migrations-rodam-automaticamente`,children:`3. Boot — migrations rodam automaticamente`}),`\n`,_jsxs(_components.p,{children:[`O container `,_jsx(_components.code,{children:`worker-analytics`}),` compartilha o mesmo `,_jsx(_components.code,{children:`prod-entrypoint.sh`}),`\ndo `,_jsx(_components.code,{children:`api`}),`/`,_jsx(_components.code,{children:`worker`}),`/`,_jsx(_components.code,{children:`webhooks`}),`. Com `,_jsx(_components.code,{children:`RUN_MIGRATIONS=true`}),` (default do\ninstaller), as migrations do warehouse de analytics\n(`,_jsx(_components.code,{children:`pnpm run analytics:migration:run:prod`}),`) rodam no primeiro boot, criando\no schema `,_jsx(_components.code,{children:`analytics`}),` e suas tabelas.`]}),`\n`,_jsx(Heading,{level:`2`,id:`referência`,children:`Referência`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Variável`}),_jsx(_components.th,{children:`Descrição`}),_jsx(_components.th,{children:`Default`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`WORKER_ROLE`})}),_jsxs(_components.td,{children:[`Tem que ser `,_jsx(_components.code,{children:`analytics`}),` nesse container.`]}),_jsx(_components.td,{children:_jsx(_components.em,{children:`obrigatório`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ANALYTICS_PG_DB_HOST`})}),_jsx(_components.td,{children:`Host do Postgres de analytics. Vazio → reusa o Postgres principal.`}),_jsx(_components.td,{children:_jsx(_components.em,{children:`vazio`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ANALYTICS_PG_DB_PORT`})}),_jsx(_components.td,{children:`Porta do Postgres de analytics.`}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`5432`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ANALYTICS_PG_DB_USERNAME`})}),_jsxs(_components.td,{children:[`Usuário do Postgres de analytics. Vazio → reusa `,_jsx(_components.code,{children:`API_PG_DB_USERNAME`}),`.`]}),_jsx(_components.td,{children:_jsx(_components.em,{children:`vazio`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ANALYTICS_PG_DB_PASSWORD`})}),_jsxs(_components.td,{children:[`Senha do Postgres de analytics. Vazio → reusa `,_jsx(_components.code,{children:`API_PG_DB_PASSWORD`}),`.`]}),_jsx(_components.td,{children:_jsx(_components.em,{children:`vazio`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ANALYTICS_PG_DB_DATABASE`})}),_jsxs(_components.td,{children:[`Banco do Postgres de analytics. Vazio → reusa `,_jsx(_components.code,{children:`API_PG_DB_DATABASE`}),`.`]}),_jsx(_components.td,{children:_jsx(_components.em,{children:`vazio`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ANALYTICS_PG_DB_SCHEMA`})}),_jsx(_components.td,{children:`Nome do schema das tabelas do warehouse.`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`analytics`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ANALYTICS_PG_POOL_MAX`})}),_jsx(_components.td,{children:`Limite superior do pool do Postgres de analytics.`}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`5`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ANALYTICS_INGESTION_CRON`})}),_jsx(_components.td,{children:`Cron schedule da ingestão (UTC).`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`*/30 * * * *`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ANALYTICS_CLASSIFIER_CRON`})}),_jsx(_components.td,{children:`Cron schedule do classifier de tipo de PR via LLM (UTC).`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`*/15 * * * *`})})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`pausando-a-ingestão-avançado`,children:`Pausando a ingestão (avançado)`}),`\n`,_jsxs(_components.p,{children:[`Pra parar a ingestão em runtime sem remover o container, defina\n`,_jsx(_components.code,{children:`ANALYTICS_INGESTION_DISABLED=true`}),` e/ou `,_jsx(_components.code,{children:`ANALYTICS_CLASSIFIER_DISABLED=true`}),`\ne reinicie o `,_jsx(_components.code,{children:`worker-analytics`}),`. O cron continua agendado mas cada tick\nfaz short-circuit. Use isso pra triagem de incidente, não como config\nde longo prazo — essas vars são gerenciadas primariamente para cloud e\npodem não aparecer no template do installer.`]}),`\n`,_jsx(Heading,{level:`2`,id:`verificando-que-está-funcionando`,children:`Verificando que está funcionando`}),`\n`,_jsx(_components.p,{children:`Após o boot, acompanhe os logs do analytics worker:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`docker`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` compose`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` logs`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -f`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` worker-analytics`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Você deve ver linhas como `,_jsx(_components.code,{children:`analytics ingestion done in NNNms — {...}`}),` a\ncada 30 minutos e `,_jsx(_components.code,{children:`analytics classifier done ...`}),` a cada 15 minutos.\nSe não, confirme que `,_jsx(_components.code,{children:`WORKER_ROLE=analytics`}),` está setado só nesse\ncontainer (não no `,_jsx(_components.code,{children:`worker`}),` principal — esse tem que continuar\n`,_jsx(_components.code,{children:`code-review`}),`).`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Analytics Worker","description":"Worker de ingestão de analytics opcional para self-hosted Enterprise. Alimenta os dashboards do Cockpit (DORA, ciclo de vida, classifier).","icon":"chart-line","tag":"enterprise","href":"/pt-BR/how_to_deploy/deploy_kodus/analytics_worker"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"O que ele faz","slug":"o-que-ele-faz","depth":2,"children":[]},{"title":"Topologia","slug":"topologia","depth":2,"children":[]},{"title":"Habilitando no self-hosted Enterprise","slug":"habilitando-no-self-hosted-enterprise","depth":2,"children":[{"title":"1. Adicione o serviço ao docker-compose.yml","slug":"1-adicione-o-serviço-ao-docker-compose-yml","depth":3,"children":[]},{"title":"2. Adicione o bloco de analytics ao .env","slug":"2-adicione-o-bloco-de-analytics-ao-env","depth":3,"children":[]},{"title":"3. Boot — migrations rodam automaticamente","slug":"3-boot-—-migrations-rodam-automaticamente","depth":3,"children":[]}]},{"title":"Referência","slug":"referência","depth":2,"children":[{"title":"Pausando a ingestão (avançado)","slug":"pausando-a-ingestão-avançado","depth":3,"children":[]}]},{"title":"Verificando que está funcionando","slug":"verificando-que-está-funcionando","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"kodus","siteName":"Kodus","title":"Analytics Worker - Kodus","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/en/how_to_deploy/deploy_kodus/analytics_worker","matchLevel":1},"es":{"href":"/es/how_to_deploy/deploy_kodus/analytics_worker","matchLevel":1},"pt-BR":{"href":"/pt-BR/how_to_deploy/deploy_kodus/analytics_worker","matchLevel":0},"ja":{"href":"/ja/how_to_deploy/deploy_kodus/analytics_worker","matchLevel":1},"zh":{"href":"/zh/how_to_deploy/deploy_kodus/analytics_worker","matchLevel":1}}},"lastModified":"2026-09-25T17:40:41.401Z","originalFileLocation":"pt-BR/how_to_deploy/deploy_kodus/analytics_worker.mdx","locale":"pt-BR"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Worker de ingestão de analytics opcional para self-hosted Enterprise. Alimenta os dashboards do Cockpit (DORA, ciclo de vida, classifier).\">\u003cmeta data-mint-head name=\"application-name\" content=\"Kodus\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/kodus/PQ3FvCcQd6QjpCLU/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/kodus/PQ3FvCcQd6QjpCLU/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/kodus/PQ3FvCcQd6QjpCLU/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/kodus/PQ3FvCcQd6QjpCLU/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/kodus/PQ3FvCcQd6QjpCLU/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/kodus/PQ3FvCcQd6QjpCLU/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/kodus/PQ3FvCcQd6QjpCLU/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/kodus/PQ3FvCcQd6QjpCLU/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/kodus/PQ3FvCcQd6QjpCLU/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Analytics Worker - Kodus\">\u003cmeta data-mint-head property=\"og:description\" content=\"Worker de ingestão de analytics opcional para self-hosted Enterprise. Alimenta os dashboards do Cockpit (DORA, ciclo de vida, classifier).\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Kodus\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.kodus.io/pt-BR/how_to_deploy/deploy_kodus/analytics_worker\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://kodus.mintlify.app/_mintlify/api/og/v2?division=Implantar+com+Docker\u0026amp;title=Analytics+Worker\u0026amp;description=Worker+de+ingest%C3%A3o+de+analytics+opcional+para+self-hosted+Enterprise.+Alimenta+os+dashboards+do+Cockpit+%28DORA%2C+ciclo+de+vida%2C+classifier%29.\u0026amp;theme=04a77bbc4db3cb7cb013f7f3\u0026amp;signature=80d54f60e8d92d4b430ce16f781c35d7915d13f69f2d03beff6629c02a92dfb5\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Analytics Worker - Kodus\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Worker de ingestão de analytics opcional para self-hosted Enterprise. Alimenta os dashboards do Cockpit (DORA, ciclo de vida, classifier).\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://kodus.mintlify.app/_mintlify/api/og/v2?division=Implantar+com+Docker\u0026amp;title=Analytics+Worker\u0026amp;description=Worker+de+ingest%C3%A3o+de+analytics+opcional+para+self-hosted+Enterprise.+Alimenta+os+dashboards+do+Cockpit+%28DORA%2C+ciclo+de+vida%2C+classifier%29.\u0026amp;theme=04a77bbc4db3cb7cb013f7f3\u0026amp;signature=80d54f60e8d92d4b430ce16f781c35d7915d13f69f2d03beff6629c02a92dfb5\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/kodus/PQ3FvCcQd6QjpCLU/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Kodus\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#F8B76D\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.kodus.io/pt-BR/how_to_deploy/deploy_kodus/analytics_worker\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/pt-BR/how_to_deploy/deploy_kodus/analytics_worker.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"pt-BR\" href=\"https://docs.kodus.io/pt-BR/how_to_deploy/deploy_kodus/analytics_worker\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.kodus.io/en/how_to_deploy/deploy_kodus/analytics_worker\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://docs.kodus.io/es/how_to_deploy/deploy_kodus/analytics_worker\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://docs.kodus.io/ja/how_to_deploy/deploy_kodus/analytics_worker\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh\" href=\"https://docs.kodus.io/zh/how_to_deploy/deploy_kodus/analytics_worker\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.kodus.io/en/how_to_deploy/deploy_kodus/analytics_worker\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.kodus.io/#organization\",\"name\":\"Kodus\",\"url\":\"https://docs.kodus.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/kodus/AF97E4sqQ0bDm2vv/logo/light.svg?fit=max\u0026auto=format\u0026n=AF97E4sqQ0bDm2vv\u0026q=85\u0026s=f936e2273166bb149af32c25f012a088\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.kodus.io#website\",\"name\":\"Kodus\",\"url\":\"https://docs.kodus.io\",\"publisher\":{\"@id\":\"https://docs.kodus.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.kodus.io/pt-BR/how_to_deploy/deploy_kodus/analytics_worker#webpage\",\"url\":\"https://docs.kodus.io/pt-BR/how_to_deploy/deploy_kodus/analytics_worker\",\"name\":\"Analytics Worker\",\"description\":\"Worker de ingestão de analytics opcional para self-hosted Enterprise. Alimenta os dashboards do Cockpit (DORA, ciclo de vida, classifier).\",\"dateModified\":\"2026-09-25T17:40:41.401Z\",\"isPartOf\":{\"@id\":\"https://docs.kodus.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.kodus.io/pt-BR/how_to_deploy/deploy_kodus/analytics_worker#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.kodus.io/pt-BR/how_to_deploy/deploy_kodus/analytics_worker#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Implantar com Docker\",\"item\":\"https://docs.kodus.io/pt-BR/how_to_deploy/deploy_kodus/generic_vm\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Analytics Worker\",\"item\":\"https://docs.kodus.io/pt-BR/how_to_deploy/deploy_kodus/analytics_worker\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.kodus.io/pt-BR/how_to_deploy/deploy_kodus/analytics_worker#article\",\"headline\":\"Analytics Worker\",\"name\":\"Analytics Worker\",\"description\":\"Worker de ingestão de analytics opcional para self-hosted Enterprise. Alimenta os dashboards do Cockpit (DORA, ciclo de vida, classifier).\",\"url\":\"https://docs.kodus.io/pt-BR/how_to_deploy/deploy_kodus/analytics_worker\",\"mainEntityOfPage\":{\"@id\":\"https://docs.kodus.io/pt-BR/how_to_deploy/deploy_kodus/analytics_worker#webpage\"},\"dateModified\":\"2026-09-25T17:40:41.401Z\",\"publisher\":{\"@id\":\"https://docs.kodus.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.kodus.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Kodus\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Kodus","nav":{"global":null,"languages":[{"language":"en","pages":[{"title":"en","href":"/en/how_to_deploy/deploy_kodus/analytics_worker"}]},{"language":"es","pages":[{"title":"es","href":"/es/how_to_deploy/deploy_kodus/analytics_worker"}]},{"language":"pt-BR","tabs":[{"tab":"Como usar","icon":"gamepad-modern","pages":[{"title":"Como usar","href":"/pt-BR/how_to_use/overview"}]},{"tab":"Como implantar","icon":"rocket-launch","groups":[{"group":"Conceitos","pages":[{"title":"Arquitetura do Kodus","icon":"puzzle-piece","href":"/pt-BR/how_to_deploy/kodus_architecture"}]},{"group":"Início Rápido Local","pages":[{"title":"Início Rápido Local","icon":"laptop","href":"/pt-BR/how_to_deploy/local_quickstart/orchestrator"}]},{"group":"Implantar com Docker","pages":[{"title":"Instalação","icon":"plug","href":"/pt-BR/how_to_deploy/deploy_kodus/generic_vm"},{"title":"MCP Manager","icon":"puzzle-piece","tag":"beta","href":"/pt-BR/how_to_deploy/deploy_kodus/mcp_manager"},{"title":"Sandbox \u0026 AST Graph","description":"Como o Kodus parseia seu repo (kodus-graph), onde isso roda (modos de sandbox), e quando escolher cada modo.","icon":"box","href":"/pt-BR/how_to_deploy/deploy_kodus/sandbox"},{"title":"Analytics Worker","icon":"chart-line","tag":"enterprise","href":"/pt-BR/how_to_deploy/deploy_kodus/analytics_worker"},{"title":"Proxy Reverso","description":"Configure um proxy reverso para o Kodus.","icon":"server","href":"/pt-BR/how_to_deploy/deploy_kodus/reverse_proxy"},{"title":"Telemetria Anônima","icon":"satellite-dish","href":"/pt-BR/how_to_deploy/deploy_kodus/telemetry"},{"title":"Guia de Solução de Problemas","icon":"headset","href":"/pt-BR/how_to_deploy/deploy_kodus/troubleshooting"},{"title":"Atualizando","icon":"arrow-up","href":"/pt-BR/how_to_deploy/deploy_kodus/updating"}]},{"group":"Implantar com Kubernetes","pages":[{"title":"Kubernetes e OpenShift","icon":"dharmachakra","href":"/pt-BR/how_to_deploy/deploy_kodus/kubernetes"}]},{"group":"Configuração de Provedores Git","pages":[{"group":"Github","icon":"github","pages":[{"title":"Criando um GitHub App","icon":"github","href":"/pt-BR/how_to_deploy/platforms/github/github_app"},{"title":"OAuth App do GitHub (Entrar com GitHub)","icon":"github","href":"/pt-BR/how_to_deploy/platforms/github/github_oauth"},{"title":"Criando um Webhook","icon":"webhook","href":"/pt-BR/how_to_deploy/platforms/github/github_webhook"}]},{"group":"Gitlab","icon":"gitlab","pages":[{"title":"OAuth App do GitLab (Entrar com GitLab)","icon":"gitlab","href":"/pt-BR/how_to_deploy/platforms/gitlab/gitlab_oauth"},{"title":"Criando um Webhook","icon":"webhook","href":"/pt-BR/how_to_deploy/platforms/gitlab/gitlab_webhook"}]},{"group":"Bitbucket","icon":"bitbucket","pages":[{"title":"Criando um Webhook","icon":"webhook","href":"/pt-BR/how_to_deploy/platforms/bitbucket/bitbucket_webhook"}]},{"group":"Azure DevOps","icon":"microsoft","pages":[{"title":"Criando um Webhook","icon":"webhook","href":"/pt-BR/how_to_deploy/platforms/azure_devops/azdevops_webhook"}]},{"group":"Forgejo","icon":"/images/forgejo.svg","pages":[{"title":"Criando um Webhook","icon":"webhook","href":"/pt-BR/how_to_deploy/platforms/forgejo/forgejo_webhook"}]}]}]},{"tab":"Base de Conhecimento","icon":"book-open","pages":[{"title":"Base de Conhecimento","href":"/pt-BR/knowledge_base/introduction"}]},{"tab":"Cookbook","icon":"fire","pages":[{"title":"Cookbook","href":"/pt-BR/cookbook/custom-plugin-install"}]},{"tab":"Changelog","icon":"newspaper","pages":[{"title":"Changelog","href":"/changelog"}]}]},{"language":"ja","pages":[{"title":"ja","href":"/ja/how_to_deploy/deploy_kodus/analytics_worker"}]},{"language":"zh","pages":[{"title":"zh","href":"/zh/how_to_deploy/deploy_kodus/analytics_worker"}]}]},"basePath":"","title":"Analytics Worker - Kodus","buildId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","deploymentId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","dynamics":[],"chunks":[]}