189 lines
6.2 KiB
Bash
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 "✅ Готово! Всё развёрнуто."
|