diff --git a/sk1/.env b/sk1/.env new file mode 100644 index 0000000..c7ef9b8 --- /dev/null +++ b/sk1/.env @@ -0,0 +1,27 @@ + +NODE_ENV=production +PORT=3000 + + +MONGODB_ROOT_USERNAME=brabus_admin +MONGODB_ROOT_PASSWORD=ZKT_KASABUTSKI_77557755 +MONGODB_URI=mongodb://brabus_admin:ZKT_KASABUTSKI_77557755@mongodb:27017/brabus?authSource=admin + + +JWT_SECRET=zkt_super_secret_key_what_be_very_long_and_secure + + +AZURE_RESOURCE_GROUP=car-salon-rg +AZURE_LOCATION=westeurope +AZURE_APP_NAME=car-salon-zkt-kasabutski +AZURE_CONTAINER_REGISTRY=carsalonacr123 +AZURE_SQL_SERVER=car-salon-server +AZURE_SQL_DB=carsalondb +AZURE_SQL_USER=kasabutskiadmin +AZURE_SQL_PASSWORD=ZKT_KASABUTSKI_77557755 +AZURE_STORAGE_ACCOUNT=carsalonstorage + + +# AZURE_STORAGE_CONNECTION_STRING= +# AZURE_KEY_VAULT_URI= + diff --git a/sk1/Dockerfile b/sk1/Dockerfile new file mode 100644 index 0000000..06bcd3b --- /dev/null +++ b/sk1/Dockerfile @@ -0,0 +1,20 @@ +# Базовый образ Node.js +FROM node:18-alpine + +# Рабочая директория в контейнере +WORKDIR /usr/src/app + +# Копирование package.json и package-lock.json +COPY package*.json ./ + +# Установка зависимостей +RUN npm install + +# Копирование исходного кода +COPY . . + +# Открываем порт, который будет использовать приложение +EXPOSE 3000 + +# Команда для запуска приложения +CMD ["node", "server.js"] diff --git a/sk1/README.md.md b/sk1/README.md.md new file mode 100644 index 0000000..78a0539 --- /dev/null +++ b/sk1/README.md.md @@ -0,0 +1,135 @@ +# Веб-приложение Brabus Premium Automotive + +## Описание приложения + +Данное веб-приложение представляет собой официальный сайт автосалона Brabus Premium Automotive, специализирующегося на продаже премиальных автомобилей. Сайт включает следующие функции: + +- Красивый и современный пользовательский интерфейс в стиле Apple +- Карусель для демонстрации моделей автомобилей +- Система аутентификации пользователей (регистрация/вход) +- Корзина покупок +- Адаптивный дизайн для мобильных устройств + +## Использованные технологии + +### Облачные сервисы Azure + +1. **Azure Container Instances (ACI)** - для размещения контейнеров приложения +2. **Azure Container Registry (ACR)** - для хранения Docker-образов +3. **Azure Storage Account** - для хранения постоянных данных MongoDB +4. **Azure Key Vault** - для управления секретами приложения + +### Контейнеры Docker + +- **Контейнер приложения** - Node.js сервер, обслуживающий фронтенд и API +- **Контейнер MongoDB** - база данных для хранения информации о пользователях и заказах + +### Сохранение данных + +- **Постоянное хранилище** - Azure File Share для данных MongoDB +- **Секреты** - хранятся в Azure Key Vault + +## Описание файлов + +### Основные файлы + +- `Dockerfile` - описывает сборку контейнера Node.js +- `docker-compose.yml` - конфигурация для локального развертывания приложения +- `azure_deployment.yml` - шаблон для развертывания в Azure Container Instances +- `package.json` - описание зависимостей Node.js приложения +- `.env` - файл с переменными окружения (не включен в репозиторий для безопасности) +- `.env.example` - пример файла переменных окружения + +### Скрипты + +- `prepare-app.sh` - скрипт для автоматического развертывания приложения в Azure +- `remove-app.sh` - скрипт для удаления приложения из Azure + +### Исходный код + +- `src/server.js` - основной файл серверного приложения на Node.js +- `src/public/` - папка с статическими файлами (HTML, CSS, JS) +- `src/public/index.html` - главная страница +- `src/public/login.html` - страница входа +- `src/public/cart.html` - страница корзины +- `src/public/styles.css` - стили приложения +- `src/public/script.js` - клиентский JavaScript + +## Инструкция по использованию + +### Подготовка к развертыванию + +1. Сначала убедитесь, что у вас установлены необходимые инструменты: + - Docker + - Azure CLI + - bash (для Linux/Mac) или Git Bash (для Windows) + +2. Создайте файл `.env` на основе `.env.example` и заполните его своими значениями: + ``` + # Azure настройки + AZURE_RESOURCE_GROUP=brabus-resources + AZURE_LOCATION=westeurope + AZURE_CONTAINER_REGISTRY=brabusregistry + AZURE_STORAGE_ACCOUNT=brabusstorage + AZURE_KEY_VAULT_NAME=brabusvault + + # MongoDB настройки + MONGODB_ROOT_USERNAME=brabus_admin + MONGODB_ROOT_PASSWORD=your_secure_password + + # Другие настройки приложения + NODE_ENV=production + PORT=3000 + ``` + +### Развертывание + +1. Сделайте скрипты исполняемыми: + ```bash + chmod +x prepare-app.sh remove-app.sh + ``` + +2. Запустите скрипт развертывания: + ```bash + ./prepare-app.sh + ``` + +3. После завершения развертывания вы увидите IP-адрес вашего приложения. + +### Просмотр приложения + +1. Откройте веб-браузер и перейдите по адресу, полученному после развертывания: + ``` + http://:3000 + ``` + +2. Для регистрации перейдите по ссылке "Login" в верхнем меню и создайте учетную запись. + +### Удаление приложения + +1. Чтобы удалить приложение и все связанные с ним ресурсы, выполните: + ```bash + ./remove-app.sh + ``` + +2. Следуйте инструкциям скрипта для выборочного или полного удаления ресурсов. + +## Условия запуска скриптов + +Скрипты `prepare-app.sh` и `remove-app.sh` требуют следующего: + +1. Наличие установленного [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) +2. Активная подписка Azure (скрипты запросят авторизацию, если вы не вошли в систему) +3. Правильно настроенный файл `.env` (или ввод параметров вручную для скрипта удаления) +4. Для скрипта `prepare-app.sh` также требуется установленный Docker + +## Внешние источники и использование генеративных моделей + +При создании этого проекта были использованы следующие внешние источники: + +1. Официальная документация Azure: [https://docs.microsoft.com/en-us/azure/](https://docs.microsoft.com/en-us/azure/) +2. Документация Docker: [https://docs.docker.com/](https://docs.docker.com/) +3. Руководство по Node.js и Express: [https://expressjs.com/](https://expressjs.com/) +4. Шаблоны дизайна с [Dribbble](https://dribbble.com/) и [Behance](https://www.behance.net/) + +Для помощи в написании документации и создании скриптов была использована генеративная модель Claude 3.7 Sonnet от Anthropic. diff --git a/sk1/azure_deployment.yml b/sk1/azure_deployment.yml new file mode 100644 index 0000000..6a247f3 --- /dev/null +++ b/sk1/azure_deployment.yml @@ -0,0 +1,54 @@ +apiVersion: '2019-12-01' +location: westus +name: brabus-container-group +properties: + containers: + - name: brabus-app + properties: + image: ${AZURE_CONTAINER_REGISTRY_URL}/brabus-app:latest + resources: + requests: + cpu: 1.0 + memoryInGB: 1.5 + ports: + - port: 3000 + environmentVariables: + - name: PORT + value: '3000' + - name: MONGODB_URI + secureValue: ${MONGODB_URI} + - name: JWT_SECRET + secureValue: ${JWT_SECRET} + - name: NODE_ENV + value: 'production' + - name: mongodb + properties: + image: mongo:latest + resources: + requests: + cpu: 1.0 + memoryInGB: 1.5 + ports: + - port: 27017 + environmentVariables: + - name: MONGO_INITDB_ROOT_USERNAME + secureValue: ${MONGODB_ROOT_USERNAME} + - name: MONGO_INITDB_ROOT_PASSWORD + secureValue: ${MONGODB_ROOT_PASSWORD} + volumeMounts: + - name: mongodb-data + mountPath: /data/db + osType: Linux + ipAddress: + type: Public + ports: + - protocol: TCP + port: 3000 + volumes: + - name: mongodb-data + azureFile: + shareName: mongodb-data + storageAccountName: ${STORAGE_ACCOUNT_NAME} + storageAccountKey: ${STORAGE_ACCOUNT_KEY} +tags: {} +type: Microsoft.ContainerInstance/containerGroups diff --git a/sk1/azure_deployment_filled.yml b/sk1/azure_deployment_filled.yml new file mode 100644 index 0000000..9cff0a6 --- /dev/null +++ b/sk1/azure_deployment_filled.yml @@ -0,0 +1,54 @@ +apiVersion: '2019-12-01' +location: westus +name: brabus-container-group +properties: + containers: + - name: brabus-app + properties: + image: carsalonacr123.azurecr.io/brabus-app:latest + resources: + requests: + cpu: 1.0 + memoryInGB: 1.5 + ports: + - port: 3000 + environmentVariables: + - name: PORT + value: '3000' + - name: MONGODB_URI + secureValue: mongodb://brabus_admin:ZKT_KASABUTSKI_77557755@mongodb:27017/brabus?authSource=admin + - name: JWT_SECRET + secureValue: 6954f97ecc686eab533c9694d4d2595120d48eb27b0ad07a7b176e0a048ecdd4 + - name: NODE_ENV + value: 'production' + - name: mongodb + properties: + image: mongo:latest + resources: + requests: + cpu: 1.0 + memoryInGB: 1.5 + ports: + - port: 27017 + environmentVariables: + - name: MONGO_INITDB_ROOT_USERNAME + secureValue: brabus_admin + - name: MONGO_INITDB_ROOT_PASSWORD + secureValue: ZKT_KASABUTSKI_77557755 + volumeMounts: + - name: mongodb-data + mountPath: /data/db + osType: Linux + ipAddress: + type: Public + ports: + - protocol: TCP + port: 3000 + volumes: + - name: mongodb-data + azureFile: + shareName: mongodb-data + storageAccountName: carsalonstorage + storageAccountKey: +tags: {} +type: Microsoft.ContainerInstance/containerGroups diff --git a/sk1/docker-compose.yml b/sk1/docker-compose.yml new file mode 100644 index 0000000..d98ebf5 --- /dev/null +++ b/sk1/docker-compose.yml @@ -0,0 +1,44 @@ +version: '3.8' + +services: + # MongoDB сервис + mongodb: + image: mongo:latest + container_name: brabus-mongodb + restart: always + ports: + - "27017:27017" + volumes: + - mongodb_data:/data/db + environment: + MONGO_INITDB_ROOT_USERNAME: ${MONGODB_ROOT_USERNAME} + MONGO_INITDB_ROOT_PASSWORD: ${MONGODB_ROOT_PASSWORD} + networks: + - brabus-network + + # Node.js приложение + app: + build: . + container_name: brabus-app + restart: always + ports: + - "${PORT:-3000}:3000" + depends_on: + - mongodb + environment: + - PORT=${PORT:-3000} + - MONGODB_URI=mongodb://${MONGODB_ROOT_USERNAME}:${MONGODB_ROOT_PASSWORD}@mongodb:27017/brabus?authSource=admin + - JWT_SECRET=${JWT_SECRET} + - NODE_ENV=${NODE_ENV:-production} + volumes: + - ./:/usr/src/app + - /usr/src/app/node_modules + networks: + - brabus-network + +networks: + brabus-network: + driver: bridge + +volumes: + mongodb_data: diff --git a/sk1/env-example.sh b/sk1/env-example.sh new file mode 100644 index 0000000..f5b35ee --- /dev/null +++ b/sk1/env-example.sh @@ -0,0 +1,23 @@ +# Базовые настройки +NODE_ENV=production +PORT=3000 + +# MongoDB настройки +MONGODB_ROOT_USERNAME=brabus_admin +MONGODB_ROOT_PASSWORD=your_secure_password_here +MONGODB_URI=mongodb://brabus_admin:your_secure_password_here@mongodb:27017/brabus?authSource=admin + +# JWT секрет +JWT_SECRET=your_jwt_secret_key_should_be_very_long_and_secure + +# Настройки Azure +# Обязательные для скриптов развертывания +AZURE_RESOURCE_GROUP=brabus-resources +AZURE_LOCATION=westeurope +AZURE_CONTAINER_REGISTRY=brabusregistry +AZURE_STORAGE_ACCOUNT=brabusstorage +AZURE_KEY_VAULT_NAME=brabusvault + +# Опциональные настройки Azure +AZURE_STORAGE_CONNECTION_STRING=your_azure_storage_connection_string +AZURE_KEY_VAULT_URI=your_azure_key_vault_uri diff --git a/sk1/package.json b/sk1/package.json new file mode 100644 index 0000000..7a635d4 --- /dev/null +++ b/sk1/package.json @@ -0,0 +1,34 @@ +{ + "name": "brabus-website", + "version": "1.0.0", + "description": "Brabus car dealership website with authentication", + "main": "server.js", + "scripts": { + "start": "node server.js", + "dev": "nodemon server.js" + }, + "keywords": [ + "brabus", + "cars", + "dealership", + "authentication", + "azure" + ], + "author": "", + "license": "ISC", + "dependencies": { + "@azure/identity": "^3.1.3", + "@azure/keyvault-secrets": "^4.6.0", + "@azure/storage-blob": "^12.13.0", + "bcryptjs": "^2.4.3", + "body-parser": "^1.20.2", + "cors": "^2.8.5", + "dotenv": "^16.0.3", + "express": "^4.18.2", + "jsonwebtoken": "^9.0.0", + "mongoose": "^7.0.3" + }, + "devDependencies": { + "nodemon": "^2.0.22" + } +} diff --git a/sk1/prepare-app.sh b/sk1/prepare-app.sh new file mode 100644 index 0000000..72279e7 --- /dev/null +++ b/sk1/prepare-app.sh @@ -0,0 +1,131 @@ +#!/bin/bash + +# Скрипт для подготовки и развертывания приложения Brabus в Azure Cloud + +# Цвета для вывода +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' # No Color + +# Проверяем, установлен ли Azure CLI +if ! command -v az &> /dev/null; then + echo -e "${RED}Azure CLI не установлен. Пожалуйста, установите его перед запуском скрипта.${NC}" + echo "Инструкции: https://docs.microsoft.com/en-us/cli/azure/install-azure-cli" + exit 1 +fi + +# Проверяем, авторизован ли пользователь в Azure +echo -e "${YELLOW}Проверка авторизации в Azure...${NC}" +az account show > /dev/null 2>&1 +if [ $? -ne 0 ]; then + echo -e "${YELLOW}Требуется авторизация в Azure. Запуск процесса входа...${NC}" + az login + if [ $? -ne 0 ]; then + echo -e "${RED}Ошибка авторизации в Azure. Выход.${NC}" + exit 1 + fi +fi + +# Загружаем переменные окружения +if [ -f .env ]; then + echo -e "${GREEN}Загрузка переменных окружения из файла .env${NC}" + export $(grep -v '^#' .env | xargs) +else + echo -e "${RED}Файл .env не найден. Пожалуйста, создайте его на основе .env.example${NC}" + exit 1 +fi + +# Проверяем наличие нужных переменных +if [[ -z "$AZURE_RESOURCE_GROUP" || -z "$AZURE_LOCATION" || -z "$AZURE_STORAGE_ACCOUNT" ]]; then + echo -e "${RED}Не все обязательные переменные окружения заданы в файле .env${NC}" + exit 1 +fi + +# Создаем группу ресурсов, если она не существует +echo -e "${YELLOW}Создание группы ресурсов ${AZURE_RESOURCE_GROUP}...${NC}" +az group create --name $AZURE_RESOURCE_GROUP --location $AZURE_LOCATION + +# Создаем реестр контейнеров, если он не существует +echo -e "${YELLOW}Создание реестра контейнеров...${NC}" +az acr create --resource-group $AZURE_RESOURCE_GROUP --name $AZURE_CONTAINER_REGISTRY --sku Basic --admin-enabled true + +# Получаем учетные данные реестра +echo -e "${YELLOW}Получение учетных данных реестра контейнеров...${NC}" +REGISTRY_USERNAME=$(az acr credential show --name $AZURE_CONTAINER_REGISTRY --query "username" -o tsv) +REGISTRY_PASSWORD=$(az acr credential show --name $AZURE_CONTAINER_REGISTRY --query "passwords[0].value" -o tsv) +REGISTRY_URL=$(az acr show --name $AZURE_CONTAINER_REGISTRY --query "loginServer" -o tsv) + +# Создаем учетную запись хранения, если она не существует +echo -e "${YELLOW}Создание учетной записи хранения...${NC}" +az storage account create \ + --name $AZURE_STORAGE_ACCOUNT \ + --resource-group $AZURE_RESOURCE_GROUP \ + --location $AZURE_LOCATION \ + --sku Standard_LRS + +# Получаем ключ учетной записи хранения +STORAGE_ACCOUNT_KEY=$(az storage account keys list --resource-group $AZURE_RESOURCE_GROUP --account-name $AZURE_STORAGE_ACCOUNT --query "[0].value" -o tsv) + +# Создаем файловый ресурс для MongoDB +echo -e "${YELLOW}Создание файлового ресурса для MongoDB...${NC}" +az storage share create \ + --name mongodb-data \ + --account-name $AZURE_STORAGE_ACCOUNT \ + --account-key $STORAGE_ACCOUNT_KEY + +# Создаем ключ хранилища для Azure Key Vault +echo -e "${YELLOW}Создание Key Vault...${NC}" +az keyvault create \ + --name $AZURE_KEY_VAULT_NAME \ + --resource-group $AZURE_RESOURCE_GROUP \ + --location $AZURE_LOCATION + +# Генерируем секретный ключ JWT +JWT_SECRET=$(openssl rand -hex 32) + +# Добавляем секреты в Key Vault +echo -e "${YELLOW}Добавление секретов в Key Vault...${NC}" +az keyvault secret set --vault-name $AZURE_KEY_VAULT_NAME --name "MONGODB-ROOT-USERNAME" --value $MONGODB_ROOT_USERNAME +az keyvault secret set --vault-name $AZURE_KEY_VAULT_NAME --name "MONGODB-ROOT-PASSWORD" --value $MONGODB_ROOT_PASSWORD +az keyvault secret set --vault-name $AZURE_KEY_VAULT_NAME --name "JWT-SECRET" --value $JWT_SECRET + +# Создаем директорию и копируем туда файлы для сборки Docker-образа +echo -e "${YELLOW}Подготовка файлов для сборки Docker-образа...${NC}" +mkdir -p build +cp -r src/* build/ +cp Dockerfile build/ +cp package.json build/ + +# Авторизуемся в реестре контейнеров +echo -e "${YELLOW}Авторизация в реестре контейнеров...${NC}" +az acr login --name $AZURE_CONTAINER_REGISTRY + +# Сборка и публикация Docker-образа +echo -e "${YELLOW}Сборка и публикация Docker-образа...${NC}" +cd build +docker build -t ${REGISTRY_URL}/brabus-app:latest . +docker push ${REGISTRY_URL}/brabus-app:latest +cd .. + +# Создаем переменные для развертывания +export AZURE_CONTAINER_REGISTRY_URL=$REGISTRY_URL +export MONGODB_URI="mongodb://${MONGODB_ROOT_USERNAME}:${MONGODB_ROOT_PASSWORD}@mongodb:27017/brabus?authSource=admin" +export STORAGE_ACCOUNT_NAME=$AZURE_STORAGE_ACCOUNT +export STORAGE_ACCOUNT_KEY=$STORAGE_ACCOUNT_KEY + +# Применяем шаблон развертывания +echo -e "${YELLOW}Применение шаблона развертывания...${NC}" +envsubst < azure_deployment.yml > azure_deployment_filled.yml +az container create --resource-group $AZURE_RESOURCE_GROUP --file azure_deployment_filled.yml + +# Получаем публичный IP-адрес контейнера +CONTAINER_IP=$(az container show --resource-group $AZURE_RESOURCE_GROUP --name brabus-container-group --query "ipAddress.ip" -o tsv) + +# Настройка HTTPS с Let's Encrypt +# Примечание: этот шаг требует дополнительной настройки DNS и доменного имени +# Здесь приведен упрощенный пример + +echo -e "${GREEN}Развертывание завершено успешно!${NC}" +echo -e "${GREEN}Приложение доступно по адресу: http://${CONTAINER_IP}:3000${NC}" +echo -e "${YELLOW}Примечание: для настройки HTTPS необходимо настроить доменное имя и SSL-сертификат${NC}" diff --git a/sk1/remove-app.sh b/sk1/remove-app.sh new file mode 100644 index 0000000..ed62b36 --- /dev/null +++ b/sk1/remove-app.sh @@ -0,0 +1,122 @@ +#!/bin/bash + +# Скрипт для удаления приложения Brabus из Azure Cloud + +# Цвета для вывода +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' # No Color + +# Проверяем, установлен ли Azure CLI +if ! command -v az &> /dev/null; then + echo -e "${RED}Azure CLI не установлен. Пожалуйста, установите его перед запуском скрипта.${NC}" + echo "Инструкции: https://docs.microsoft.com/en-us/cli/azure/install-azure-cli" + exit 1 +fi + +# Проверяем, авторизован ли пользователь в Azure +echo -e "${YELLOW}Проверка авторизации в Azure...${NC}" +az account show > /dev/null 2>&1 +if [ $? -ne 0 ]; then + echo -e "${YELLOW}Требуется авторизация в Azure. Запуск процесса входа...${NC}" + az login + if [ $? -ne 0 ]; then + echo -e "${RED}Ошибка авторизации в Azure. Выход.${NC}" + exit 1 + fi +fi + +# Загружаем переменные окружения +if [ -f .env ]; then + echo -e "${GREEN}Загрузка переменных окружения из файла .env${NC}" + export $(grep -v '^#' .env | xargs) +else + echo -e "${RED}Файл .env не найден. Пожалуйста, укажите переменные окружения вручную${NC}" + + # Запрашиваем нужные переменные + read -p "Введите имя группы ресурсов: " AZURE_RESOURCE_GROUP + if [ -z "$AZURE_RESOURCE_GROUP" ]; then + echo -e "${RED}Имя группы ресурсов обязательно. Выход.${NC}" + exit 1 + fi + + read -p "Введите имя реестра контейнеров (или нажмите Enter, если не нужно удалять): " AZURE_CONTAINER_REGISTRY + read -p "Введите имя учетной записи хранения (или нажмите Enter, если не нужно удалять): " AZURE_STORAGE_ACCOUNT + read -p "Введите имя Key Vault (или нажмите Enter, если не нужно удалять): " AZURE_KEY_VAULT_NAME +fi + +# Запрашиваем подтверждение перед удалением +echo -e "${RED}ВНИМАНИЕ: Вы собираетесь удалить следующие ресурсы:${NC}" +echo -e "${RED} - Группа контейнеров: brabus-container-group в группе ресурсов ${AZURE_RESOURCE_GROUP}${NC}" + +if [ ! -z "$AZURE_CONTAINER_REGISTRY" ]; then + echo -e "${RED} - Реестр контейнеров: ${AZURE_CONTAINER_REGISTRY}${NC}" +fi + +if [ ! -z "$AZURE_STORAGE_ACCOUNT" ]; then + echo -e "${RED} - Учетная запись хранения: ${AZURE_STORAGE_ACCOUNT}${NC}" +fi + +if [ ! -z "$AZURE_KEY_VAULT_NAME" ]; then + echo -e "${RED} - Key Vault: ${AZURE_KEY_VAULT_NAME}${NC}" +fi + +read -p "Вы уверены, что хотите продолжить? (y/n): " -n 1 -r +echo +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo -e "${YELLOW}Операция отменена пользователем.${NC}" + exit 0 +fi + +# Удаляем группу контейнеров +echo -e "${YELLOW}Удаление группы контейнеров...${NC}" +az container delete \ + --resource-group $AZURE_RESOURCE_GROUP \ + --name brabus-container-group \ + --yes + +# Удаляем реестр контейнеров, если указан +if [ ! -z "$AZURE_CONTAINER_REGISTRY" ]; then + echo -e "${YELLOW}Удаление реестра контейнеров ${AZURE_CONTAINER_REGISTRY}...${NC}" + az acr delete \ + --resource-group $AZURE_RESOURCE_GROUP \ + --name $AZURE_CONTAINER_REGISTRY \ + --yes +fi + +# Удаляем учетную запись хранения, если указана +if [ ! -z "$AZURE_STORAGE_ACCOUNT" ]; then + echo -e "${YELLOW}Удаление учетной записи хранения ${AZURE_STORAGE_ACCOUNT}...${NC}" + az storage account delete \ + --resource-group $AZURE_RESOURCE_GROUP \ + --name $AZURE_STORAGE_ACCOUNT \ + --yes +fi + +# Удаляем Key Vault, если указан +if [ ! -z "$AZURE_KEY_VAULT_NAME" ]; then + echo -e "${YELLOW}Удаление Key Vault ${AZURE_KEY_VAULT_NAME}...${NC}" + + # Сначала нужно изменить политику удаления, чтобы обойти защиту от удаления + az keyvault update \ + --name $AZURE_KEY_VAULT_NAME \ + --resource-group $AZURE_RESOURCE_GROUP \ + --enable-purge-protection false \ + --enable-soft-delete false + + # Теперь можно удалить Key Vault + az keyvault delete \ + --name $AZURE_KEY_VAULT_NAME \ + --resource-group $AZURE_RESOURCE_GROUP +fi + +# Запрашиваем, нужно ли удалить всю группу ресурсов +read -p "Хотите полностью удалить группу ресурсов ${AZURE_RESOURCE_GROUP}? (y/n): " -n 1 -r +echo +if [[ $REPLY =~ ^[Yy]$ ]]; then + echo -e "${YELLOW}Удаление группы ресурсов ${AZURE_RESOURCE_GROUP}...${NC}" + az group delete --name $AZURE_RESOURCE_GROUP --yes +fi + +echo -e "${GREEN}Удаление ресурсов завершено!${NC}" diff --git a/sk1/requirements.txt b/sk1/requirements.txt new file mode 100644 index 0000000..4e6e67d --- /dev/null +++ b/sk1/requirements.txt @@ -0,0 +1,2 @@ +Flask==2.0.2 +Flask-SQLAlchemy==2.5.1