/var/www/html/back/deploy.sh
#!/bin/bash

# Завершение при первой же ошибке
set -euo pipefail

# Коды выхода
MINIKUBE_ERROR=2
DOCKER_COMPOSE_ERROR=3
KUBERNETES_ERROR=4

# Определяем Namespace
NAMESPACE="gitep"

# Логирование
log() {
  echo "$(date +'%Y-%m-%d %H:%M:%S') - $1"
}

# Проверка статуса команды
check_status() {
  local status=$1
  local message=$2
  local exit_code=$3

  if [ "$status" -ne 0 ]; then
    log "Ошибка: $message"
    exit "$exit_code"
  fi
}

IMAGE_NAME="$NAMESPACE-app:latest"
COMPOSE_FILE="docker-compose.yml"

# Trap для обработки завершения скрипта
trap cleanup EXIT

cleanup() {
  log "Выполнение очистки..."
  unset DOCKER_TLS_VERIFY DOCKER_HOST DOCKER_CERT_PATH DOCKER_API_VERSION
  log "Очистка завершена."
}

if minikube status >/dev/null 2>&1; then
  log "Остановка Minikube..."
  minikube stop
  check_status $? "Не удалось остановить Minikube." $MINIKUBE_ERROR

  log "Удаление Minikube..."
  minikube delete
  check_status $? "Не удалось удалить Minikube." $MINIKUBE_ERROR
fi

log "Запуск Minikube..."
minikube start --driver=docker --docker-opt="bip=172.17.0.1/24"
check_status $? "Не удалось запустить Minikube." $MINIKUBE_ERROR

log "Подключение к окружению Docker Minikube..."
eval $(minikube docker-env)

log "Включение metrics-server..."
minikube addons enable metrics-server
check_status $? "Не удалось включить metrics-server." $MINIKUBE_ERROR

log "Сборка и запуск контейнеров..."
docker compose -f "$COMPOSE_FILE" up --build -d --remove-orphans
check_status $? "Не удалось запустить контейнеры с помощью Docker Compose." $DOCKER_COMPOSE_ERROR

if docker images -q $IMAGE_NAME >/dev/null 2>&1; then
  log "Образ $IMAGE_NAME уже существует."
else
  log "Сборка Docker-образа..."
  docker build -t "$IMAGE_NAME" .
  check_status $? "Не удалось собрать Docker-образ." $DOCKER_COMPOSE_ERROR
fi

log "Загрузка Docker-образа в Minikube..."
minikube image load "$IMAGE_NAME"
check_status $? "Не удалось загрузить Docker-образ в Minikube." $MINIKUBE_ERROR

log "Получение UID и GID пользователя www-data..."
APP_UID=$(docker compose exec app id -u www-data)
APP_GID=$(docker compose exec app id -g www-data)

if [ -z "$APP_UID" ] || [ -z "$APP_GID" ]; then
  log "Не удалось получить UID или GID."
  docker compose logs app
  exit 1
fi

log "UID: $APP_UID, GID: $APP_GID"

log "Остановка контейнеров перед изменением прав..."
docker compose -f "$COMPOSE_FILE" down
check_status $? "Не удалось остановить контейнеры с помощью Docker Compose." $DOCKER_COMPOSE_ERROR

# Небольшая пауза для завершения остановки
sleep 3

log "Изменение прав на директорию/файлы..."
sudo chown -R "$APP_UID":"$APP_GID" .
check_status $? "Не удалось изменить права на директорию/файлы." $DOCKER_COMPOSE_ERROR

log "Повторный запуск контейнеров..."
docker compose -f "$COMPOSE_FILE" up -d
check_status $? "Не удалось перезапустить контейнеры с помощью Docker Compose." $DOCKER_COMPOSE_ERROR

log "Проверка наличия Namespace Kubernetes..."
if kubectl get namespace "$NAMESPACE" >/dev/null 2>&1; then
  log "Namespace Kubernetes '$NAMESPACE' уже существует."
else
  log "Namespace Kubernetes '$NAMESPACE' не существует. Создание..."
  kubectl create namespace "$NAMESPACE"
  check_status $? "Не удалось создать Namespace Kubernetes." $KUBERNETES_ERROR
fi

log "Применение манифестов Kubernetes..."
kubectl apply -f k8s/ --namespace="$NAMESPACE"
check_status $? "Не удалось применить манифесты Kubernetes." $KUBERNETES_ERROR

log "Ожидание запуска Pod'ов..."
kubectl wait --namespace="$NAMESPACE" --for=condition=ready pod --all --timeout=60s
check_status $? "Не удалось дождаться запуска всех Pod'ов." $KUBERNETES_ERROR

log "Проверка статуса Pod'ов..."
kubectl get pods --namespace="$NAMESPACE"

log "Перезапуск Deployment..."
kubectl rollout restart deployment/app -n "$NAMESPACE"
check_status $? "Не удалось перезапустить Deployment." $KUBERNETES_ERROR

log "Получение URL сервиса..."
MINIKUBE_URL=$(minikube service nginx -n "$NAMESPACE" --url | head -n 1)
check_status $? "Не удалось получить URL сервиса." $MINIKUBE_ERROR

log "Операция успешно завершена!"

echo -e "\nURL сервиса: $MINIKUBE_URL\n"