#!/bin/bash set -e # Параметры APP_NAME="userapp" RESOURCE_GROUP="userapp-rg" ENV_NAME="userapp-env" ACR_NAME="userappvladregistry" ACR_IMAGE="$ACR_NAME.azurecr.io/z1-web" POSTGRES_NAME="userapp-pg-vlad4" POSTGRES_HOST="$POSTGRES_NAME.postgres.database.azure.com" POSTGRES_DB="flexibleserverdb" POSTGRES_USER="postgres" POSTGRES_PASS="MySuperSecretPass123" LOCATION="northeurope" # 🏗️ Создание resource group (если не существует) echo "📁 Проверка: существует ли Resource Group $RESOURCE_GROUP..." RG_EXISTS=$(az group exists --name $RESOURCE_GROUP) if [[ "$RG_EXISTS" == "false" ]]; then echo "🌟 Создаю Resource Group $RESOURCE_GROUP..." az group create --name $RESOURCE_GROUP --location $LOCATION else echo "✔️ Resource Group уже существует" fi # 🔧 Проверка и создание ACR ACR_EXISTS=$(az acr show --name $ACR_NAME --resource-group $RESOURCE_GROUP --query "name" -o tsv 2>/dev/null || echo "") if [[ -z "$ACR_EXISTS" ]]; then echo "🌟 Создаю Azure Container Registry..." az acr create --resource-group $RESOURCE_GROUP --name $ACR_NAME --sku Basic else echo "✔️ ACR уже существует" fi # Включаем admin user az acr update --name $ACR_NAME --admin-enabled true # Ждем, пока ACR станет доступным echo "⏳ Ждем пока ACR станет доступным..." for i in {1..10}; do if az acr repository list --name $ACR_NAME &>/dev/null; then echo "✅ ACR готов" break else echo "⏳ Ожидание... ($i/10)" sleep 5 fi done # Получаем учетные данные ACR_USERNAME=$(az acr credential show --name $ACR_NAME --query "username" -o tsv) ACR_PASSWORD=$(az acr credential show --name $ACR_NAME --query "passwords[0].value" -o tsv) echo "🧠 Проверка: существует ли PostgreSQL сервер..." PG_EXISTS=$(az postgres flexible-server show \ --name $POSTGRES_NAME \ --resource-group $RESOURCE_GROUP \ --query "name" -o tsv 2>/dev/null || echo "") if [[ -n "$PG_EXISTS" ]]; then echo "🔐 Пробуем подключиться к PostgreSQL..." if ! psql "host=$POSTGRES_HOST port=5432 dbname=postgres user=$POSTGRES_USER password=$POSTGRES_PASS sslmode=require" -c '\q' 2>/dev/null; then echo "❌ Пароль не работает — удаляю и создаю заново..." az postgres flexible-server delete --name $POSTGRES_NAME --resource-group $RESOURCE_GROUP --yes PG_EXISTS="" sleep 5 else echo "✅ Успешное подключение" fi fi if [[ -z "$PG_EXISTS" ]]; then echo "🌟 Создаю PostgreSQL..." az postgres flexible-server create \ --name $POSTGRES_NAME \ --resource-group $RESOURCE_GROUP \ --location $LOCATION \ --admin-user postgres \ --admin-password $POSTGRES_PASS \ --sku-name Standard_B1ms \ --tier Burstable \ --storage-size 32 \ --yes echo "⏳ Ожидание готовности PostgreSQL..." for i in {1..10}; do STATE=$(az postgres flexible-server show --name $POSTGRES_NAME --resource-group $RESOURCE_GROUP --query "state" -o tsv 2>/dev/null || echo "") echo "🔄 Состояние: $STATE" if [[ "$STATE" == "Ready" ]]; then break fi sleep 10 done echo "🌐 Разрешаю IP..." az postgres flexible-server firewall-rule create \ --name $POSTGRES_NAME \ --resource-group $RESOURCE_GROUP \ --rule-name AllowAllIps \ --start-ip-address 0.0.0.0 \ --end-ip-address 255.255.255.255 fi echo "🔑 Сбрасываю пароль PostgreSQL..." az postgres flexible-server update --name $POSTGRES_NAME --resource-group $RESOURCE_GROUP --admin-password $POSTGRES_PASS echo "⏳ Ждем 10 сек..." sleep 10 echo "📆 Логин в ACR..." echo $ACR_PASSWORD | docker login "$ACR_NAME.azurecr.io" -u $ACR_USERNAME --password-stdin echo "▶️ Сборка Docker образа..." docker build -t z1-web . echo "📦 Тегирование и пуш..." docker tag z1-web $ACR_IMAGE docker push $ACR_IMAGE echo "☁️ Проверка Container App Environment..." ENV_EXISTS=$(az containerapp env show --name $ENV_NAME --resource-group $RESOURCE_GROUP --query "name" -o tsv 2>/dev/null || echo "") if [[ -z "$ENV_EXISTS" ]]; then echo "🌟 Создаю Container Environment..." az containerapp env create --name $ENV_NAME --resource-group $RESOURCE_GROUP --location $LOCATION else echo "✔️ Среда уже есть" fi echo "☁️ Проверка Container App..." APP_EXISTS=$(az containerapp show --name $APP_NAME --resource-group $RESOURCE_GROUP --query "name" -o tsv 2>/dev/null || echo "") if [[ -z "$APP_EXISTS" ]]; then echo "🌟 Создаю Container App..." az containerapp create \ --name $APP_NAME \ --resource-group $RESOURCE_GROUP \ --environment $ENV_NAME \ --image $ACR_IMAGE \ --target-port 5000 \ --ingress external \ --registry-server "$ACR_NAME.azurecr.io" \ --registry-username $ACR_USERNAME \ --registry-password $ACR_PASSWORD \ --cpu 0.5 --memory 1.0Gi \ --env-vars \ DB_HOST=$POSTGRES_HOST \ DB_NAME=$POSTGRES_DB \ DB_USER=$POSTGRES_USER \ DB_PASS=$POSTGRES_PASS else echo "🔁 Обновляю Container App..." az containerapp registry set \ --name $APP_NAME \ --resource-group $RESOURCE_GROUP \ --server "$ACR_NAME.azurecr.io" \ --username $ACR_USERNAME \ --password $ACR_PASSWORD az containerapp update \ --name $APP_NAME \ --resource-group $RESOURCE_GROUP \ --image $ACR_IMAGE \ --set-env-vars \ DB_HOST=$POSTGRES_HOST \ DB_NAME=$POSTGRES_DB \ DB_USER=$POSTGRES_USER \ DB_PASS=$POSTGRES_PASS fi echo "🗄️ Создание таблицы users..." command -v psql >/dev/null 2>&1 || { echo "❌ Установи psql: sudo apt install postgresql-client" exit 1 } psql "host=$POSTGRES_HOST port=5432 dbname=$POSTGRES_DB user=$POSTGRES_USER password=$POSTGRES_PASS sslmode=require" <