Files
crm.clientright.ru/crm_extensions/deploy_scripts/deploy_to_production.sh

253 lines
8.0 KiB
Bash
Raw Normal View History

#!/bin/bash
# Скрипт деплоя изменений из тестовой среды в боевую
# Автор: Фёдор
# Дата: 2025-09-26
set -e # Остановка при ошибке
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Пути
TEST_DIR="/var/www/fastuser/data/www/crm-test.clientright.ru"
PROD_DIR="/var/www/fastuser/data/www/crm.clientright.ru"
BACKUP_DIR="/var/www/fastuser/data/backups/crm_deployments"
LOG_FILE="/var/www/fastuser/data/logs/deploy_$(date +%Y%m%d_%H%M%S).log"
# Функция логирования
log() {
echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FILE"
}
error() {
echo -e "${RED}[ERROR]${NC} $1" | tee -a "$LOG_FILE"
exit 1
}
success() {
echo -e "${GREEN}[SUCCESS]${NC} $1" | tee -a "$LOG_FILE"
}
warning() {
echo -e "${YELLOW}[WARNING]${NC} $1" | tee -a "$LOG_FILE"
}
# Проверка прав доступа
check_permissions() {
log "Проверка прав доступа..."
if [ ! -d "$TEST_DIR" ]; then
error "Тестовая директория не найдена: $TEST_DIR"
fi
if [ ! -d "$PROD_DIR" ]; then
error "Продакшн директория не найдена: $PROD_DIR"
fi
if [ ! -w "$PROD_DIR" ]; then
error "Нет прав на запись в продакшн директорию: $PROD_DIR"
fi
success "Права доступа проверены"
}
# Создание резервной копии
create_backup() {
log "Создание резервной копии продакшн среды..."
mkdir -p "$BACKUP_DIR"
BACKUP_NAME="crm_backup_$(date +%Y%m%d_%H%M%S).tar.gz"
BACKUP_PATH="$BACKUP_DIR/$BACKUP_NAME"
# Исключаем кеш и временные файлы из бэкапа
tar -czf "$BACKUP_PATH" \
--exclude="$PROD_DIR/cache" \
--exclude="$PROD_DIR/test/templates_c" \
--exclude="$PROD_DIR/logs" \
--exclude="$PROD_DIR/tmp" \
-C "$(dirname "$PROD_DIR")" "$(basename "$PROD_DIR")"
if [ $? -eq 0 ]; then
success "Резервная копия создана: $BACKUP_PATH"
echo "$BACKUP_PATH" > "$BACKUP_DIR/latest_backup.txt"
else
error "Ошибка создания резервной копии"
fi
}
# Синхронизация файлов
sync_files() {
log "Синхронизация файлов из тестовой среды..."
# Список файлов и директорий для синхронизации
SYNC_ITEMS=(
"crm_extensions"
"layouts/v7/skins/images"
"layouts/v7/lib"
"modules"
"libraries"
"include"
"vtlib"
"packages"
"resources"
".htaccess"
)
for item in "${SYNC_ITEMS[@]}"; do
if [ -e "$TEST_DIR/$item" ]; then
log "Синхронизация: $item"
# Создаем директорию если не существует
if [ -d "$TEST_DIR/$item" ]; then
mkdir -p "$PROD_DIR/$(dirname "$item")"
fi
# Копируем с сохранением прав
cp -r "$TEST_DIR/$item" "$PROD_DIR/$(dirname "$item")/"
if [ $? -eq 0 ]; then
success "Синхронизировано: $item"
else
warning "Ошибка синхронизации: $item"
fi
else
warning "Файл/директория не найдена в тестовой среде: $item"
fi
done
}
# Обновление прав доступа
fix_permissions() {
log "Обновление прав доступа..."
# Устанавливаем правильные права для файлов
find "$PROD_DIR" -type f -exec chmod 644 {} \;
find "$PROD_DIR" -type d -exec chmod 755 {} \;
# Специальные права для исполняемых файлов
find "$PROD_DIR" -name "*.sh" -exec chmod 755 {} \;
find "$PROD_DIR" -name "*.php" -path "*/cron/*" -exec chmod 755 {} \;
# Права для кеша и временных файлов
if [ -d "$PROD_DIR/test/templates_c" ]; then
chmod -R 777 "$PROD_DIR/test/templates_c"
fi
if [ -d "$PROD_DIR/cache" ]; then
chmod -R 777 "$PROD_DIR/cache"
fi
# Устанавливаем владельца
chown -R fastuser:fastuser "$PROD_DIR"
success "Права доступа обновлены"
}
# Проверка работоспособности
health_check() {
log "Проверка работоспособности после деплоя..."
# Проверяем доступность главной страницы
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" https://crm.clientright.ru)
if [ "$HTTP_CODE" = "200" ]; then
success "Главная страница доступна (HTTP $HTTP_CODE)"
else
warning "Проблема с главной страницей (HTTP $HTTP_CODE)"
fi
# Проверяем наличие ключевых файлов
KEY_FILES=(
"index.php"
"config.php"
"crm_extensions/README.md"
)
for file in "${KEY_FILES[@]}"; do
if [ -f "$PROD_DIR/$file" ]; then
success "Файл найден: $file"
else
warning "Файл не найден: $file"
fi
done
}
# Откат изменений
rollback() {
log "Выполнение отката изменений..."
if [ -f "$BACKUP_DIR/latest_backup.txt" ]; then
BACKUP_PATH=$(cat "$BACKUP_DIR/latest_backup.txt")
if [ -f "$BACKUP_PATH" ]; then
log "Восстановление из резервной копии: $BACKUP_PATH"
# Останавливаем веб-сервер
systemctl stop apache2
# Восстанавливаем файлы
tar -xzf "$BACKUP_PATH" -C "$(dirname "$PROD_DIR")"
# Запускаем веб-сервер
systemctl start apache2
success "Откат выполнен успешно"
else
error "Резервная копия не найдена: $BACKUP_PATH"
fi
else
error "Файл с информацией о последней резервной копии не найден"
fi
}
# Основная функция
main() {
log "Начало деплоя CRM из тестовой среды в продакшн"
log "Лог файл: $LOG_FILE"
case "${1:-deploy}" in
"deploy")
check_permissions
create_backup
sync_files
fix_permissions
health_check
success "Деплой завершен успешно!"
;;
"rollback")
rollback
;;
"backup")
check_permissions
create_backup
;;
"sync")
check_permissions
sync_files
fix_permissions
;;
"health")
health_check
;;
*)
echo "Использование: $0 {deploy|rollback|backup|sync|health}"
echo " deploy - Полный деплой (по умолчанию)"
echo " rollback - Откат к последней резервной копии"
echo " backup - Создание резервной копии"
echo " sync - Синхронизация файлов"
echo " health - Проверка работоспособности"
exit 1
;;
esac
}
# Запуск основной функции
main "$@"