This project demonstrates a modern, production-style DevOps workflow for a full-stack Phone Book app:
- Frontend: React (Vite)
- Backend: Node.js (Express) with PostgreSQL
- Database: PostgreSQL (Bitnami Helm subchart, persistent)
- CI/CD: GitHub Actions โ Trivy scan โ GHCR โ Argo CD
- GitOps Deployment: Argo CD + Helm
- Ingress: Traefik with TLS via cert-manager
- Monitoring: Prometheus with comprehensive alerting rules
- Security Scanning: Trivy
- Rollback: One-click GitOps rollback via GitHub Actions
See QUICKSTART.md for detailed setup instructions.
- โ Multi-environment deployments (dev/prod)
- โ ArgoCD auto-sync with self-healing
- โ Automated image tag updates
- โ One-click rollback via GitHub Actions
- โ Conditional builds based on changed components
- โ Container security scanning with Trivy
- โ Multi-environment Helm value management
- โ Automated dependency updates
- โ Traefik ingress controller with TLS
- โ Comprehensive Prometheus alerting
- โ Detailed runbooks for incident response
- โ Resource optimization and scaling
- โ Pod availability monitoring
- โ Resource usage alerts (CPU/Memory)
- โ Database connectivity monitoring
- โ Environment-specific alert thresholds
apps/backendโ Node.js/Express backend (REST API, PostgreSQL)apps/frontendโ React frontendcharts/myappโ Helm chart for deployment (with PostgreSQL subchart)manifests/โ K8s manifests (Argo CD, monitoring, etc)
# Using Docker
export POSTGRES_PASSWORD=secretpassword
export POSTGRES_USER=phonebook
export POSTGRES_DB=phonebook
docker run --rm -d -p 5432:5432 \
-e POSTGRES_PASSWORD=$POSTGRES_PASSWORD \
-e POSTGRES_USER=$POSTGRES_USER \
-e POSTGRES_DB=$POSTGRES_DB \
postgres:15cd apps/backend
cp .env.example .env # Edit if needed
npm install
npm run migrate # Creates contacts table
npm start # Starts API on :5000cd apps/frontend
npm install
npm run dev # Starts Vite dev server- The frontend expects the backend at
/api(see Nginx config for production). - For local dev, you may need to set up a Vite proxy to forward
/apitolocalhost:5000.
# Backend
cd apps/backend
npm run build # If you have a build step
# Build and push image
# docker build -t ghcr.io/<your-username>/backend:latest .
# docker push ghcr.io/<your-username>/backend:latest
# Frontend
cd apps/frontend
npm run build
# docker build -t ghcr.io/<your-username>/frontend:latest .
# docker push ghcr.io/<your-username>/frontend:latest- Install dependencies:
helm dependency update charts/myapp
- Deploy:
helm upgrade --install myapp charts/myapp --namespace myapp --create-namespace # For dev/prod: # helm upgrade --install myapp charts/myapp -f charts/myapp/values-dev.yaml --namespace myapp --create-namespace # helm upgrade --install myapp charts/myapp -f charts/myapp/values-prod.yaml --namespace myapp --create-namespace
- Check status:
kubectl get pods -n myapp kubectl get svc -n myapp kubectl get ingress -n myapp
- See
manifests/argocd-app.yamlfor Argo CDAppProjectandApplicationresources. - Argo CD will watch your GitHub repo and auto-sync changes to your cluster.
To securely manage your database credentials in Kubernetes, use Bitnami SealedSecrets. This allows you to store encrypted secrets in Git and have them automatically decrypted by the SealedSecrets controller in your cluster.
curl -OL "https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.30.0/kubeseal-0.30.0-linux-amd64.tar.gz"
tar -xvzf kubeseal-0.30.0-linux-amd64.tar.gz kubeseal
sudo install -m 755 kubeseal /usr/local/bin/kubesealConnect:
kubeseal --controller-name=sealed-secrets --controller-namespace=sealed-secretsExample: myapp-db-dev-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: myapp-db-dev
namespace: myapp-dev
type: Opaque
data:
username: $(echo -n 'myappuser' | base64)
password: $(echo -n 'myapppassword' | base64)Encode the values first (for prod):
echo -n 'prodUser01' | base64
echo -n 'prodPass456@' | base64Create a JSON manifest (e.g., tmp-prod-secret.json):
{
"apiVersion": "v1",
"kind": "Secret",
"metadata": {
"name": "myapp-db-prod",
"namespace": "myapp-prod"
},
"type": "Opaque",
"data": {
"username": "cHJvZFVzZXIwMQ==",
"password": "cHJvZFBhc3M0NTZA"
}
}Seal it:
kubeseal --controller-name=sealed-secrets --controller-namespace=sealed-secrets --format yaml < tmp-prod-secret.json > manifests/sealedsecret-db-prod.yamlRepeat for myapp-db-dev in the myapp-dev namespace.
kubectl apply -f manifests/sealedsecret-db-dev.yaml
kubectl apply -f manifests/sealedsecret-db-prod.yamlkubectl get secret myapp-db-dev -n myapp-dev -o yaml
kubectl get secret myapp-db-prod -n myapp-prod -o yamlargocd app sync phonebook-dev-app
argocd app sync phonebook-prod-app- Trivy scans run in CI before image push.
- Prometheus & Grafana manifests included for monitoring.
- Ingress is set up for TLS via cert-manager (see
ingress.yaml).
CREATE TABLE contacts (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
phone TEXT NOT NULL,
email TEXT
);CREATE TABLE contacts (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
phone TEXT NOT NULL,
email TEXT
);This project includes comprehensive monitoring with Prometheus alert rules:
- Pod Down: Application pods unavailable for >2 minutes (prod) or >3 minutes (dev)
- Database Connection: PostgreSQL connectivity issues
- High Memory Usage: Memory usage >80% for >5 minutes
- High CPU Usage: CPU usage >80% for >5 minutes
- Frequent Restarts: Pods restarting repeatedly
Detailed troubleshooting guides available in docs/runbooks/:
- Backend Pod Down
- Frontend Pod Down
- High Memory Usage
- High CPU Usage
- Pod Restarts
- Database Connection
Use GitHub Actions "GitOps Rollback Application" workflow:
- Select environment (dev/prod)
- Specify backend and frontend image tags
- Execute rollback - ArgoCD syncs automatically
Use GitHub Actions "Update Helm Image Tags" workflow:
- Automatically fetches latest tags from GHCR
- Updates both dev and prod environments
- Runs daily at 6 AM UTC or manually triggered
- GitOps: All deployments via Git commits
- Infrastructure as Code: Helm charts and K8s manifests
- Immutable Infrastructure: Container-based deployments
- Automated Testing: CI pipeline with security scanning
- Multi-environment: Separate dev/prod with different configurations
- Monitoring: Comprehensive alerting and runbooks
- Security: Container scanning and secret management
- Reliability: Auto-healing, scaling, and rollback capabilities
- Observability: Prometheus metrics and alerts
- Incident Response: Detailed runbooks and escalation procedures
- Change Management: Controlled deployments via GitOps
- Compliance: Audit trails through Git history
