Migrando o Trampar de Casa pra um cluster k3s

Featured image for article: Migrando o Trampar de Casa pra um cluster k3s - Do docker compose em 1 nó para um cluster k3s multi-arquitetura com GitOps (ArgoCD), Tailscale mesh, Cloudflare Tunnel e...

Dei um tapa na arquitetura do Trampar de Casa.

Logo agora que já tava funcional, resolvi inovar e saí do docker compose + GitHub Actions rodando em 1 único nó (xenão) para um cluster k3s com 3 nós, multi-arquitetura, formado por:

  • Xenão (Ubuntu) — Intel Xeon 24 cores, 32GB de RAM
  • Xubuntu — notebook velho de guerra (i5, 8 cores, 16GB de RAM)
  • Oracle AlwaysFree VPS — ARM dificulta um pouco, mas 24GB de RAM e 4 cores não dá pra reclamar
Múltiplos nós formam uma plataforma de contêineres. Serviços da plataforma e apps ficam separados.
octa-clusterK3ssystem/SegredosObservabilidadeprojects/trampar-de-casa/git PRspush imagemgit reposreconcilepullprivatebuscarmeshinjeta segredosinjeta segredosrasparcacheeventosControle de códigocódigo versionadoRunner de CIbuild e testesRegistry Localregistro privado de imagensArgoCDsincronização GitOpsk3scontrol planeRede privadamesh protegidoExternal SecretsoperatorBackend de segredosarmazenamento protegidoPostgresCloudNativePGPrometheusmétricasGrafanadashboardsNodes · 3 hosts72 GB · 36 cores · arch mistawebNext.js · tramparRediscache + sessõesCrawlers7 bots · CronJobsPlausibleanalyticsClickHousebackend do plausible

GitOps com ArgoCD + Gitea self-hosted

Resolvi colocar ArgoCD com GitOps rodando no servidor de git self-hosted (Gitea), que roda dentro do cluster k3s.

A cada merge na main:

  1. Faz build na imagem e publica para o registry
  2. ArgoCD identifica que o serviço está atrasado
  3. Atualiza a versão sem downtime

Rede privada com Tailscale + Cloudflare

Os serviços se conectam ao Tailscale (private mesh) e não possuem portas abertas.

Eles utilizam Cloudflare Tunnel e Cloudflare DNS para fazer a conexão com a internet.

App of Apps

Li que é boa prática usar uma App das Apps para monitorar todos os outros serviços, a estrutura final acabou ficando assim:

system/ # cluster services deployment/argocd/ # GitOps controller source-control/gitea/ # Git hosting observability/ prometheus/ # Prometheus + Alertmanager grafana/ # Dashboards + datasources secrets/1password/ # ClusterSecretStore + ESO config projects/ trampar-de-casa/ app/ # web (Next.js) data/ postgres/ # PostgreSQL redis/ # Redis crawlers/ # CronJobs (morning/afternoon/evening) analytics/plausible/ # Plausible + Clickhouse

Agora ficou chique porque tem validação de lint/sintaxe nos PRs, ao mergear pra main o ArgoCD identifica o drift (diferença), e aplica as mudanças.

BordaAppsJobsDadosObservabilidadeExternoeventosPromQLCloudflare Tunnelingresso · plataformaTraefikingresso · dev.*trampar-de-casaNext.js · webPlausibleanalyticsCrawlers7 bots · 2×/diaMarket Snapshotjob agendadoEmail Pipelinejob agendadopg-backupCronJob → R2PostgresCloudNativePGRedisstateful servicePostgres (Plausible)stateful serviceClickHousestateful servicePrometheuskube-prometheus-stackGrafanadashboardsAlertmanageremail relayResendemail providerCloudflare R2object storage

Segredos com 1Password Connect

Os segredos ficam armazenados em um vault específico do 1Password, que usa 1Password Connect para adicionar as variáveis de ambiente aos serviços.

Agora que o cluster está estável e funcional, vou começar a migrar mais serviços — começando com o vaultwarden (gerenciador de senhas OSS e gratuito) para parar de pagar o 1Password hehe.

Backups no R2

Já tenho alguns backups configurados que salvam snapshots no R2 (S3 da Cloudflare, que tem 0 egress fee).

Custo total: R$0

Mas é isso, tem sido bem maneiro. Grafana é fera, Tailscale também, Cloudflare então, nem se fala. O custo para hospedar tudo isso é: R$0,00 (se você ignorar a energia e internet).

A ideia é usar o projeto para aprender sobre k3s/k8s e sistemas distribuídos. Completamente desnecessário para o tamanho do projeto, mas vale como estudo.