From b162eddf0ad88a42f34a2ee5fd9e2a19042e1c57 Mon Sep 17 00:00:00 2001 From: Fedor Date: Fri, 26 Sep 2025 10:46:34 +0300 Subject: [PATCH] Add Git backup system with S3 integration - backup_to_s3.sh: Main backup script with S3 upload - daily_backup.sh: Simple daily backup script - README_GIT.md: Complete documentation - .gitignore: Exclude sensitive files and cache --- README_GIT.md | 165 ++++++++++++++++++++++++++++++++++++++++++++++++ backup_to_s3.sh | 74 ++++++++++++++++++++++ daily_backup.sh | 32 ++++++++++ 3 files changed, 271 insertions(+) create mode 100644 README_GIT.md create mode 100755 backup_to_s3.sh create mode 100755 daily_backup.sh diff --git a/README_GIT.md b/README_GIT.md new file mode 100644 index 00000000..7c2483ac --- /dev/null +++ b/README_GIT.md @@ -0,0 +1,165 @@ +# Git Backup System для CRM + +## Обзор + +Система автоматического бэкапа Git репозитория CRM проекта с возможностью загрузки на S3. + +## Файлы + +- `backup_to_s3.sh` - Основной скрипт бэкапа с загрузкой на S3 +- `daily_backup.sh` - Простой ежедневный бэкап +- `.gitignore` - Исключения для Git +- `backups/` - Папка для локальных бэкапов + +## Использование + +### Ручной бэкап +```bash +# Создать бэкап с описанием +./backup_to_s3.sh "Описание изменений" + +# Создать бэкап с автоматическим описанием +./backup_to_s3.sh +``` + +### Автоматический ежедневный бэкап +```bash +# Добавить в crontab для ежедневного бэкапа в 2:00 +crontab -e + +# Добавить строку: +0 2 * * * /var/www/fastuser/data/www/crm.clientright.ru/daily_backup.sh +``` + +## Настройка S3 + +### 1. Установка AWS CLI +```bash +# Ubuntu/Debian +sudo apt install awscli + +# Или через pip +pip install awscli +``` + +### 2. Настройка credentials +```bash +aws configure +# Ввести: +# AWS Access Key ID: [ваш ключ] +# AWS Secret Access Key: [ваш секрет] +# Default region name: ru-central1 +# Default output format: json +``` + +### 3. Создание S3 bucket +```bash +aws s3 mb s3://crm-backups --region ru-central1 +``` + +## Структура бэкапов + +### Git коммиты +- Каждый бэкап создает коммит с временной меткой +- История изменений сохраняется в Git + +### Архивы +- Формат: `crm_backup_YYYYMMDD_HHMMSS.tar.gz` +- Исключения: `.git`, `cache`, `logs`, `test` +- Размер: обычно 50-100MB + +### S3 структура +``` +s3://crm-backups/ +├── crm-git-backup/ +│ ├── crm_backup_20240926_104500.tar.gz +│ ├── crm_backup_20240926_120000.tar.gz +│ └── ... +``` + +## Восстановление + +### Из Git +```bash +# Посмотреть историю +git log --oneline + +# Откатиться к предыдущей версии +git reset --hard HEAD~1 + +# Откатиться к конкретному коммиту +git reset --hard +``` + +### Из архива +```bash +# Скачать с S3 +aws s3 cp s3://crm-backups/crm-git-backup/crm_backup_20240926_104500.tar.gz . + +# Распаковать +tar -xzf crm_backup_20240926_104500.tar.gz +``` + +## Мониторинг + +### Проверка статуса +```bash +# Статус Git +git status + +# Последние коммиты +git log --oneline -10 + +# Размер репозитория +du -sh .git +``` + +### Логи +```bash +# Логи ежедневного бэкапа +tail -f /var/log/cron + +# Или добавить логирование в скрипт +./daily_backup.sh >> /var/log/crm_backup.log 2>&1 +``` + +## Безопасность + +### Исключенные файлы +- `config.inc.php` - конфигурация БД +- `.env` - переменные окружения +- `cache/` - кеш файлы +- `logs/` - логи +- `*.log` - все лог файлы + +### Рекомендации +1. Регулярно проверяйте размер бэкапов +2. Настройте lifecycle policy для S3 +3. Используйте разные bucket для разных окружений +4. Шифруйте sensitive данные + +## Troubleshooting + +### Проблема: "Permission denied" +```bash +sudo chown -R www-data:www-data . +sudo chmod -R 755 . +``` + +### Проблема: "AWS CLI not found" +```bash +# Установить AWS CLI +curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" +unzip awscliv2.zip +sudo ./aws/install +``` + +### Проблема: "Bucket does not exist" +```bash +# Создать bucket +aws s3 mb s3://crm-backups --region ru-central1 +``` + +## Контакты + +При проблемах обращайтесь к Фёдору. diff --git a/backup_to_s3.sh b/backup_to_s3.sh new file mode 100755 index 00000000..33c4d32c --- /dev/null +++ b/backup_to_s3.sh @@ -0,0 +1,74 @@ +#!/bin/bash + +# Скрипт для бэкапа Git репозитория на S3 +# Использование: ./backup_to_s3.sh [описание_изменений] + +# Настройки +BUCKET_NAME="crm-backups" +BACKUP_PREFIX="crm-git-backup" +TIMESTAMP=$(date +"%Y%m%d_%H%M%S") +COMMIT_MESSAGE=${1:-"Auto backup $(date '+%Y-%m-%d %H:%M:%S')"} + +# Цвета для вывода +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +echo -e "${GREEN}=== CRM Git Backup to S3 ===${NC}" + +# Проверяем, что мы в Git репозитории +if [ ! -d ".git" ]; then + echo -e "${RED}Ошибка: Не найден Git репозиторий${NC}" + exit 1 +fi + +# Проверяем наличие изменений +if git diff --quiet && git diff --cached --quiet; then + echo -e "${YELLOW}Нет изменений для коммита${NC}" + exit 0 +fi + +# Добавляем все изменения +echo -e "${YELLOW}Добавляем изменения в Git...${NC}" +git add . + +# Создаем коммит +echo -e "${YELLOW}Создаем коммит: $COMMIT_MESSAGE${NC}" +git commit -m "$COMMIT_MESSAGE" + +# Создаем архив репозитория +ARCHIVE_NAME="crm_backup_${TIMESTAMP}.tar.gz" +echo -e "${YELLOW}Создаем архив: $ARCHIVE_NAME${NC}" + +# Исключаем .git из архива для экономии места +tar --exclude='.git' --exclude='cache' --exclude='logs' --exclude='test' \ + -czf "/tmp/$ARCHIVE_NAME" . + +# Проверяем размер архива +ARCHIVE_SIZE=$(du -h "/tmp/$ARCHIVE_NAME" | cut -f1) +echo -e "${GREEN}Архив создан: $ARCHIVE_NAME (размер: $ARCHIVE_SIZE)${NC}" + +# Загружаем на S3 (если настроен AWS CLI) +if command -v aws &> /dev/null; then + echo -e "${YELLOW}Загружаем на S3...${NC}" + aws s3 cp "/tmp/$ARCHIVE_NAME" "s3://$BUCKET_NAME/$BACKUP_PREFIX/$ARCHIVE_NAME" + + if [ $? -eq 0 ]; then + echo -e "${GREEN}✅ Бэкап успешно загружен на S3${NC}" + echo -e "${GREEN} S3 путь: s3://$BUCKET_NAME/$BACKUP_PREFIX/$ARCHIVE_NAME${NC}" + else + echo -e "${RED}❌ Ошибка загрузки на S3${NC}" + fi +else + echo -e "${YELLOW}⚠️ AWS CLI не установлен, пропускаем загрузку на S3${NC}" +fi + +# Очищаем временный файл +rm -f "/tmp/$ARCHIVE_NAME" + +# Показываем последние коммиты +echo -e "${GREEN}Последние коммиты:${NC}" +git log --oneline -5 + +echo -e "${GREEN}=== Backup завершен ===${NC}" diff --git a/daily_backup.sh b/daily_backup.sh new file mode 100755 index 00000000..617161e6 --- /dev/null +++ b/daily_backup.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +# Простой ежедневный бэкап Git репозитория +# Добавить в crontab: 0 2 * * * /var/www/fastuser/data/www/crm.clientright.ru/daily_backup.sh + +cd /var/www/fastuser/data/www/crm.clientright.ru + +# Проверяем наличие изменений +if ! git diff --quiet || ! git diff --cached --quiet; then + echo "$(date): Найдены изменения, создаем бэкап" + + # Добавляем все изменения + git add . + + # Создаем коммит с временной меткой + git commit -m "Daily backup $(date '+%Y-%m-%d %H:%M:%S')" + + # Создаем архив + TIMESTAMP=$(date +"%Y%m%d_%H%M%S") + ARCHIVE_NAME="crm_daily_${TIMESTAMP}.tar.gz" + + tar --exclude='.git' --exclude='cache' --exclude='logs' --exclude='test' \ + -czf "/tmp/$ARCHIVE_NAME" . + + # Перемещаем архив в папку backups + mkdir -p backups + mv "/tmp/$ARCHIVE_NAME" "backups/" + + echo "$(date): Бэкап создан: backups/$ARCHIVE_NAME" +else + echo "$(date): Нет изменений для бэкапа" +fi