Migrando o Trampar de Casa pra um cluster k3s

13 de Abril, 20264 min de leitura
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...
#k3s#gitops#argocd#self-hosted#homelab

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
Três máquinas físicas juntas formam um cluster k3s. O namespace system/ guarda serviços de plataforma, projects/ guarda os workloads das apps.
octa-clusterK3ssystem/SegredosObservabilidadeprojects/trampar-de-casa/git PRspush imagemgit reposreconcilepulltailscale0buscarmeshinjeta segredosinjeta segredosrasparcacheeventosGiteadentro do cluster · todos reposGitea Actionsrunner self-hostedRegistry Localespelho do k3s · :30500ArgoCDsincronização GitOpsk3scontrol planeTailscalemesh · backend flannelExternal Secretsoperator1Password Connectbackend de segredosPostgresCloudNativePGPrometheusmé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.

BordaAppsJobsDadosObservabilidadeExterno:3000:8000:80:5432:6379eventos:8123PromQLCloudflare Tunnelingresso · ns infraTraefikingresso · dev.*trampar-de-casaNext.js · :3000Plausibleanalytics · :8000Crawlers7 bots · 2×/diaMarket SnapshotCronJob · diário 06:00Email PipelineCronJob · Qua 13:00pg-backupCronJob → R2PostgresCloudNativePG · :5432RedisStatefulSet · :6379Postgres (Plausible)StatefulSet · :5432ClickHouseStatefulSet · :8123Prometheuskube-prometheus-stackGrafanaNodePort :30090AlertmanagerSMTP → ResendResendSMTP:465Cloudflare 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.