Commit Graph

25 Commits

Author SHA1 Message Date
Julia McGhee
3d61911868 Add Tactical Monolith design system and landing page to web app
Set up Tailwind CSS v4 with full design token system from Stitch project
(obsidian surfaces, neon cyan/magenta/lime palette, Space Grotesk + Inter
typography, 0px border-radius). Landing page includes hero section, side
nav, module cards, system status panels, terminal log, and CRT overlay.
2026-03-20 20:24:19 +00:00
Julia McGhee
18b2564c8e Add sealed api-secrets with database and Valkey connection strings 2026-03-20 20:16:35 +00:00
Julia McGhee
9ae228f0f3 Add ghcr.io pull secret for private container images
Sealed secret provides auth for pulling from ghcr.io/lazorgurl/*.
Added imagePullSecrets to both app deployments.
2026-03-20 20:06:18 +00:00
github-actions[bot]
a38c6d399a deploy: update production images to 6df9afdc20 2026-03-20 19:58:01 +00:00
Julia McGhee
6df9afdc20 Add packages:write permission for ghcr.io push 2026-03-20 19:55:51 +00:00
Julia McGhee
6317291330 Add empty public directory for Next.js Docker build 2026-03-20 19:53:32 +00:00
Julia McGhee
68261e17a2 Add .dockerignore files to prevent node_modules copy conflicts 2026-03-20 19:51:12 +00:00
Julia McGhee
c9f612d5ce Switch Dockerfiles from pnpm to npm for standalone app builds
pnpm in workspace mode can't generate per-app lockfiles, and without a
lockfile the install is unreliable in CI. npm works fine for these
standalone app builds since they have no workspace dependencies.
2026-03-20 19:49:50 +00:00
Julia McGhee
dafbb59463 Fix Docker builds: drop frozen-lockfile for standalone app builds
Apps build in isolation from the monorepo, so the root pnpm-lock.yaml
doesn't match the app-level package.json. Use plain pnpm install
since each app's package.json is the source of truth.
2026-03-20 19:48:00 +00:00
Julia McGhee
e13a008860 Copy root pnpm-lock.yaml into app context for Docker builds
Each app's Dockerfile expects a lockfile but docker build context is
scoped to the app directory. Copy it in before build, remove after.
2026-03-20 19:46:34 +00:00
Julia McGhee
d1f2bd1fc5 Add pnpm-lock.yaml for reproducible CI builds 2026-03-20 19:45:18 +00:00
Julia McGhee
bdbc5caf8e Add workflow_dispatch to deploy-production with force-build-all
Manual triggers build all apps since turbo's change filter doesn't
apply when there's no push diff to compare against.
2026-03-20 19:44:01 +00:00
Julia McGhee
e863ebed9b Set Longhorn default replica count to 1 for single-node cluster
With only one node, 2 replicas can never be scheduled — volumes report
as degraded. Match the replica count to the node count.
2026-03-20 19:39:15 +00:00
Julia McGhee
04fc7c7576 Disable ArgoCD internal TLS to fix redirect loop behind Traefik
Traefik terminates TLS, so ArgoCD server must run in insecure mode.
Also update ArgoCD URL from homelab.local to coreworlds.io.
2026-03-20 19:33:17 +00:00
Julia McGhee
1bafc75429 Enable servicelb for LoadBalancer IP assignment on single-node cluster
Without servicelb, Traefik had no external IP and was only reachable via
NodePort. Klipper LB binds ports 80/443 directly to the node.
2026-03-20 19:31:27 +00:00
Julia McGhee
11c9c0f1bc Add Certificate resources for internal IngressRoutes
cert-manager annotations don't work on Traefik IngressRoutes — explicit
Certificate resources are needed to trigger Let's Encrypt issuance.
2026-03-20 19:26:25 +00:00
Julia McGhee
71442a0405 Switch from homelab.local to coreworlds.io with split-horizon DNS and LAN-only access controls
- Migrate all ingress hostnames from *.homelab.local to *.coreworlds.io
- Remove broken Traefik certresolver config (cert-manager handles TLS)
- Add internal-only IP allowlist middleware for platform services
- Add IngressRoutes for ArgoCD, Grafana, Longhorn (LAN-only via middleware)
- Seal and add Cloudflare API token for cert-manager DNS-01 challenges
- Update cert-manager ClusterIssuers with real email
- Update k3s TLS SAN to k3s.coreworlds.io
- Rewrite Ubiquiti docs for single-node topology and split-horizon DNS
- Fix seal-secret.sh controller name to match Helm release
- Add UCG DNS setup script using API key auth
2026-03-20 19:21:46 +00:00
Julia McGhee
4135d2102e Bump CNPG chart to 0.23.2 for missing Pooler CRD 2026-03-20 18:51:15 +00:00
Julia McGhee
9867129eff Add retry/ServerSideApply to CNPG helm app 2026-03-20 18:49:37 +00:00
Julia McGhee
6f1418d0c6 Disable Longhorn pre-upgrade checker job for ArgoCD compatibility 2026-03-20 18:48:06 +00:00
Julia McGhee
b359cc9560 Separate CRD-dependent resources from operator installs
cert-manager and CloudNativePG operator installs must complete before
their custom resources (ClusterIssuer, CNPG Cluster) can be applied.

Split into separate kustomize dirs so the ApplicationSet creates
independent ArgoCD apps that can sync in order:
- platform-cert-manager → installs operator
- platform-cert-manager-config → creates ClusterIssuers (after CRDs exist)
- platform-cloudnativepg → installs operator
- platform-cloudnativepg-cluster → creates PG cluster (after CRDs exist)
2026-03-20 18:43:01 +00:00
Julia McGhee
4aff69d0e6 Add Helm-based ArgoCD Applications for platform operators
- Longhorn: Helm chart v1.7.2 (sync-wave -2, installs first)
- cert-manager: Helm chart v1.16.3 with CRDs enabled
- CloudNativePG: Helm chart v0.23.0
- Sealed Secrets: Helm chart v2.16.2
- Remove custom StorageClass (Helm chart manages it)

Previously only config resources were deployed without the actual
operators, causing PVCs to pend and CRDs to be missing.
2026-03-20 18:40:16 +00:00
Julia McGhee
9cb517fcbe Remove accidentally committed secrets, harden .gitignore
- Remove vault.yaml and kubeconfig from tracking
- Add vault files and kubeconfig to .gitignore everywhere
- Clean up stray infra/ansible/infra/ directory
2026-03-20 18:33:55 +00:00
Julia McGhee
7f3585a013 Configure ArgoCD for private repo access
- Update repo URLs from HTTPS placeholder to git@github.com:lazorgurl/homelab.git
- Update container image refs from OWNER to lazorgurl
- Set KUBECONFIG env in Taskfile
- Fix kubeconfig-fetch.sh to auto-detect server IP from inventory
- Fix Ansible: callback plugin, br_netfilter ordering, ssh service name
2026-03-20 18:33:30 +00:00
Julia McGhee
96e3f32f28 Initial monorepo scaffold
Turborepo + pnpm monorepo for k3s homelab cluster on Intel NUCs.

- Apps: Next.js web frontend, Express API (TypeScript, Dockerfiles, k8s manifests)
- Packages: shared UI, ESLint config, TypeScript config, Drizzle DB schemas
- Infra/Ansible: bare-metal provisioning with roles for common, k3s-server, k3s-agent, hardening
- Infra/Kubernetes: ArgoCD GitOps (app-of-apps + ApplicationSets), platform components
  (cert-manager, Traefik, CloudNativePG, Valkey, Longhorn, Sealed Secrets), namespaces
- Observability: kube-prometheus-stack, Loki, Promtail as ArgoCD Applications
- CI/CD: GitHub Actions for PR builds, preview deploys, production deploys
- DX: Taskfile, utility scripts, copier templates, Ubiquiti network docs
2026-03-19 22:24:56 +00:00