#!/bin/bash # scripts/deploy-staging.sh # Gravl Staging Deployment Script # Phase 10-07: Task 2 — Deploy All Services to Staging # # USAGE: # ./scripts/deploy-staging.sh [--context ] [--dry-run] # # PREREQUISITES: # - kubectl installed and reachable # - kubeconfig with staging cluster context # - Staging namespace already configured (see setup-staging.sh) # - Docker images available (pushed to registry or local) set -euo pipefail CONTEXT="${KUBECTL_CONTEXT:-}" DRY_RUN=false K8S_DEPLOYMENTS_DIR="$(dirname "$0")/../k8s/deployments" NAMESPACE="gravl-staging" KUBECTL="kubectl" [[ -n "$CONTEXT" ]] && KUBECTL="kubectl --context=$CONTEXT" [[ "$DRY_RUN" == "true" ]] && KUBECTL="$KUBECTL --dry-run=client -o yaml" echo "[INFO] Deploying Gravl services to ${NAMESPACE}..." # Deploy PostgreSQL StatefulSet echo "[INFO] Deploying PostgreSQL..." sed "s/namespace: gravl-prod/namespace: ${NAMESPACE}/g" \ "${K8S_DEPLOYMENTS_DIR}/postgresql.yaml" | \ $KUBECTL apply -f - # Deploy Backend Deployment (1 replica for staging) echo "[INFO] Deploying backend..." sed "s/namespace: gravl-prod/namespace: ${NAMESPACE}/g; s/replicas: 3/replicas: 1/g" \ "${K8S_DEPLOYMENTS_DIR}/gravl-backend.yaml" | \ $KUBECTL apply -f - # Deploy Frontend Deployment (1 replica for staging) echo "[INFO] Deploying frontend..." sed "s/namespace: gravl-prod/namespace: ${NAMESPACE}/g; s/replicas: 3/replicas: 1/g" \ "${K8S_DEPLOYMENTS_DIR}/gravl-frontend.yaml" | \ $KUBECTL apply -f - # Deploy Ingress echo "[INFO] Deploying Ingress..." grep -A 30 "namespace: gravl-staging" "${K8S_DEPLOYMENTS_DIR}/ingress-nginx.yaml" | \ $KUBECTL apply -f - echo "[OK] Staging deployment initiated" echo "[INFO] Wait for pods: kubectl get pods -n ${NAMESPACE}" echo "[INFO] View logs: kubectl logs -f -n ${NAMESPACE} -l app=gravl"