Files
resume-site/DEPLOYMENT.md
Neon Vortex c37e2c60f8 Add comprehensive deployment documentation
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 13:39:02 -05:00

8.6 KiB

Resume Site Deployment Guide

Overview

Your resume site is now configured for automated deployment to your Kubernetes cluster via Flux CD. The site will be accessible at https://resume.caffeinetux.com.

What's Been Configured

  • HTML comment added to source: <!-- If you're reading this, the hiring pipeline has reached manual approval. -->
  • Helm chart configured for Kubernetes deployment
  • Harbor registry: images.caffeinetux.com/production/resume-site
  • Ingress configured with Let's Encrypt TLS
  • Flux CD manifests for GitOps automation
  • CI/CD workflow for Harbor image builds

Deployment Status

Completed:

  • Resume site extracted and prepared
  • HTML comment added to index.html
  • Helm values updated with resume.caffeinetux.com domain
  • Harbor registry configured at images.caffeinetux.com
  • Flux manifests created and configured
  • Git repository initialized with all changes committed
  • Deployment script created (deploy.sh)

Next Steps Required:

1. Create Gitea Repository

# Option A: Via Web UI
# Navigate to: http://192.168.1.49:13001
# Click "+" → "New Repository"
# Repository name: resume-site
# Owner: admin

# Option B: Via API (requires token)
curl -X POST "http://192.168.1.49:13001/api/v1/user/repos" \
  -H "Authorization: token YOUR_GITEA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "resume-site",
    "description": "Nicholas Haven Resume Site",
    "private": false
  }'

2. Push Code to Gitea

cd /data/data/com.termux/files/home/git/resume-site

# Rename branch to main
git branch -M main

# Add Gitea remote
git remote add origin http://192.168.1.49:13001/admin/resume-site.git

# Push code
git push -u origin main

3. Build and Push Docker Image

Since Docker isn't available in Termux, you'll need to build from a machine with Docker:

# Login to Harbor
docker login images.caffeinetux.com

# Build the image
docker build -t images.caffeinetux.com/production/resume-site:latest .

# Push to Harbor
docker push images.caffeinetux.com/production/resume-site:latest

Alternative: Let your CI/CD handle the build:

  • The .github/workflows/ci.yaml is configured for automated builds
  • Just set HARBOR_USERNAME and HARBOR_PASSWORD secrets in Gitea
  • Push to main branch and it will build automatically

4. Apply Flux Manifests

# Apply the Flux manifests to your cluster
kubectl apply -k /data/data/com.termux/files/home/git/resume-site/flux/

# Verify Flux resources
kubectl get gitrepository -n flux-system resume-site
kubectl get helmrelease -n default resume-site

5. Monitor Deployment

# Check pods
kubectl get pods -n default -l app.kubernetes.io/name=resume-site

# Watch logs
kubectl logs -n default -l app.kubernetes.io/name=resume-site -f

# Check ingress
kubectl get ingress -n default

# Verify Flux reconciliation
flux reconcile source git resume-site
flux reconcile helmrelease resume-site

Quick Deployment

Use the provided deployment script for interactive deployment:

cd /data/data/com.termux/files/home/git/resume-site
./deploy.sh

The script will guide you through:

  1. Creating the Gitea repository
  2. Pushing code to Gitea
  3. Building and pushing the Docker image (if Docker is available)
  4. Applying Flux manifests
  5. Verifying deployment

Architecture

┌─────────────────────────────────────────────────────┐
│                                                       │
│  Gitea (http://192.168.1.49:13001/admin/resume-site)│
│                                                       │
└────────────────┬────────────────────────────────────┘
                 │
                 │ Flux CD watches Git repo every 1 min
                 ▼
┌─────────────────────────────────────────────────────┐
│                                                       │
│  Flux GitRepository + HelmRelease (flux-system ns)  │
│                                                       │
└────────────────┬────────────────────────────────────┘
                 │
                 │ Deploys Helm chart
                 ▼
┌─────────────────────────────────────────────────────┐
│                                                       │
│  Kubernetes Deployment (default namespace)          │
│  - 2 replicas                                        │
│  - nginx:alpine based                                │
│  - Pod anti-affinity for HA                          │
│  - PodDisruptionBudget (minAvailable: 1)            │
│                                                       │
└────────────────┬────────────────────────────────────┘
                 │
                 │ Exposes via Ingress
                 ▼
┌─────────────────────────────────────────────────────┐
│                                                       │
│  nginx Ingress Controller                            │
│  - TLS via Let's Encrypt (letsencrypt-prod)         │
│  - Certificate auto-renewal                          │
│                                                       │
└────────────────┬────────────────────────────────────┘
                 │
                 ▼
          https://resume.caffeinetux.com

Configuration Files

  • index.html: Resume site with special hiring comment
  • Dockerfile: nginx:alpine based container
  • helm/: Kubernetes Helm chart
    • values.yaml: Configuration values
    • templates/: Kubernetes resource templates
  • flux/: Flux CD manifests
    • gitrepository.yaml: Defines Git source
    • helmrelease.yaml: Defines Helm deployment
    • kustomization.yaml: Kustomize bundle
  • .github/workflows/ci.yaml: CI pipeline for Harbor builds

Harbor Image Pull Secrets (if needed)

If your Harbor registry requires authentication for pulling:

kubectl create secret docker-registry harbor-creds \
  --docker-server=images.caffeinetux.com \
  --docker-username=YOUR_USERNAME \
  --docker-password=YOUR_PASSWORD \
  --namespace=default

# Then update helm/values.yaml:
# imagePullSecrets:
#   - name: harbor-creds

Troubleshooting

Flux not reconciling

# Force reconciliation
flux reconcile source git resume-site
flux reconcile helmrelease resume-site

# Check Flux logs
kubectl logs -n flux-system deployment/source-controller
kubectl logs -n flux-system deployment/helm-controller

Image pull errors

# Check if Harbor is accessible from cluster
kubectl run test --rm -it --image=busybox --restart=Never -- wget -O- http://images.caffeinetux.com

# Verify image exists in Harbor
curl -k https://images.caffeinetux.com/api/v2.0/projects/production/repositories/resume-site/artifacts

Ingress not working

# Check ingress controller
kubectl get pods -n ingress-nginx

# Check certificate
kubectl get certificate -n default resume-tls
kubectl describe certificate -n default resume-tls

# Check cert-manager
kubectl get certificaterequest -n default

DNS resolution

# Verify DNS points to your cluster
nslookup resume.caffeinetux.com

# Check ingress external IP
kubectl get ingress -n default

Updates and Changes

After the initial deployment, any changes you push to the helm/ directory in Git will be automatically deployed by Flux within 1 minute.

# Make changes to helm chart
vim helm/values.yaml

# Commit and push
git add helm/values.yaml
git commit -m "Update configuration"
git push

# Flux will automatically sync (or force it)
flux reconcile source git resume-site

Contact

If you encounter issues:

  1. Check the logs in each component (Flux, pods, ingress)
  2. Verify network connectivity to Gitea and Harbor
  3. Ensure DNS is properly configured for resume.caffeinetux.com
  4. Check that cert-manager is issuing certificates correctly

Generated with Claude Code