#!/usr/bin/env bash # Настройка SSL в Kubernetes для gooseek.ru # Запуск из корня репозитория: ./deploy/k3s/ssl/setup-kubernetes.sh # # Вариант A: cert-manager (автоматические сертификаты Let's Encrypt) # Вариант B: ручные сертификаты (certbot на сервере → apply-secret.sh) set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" CERT_MANAGER_VERSION="v1.13.0" usage() { echo "Использование: $0 [cert-manager|manual]" echo "" echo " cert-manager — установить cert-manager и настроить автоматические сертификаты (рекомендуется)" echo " manual — применить ingress с ручным Secret (нужны fullchain.pem, privkey.pem в backup/)" echo "" echo "Без аргумента — cert-manager" } apply_cert_manager() { echo "=== 1. Установка cert-manager ===" kubectl apply -f "https://github.com/cert-manager/cert-manager/releases/download/${CERT_MANAGER_VERSION}/cert-manager.yaml" echo "Ожидание готовности cert-manager (до 2 мин)..." kubectl wait --for=condition=Available deployment/cert-manager -n cert-manager --timeout=120s 2>/dev/null || true kubectl wait --for=condition=Available deployment/cert-manager-webhook -n cert-manager --timeout=120s 2>/dev/null || true kubectl wait --for=condition=Available deployment/cert-manager-cainjector -n cert-manager --timeout=120s 2>/dev/null || true echo "" echo "=== 2. ClusterIssuer Let's Encrypt ===" kubectl apply -f "$SCRIPT_DIR/cert-manager-issuer.yaml" echo "" echo "=== 3. Production Ingress (cert-manager создаст Secret gooseek-tls) ===" kubectl apply -f "$REPO_ROOT/deploy/k3s/ingress-production.yaml" echo "" echo "=== Готово ===" echo "Сертификат будет получен в течение 1–2 минут." echo "Проверка: kubectl get certificate -n gooseek" echo "Проверка: kubectl get secret gooseek-tls -n gooseek" } apply_manual() { if [[ ! -f "$SCRIPT_DIR/backup/fullchain.pem" ]] || [[ ! -f "$SCRIPT_DIR/backup/privkey.pem" ]]; then echo "Ошибка: нужны fullchain.pem и privkey.pem в $SCRIPT_DIR/backup/" echo "См. deploy/k3s/ssl/README.md — получите сертификат через certbot на сервере" exit 1 fi echo "=== 1. Secret gooseek-tls из backup ===" "$SCRIPT_DIR/apply-secret.sh" echo "" echo "=== 2. Production Ingress (ручной Secret) ===" kubectl apply -f "$REPO_ROOT/deploy/k3s/ingress-production-manual.yaml" echo "" echo "=== Готово ===" } # Проверка namespace if ! kubectl get namespace gooseek &>/dev/null; then echo "Создание namespace gooseek..." kubectl apply -f "$REPO_ROOT/deploy/k3s/namespace.yaml" fi # Проверка ingress-nginx if ! kubectl get deployment -n ingress-nginx ingress-nginx-controller &>/dev/null 2>&1; then echo "Внимание: ingress-nginx не найден. Установите:" echo " kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml" echo "" read -p "Продолжить? (y/n) " -n 1 -r echo [[ $REPLY =~ ^[Yy]$ ]] || exit 1 fi MODE="${1:-cert-manager}" case "$MODE" in cert-manager) apply_cert_manager ;; manual) apply_manual ;; -h|--help) usage; exit 0 ;; *) echo "Неизвестный режим: $MODE"; usage; exit 1 ;; esac