11#! /bin/bash
22
3- # Скрипт для деплоя на VPS
4- # Использование: ./deploy.sh [branch]
5- # По умолчанию деплоится ветка master
6-
73set -e
84
95BRANCH=${1:- master}
106APP_DIR=${VPS_APP_DIR:- $(pwd)}
117
128echo " 🚀 Starting deployment of branch: $BRANCH "
139
14- # Переходим в директорию проекта
1510cd " $APP_DIR " || {
1611 echo " ❌ Directory $APP_DIR not found!"
1712 exit 1
1813}
1914
20- # Обновляем код из репозитория
21- # (При запуске через GitHub Actions код уже обновлен, но повторное обновление безопасно)
2215echo " 📥 Fetching latest code..."
2316git fetch origin
2417git reset --hard " origin/$BRANCH "
2518git clean -fd
2619
27- # Проверяем наличие .env файла
2820if [ ! -f .env ]; then
2921 echo " ⚠️ Warning: .env file not found!"
3022 echo " Please create .env file before deployment."
3123 exit 1
3224fi
3325
34- # Останавливаем только приложение, НЕ базу данных (чтобы сохранить данные)
35- # ВАЖНО: volumes объявлены в storages.yaml и должны сохраняться между деплоями
36- # Используем прямой docker stop/rm для контейнера, чтобы избежать проблем с зависимостями
3726echo " 🛑 Stopping application container..."
3827docker stop main-app 2> /dev/null || true
3928docker rm main-app 2> /dev/null || true
4029
41- # Проверяем, что volumes существуют (для отладки)
4230echo " 🔍 Checking volumes..."
4331VOLUMES_EXIST=$( docker volume ls | grep -E " postgres_data|pgadmin_data" | wc -l)
4432if [ " $VOLUMES_EXIST " -ge 2 ]; then
4735 echo " ⚠️ Warning: Some volumes may not exist yet (will be created on first run)"
4836fi
4937
50- # Собираем и запускаем контейнеры
51- # Сначала запускаем storages (postgres), затем приложение с обоими файлами
5238echo " 🔨 Building and starting containers..."
5339docker compose -f docker_compose/storages.yaml --env-file .env up -d
54- # Используем оба файла вместе, чтобы зависимости работали
55- # postgres уже запущен, поэтому он не будет пересоздан
5640echo " 🔨 Building and starting application..."
5741docker compose -f docker_compose/storages.yaml -f docker_compose/app.yaml --env-file .env up --build -d main-app
5842
59- # Читаем переменные окружения из .env заранее
6043DB_NAME=$( grep -E " ^POSTGRES_DB=" .env 2> /dev/null | cut -d ' =' -f2 | tr -d ' "' | tr -d " '" || echo " organization_catalog" )
6144DB_USER=$( grep -E " ^POSTGRES_USER=" .env 2> /dev/null | cut -d ' =' -f2 | tr -d ' "' | tr -d " '" || echo " postgres" )
6245
63- # Удаляем пробелы
6446DB_NAME=$( echo " $DB_NAME " | xargs)
6547DB_USER=$( echo " $DB_USER " | xargs)
6648
67- # Ждем пока PostgreSQL будет готов
6849echo " ⏳ Waiting for PostgreSQL to be ready..."
6950MAX_ATTEMPTS=30
7051ATTEMPT=0
@@ -83,7 +64,6 @@ if [ $ATTEMPT -eq $MAX_ATTEMPTS ]; then
8364 exit 1
8465fi
8566
86- # Создаем базу данных, если её нет
8767echo " 🔍 Checking if database '$DB_NAME ' exists..."
8868if ! docker exec postgres psql -U " $DB_USER " -lqt 2> /dev/null | cut -d \| -f 1 | grep -qw " $DB_NAME " ; then
8969 echo " 📦 Creating database '$DB_NAME '..."
9474 echo " ✅ Database '$DB_NAME ' already exists"
9575fi
9676
97- # Применяем миграции
9877echo " 📊 Running database migrations..."
9978docker exec main-app alembic upgrade head || {
10079 echo " ⚠️ Migration failed, but continuing..."
10180}
10281
103- # Очищаем старые Docker образы
10482echo " 🧹 Cleaning up old Docker images..."
10583docker image prune -f
10684
107- # Проверяем статус контейнеров
10885echo " ✅ Checking container status..."
10986docker ps --filter " name=main-app" --format " table {{.Names}}\t{{.Status}}"
11087
0 commit comments