diff --git a/ z2/prepare-app.sh b/ z2/prepare-app.sh index bf3a84f..166911c 100644 --- a/ z2/prepare-app.sh +++ b/ z2/prepare-app.sh @@ -1,14 +1,135 @@ #!/bin/bash -docker build -t web-app:latest . + +# Скрипт для подготовки и развертывания приложения 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 is not installed. Please install it before running the script.${NC}" + echo "Instr: https://docs.microsoft.com/en-us/cli/azure/install-azure-cli" + exit 1 +fi + +# Проверяем, авторизован ли пользователь в Azure +echo -e "${YELLOW}Checking authorization in Azure...${NC}" +az account show > /dev/null 2>&1 +if [ $? -ne 0 ]; then + echo -e "${YELLOW}Azure authorization required. Starting the sign-in process..${NC}" + az login + if [ $? -ne 0 ]; then + echo -e "${RED}Azure Authorization Error. Exit.${NC}" + exit 1 + fi +fi + +# Загружаем переменные окружения +if [ -f .env ]; then + echo -e "${GREEN}Loading environment variables from a file${NC}" + export $(grep -v '^#' .env | xargs) +else + echo -e "${RED}File .env not found. Please create one based on .env.example${NC}" + exit 1 +fi + +# Проверяем наличие нужных переменных +if [[ -z "$AZURE_RESOURCE_GROUP" || -z "$AZURE_LOCATION" || -z "$AZURE_STORAGE_ACCOUNT" ]]; then + echo -e "${RED}Not all required environment variables are defined in the .env file.${NC}" + exit 1 +fi + +# Создаем группу ресурсов, если она не существует +echo -e "${YELLOW}Создание группы ресурсов ${AZURE_RESOURCE_GROUP}...${NC}" +az group create --name $AZURE_RESOURCE_GROUP --location $AZURE_LOCATION + +# Создаем реестр контейнеров, если он не существует +echo -e "${YELLOW}Creating a container registry...${NC}" +az acr create --resource-group $AZURE_RESOURCE_GROUP --name $AZURE_CONTAINER_REGISTRY --sku Basic --admin-enabled true + +# Получаем учетные данные реестра +echo -e "${YELLOW}Getting container registry credentials...${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}Creating storage account...${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}Creating a File Resource for 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}Creating a 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}Adding secrets to 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}Preparing files for building Docker image...${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}Authorization in the container registry...${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}Applying deployment template...${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) -# включаем созд контейнеров - -docker-compose build - -# создание сети и томов - - -docker network create app-network -docker volume create db_data +echo -e "${GREEN}Развертывание завершено успешно!${NC}" +echo -e "${GREEN}Приложение доступно по адресу: http://${CONTAINER_IP}:3000${NC}" +echo -e "${YELLOW}Примечание: для настройки HTTPS необходимо настроить доменное имя и SSL-сертификат${NC}"