253 lines
8.0 KiB
Bash
253 lines
8.0 KiB
Bash
|
|
#!/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 "$@"
|
|||
|
|
|
|||
|
|
|