Migrando o Trampar de Casa pra um cluster k3s

April 13, 20264 min read
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...
#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
Three physical boxes joined as one k3s cluster. system/ namespace holds platform services, projects/ holds app workloads.
octa-clusterK3ssystem/SecretsObservabilityprojects/trampar-de-casa/git PRsimage pushgit reposreconcilepulltailscale0fetchmeshinject secretsinject secretsscrapecacheeventsGiteain-cluster · all reposGitea Actionsself-hosted runnerLocal Registryk3s mirror · :30500ArgoCDGitOps synck3scontrol planeTailscalemesh · flannel backendExternal Secretsoperator1Password Connectsecrets backendPostgresCloudNativePGPrometheusmetricsGrafanadashboardsNodes · 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.

EdgeAppsJobsDataObservabilityExternal:3000:8000:80:5432:6379events:8123PromQLCloudflare Tunnelingress · infra nsTraefikingress · dev.*trampar-de-casaNext.js · :3000Plausibleanalytics · :8000Crawlers7 bots · 2×/dayMarket SnapshotCronJob · daily 06:00Email PipelineCronJob · Wed 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.