#!/usr/bin/env bash # portainer/bootstrap.sh # Deploys Portainer CE into the dashboard namespace. # No credentials needed — Portainer prompts you to create an admin account # on first browser visit. # # Prerequisites: # - kubectl configured (KUBECONFIG pointing to cluster-config/kubeconfig) # - helm >= 3.x set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" KUBECONFIG="${KUBECONFIG:-${REPO_ROOT}/cluster-config/kubeconfig}" export KUBECONFIG # ── Namespace ───────────────────────────────────────────────────────────────── echo "==> Creating dashboard namespace..." kubectl create namespace dashboard --dry-run=client -o yaml | kubectl apply -f - kubectl label namespace dashboard \ pod-security.kubernetes.io/enforce=privileged \ pod-security.kubernetes.io/enforce-version=latest \ --overwrite # ── Helm repo ───────────────────────────────────────────────────────────────── echo "==> Adding Portainer Helm repo..." helm repo add portainer https://portainer.github.io/k8s/ helm repo update portainer # ── Portainer ───────────────────────────────────────────────────────────────── echo "==> Installing Portainer..." helm upgrade --install portainer portainer/portainer \ --namespace dashboard \ --values "${SCRIPT_DIR}/portainer-values.yaml" \ --wait \ --timeout 5m echo "==> Waiting for Portainer Deployment to be ready..." kubectl rollout status deployment/portainer -n dashboard --timeout=120s # ── Done ────────────────────────────────────────────────────────────────────── echo "" echo "==> Portainer is up." echo "" echo "Access Portainer UI:" echo " make pf-portainer" echo " http://localhost:9000" echo "" echo "First-time setup: Portainer will prompt you to create an admin account." echo "Choose 'Manage the local Kubernetes environment' when asked." echo "" echo "Node failure resilience tip:" echo " For faster PVC failover on hard node failure, enable in Longhorn UI → Settings:" echo " nodeDownPodDeletionPolicy = delete-deployment-pod"