architect/standards/4-policy/policy-rollback.md

type: standard
aspect: policy
title: "ROLLBACK POLICY"
version: 1.0.0
date: 2026-02-19
status: active


ROLLBACK POLICY

Версия: 1.0.0
Дата: 2026-02-13


ПРИНЦИП

При любом программировании: Контрольные точки → Обновление → Если сломалось → Откат → Снова.

ЗАПРЕЩЕНО:
- ❌ Править ядро (core) системы
- ❌ Пытаться чинить сломанное на месте
- ❌ Накручивать workarounds поверх сломанного

ПРАВИЛЬНО:
- ✅ Откатиться к предыдущей рабочей версии
- ✅ Продолжить настройку с чистого состояния
- ✅ Искать где именно поломка


АЛГОРИТМ

1. ПЕРЕД ИЗМЕНЕНИЕМ
    Создать контрольную точку (backup)
    Запомнить состояние: "это работает"

2. ДЕЛАТЬ ИЗМЕНЕНИЕ
    Одно изменение за раз
    Проверка после каждого шага

3. ЕСЛИ СЛОМАЛОСЬ
    СТОП! Не пытаться починить
    Откат к контрольной точке
    Повторить с другим подходом

4. НИКОГДА
    Не менять ядро (Drupal core, Laravel core, etc.)
    Не накручивать fix поверх fix
    Не продолжать если не работает

КОНТРОЛЬНЫЕ ТОЧКИ

Уровни backup

Уровень Что Когда Где
L1 Файлы Модули, код Перед деплоем arh/ + timestamp
L2 БД Дамп БД Перед миграцией arh/sql/ + timestamp
L3 Ванилла Чистая установка После установки CMS ~/vanilla-YYYY-MM-DD.tar.gz
L4 Система Вся папка проекта Перед большими изменениями $INFRA/backups/

Имена backup

Формат: {тип}_{дата}_{время}_{статус}.{ext}

drupal-vanilla-20260210-110019.tar.gz       ← L3: Чистая установка
modules-before-deploy-20260213-143022.tar.gz ← L1: Перед деплоем
db-before-migration-20260213-143505.sql.gz   ← L2: Перед миграцией БД

ПРИМЕРЫ

Drupal модули (этот случай)

БЫЛО:
1. Пытались установить модули  ошибка
2. Пытались починить core  сломали ещё больше
3. Пытались workaround  не помогло

ПРАВИЛЬНО:
1. СТОП! Откат к vanilla
2. Восстановить чистое ядро
3. Установить модули заново
4. Если не работает  искать причину в модулях, НЕ в ядре

Любое программирование

ПЕРЕД началом:
  ✓ Есть ванилла (чистая установка)?
  ✓ Есть backup текущего состояния?
  ✓ Знаем как откатиться?

ЕСЛИ что-то пошло не так:
  1. ОТКАТ к последней рабочей точке
  2. Проверка: "это работает?"
  3. Повторить изменение по-другому

НЕ ДЕЛАТЬ:
  ✗ Править ядро фреймворка
  ✗ "Починить" vendor/ файлы
  ✗ Накручивать костыли

ПРАВИЛО ЯДРА

Что считается "ядром"

Система Ядро (НЕ ТРОГАТЬ) Можно менять
Drupal core/, vendor/ modules/custom/, themes/custom/
Laravel vendor/, bootstrap/ app/, routes/, config/
WordPress wp-includes/, wp-admin/ wp-content/plugins/, wp-content/themes/
Node.js node_modules/ src/, lib/

Если ядро сломано

ДИАГНОСТИКА:
1. Это точно ядро сломано?
    Проверить на vanilla
2. Ядро из коробки работает?
    Да: проблема в наших изменениях
    Нет: проблема в установке

ЕСЛИ ЯДРО СЛОМАНО:
 Откат к vanilla
 НЕ ЧИНИТЬ на месте!

ИНТЕГРАЦИЯ С ПРОЦЕССАМИ

При разработке

research → Не требует backup (только чтение)
plan → Создать описание rollback в плане
code → Обязательный backup перед началом
ops → L3-L4 backup + план отката

При деплое

1. Создать backup (L1 + L2)
2. Деплой
3. Проверка работоспособности
4. Если сломалось:
    Откат к backup
    НЕ пытаться чинить на prod

ЧЕКЛИСТ ПЕРЕД ДЕЙСТВИЕМ

Перед любым изменением:

Если хоть один пункт "нет" → СНАЧАЛА СДЕЛАТЬ BACKUP


ХРАНЕНИЕ BACKUP

Локальные backup

{project}/
├── arh/                    ← L1: Архив модулей
│   ├── modules/
│   │   └── 2026-02-13-143022/
│   └── sql/                ← L2: Дампы БД
│       └── 2026-02-13-143505.sql.gz

Удалённые backup (сервер)

~/
├── vanilla-{date}.tar.gz              ← L3: Чистая установка
├── backups/                            ← L2: Текущие backup
│   ├── before_deploy_{timestamp}.tar.gz
│   └── db_{timestamp}.sql.gz

S3 backup (долгосрочные)

$INFRA/backups/
├── {project}/
│   └── {YYYY-MM}/
│       ├── vanilla-20260210.tar.gz    ← L3
│       └── weekly-20260213.tar.gz     ← L4

АВТОМАТИЗАЦИЯ

Скрипт backup перед деплоем

#!/bin/bash
# deploy/backup.sh

TIMESTAMP=$(date +%Y%m%d_%H%M%S)

echo "Создание backup..."
tar -czf "arh/modules/$TIMESTAMP.tar.gz" dev/modules/
mysqldump db_name | gzip > "arh/sql/$TIMESTAMP.sql.gz"
echo "✓ Backup: $TIMESTAMP"

Скрипт отката

#!/bin/bash
# deploy/rollback.sh

BACKUP_ID=$1  # 20260213_143022

echo "Откат к $BACKUP_ID..."
tar -xzf "arh/modules/$BACKUP_ID.tar.gz" -C dev/
gunzip < "arh/sql/$BACKUP_ID.sql.gz" | mysql db_name
echo "✓ Откат выполнен"

ДОКУМЕНТАЦИЯ ROLLBACK

При создании backup → записать:

## Backup {timestamp}

**Что:** Перед деплоем модулей Drupal
**Состояние:** Ванилла Drupal 11.3.3 + locale + commerce
**Работает:** ✓ Сайт доступен, админка работает

**Откат:**
```bash
cd ~/
tar -xzf drupal-vanilla-20260210.tar.gz -C new.site.ru/
gunzip -c drupal-vanilla.sql.gz | mysql db_name

Проверка:
- http://new.site.ru/ → 200 OK
- http://new.site.ru/admin → доступна админка



ССЫЛКИ


Помни: Откатиться и сделать правильно → БЫСТРЕЕ чем чинить сломанное.