Self-host no Kubernetes
O chart Helm roda os mesmos serviços do arquivo Compose — app web, API, workers, worker de imagens, motor do scraper e serviço do editor — contra um PostgreSQL que você já roda. Duas coisas são obrigatórias, a conexão com o banco e um segredo de credenciais; todo o resto tem um padrão que funciona.
- Criar os dois segredos de que o chart precisa
- Instalar o chart com ingress em três hostnames
- Dimensionar as réplicas de worker e dividi-las em pools
- Atender aos requisitos de nó e de AppArmor do sandbox
O que o chart instala
Um Deployment por serviço, cada um com as próprias réplicas e recursos, mais os Services e um Ingress opcional. O PostgreSQL não vem junto: o chart aponta para o banco que você roda, e a API aplica as migrações ao iniciar, como no Compose.
| Valor | Padrão | Significado |
|---|---|---|
ui.replicaCount, api.replicaCount | 2 | Réplicas do app web e da API |
worker.replicaCount | 3 | Réplicas de worker |
worker.concurrency | 12 | Tarefas que uma réplica roda ao mesmo tempo |
worker.sql.concurrency | 4 | Consultas SQL por réplica contra os seus bancos |
worker.isolationLevel | sandbox | Toda execução isolada (veja abaixo) |
scraperEngine.enabled, lsp.enabled | true | Desligue o que você não usa |
Instale
- Crie o segredo do banco
Um Secret com a chave
DATABASE_URL. Prefira um Secret a um valor direto: uma string de conexão nos values acaba nohelm get valuese nos logs de CI. - Crie o segredo das credenciais
DB_CREDENTIALS_KEYcriptografa todo segredo guardado no banco — perder a chave é perder os segredos, então guarde uma cópia fora do cluster.SCRAPER_ENGINE_SECRETautentica o motor do scraper na API. - Instale o chart
Aponte para os dois segredos e ligue o ingress com os seus três hostnames.
- Configure DNS e TLS
Crie um registro DNS para cada hostname apontando para o endereço do controller (
kubectl get ingress) e definaingress.tls.enabled=truecom um certificado para os três, ou as anotações do cert-manager emingress.annotations.
kubectl create secret generic waiso-db \
--from-literal=DATABASE_URL='postgres://user:pass@db:5432/waiso'
kubectl create secret generic waiso-secrets \
--from-literal=DB_CREDENTIALS_KEY="$(openssl rand -base64 32)" \
--from-literal=SCRAPER_ENGINE_SECRET="$(openssl rand -hex 32)"
helm install waiso oci://ghcr.io/talissonjunior16/charts/waiso \
--set postgres.existingSecret=waiso-db \
--set credentials.existingSecret=waiso-secrets \
--set ingress.enabled=true \
--set ingress.hosts.ui=waiso.example.com \
--set ingress.hosts.api=api.waiso.example.com \
--set ingress.hosts.lsp=lsp.waiso.example.comWorkers no Kubernetes
Escale com worker.replicaCount. Para reservar réplicas para algumas linguagens, defina worker.languages (por exemplo python,typescript,sql); vazio significa todas. Os binários compilados de C e C++ ficam guardados por réplica, ou divididos entre réplicas quando você dá ao worker.nativeCache.existingClaim um volume ReadWriteMany.
Do que o sandbox precisa
- O isolamento
sandboxprecisa deSYS_ADMIN,NET_ADMINe de um perfil seccomp sem restrição, que namespaces com o nível restricted do PodSecurity recusam. Rode os workers num namespace que permita isso. - Em nós que exigem AppArmor (Ubuntu, Container-Optimized OS, SUSE), carregue o perfil
waiso-workerem todo nó onde um worker possa rodar e definaworker.appArmorProfile=waiso-worker(Kubernetes 1.30+). Sem isso, toda execução Python, C e C++ falha, e o worker registra o motivo ao iniciar. worker.isolationLevel=noneroda scripts como processos comuns, isolados só pelo container — use só quando confiar em todos que podem escrever um script.
Atualize
helm upgrade waiso oci://ghcr.io/talissonjunior16/charts/waiso --reuse-valuesUma tag, global.imageTag, move todas as imagens juntas; o padrão é a versão do chart. As migrações rodam quando a API nova inicia. Faça backup do banco antes — não há caminho de volta.