#!/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 "$@"