zkt25/sk1/prepare-app.sh

189 lines
6.2 KiB
Bash

#!/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" <<EOF
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
EOF
echo "✅ Готово! Всё развёрнуто."