#!/usr/bin/env bash # ============================================================================= # start-app.sh # Creates all Kubernetes objects for the Todo application. # Assumes: kubectl configured, minikube running, prepare-app.sh already run. # ============================================================================= set -euo pipefail K8S_DIR="$(dirname "$0")/k8s" echo "======================================================" echo " Starting K8s Todo App" echo "======================================================" # ── 1. Namespace ─────────────────────────────────────────── echo "" echo "[1/6] Creating Namespace..." kubectl apply -f "$K8S_DIR/namespace.yaml" echo " ✓ Namespace 'todo-app' ready" # ── 2. ConfigMap (init SQL) ──────────────────────────────── echo "" echo "[2/6] Creating ConfigMap for database init SQL..." kubectl apply -f "$K8S_DIR/configmap.yaml" echo " ✓ ConfigMap 'postgres-init-sql' ready" # ── 3. PersistentVolume + PVC + Secret + StatefulSet ────── echo "" echo "[3/6] Creating PersistentVolume, PVC, Secret and StatefulSet (PostgreSQL)..." kubectl apply -f "$K8S_DIR/statefulset.yaml" echo " ✓ PersistentVolume, PVC, Secret and StatefulSet applied" # ── 4. Services ──────────────────────────────────────────── echo "" echo "[4/6] Creating Services..." kubectl apply -f "$K8S_DIR/service.yaml" echo " ✓ Services created" # ── 5. Wait for PostgreSQL to be ready ──────────────────── echo "" echo "[5/6] Waiting for PostgreSQL StatefulSet to become ready (up to 3 min)..." kubectl rollout status statefulset/postgres -n todo-app --timeout=180s echo " ✓ PostgreSQL is ready" # ── 6. Deployment (Flask app) ────────────────────────────── echo "" echo "[6/6] Creating Deployment (Flask Todo App)..." kubectl apply -f "$K8S_DIR/deployment.yaml" kubectl rollout status deployment/todo-app -n todo-app --timeout=120s echo " ✓ Deployment is ready" # ── Summary ──────────────────────────────────────────────── echo "" echo "======================================================" echo " Application is UP!" echo "" MINIKUBE_IP=$(minikube ip 2>/dev/null || echo "") echo " Open in browser: http://${MINIKUBE_IP}:30080" echo "" echo " Or run: minikube service todo-app-service -n todo-app" echo "" echo " All pods:" kubectl get pods -n todo-app echo "======================================================"