Migrando o Trampar de Casa pra um cluster k3s

Featured image for article: Migrating Trampar de Casa to a k3s cluster - From docker compose on one node to a multi-architecture k3s cluster with GitOps (ArgoCD), Tailscale mesh, Cloudflare Tun...

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
Multiple compute nodes form one container platform. Platform services and app workloads stay separated.
octa-clusterK3ssystem/SecretsObservabilityprojects/trampar-de-casa/git PRsimage pushgit reposreconcilepullprivatefetchmeshinject secretsinject secretsscrapecacheeventsSource controlversioned codeCI runnerbuild and testLocal Registryprivate image storeArgoCDGitOps synck3scontrol planePrivate networkprotected meshExternal SecretsoperatorSecrets backendprotected storagePostgresCloudNativePGPrometheusmetricsGrafanadashboardsNodes · 3 hosts72 GB · 36 cores · mixed archwebNext.js · tramparRediscache + sessionsCrawlers7 bots · CronJobsPlausibleanalyticsClickHouseplausible backend

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.

EdgeAppsJobsDataObservabilityExternaleventsPromQLCloudflare Tunnelingress · plataformaTraefikingress · dev.*trampar-de-casaNext.js · webPlausibleanalyticsCrawlers7 bots · 2×/dayMarket Snapshotscheduled jobEmail Pipelinescheduled jobpg-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.