ImplantaçãoGuia

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.

10 min de leituraAntes: Self-host com Docker Compose
O que você vai aprender
  • 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.

ValorPadrãoSignificado
ui.replicaCount, api.replicaCount2Réplicas do app web e da API
worker.replicaCount3Réplicas de worker
worker.concurrency12Tarefas que uma réplica roda ao mesmo tempo
worker.sql.concurrency4Consultas SQL por réplica contra os seus bancos
worker.isolationLevelsandboxToda execução isolada (veja abaixo)
scraperEngine.enabled, lsp.enabledtrueDesligue o que você não usa
Cada réplica de worker que o chart sobe se apresenta e aparece na página Workers; escale o Deployment e a lista cresce.

Instale

  1. 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 no helm get values e nos logs de CI.

  2. Crie o segredo das credenciais

    DB_CREDENTIALS_KEY criptografa todo segredo guardado no banco — perder a chave é perder os segredos, então guarde uma cópia fora do cluster. SCRAPER_ENGINE_SECRET autentica o motor do scraper na API.

  3. Instale o chart

    Aponte para os dois segredos e ligue o ingress com os seus três hostnames.

  4. Configure DNS e TLS

    Crie um registro DNS para cada hostname apontando para o endereço do controller (kubectl get ingress) e defina ingress.tls.enabled=true com um certificado para os três, ou as anotações do cert-manager em ingress.annotations.

Shellterminal
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.com

Workers 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 sandbox precisa de SYS_ADMIN, NET_ADMIN e 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-worker em todo nó onde um worker possa rodar e defina worker.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=none roda scripts como processos comuns, isolados só pelo container — use só quando confiar em todos que podem escrever um script.

Atualize

Shellterminal
helm upgrade waiso oci://ghcr.io/talissonjunior16/charts/waiso --reuse-values

Uma 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.