# Deployment ## Local Commands ```bash npm install npm run dev npm run typecheck npm run build npm run preview ``` ## Configuration Set these at build time: ```bash PUBLIC_SITE_URL=https://www.bluecapstrategies.com PUBLIC_CONTACT_FORM_ENDPOINT=https://your-form-endpoint.example ``` `PUBLIC_CONTACT_FORM_ENDPOINT` can point to Formspree, a webhook, ntfy, or a self-hosted form receiver. Without it, the contact form validates fields and opens an email draft to `info@bluecapstrategies.com`. ## Container ```bash docker build -t bluecap-strategies-website:latest . docker run --rm -p 8080:80 bluecap-strategies-website:latest ``` ## k3s Production deployment should use the pull-based GitOps model documented in `docs/gitops-deployment-strategy.md`. The intended flow is: ```text local edit -> git push -> GitHub Actions test/build/publish -> Git manifest image tag update -> ArgoCD reconciles k3s ``` ArgoCD is already running in the homelab k3s cluster, so it is the reconciler (not Flux). GitHub Actions should not receive kubeconfig or direct access to the homelab cluster. Manual `kubectl` use should be limited to bootstrapping the ArgoCD Application, read-only inspection, and emergency operations. If you intentionally choose to apply the current manifests by hand during a controlled bootstrap test, the command would be: ```bash kubectl apply -k k8s/ ``` Do not treat that as the normal production deployment process. The manifests assume Traefik ingress is available. Read-only research confirmed Traefik and cert-manager are installed, with a ready `letsencrypt-prod` ClusterIssuer. However, TLS and ingress hardening should remain documented rather than applied until the Pangolin/Newt edge path is confirmed. Items to confirm before production ingress changes: - Whether Pangolin/Newt terminates TLS, passes TLS through, or proxies HTTPS to Traefik. - Whether Pangolin/Newt preserves `Host` headers for the BlueCap hostnames. - Whether cert-manager's Cloudflare DNS-01 token can issue certificates for `bluecapstrategies.com`. - Whether the canonical production host should be apex or `www`. ## DNS Cutover Before cutover: - Build and push the final container image. - Confirm the GitHub Actions workflow publishes the GHCR image and updates the desired image tag. - Confirm ArgoCD reconciles the `bluecap-strategies` workload from Git. - Confirm the ingress or edge route answers for `www.bluecapstrategies.com` and `bluecapstrategies.com`. - Lower DNS TTL on the existing records. - Point BlueCap DNS to the existing Pangolin/Newt public edge, or to the chosen production edge if that architecture changes. - Configure apex-to-canonical redirect at the selected layer: Cloudflare, Pangolin/Newt, Traefik, or nginx. - Verify `/`, `/services/`, `/about-us/`, `/contact/`, `/sitemap-index.xml`, and `/robots.txt` after DNS propagation.