#!/bin/bash set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BACKEND_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" ROOT_DIR="$(cd "$BACKEND_DIR/.." && pwd)" ENV_FILE="$ROOT_DIR/.env" REGISTRY="localhost:5000" IMAGE_TAG="${IMAGE_TAG:-latest}" echo "=== GooSeek K8s Deployment ===" echo "Backend dir: $BACKEND_DIR" echo "Registry: $REGISTRY" echo "Tag: $IMAGE_TAG" # Load .env if [ -f "$ENV_FILE" ]; then echo "Loading env from $ENV_FILE" set -a source "$ENV_FILE" set +a fi # Check kubectl if ! command -v kubectl &> /dev/null; then echo "Error: kubectl not found" exit 1 fi # Build and push backend image echo "" echo "=== Building Go backend image ===" cd "$BACKEND_DIR" docker build -f deploy/docker/Dockerfile.all \ -t "$REGISTRY/gooseek/backend:$IMAGE_TAG" \ -t "$REGISTRY/gooseek/backend:latest" \ . echo "=== Pushing backend to registry ===" docker push "$REGISTRY/gooseek/backend:$IMAGE_TAG" docker push "$REGISTRY/gooseek/backend:latest" # Build and push webui image echo "" echo "=== Building webui image ===" docker build \ -f "$BACKEND_DIR/webui/Dockerfile" \ --build-arg "NEXT_PUBLIC_ENABLED_ROUTES=${NEXT_PUBLIC_ENABLED_ROUTES:-}" \ --build-arg "NEXT_PUBLIC_TWOGIS_API_KEY=${NEXT_PUBLIC_TWOGIS_API_KEY:-}" \ -t "$REGISTRY/gooseek/webui:$IMAGE_TAG" \ -t "$REGISTRY/gooseek/webui:latest" \ "$BACKEND_DIR/webui" echo "=== Pushing webui to registry ===" docker push "$REGISTRY/gooseek/webui:$IMAGE_TAG" docker push "$REGISTRY/gooseek/webui:latest" # Generate configmap/secrets from .env via envsubst echo "" echo "=== Generating K8s manifests from .env ===" if command -v envsubst &> /dev/null && [ -f "$ENV_FILE" ]; then envsubst < "$SCRIPT_DIR/configmap.yaml" > "$SCRIPT_DIR/_generated_configmap.yaml" kubectl apply -f "$SCRIPT_DIR/_generated_configmap.yaml" -n gooseek fi # Apply kustomization echo "" echo "=== Applying K8s manifests ===" cd "$SCRIPT_DIR" kubectl apply -k . # Rolling restart to pull new images echo "" echo "=== Rolling restart deployments ===" kubectl -n gooseek rollout restart deployment/api-gateway kubectl -n gooseek rollout restart deployment/webui kubectl -n gooseek rollout restart deployment/chat-svc kubectl -n gooseek rollout restart deployment/agent-svc kubectl -n gooseek rollout restart deployment/discover-svc kubectl -n gooseek rollout restart deployment/search-svc kubectl -n gooseek rollout restart deployment/learning-svc kubectl -n gooseek rollout restart deployment/medicine-svc kubectl -n gooseek rollout restart deployment/travel-svc kubectl -n gooseek rollout restart deployment/sandbox-svc # Wait for rollout echo "" echo "=== Waiting for rollouts ===" kubectl -n gooseek rollout status deployment/api-gateway --timeout=180s || true kubectl -n gooseek rollout status deployment/chat-svc --timeout=120s || true kubectl -n gooseek rollout status deployment/agent-svc --timeout=120s || true # Show status echo "" echo "=== Deployment Status ===" kubectl -n gooseek get pods -o wide echo "" kubectl -n gooseek get svc echo "" kubectl -n gooseek get ingress echo "" echo "=== Done ===" echo "API: https://api.gooseek.ru" echo "Web: https://gooseek.ru"