{
  "markdown": "# homelab\n\nPersonal Kubernetes homelab on k3s. Fully GitOps — push to git, cluster self-updates via ArgoCD.\n\n---\n\n## Stack\n\n| Layer | Tool |\n|---|---|\n| Cluster | k3s |\n| GitOps | ArgoCD |\n| Ingress | Traefik |\n| DNS | AdGuard Home (Tailnet Split DNS) |\n| Registry | GHCR |\n\n---\n\n## How it works\n\n```\ngit push\n  └── ArgoCD detects change\n        └── applies manifests to cluster\n              └── cluster self-heals to match git\n```\n\nOne rule: **git is the source of truth**. Never `kubectl apply` manually unless bootstrapping.\n\n---\n\n## Deployments\n\n| Service | Namespace | Access |\n|---|---|---|\n| ArgoCD | `infra` | argocd.homelab |\n| Traefik | `infra` | traefik.homelab (dashboard) |\n| Blog | `apps` | **Public** (Funnel): dhridata.tail6a3e40.ts.net — blog `/`, admin `/admin`, images `/s3/*` |\n| MinIO | `cloud` | minio.homelab, s3.homelab; public images via blog host `/s3/*` |\n| PostgreSQL | `cloud` | postgres.cloud.svc.cluster.local:5432 (ClusterIP only, never public) |\n| Redis | `cloud` | redis.cloud.svc.cluster.local:6379 (ClusterIP only, never public) |\n| AdGuard Home | `cloud` | adguard.homelab (admin); tailnet-ip:53 (DNS) |\n\nFull exposure map: see `docs/exposure.md`.\n\n---\n\n## Repo Structure\n\n```\nk8s/\n  platform/              — platform components (applied manually)\n    argocd/              — ArgoCD install (Helm via Kustomize)\n    traefik/             — ingress controller (Helm via Kustomize)\n  cloud/                 — shared infra services\n    minio/\n    postgres/\n    redis/\n    adguard/\n  apps/                  — personal projects\nargocd-apps/             — app-of-apps registry (auto-synced by root)\n  root.yaml              — the only manifest ever manually applied\n  cloud/                 — ArgoCD Applications for cloud services\n  apps/                  — ArgoCD Applications for app projects\ndocs/\n  knowledge.md           — how everything works\n  kubectl.md             — debug commands\n  add-app.md             — adding a new app\n  lessons.md             — mistakes documented\n  history.md             — project history & challenges\ntemplates/               — copy these to add new apps\n```\n\n---\n\n## Bootstrap\n\nArgoCD and Traefik are deployed via Kustomize + Helm. Run these once:\n\n```bash\nkustomize build --enable-helm k8s/platform/traefik/ | kubectl apply -f -\nkustomize build --enable-helm k8s/platform/argocd/ | kubectl apply -f -\nkubectl apply -f argocd-apps/root.yaml\n```\n\nThe last command is the **only** `kubectl apply` you'll ever need again.\n\n---\n\n## Adding a New App\n\n```bash\ncp templates/deployment.yaml k8s/apps/<your-app>/deployment.yaml\ncp templates/service.yaml k8s/apps/<your-app>/service.yaml\ncp templates/kustomization.yaml k8s/apps/<your-app>/kustomization.yaml\ncp templates/argocd-app.yaml argocd-apps/apps/<your-app>.yaml\n# edit files — set name, image, port, namespace\ngit add . && git commit -m \"add <your-app>\" && git push\n```\n\nArgoCD picks it up automatically in ~3 minutes. See `docs/add-app.md` for details.\n\n---\n\n## Namespaces\n\n| Namespace | Purpose |\n|---|---|\n| `infra` | ArgoCD, Traefik |\n| `cloud` | MinIO, PostgreSQL, Redis, AdGuard Home |\n| `apps` | Personal projects |\n",
  "bytes": 3141,
  "sha": "34d851397251227cda17cc28e7ff744d9905420950c71b5bba2aef75462ee508",
  "repo_slug": "adi-amatdev/homelab",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/okf_adi_amatdev_homelab_docs_index_md_a4bfe2be/readme"
}