/
var
/
www
/
html
/
back
/
up file
home
#!/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"