Nik Afiq e15911305f Revert "feat: move Gitea traffic from gitea.nik4nao.com to gitea.home.arpa"
This reverts commit fd13b8a. The registry-host migration broke image
pulls for home-services/portfolio (internal CA not trusted by
containerd) and has left them Degraded for 11 days; reverting back to
gitea.nik4nao.com pending a decision on how to proceed. Not pushed yet.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 00:22:27 +09:00

3.1 KiB

name, description
name description
add-service Add a new service to the homelab cluster end-to-end (manifests, Argo CD Application, DNS, certs/secrets). Use when the user wants to deploy a new app or service to the K3s cluster.

Add a new service to the cluster: $ARGUMENTS

Follow the checklist from argocd/README.md, in order:

1. Manifests or Helm values

  • Raw resources: create manifests/<area>/<service>.yaml. Follow the style of existing files (see manifests/portfolio/portfolio.yaml for a full example: NamespaceDeploymentServiceCertificateIngressRoute, all in one file separated by ---). Start the file with an # Apply: / # Delete: / # Description: comment block matching sibling files.
  • Helm chart instead: add values/<service>.yaml with the chart's values.

2. Argo CD Application

Add argocd/apps/<service>.yaml. For a raw manifest directory:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: <service>
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://gitea.nik4nao.com/nik/homelab.git
    targetRevision: main
    path: manifests/<area>
    directory:
      recurse: true
      include: '*.yaml'
  destination:
    server: https://kubernetes.default.svc
    namespace: <service>
  syncPolicy:
    automated:
      prune: false
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

For a Helm chart, mirror an existing chart-backed Application (e.g. argocd/apps/traefik.yaml) and point it at values/<service>.yaml.

prune: false is deliberate — deleting a manifest from Git will NOT remove the resource from the cluster automatically; say so if the user is removing something, not just adding.

3. DNS (internal services only)

home.arpa has no wildcard DNS. If this service gets a *.home.arpa hostname, add it to both:

  • values/pihole.yaml (dnsmasq.customDnsEntries, format address=/<host>.home.arpa/<node-ip>, plus an ingress.hosts entry if the service itself is exposed through Pi-hole's own ingress block — most services don't need that part, just the customDnsEntries line)
  • values/pihole-debian.yaml (same entry, kept in sync with the primary)

Public services use nik4nao.com and don't need Pi-hole entries.

4. Certificates and secrets

  • Internal (home.arpa): Certificate with issuerRef.name: internal-ca-issuer.
  • Public (nik4nao.com): Certificate with issuerRef.name: letsencrypt-prod.
  • If the service needs credentials, decide runtime-script vs sealed-secret — see the regen-sealed-secret skill / manifests/README.md for the distinction. Don't hardcode secret values into the manifest.
  • If the image is pulled from the private Gitea registry, add an imagePullSecrets reference and reuse/create the matching registry-secret.sh pattern (see manifests/portfolio/registry-secret.sh).

5. Commit

Commit manifests, the Application file, and any DNS/values changes together. Do not commit .env or any plaintext secret values. Let the app-of-apps reconcile — don't kubectl apply the new Application by hand unless the user asks for an immediate manual sync.