architect/standards/arh/process-project-workflow.md

type: standard
aspect: process
title: "WORKFLOW: РАЗРАБОТКА ЛЮБОГО IT ПРОЕКТА"
version: 1.0.0
date: 2026-02-19
status: active


WORKFLOW: РАЗРАБОТКА ЛЮБОГО IT ПРОЕКТА

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


СТРУКТУРА ДОКУМЕНТА

┌─────────────────────────────────────────────────────────┐
│ PART 0: БАЗОВЫЕ ПОНЯТИЯ                                 │
│                                                         │
│ ┌─────────────────────────────────────────────┐         │
│ │ ЧТО (понятия)                               │         │
│ │ 0.1 Три состояния проекта                   │         │
│ │ 0.2 Два типа проектов (PATH A vs PATH B)   │         │
│ │ 0.3 Версионирование                         │         │
│ │ 0.4 Эталонные данные в корне                │         │
│ │ 0.5 Окружения и стадии (dev/stage/prod)    │         │
│ └─────────────────────────────────────────────┘         │
│                                                         │
│ ┌─────────────────────────────────────────────┐         │
│ │ КАК (правила работы)                        │         │
│ │ 0.6 Контрольные точки (backup)              │         │
│ │ 0.7 Не чинить ядро (откат)                  │         │
│ │ 0.8 Один шаг = одна проверка                │         │
│ │ 0.9 Записывать всё (DEVLOG)                 │         │
│ │ 0.10 Git после проверки                     │         │
│ │ 0.11 Откат немедленно                       │         │
│ │ 0.12 Правило удалённых изменений            │         │
│ └─────────────────────────────────────────────┘         │
│                                                         │
│ ┌─────────────────────────────────────────────┐         │
│ │ КОГДА (prerequisite)                        │         │
│ │ 0.0 Проверка инфраструктуры                 │         │
│ └─────────────────────────────────────────────┘         │
└─────────────────────────────────────────────────────────┘
                        ↓
┌───────────────────────────┬─────────────────────────────┐
│ PART 1: PATH A            │ PART 2: PATH B              │
│ Создание нового проекта   │ Онбординг существующего     │
│                           │                             │
│ Zero → Vanilla → Работа   │ Получение → Настройка →     │
│                           │ Работа                      │
└───────────────────────────┴─────────────────────────────┘
                        ↓
┌─────────────────────────────────────────────────────────┐
│ PART 3: ЕЖЕДНЕВНАЯ РАБОТА                               │
│ (будет далее)                                           │
└─────────────────────────────────────────────────────────┘

Принцип каскадности:
- PART 0 = фундамент (понятия и правила)
- PART 1/2 = применение (инициализация проекта)
- PART 3 = работа (цикл разработки)


PART 0: БАЗОВЫЕ ПОНЯТИЯ

━━━ ЧТО (понятия) ━━━

0.1 ТРИ СОСТОЯНИЯ ПРОЕКТА

ZERO (развёрнутая система):
- Система установлена из коробки
- НЕ настроена
- БД не подключена
- Как телефон после распаковки

VANILLA (голый дистрибутив):
- КРИТИЧНО: Vanilla = ВСЕГДА чистая CMS
- Drupal/Laravel/WordPress из коробки
- БД подключена, система работает
- Базовые модули (locale, commerce)
- НЕТ кастомизации
- НЕТ custom кода
- Точка отката при проблемах

WORKING (рабочие версии):
- Версии с изменениями
- v0.1.0, v0.2.0, v1.0.0, ...
- Каждая версия = git tag
- Есть custom код, модули, настройки

СХЕМА:

PATH A (новый проект):
Zero → Vanilla (v0.0.0) → Working (v0.1.0+) → Production (v1.0.0+)

PATH B (онбординг):
Получение → Онбординг (v1.0.0) → Working (v1.1.0+)
              ↑
              НЕ vanilla! Это рабочий проект

0.2 ДВА ТИПА ПРОЕКТОВ

PATH A: Создание с нуля
- Нет готового решения
- Выбираем CMS/framework сами
- Создаём Zero → Vanilla → Разработка
- Пример: новый магазин на Drupal

PATH B: Онбординг существующего
- Есть готовое решение
- Заводим на наш сервер
- Получение → Настройка → Работа
- Пример: переезд сайта с другого хостинга

ВАЖНО:
- PATH A даёт Vanilla (чистый дистрибутив)
- PATH B НЕ даёт Vanilla (уже кастомизированный проект)


РАЗНИЦА: "Новая версия" vs "Новый проект"

НОВАЯ ВЕРСИЯ (эволюция проекта):

v0.1.0 → v0.2.0 → v1.0.0 → v1.1.0
  ↑        ↑        ↑        ↑
Тот же проект, добавляем фичи
Та же CMS, тот же стек
Та же vanilla v0.0.0 в основе

НОВЫЙ ПРОЕКТ (создание с нуля):

Проект А (Drupal 10) → закончен
                ↓
Проект Б (Drupal 11) → создаём заново
  ↑
НОВАЯ vanilla v0.0.0
НОВАЯ технология/платформа
НОВЫЙ PATH A (Zero → Vanilla → ...)

Когда создавать НОВЫЙ проект:
- Переход на новую CMS (Drupal 10 → 11)
- Смена технологии (PHP → Node.js)
- Полный редизайн архитектуры
- Создание второго продукта компании

Когда создавать НОВУЮ версию:
- Добавление фичи (модуль, функция)
- Баг-фикс
- Рефакторинг в рамках существующего стека
- Обновление зависимостей БЕЗ смены CMS


0.3 ВЕРСИОНИРОВАНИЕ

Схема: MAJOR.MINOR.PATCH

Правила:

PATH A (новый проект):

v0.0.0 = Vanilla (голый дистрибутив)
v0.1.0 = Первая фича
v0.2.0 = Вторая фича
v0.x.x = Разработка (не в проде)
v1.0.0 = Релиз в production
v1.1.0 = Новая фича в проде
v1.1.1 = Баг-фикс

PATH B (онбординг):

Если есть версия в проекте:
  → Сохранить существующую (v2.3.1)
  → Продолжить нумерацию (v2.3.2, v2.4.0)

Если нет версии:
  → Поставить v1.0.0 (онбординг завершён)
  → Это НЕ vanilla, это рабочий проект

Что менять:
- MAJOR (1.0.0 → 2.0.0): Breaking changes, API изменился
- MINOR (1.0.0 → 1.1.0): Новая фича, модуль
- PATCH (1.0.0 → 1.0.1): Баг-фикс


0.4 ЭТАЛОННЫЕ ДАННЫЕ В КОРНЕ

ПРАВИЛО: Вся информация хранится ОДИН РАЗ в корне. Остальное — ссылки.

Структура:

{project}/
├── .credentials.md          ← СКРЫТО: пароли (не в git)
├── .project-config.md       ← ОТКРЫТО: параметры (в git)
├── PROJECT.md               ← Описание проекта
├── DEVLOG.md                ← История разработки
│
└── modules/custom/
    ├── module1/
    │   └── README.md        ← Ссылка на ../../.project-config.md
    └── module2/
        └── CONFIG.md        ← Ссылка на ../../.project-config.md

Файл: .credentials.md (НЕ в git)

# CREDENTIALS: {project_name}

## База данных
- Host: localhost
- Database: ${DB_NAME}
- User: ${DB_USER}
- Password: ${DB_PASS}

## CMS Admin
- Username: ${ADMIN_USER}
- Password: ${ADMIN_PASS}

## API ключи
- API_KEY: ${API_KEY}

Файл: .project-config.md (В git)

# PROJECT CONFIG: {project_name}

## Окружение
- CMS: Drupal 11.3.3
- PHP: 8.4
- Database: MySQL 8.0

## Домены
- Production: ${PROD_DOMAIN}
- Staging: ${STAGE_DOMAIN}

## Переменные
DB_NAME=project_db
DB_USER=project_user
ADMIN_USER=admin
PROD_DOMAIN=site.ru

## Credentials
Все пароли см. [.credentials.md](.credentials.md)

Принцип наследования:

КОРЕНЬ                       ДОЧЕРНИЙ
.project-config.md           modules/X/README.md
  DB_NAME=site_db     ←─       ${DB_NAME}

ИЗМЕНИЛ В КОРНЕ              АВТОМАТИЧЕСКИ везде
DB_NAME  new_db             ${DB_NAME}  new_db

Правила:
1. Эталон в корне (один раз)
2. Дочерние НЕ копируют (ссылка на ${VAR})
3. Изменение в корне → везде
4. .credentials.md.gitignore (НЕ в git!)


0.5 ОКРУЖЕНИЯ И СТАДИИ

ПРАВИЛО: В начале работы определить:
1. Режим работы (полный цикл или быстрый)
2. Тип проекта (LEGACY или NEXT)
3. ГДЕ что лежит (runtime и структура)


ДВА РЕЖИМА РАБОТЫ

РЕЖИМ 1: ПОЛНЫЙ ЦИКЛ (DEV → STAGING → PRODUCTION)

Когда использовать:
- E-commerce (деньги!)
- Финансы, банки
- Медицина, персональные данные
- Большая аудитория (>10k пользователей)
- Высокая стоимость ошибки

Окружения:

DEV       → разработка
STAGING   → точная копия prod, финальные тесты
PRODUCTION → боевой

Правило: STAGING = точная копия PRODUCTION (БД, версии, конфиг)


РЕЖИМ 2: БЫСТРЫЙ ЦИКЛ (DEV → PRODUCTION)

Когда использовать:
- MVP (быстрый старт)
- Внутренние инструменты (<100 пользователей)
- Низкий риск (блоги, контент)
- Нужна скорость релизов
- Малый бюджет

Окружения:

DEV        → разработка + ВСЕ тесты
PRODUCTION → релиз + доделка + мониторинг

Правило: На DEV делаем ВСЁ. PROD = только мониторинг и hotfix.


ТИПЫ ПРОЕКТОВ: LEGACY vs NEXT

LEGACY (текущий рабочий проект):

Domain: site.ru
Status: production (работает)
Version: v1.x.x
Поддержка: минимальная (только критические баги)

NEXT (переделка с нуля):

Domain: new.site.ru  (после миграции)  site.ru
Status: в разработке
Version: v2.0.0
Цель: заменить LEGACY

Схема миграции:

LEGACY (v1.x.x)          NEXT (v2.0.0)
site.ru (работает)       DEV  PREVIEW  MIGRATION
        ↓
После миграции:
site.ru  archive.site.ru
new.site.ru  site.ru (production)

ОКРУЖЕНИЯ ДЛЯ LEGACY ПРОЕКТА

Режим 1 (полный цикл):

Окружение Домен Где лежит
DEV localhost или dev.site.ru Локально или dev-сервер
STAGING stage.site.ru Продакшн-сервер (отдельная папка)
PRODUCTION site.ru Продакшн-сервер

Режим 2 (быстрый цикл):

Окружение Домен Где лежит
DEV localhost Локально
PRODUCTION site.ru Продакшн-сервер

ОКРУЖЕНИЯ ДЛЯ NEXT ПРОЕКТА (переделка с нуля)

ДО МИГРАЦИИ (пока LEGACY работает):

Окружение Назначение Домен Статус
DEV Разработка localhost или dev.new-site.ru Активная разработка
PREVIEW Предрелиз new.site.ru Тестирование, ограниченный доступ

ПОСЛЕ МИГРАЦИИ:

Окружение Домен Статус
DEV localhost или dev.site.ru Разработка
STAGING stage.site.ru (если режим 1) Тест
PRODUCTION site.ru Боевой
ARCHIVE archive.site.ru (старый LEGACY) Только чтение

ФАЙЛ .project-config.md (примеры)

Пример 1: LEGACY проект (режим 1)

# PROJECT CONFIG: site

## Тип проекта
- Type: LEGACY
- Version: v1.5.2
- Режим: ПОЛНЫЙ ЦИКЛ (DEV → STAGING → PROD)

## Окружения

### DEV
- Domain: http://localhost:8000
- Path: ~/projects/site/
- DB: site_dev
- Branch: develop

### STAGING
- Domain: http://stage.site.ru/
- Path: /home/user/stage.site.ru/
- DB: stage_db
- Branch: staging

### PRODUCTION
- Domain: http://site.ru/
- Path: /home/user/site.ru/
- DB: site_db
- Branch: main

Пример 2: NEXT проект (переделка с нуля)

# PROJECT CONFIG: site (NEXT v2.0.0)

## Тип проекта
- Type: NEXT (переделка с нуля)
- Legacy: site.ru (v1.x.x, работает)
- Режим: DEV → PREVIEW → MIGRATION
- Migration date: TBD

## Окружения

### DEV (разработка)
- Domain: http://localhost:8000
- Path: ~/projects/site-next/
- DB: site_next_dev
- Branch: develop
- Version: v2.0.0-dev

### PREVIEW (предрелиз, ДО миграции)
- Domain: http://new.site.ru/
- Path: /home/user/new.site.ru/
- DB: site_next_preview
- Branch: main
- Version: v2.0.0-beta
- Access: ограниченный (тестеры, клиенты)

### PRODUCTION (после миграции)
- Domain: http://site.ru/ ← переедет сюда
- Path: /home/user/site.ru/
- DB: site_prod
- Version: v2.0.0
- Status: PLANNED

## Legacy (старый продукт)
- Domain: http://site.ru/ (пока работает)
- Version: v1.5.2
- After migration: → archive.site.ru

Пример 3: Простой проект (режим 2)

# PROJECT CONFIG: internal-tool

## Тип проекта
- Type: LEGACY
- Version: v1.2.0
- Режим: БЫСТРЫЙ ЦИКЛ (DEV → PROD)

## Окружения

### DEV
- Domain: http://localhost:3000
- Path: ~/projects/internal-tool/
- DB: tool_dev

### PRODUCTION
- Domain: http://tool.company.local/
- Path: /var/www/tool/
- DB: tool_prod

WORKFLOW ПО РЕЖИМАМ

РЕЖИМ 1 (полный цикл):

1. DEV (разработка)
    Пишем код
    Тестируем локально
    git commit
    git push origin develop

2. STAGING (тест)
    git checkout staging
    git merge develop
    bash deploy/deploy-staging.sh
    Тестируем на stage.site.ru
    Если OK  готово к production

3. PRODUCTION (релиз)
    git checkout main
    git merge staging
    bash deploy/deploy-production.sh
    Проверяем site.ru
    Мониторим логи

РЕЖИМ 2 (быстрый цикл):

1. DEV (разработка + ВСЕ тесты)
    Пишем код
    Тестируем ВСЁ локально
    Авто-тесты, линтеры
    Готово к релизу
    git commit
    git push origin main

2. PRODUCTION (релиз)
    bash deploy/deploy-production.sh
    Проверяем site.ru
    Мониторим логи
    Hotfix при необходимости

NEXT проект (ДО миграции):

1. DEV (разработка)
    Пишем код
    git push origin develop

2. PREVIEW (тестирование)
    git checkout main
    git merge develop
    bash deploy/deploy-preview.sh
    Тестируем на new.site.ru
    Собираем feedback

3. MIGRATION (когда готово)
    Остановить LEGACY (site.ru)
    Backup LEGACY  archive.site.ru
    new.site.ru  site.ru
    Проверить site.ru
    NEXT стал LEGACY

ФАЙЛ .credentials.md (для всех окружений)

LEGACY проект (режим 1):

# CREDENTIALS: site (LEGACY)

## DEV
- DB: site_dev / devpass123
- Admin: admin / dev123

## STAGING
- DB: stage_db / stagepass456
- Admin: admin / stage456

## PRODUCTION
- DB: site_db / prodpass789
- Admin: admin / PROD_SECURE_PASS

NEXT проект (переделка):

# CREDENTIALS: site (NEXT v2.0.0)

## DEV
- DB: site_next_dev / dev123
- Admin: admin / dev123

## PREVIEW (new.site.ru)
- DB: site_next_preview / preview456
- Admin: admin / preview456

## PRODUCTION (после миграции)
- DB: site_prod / PROD_PASS
- Admin: admin / PROD_ADMIN_PASS

## LEGACY (старый, будет archive)
- DB: site_db / legacy_pass
- Admin: admin / legacy_admin
- After migration: read-only

ЧЕКЛИСТ ОПРЕДЕЛЕНИЯ ОКРУЖЕНИЙ

ПЕРЕД НАЧАЛОМ РАБОТЫ:

□ Определён режим работы (режим 1 или 2) Определён тип проекта (LEGACY или NEXT) Если NEXT: описан LEGACY проект
□ Определены домены для каждого окружения
□ Определены пути на серверах
□ Определены БД для каждого окружения
□ Записано Type в .project-config.md Созданы .env файлы (или config/) Настроены deploy скрипты
□ Проверен доступ к каждому окружению
□ Если NEXT: план миграции описан
□ Записано в DEVLOG.md ОКРУЖЕНИЯ ОПРЕДЕЛЕНЫ, можно работать

ПРАВИЛА

  1. Выбрать режим В НАЧАЛЕ — не менять в процессе
  2. LEGACY проект:
    - Режим 1: DEV → STAGING → PROD
    - Режим 2: DEV → PROD
  3. NEXT проект (переделка):
    - ДО миграции: DEV → PREVIEW (new.site.ru)
    - ПОСЛЕ миграции: как LEGACY (режим 1 или 2)
  4. PREVIEW ≠ STAGING:
    - PREVIEW: тестирование NEXT проекта на new.site.ru
    - STAGING: финальные тесты LEGACY на stage.site.ru
  5. Type в .project-config.md — ОБЯЗАТЕЛЬНО указать LEGACY/NEXT
  6. Vanilla создаётся в DEV — потом деплоится на другие окружения

━━━ КАК (правила работы) ━━━

0.6 КОНТРОЛЬНЫЕ ТОЧКИ (BACKUP)

ПРАВИЛО: Перед изменением — backup. Если сломалось — откат.

Уровни backup:

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

Именование:

{тип}_{дата}_{время}.{ext}

vanilla-20260213-110019.tar.gz           ← L3: Голый дистрибутив
modules-before-deploy-20260213-143022.tar.gz ← L1
db-before-migration-20260213-143505.sql.gz   ← L2

Когда делать:
- L1: Перед деплоем модулей
- L2: Перед ALTER TABLE, миграцией
- L3: После установки чистой CMS (vanilla)
- L4: Перед рефакторингом архитектуры

См. также: ROLLBACK_POLICY.md


0.7 НЕ ЧИНИТЬ ЯДРО (ОТКАТ)

ПРАВИЛО: Откатиться к рабочей версии → повторить. НЕ чинить на месте.

Что считается "ядром" (НЕ ТРОГАТЬ):

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

Если сломалось:

❌ НЕПРАВИЛЬНО:
1. Пытаться чинить core файлы
2. Накручивать workarounds
3. Продолжать если не работает

✅ ПРАВИЛЬНО:
1. ОТКАТ к последнему backup
2. Проверка: "это работает?"
3. Повторить изменение ПО-ДРУГОМУ

См. полный стандарт: ROLLBACK_POLICY.md


0.8 ОДИН ШАГ = ОДНА ПРОВЕРКА

ПРАВИЛО: Сделал → проверил → записал → commit. Повторить.

Цикл:

1. СДЕЛАТЬ одно изменение
2. ПРОВЕРИТЬ что работает
3. ЗАПИСАТЬ в DEVLOG.md
4. GIT COMMIT
5. Следующее изменение

Пример:

# 1. СДЕЛАТЬ
drush en commerce -y

# 2. ПРОВЕРИТЬ
drush status | grep commerce
# commerce: enabled ✓

# 3. ЗАПИСАТЬ
echo "[$(date +%Y-%m-%d\ %H:%M)] MODULE: commerce enabled" >> DEVLOG.md
echo "  ✓ Модуль включён" >> DEVLOG.md

# 4. GIT COMMIT
git add DEVLOG.md
git commit -m "Setup: module commerce enabled"

0.9 ЗАПИСЫВАТЬ ВСЁ (DEVLOG.md)

ПРАВИЛО: Каждое действие записывается в DEVLOG.md

Формат записи:

[YYYY-MM-DD HH:MM] ДЕЙСТВИЕ: описание
  Параметр: значение
  ✓ Результат
  → Статус

Примеры:

[2026-02-13 03:00] INFRA CHECK: проверка окружения
  PHP: 8.4
  MySQL: 8.0
  ✓ Всё установлено
  → ГОТОВО к работе

[2026-02-13 03:05] ZERO: развёртывание Drupal
  Версия: 11.3.3
  Путь: ~/new.site.ru
  ✓ Файлы на месте
  → ZERO создан

[2026-02-13 03:15] VANILLA: настройка завершена
  URL: http://new.site.ru/
  Admin: http://new.site.ru/admin
  ✓ Сайт работает
  → VANILLA готова

[2026-02-13 03:30] MODULE: commerce enabled
  Версия: 2.35
  ✓ Модуль включён
  → Работает

[2026-02-13 04:00] BACKUP: создан L3
  Файл: ~/backups/vanilla/vanilla-20260213-040000.tar.gz
  Размер: 45M
  ✓ Проверен
  → Backup готов

Типы действий:
- INFRA CHECK: проверка инфраструктуры
- ZERO: развёртывание системы
- VANILLA: создание голого дистрибутива
- SETUP: настройка и установка
- MODULE: работа с модулями
- BACKUP: создание backup
- FEATURE: новая функция
- FIX: исправление бага
- DEPLOY: деплой
- ROLLBACK: откат


0.10 GIT ПОСЛЕ ПРОВЕРКИ

ПРАВИЛО: Проверил что работает → commit. НЕ раньше.

Формат commit:

{Этап}: {действие}

Этапы:
- Zero: развёртывание системы
- Setup: настройка и установка
- Vanilla: создание эталона
- Feature: новая функция
- Fix: исправление бага
- Refactor: рефакторинг
- Deploy: деплой
- Rollback: откат

Примеры:

git commit -m "Zero: Drupal 11.3.3 deployed"
git commit -m "Setup: database created"
git commit -m "Setup: modules enabled (locale, commerce)"
git commit -m "Vanilla: backup created"
git commit -m "Feature: custom module created"
git commit -m "Fix: form validation error"
git commit -m "Deploy: modules deployed to production"
git commit -m "Rollback: reverted to v0.5.0"

Правило: Один commit = одно логическое изменение


0.11 ОТКАТ НЕМЕДЛЕННО

ПРАВИЛО: 3 ошибки подряд → СТОП → откат к backup → другой подход.

Когда откатываться:
- Тест падает 3 раза
- Код не работает после 3 попыток
- Сайт сломался
- Ошибки в логах

КАК:

# 1. СТОП работы
# 2. Найти последний рабочий backup
ls -lt ~/backups/vanilla/
# vanilla-20260213-030000.tar.gz

# 3. Откат файлов
cd ~/
rm -rf broken.site.ru
tar -xzf backups/vanilla/vanilla-20260213-030000.tar.gz

# 4. Откат БД
gunzip < backups/vanilla/vanilla-db.sql.gz | mysql -u user -p db_name

# 5. Проверка
curl -I http://site.ru/
# HTTP/1.1 200 OK ✓

# 6. Записать
echo "[$(date +%Y-%m-%d\ %H:%M)] ROLLBACK: откат к vanilla" >> DEVLOG.md
echo "  Причина: сломалась установка модулей" >> DEVLOG.md
echo "  Backup: vanilla-20260213-030000.tar.gz" >> DEVLOG.md
echo "  ✓ Откат выполнен" >> DEVLOG.md

git add DEVLOG.md
git commit -m "Rollback: reverted to vanilla 20260213-030000"

НЕ ДЕЛАТЬ:
- ❌ Пытаться чинить 10 раз подряд
- ❌ Менять ядро системы
- ❌ Накручивать костыли

ДЕЛАТЬ:
- ✅ Откатиться к рабочей версии
- ✅ Понять в чём проблема
- ✅ Попробовать ДРУГОЙ подход


0.12 ПРАВИЛО УДАЛЁННЫХ ИЗМЕНЕНИЙ

ПРАВИЛО: Меняешь файл/БД на сервере → READ-MODIFY-WRITE. НИКОГДА слепая перезапись.

Проблема:

# ❌ ОПАСНО (слепая перезапись)
echo "new_setting=1" > /etc/config.conf
# ← СТИРАЕТ ВСЁ остальное!

# ❌ ОПАСНО (UPDATE без WHERE)
UPDATE products SET price=0;
# ← ОБНУЛЯЕТ ВСЕ цены!

Решение: Паттерн READ → BACKUP → MODIFY → VERIFY


ШЕСТЬ ПРАВИЛ НАДЁЖНЫХ ИЗМЕНЕНИЙ

1. READ BEFORE WRITE (прочитать перед записью)

Непонятно что там → СНАЧАЛА ПРОЧИТАТЬ

# ❌ НЕПРАВИЛЬНО
echo "server_name site.ru;" >> /etc/nginx/site.conf

# ✅ ПРАВИЛЬНО
cat /etc/nginx/site.conf  # сначала смотрим
# Понимаем структуру
# ПОТОМ вносим изменение
sed -i 's/old_value/new_value/' /etc/nginx/site.conf
-- ❌ НЕПРАВИЛЬНО
UPDATE products SET category_id=5 WHERE sku='ABC123';

-- ✅ ПРАВИЛЬНО
SELECT * FROM products WHERE sku='ABC123';  -- сначала смотрим
-- Видим текущее состояние
-- ПОТОМ обновляем
UPDATE products SET category_id=5 WHERE sku='ABC123';

2. BACKUP BEFORE CHANGE (бэкап перед изменением)

Любое изменение → СНАЧАЛА БЭКАП

# Файлы: всегда с timestamp
cp /path/to/file /path/to/file.bak-$(date +%Y%m%d-%H%M%S)
-- БД: backup строк
CREATE TABLE tablename_backup_20260213_143500
AS SELECT * FROM tablename WHERE condition;

3. SPECIFIC NOT GLOBAL (конкретное, не глобальное)

Изменяй КОНКРЕТНОЕ, НЕ ВСЁ

# ❌ ГЛОБАЛЬНО (опасно)
echo "new" > file.txt  # перезаписывает ВСЁ

# ✅ КОНКРЕТНО (безопасно)
sed -i 's/^old_line$/new_line/' file.txt  # меняет ОДНУ строку
-- ❌ ГЛОБАЛЬНО (опасно)
UPDATE users SET active=0;  -- меняет ВСЕ записи

-- ✅ КОНКРЕТНО (безопасно)
UPDATE users SET active=0 WHERE last_login < '2024-01-01';

4. VERIFY AFTER CHANGE (проверить после изменения)

Изменил → ПРОВЕРЬ результат

# 1. Изменение
sed -i 's/listen 80/listen 8080/' nginx.conf

# 2. Проверка содержимого
grep "listen" nginx.conf
# listen 8080; ✓

# 3. Проверка синтаксиса
nginx -t
# syntax is ok ✓

# 4. Проверка работы
systemctl reload nginx
curl -I http://localhost:8080
# HTTP/1.1 200 OK ✓
-- 1. Изменение
UPDATE products SET price=price*1.1 WHERE category_id=5;
-- Query OK, 42 rows affected

-- 2. Проверка результата
SELECT COUNT(*), AVG(price), MIN(price), MAX(price)
FROM products WHERE category_id=5;
-- Проверить разумность цен ✓

-- 3. Проверка конкретной записи
SELECT * FROM products WHERE category_id=5 LIMIT 5;

5. ATOMIC OPERATIONS (атомарность)

Операция = атомарная (всё или ничего)

-- Транзакции
START TRANSACTION;

UPDATE accounts SET balance=balance-100 WHERE id=1;
UPDATE accounts SET balance=balance+100 WHERE id=2;

-- Проверить
SELECT balance FROM accounts WHERE id IN (1,2);

-- Если OK → зафиксировать
COMMIT;

-- Если НЕ OK → откатить
-- ROLLBACK;
# Файлы: write to temp → rename (атомарная замена)
cat > /tmp/config.new << 'EOF'
new_content
EOF

# Проверить
cat /tmp/config.new

# Атомарная замена (одна операция)
mv /tmp/config.new /etc/config.conf

6. ROLLBACK PLAN READY (план отката готов)

Перед изменением → ЗНАТЬ как откатить

ПЕРЕД ИЗМЕНЕНИЕМ:
□ Есть backup?
□ Знаю команду rollback?
□ Проверил backup (можно восстановить)?
□ Записал что изменяю (в DEVLOG)?

ЕСЛИ ВСЁ ✓ → делать изменение
ЕСЛИ ЧТО-ТО ✗ → СТОП, сначала подготовить

АЛГОРИТМ НАДЁЖНОГО ИЗМЕНЕНИЯ

┌─────────────────────────────────────────────┐
│ ЛЮБОЕ ИЗМЕНЕНИЕ НА УДАЛЁННОМ СЕРВЕРЕ/БД     │
└─────────────────────────────────────────────┘
                    ↓
         ┌──────────────────────┐
         │ 1. READ (прочитать)  │
         │ - Что там сейчас?    │
         │ - Понятна структура? │
         └──────────────────────┘
                    ↓
         ┌──────────────────────┐
         │ 2. BACKUP (сохранить)│
         │ - Файл: .bak-DATE    │
         │ - БД: backup таблица │
         └──────────────────────┘
                    ↓
         ┌──────────────────────┐
         │ 3. MODIFY (изменить) │
         │ - Конкретное место   │
         │ - НЕ всё подряд      │
         └──────────────────────┘
                    ↓
         ┌──────────────────────┐
         │ 4. VERIFY (проверить)│
         │ - Прочитать результат│
         │ - Тест (syntax/logic)│
         └──────────────────────┘
                    ↓
              ┌─────────┐
              │ OK?     │
              └─────────┘
               /       \
          ДА /         \ НЕТ
            ↓           ↓
   ┌──────────────┐  ┌──────────────┐
   │ 5. COMMIT    │  │ ROLLBACK     │
   │ - Применить  │  │ - Откатить   │
   │ - Записать   │  │ - Из backup  │
   └──────────────┘  └──────────────┘

ПРИМЕРЫ

Пример 1: Изменение nginx конфига

# 1. READ
ssh server "cat /etc/nginx/sites-available/site.conf" > site.conf.current
cat site.conf.current  # изучаем

# 2. BACKUP на сервере
ssh server "cp /etc/nginx/sites-available/site.conf \
             /etc/nginx/sites-available/site.conf.bak-$(date +%Y%m%d-%H%M%S)"

# 3. MODIFY (локально)
cp site.conf.current site.conf.new
vim site.conf.new  # редактируем

# 4. VERIFY (локально)
docker run --rm -v $(pwd):/etc/nginx nginx nginx -t -c /etc/nginx/site.conf.new
# syntax is ok ✓

# 5. UPLOAD
scp site.conf.new server:/tmp/site.conf.new

# 6. ATOMIC REPLACE
ssh server "sudo mv /tmp/site.conf.new /etc/nginx/sites-available/site.conf"

# 7. VERIFY на сервере
ssh server "nginx -t"
# syntax is ok ✓

# 8. COMMIT
ssh server "systemctl reload nginx"

# 9. CHECK
curl -I https://site.ru
# HTTP/1.1 200 OK ✓

# ROLLBACK (если что-то не так):
# ssh server "cp /etc/nginx/sites-available/site.conf.bak-DATE \
#              /etc/nginx/sites-available/site.conf && \
#              systemctl reload nginx"

Пример 2: UPDATE в БД

-- 1. READ (сколько затронем?)
SELECT COUNT(*) FROM products WHERE sku LIKE 'ABC%';
-- 5000 rows! ← СТОП, это много!

-- Уточняем
SELECT COUNT(*) FROM products WHERE sku='ABC-123';
-- 1 row ✓

-- 2. BACKUP
CREATE TABLE products_backup_20260213_143500
AS SELECT * FROM products WHERE sku='ABC-123';

-- 3. MODIFY
UPDATE products
SET price=999.99
WHERE sku='ABC-123';
-- Query OK, 1 row affected ✓

-- 4. VERIFY
SELECT sku, price FROM products WHERE sku='ABC-123';
-- sku='ABC-123', price=999.99 ✓

-- ROLLBACK (если ошибка):
-- UPDATE products p
-- SET price=(SELECT price FROM products_backup_20260213_143500 b
--            WHERE b.id=p.id)
-- WHERE sku='ABC-123';

Пример 3: Массовое удаление

# 1. READ (что удалим?)
find /var/log -name "*.log" -mtime +30
# /var/log/old1.log
# /var/log/old2.log

# 2. BACKUP
mkdir -p /var/log/archive-$(date +%Y%m%d)
find /var/log -name "*.log" -mtime +30 \
  -exec cp {} /var/log/archive-$(date +%Y%m%d)/ \;

# 3. VERIFY backup
ls -lh /var/log/archive-$(date +%Y%m%d)/
# old1.log ✓
# old2.log ✓

# 4. DELETE
find /var/log -name "*.log" -mtime +30 -delete

# 5. VERIFY
ls -lh /var/log/*.log
# Только свежие логи ✓

ЧЕКЛИСТ НАДЁЖНОГО ИЗМЕНЕНИЯ

ПЕРЕД ИЗМЕНЕНИЕМ НА СЕРВЕРЕ/БД:

□ 1. READ: Прочитал текущее состояние?
□ 2. UNDERSTAND: Понял что там и как устроено?
□ 3. BACKUP: Создал backup (файл.bak или backup таблица)?
□ 4. SPECIFIC: Изменяю КОНКРЕТНОЕ, не всё подряд?
□ 5. WHERE: Есть WHERE в UPDATE? Проверил COUNT(*)?
□ 6. PLAN: Знаю команду rollback?
□ 7. VERIFY: Буду проверять результат?
□ 8. LOG: Запишу в DEVLOG что изменил?

ЕСЛИ ВСЁ ✓ → делать изменение
ЕСЛИ ЧТО-ТО ✗ → СТОП, доделать подготовку

ПРАВИЛА:

  1. Непонятно что там → READ сначала
  2. Любое изменение → BACKUP перед
  3. Меняй конкретное → НЕ всё подряд
  4. Изменил → VERIFY результат
  5. Используй транзакции (БД) или atomic replace (файлы)
  6. Знай команду rollback перед изменением

━━━ КОГДА (prerequisite) ━━━

0.0 ПРОВЕРКА ИНФРАСТРУКТУРЫ

ПРАВИЛО: Перед ЛЮБЫМ проектом — сначала проверить окружение.

ДВА СЛУЧАЯ:

СЛУЧАЙ A: Создание нового (PATH A)

# 1. Проверить выбранный стек
php -v
# PHP 8.4 ✓

mysql --version
# MySQL 8.0 ✓

nginx -v
# nginx/1.24 ✓

# 2. Проверить место на диске
df -h /
# 45GB available ✓

# 3. Тестовая страница
echo "<?php phpinfo();" > /var/www/test.php
curl http://localhost/test.php
# PHP Version 8.4 ✓

# 4. Записать
echo "[$(date +%Y-%m-%d\ %H:%M)] INFRA CHECK (PATH A)" >> DEVLOG.md
echo "  PHP: 8.4" >> DEVLOG.md
echo "  MySQL: 8.0" >> DEVLOG.md
echo "  nginx: 1.24" >> DEVLOG.md
echo "  Диск: 45GB" >> DEVLOG.md
echo "  ✓ Всё установлено" >> DEVLOG.md
echo "  → ГОТОВО для нового проекта" >> DEVLOG.md

СЛУЧАЙ B: Онбординг существующего (PATH B)

# 1. Узнать требования ПРОЕКТА
cat composer.json | grep "php"
# "php": ">=8.1"

cat composer.json | grep "drupal/core"
# "drupal/core": "^10.2"

# 2. Проверить НАШ стек
php -v
# PHP 8.4 ✓ (>= 8.1)

# 3. Сверить
echo "[$(date +%Y-%m-%d\ %H:%M)] INFRA CHECK (PATH B)" >> DEVLOG.md
echo "  Требуется: PHP >=8.1, Drupal 10.2" >> DEVLOG.md
echo "  Есть: PHP 8.4, MySQL 8.0" >> DEVLOG.md
echo "  ✓ Совместимость подтверждена" >> DEVLOG.md
echo "  → ГОТОВО для онбординга" >> DEVLOG.md

ЕСЛИ НЕ СОВПАДАЕТ:

# СТОП! Сначала исправить инфру
# Проект требует PHP 7.4, у нас 8.4? → Установить PHP 7.4
# НЕ пытаться "подогнать" проект под инфру

Чеклист:

□ Версии софта проверены
□ База данных доступна
□ Веб-сервер настроен
□ Права доступа корректны
□ Тестовая страница работает
□ Место на диске достаточно
□ Всё записано в DEVLOG.md

✓ ВСЁ → Можно создавать проект
✗ ЧТО-ТО → СТОП, исправить инфру

PART 1: СОЗДАНИЕ НОВОГО ПРОЕКТА (PATH A)

ЦЕЛЬ: Из "ничего" создать Vanilla (голый дистрибутив), готовый к разработке.

ЭТАПЫ:

НИЧЕГО → Zero → Vanilla (v0.0.0) → Backup L3 → Готово к разработке

1.1 ПРОВЕРКА ИНФРАСТРУКТУРЫ

См. раздел 0.0 Проверка инфраструктуры

Особенность PATH A:
- Мы сами выбираем стек (PHP 8.4, MySQL 8.0, nginx)
- Проверяем что выбранный стек установлен

Результат:

[2026-02-13 03:00] INFRA CHECK (PATH A)
✓ PHP 8.4
✓ MySQL 8.0
✓ nginx 1.24
✓ Диск: 45GB
→ ГОТОВО для нового проекта

1.2 СОЗДАНИЕ ZERO

ЧТО: Развернуть систему из коробки (Drupal/Laravel/WordPress).

Пример: Drupal 11

# 1. Развернуть
cd ~/
composer create-project drupal/recommended-project new.site.ru
cd new.site.ru

# 2. Проверить
ls -la
# composer.json, web/, vendor/ ✓

# 3. Записать
echo "[$(date +%Y-%m-%d\ %H:%M)] ZERO: Drupal deployed" >> DEVLOG.md
echo "  Версия: 11.3.3" >> DEVLOG.md
echo "  Путь: ~/new.site.ru" >> DEVLOG.md
echo "  ✓ Файлы на месте" >> DEVLOG.md
echo "  → ZERO создан" >> DEVLOG.md

# 4. Git commit
git init
git add .
git commit -m "Zero: Drupal 11.3.3 deployed"

Проверка Zero:

curl -I http://new.site.ru/
# Редирект на /install ✓ (ожидаемо, БД не подключена)

1.3 НАСТРОЙКА → VANILLA

ЧТО: Настроить систему до голого дистрибутива.

Шаг 1: БД

mysql -u root -p
CREATE DATABASE site_db;
CREATE USER 'site_user'@'localhost' IDENTIFIED BY 'SecurePass123';
GRANT ALL ON site_db.* TO 'site_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

echo "[$(date +%Y-%m-%d\ %H:%M)] SETUP: database created" >> DEVLOG.md
git add DEVLOG.md
git commit -m "Setup: database created"

Шаг 2: Установка

cd web
php core/scripts/drupal install standard \
  --db-url=mysql://site_user:SecurePass123@localhost/site_db \
  --site-name="New Site" \
  --account-name=admin \
  --account-pass=Admin123!

curl -I http://new.site.ru/
# HTTP/1.1 200 OK ✓

echo "[$(date +%Y-%m-%d\ %H:%M)] SETUP: Drupal installed" >> ../DEVLOG.md
cd ..
git add sites/default/settings.php DEVLOG.md
git commit -m "Setup: Drupal installed"

Шаг 3: Базовые модули (ТОЛЬКО из коробки)

drush en locale -y

echo "[$(date +%Y-%m-%d\ %H:%M)] SETUP: module locale enabled" >> DEVLOG.md
git add DEVLOG.md
git commit -m "Setup: module locale enabled"

ВАЖНО:
- Только модули из коробки (locale, но НЕ commerce)
- НЕТ custom кода
- НЕТ contrib модулей (пока)
- Vanilla = ГОЛЫЙ ДИСТРИБУТИВ

Проверка Vanilla:

curl -s http://new.site.ru/ | head
# Главная страница ✓

curl -I http://new.site.ru/admin
# HTTP/1.1 200 OK ✓

Записать:

[2026-02-13 03:15] VANILLA: готов голый дистрибутив
✓ Сайт: http://new.site.ru/
✓ Админка: http://new.site.ru/admin
✓ Логин: admin / Admin123!
✓ Модули: ТОЛЬКО locale (из коробки)
✓ НЕТ custom кода
✓ НЕТ contrib модулей
→ VANILLA (голый дистрибутив) готов
Git: commit abc123 "Setup: module locale enabled"

1.4 СОЗДАНИЕ ЭТАЛОННЫХ ДАННЫХ

ЧТО: Создать .credentials.md и .project-config.md

См. раздел 0.4 Эталонные данные в корне

Файл: .credentials.md

# CREDENTIALS: new.site.ru

## База данных
- Host: localhost
- Database: site_db
- User: site_user
- Password: SecurePass123

## Drupal Admin
- Username: admin
- Password: Admin123!

Файл: .project-config.md

# PROJECT CONFIG: new.site.ru

## Окружение
- CMS: Drupal 11.3.3
- PHP: 8.4
- Database: MySQL 8.0

## Переменные
DB_NAME=site_db
DB_USER=site_user
ADMIN_USER=admin

## Credentials
Все пароли см. [.credentials.md](.credentials.md)

Git:

echo ".credentials.md" >> .gitignore
git add .gitignore .project-config.md DEVLOG.md
git commit -m "Setup: project config created"

1.5 BACKUP VANILLA

Уровень: L3 (см. раздел 0.6 Контрольные точки)

ЧТО: Сохранить голый дистрибутив для отката.

# 1. Backup файлов
cd ~/
tar -czf vanilla-$(date +%Y%m%d-%H%M%S).tar.gz new.site.ru/

# 2. Backup БД
mysqldump -u site_user -pSecurePass123 site_db | gzip > vanilla-db.sql.gz

# 3. Сохранить
mkdir -p ~/backups/vanilla
mv vanilla-*.tar.gz ~/backups/vanilla/
mv vanilla-db.sql.gz ~/backups/vanilla/

# 4. Записать
echo "[$(date +%Y-%m-%d\ %H:%M)] BACKUP: L3 vanilla created" >> new.site.ru/DEVLOG.md
echo "  Файлы: ~/backups/vanilla/vanilla-20260213-032000.tar.gz" >> new.site.ru/DEVLOG.md
echo "  БД: ~/backups/vanilla/vanilla-db.sql.gz" >> new.site.ru/DEVLOG.md
echo "  Размер: 45M" >> new.site.ru/DEVLOG.md
echo "  ✓ Проверен" >> new.site.ru/DEVLOG.md
echo "  → Backup L3 готов" >> new.site.ru/DEVLOG.md

cd new.site.ru
git add DEVLOG.md
git commit -m "Vanilla: backup L3 created"

1.6 ВЕРСИЯ v0.0.0 (VANILLA)

ЧТО: Отметить голый дистрибутив как v0.0.0

git tag -a v0.0.0 -m "Vanilla: clean Drupal 11.3.3"

echo "" >> DEVLOG.md
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" >> DEVLOG.md
echo "[$(date +%Y-%m-%d\ %H:%M)] VERSION: v0.0.0 (Vanilla)" >> DEVLOG.md
echo "  Состояние: Голый дистрибутив Drupal 11.3.3" >> DEVLOG.md
echo "  Модули: locale (из коробки)" >> DEVLOG.md
echo "  Custom код: НЕТ" >> DEVLOG.md
echo "  Contrib модули: НЕТ" >> DEVLOG.md
echo "  ✓ Готово к разработке" >> DEVLOG.md
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" >> DEVLOG.md

git add DEVLOG.md
git commit -m "Vanilla: version v0.0.0 tagged"

ИТОГО PATH A (ЧЕКЛИСТ)

СОЗДАНИЕ НОВОГО ПРОЕКТА:

□ 1.1 Проверка инфраструктуры (→ 0.0)
    ✓ Стек выбран и установлен

□ 1.2 Zero
    ✓ Система развёрнута
    ✓ git commit "Zero"

□ 1.3 Vanilla
    ✓ БД подключена
    ✓ Система установлена
    ✓ Базовые модули (из коробки)
    ✓ НЕТ custom кода
    ✓ НЕТ contrib
    ✓ git commit каждый шаг

□ 1.4 Эталонные данные (→ 0.4)
    ✓ .credentials.md
    ✓ .project-config.md
    ✓ git commit

□ 1.5 Backup L3
    ✓ tar.gz + sql.gz
    ✓ Проверен
    ✓ git commit

□ 1.6 Версия v0.0.0
    ✓ git tag v0.0.0
    ✓ Записано в DEVLOG

→ VANILLA (голый дистрибутив) ГОТОВ
→ Можно разрабатывать (v0.1.0+)

PART 2: ОНБОРДИНГ СУЩЕСТВУЮЩЕГО ПРОЕКТА (PATH B)

ЦЕЛЬ: Завести готовый проект на наш сервер и подготовить к работе.

ВАЖНО: Онбординг НЕ даёт Vanilla. Vanilla = только голый дистрибутив.

ЭТАПЫ:

Получение → Анализ → Развёртывание → Онбординг (v1.0.0) → Backup → Работа

2.1 ПРОВЕРКА ИНФРАСТРУКТУРЫ

См. раздел 0.0 Проверка инфраструктуры

Особенность PATH B:
- Проект диктует требования
- Мы подстраиваем инфру под проект (НЕ наоборот!)

Пример:

# Узнать требования
cat composer.json | grep "php"
# "php": ">=8.1"

# Проверить наш стек
php -v
# PHP 8.4 ✓ (>= 8.1)

# Записать
echo "[$(date +%Y-%m-%d\ %H:%M)] INFRA CHECK (PATH B)" >> DEVLOG.md
echo "  Требуется: PHP >=8.1" >> DEVLOG.md
echo "  Есть: PHP 8.4" >> DEVLOG.md
echo "  ✓ Совместимо" >> DEVLOG.md
echo "  → ГОТОВО для онбординга" >> DEVLOG.md

2.2 ПОЛУЧЕНИЕ ПРОЕКТА

Способы:

A) Git clone:

git clone https://github.com/user/project.git existing-project
cd existing-project

echo "[$(date +%Y-%m-%d\ %H:%M)] PROJECT: cloned from git" >> DEVLOG.md
echo "  Source: https://github.com/user/project.git" >> DEVLOG.md
echo "  Commit: $(git rev-parse HEAD)" >> DEVLOG.md

B) Копирование:

scp user@old-server:/var/www/project.tar.gz ~/
tar -xzf project.tar.gz
mv project existing-project

echo "[$(date +%Y-%m-%d\ %H:%M)] PROJECT: copied from server" >> existing-project/DEVLOG.md
echo "  Source: user@old-server:/var/www/project" >> existing-project/DEVLOG.md

2.3 АНАЛИЗ ПРОЕКТА

ЧТО узнать:
- CMS/Framework?
- Зависимости?
- Модули?
- Конфиги?

cd ~/existing-project

# Тип
ls -la
# composer.json → PHP (Drupal/Laravel)

# Зависимости
cat composer.json | grep -A 20 "require"

# Создать документ анализа
cat > ANALYSIS.md << 'EOF'
# PROJECT ANALYSIS

## Тип
- CMS: Drupal 10.2
- PHP: >=8.1

## Модули (contrib)
- commerce: 2.35
- token
- pathauto

## Модули (custom)
- custom_shop
- custom_sync

## База данных
- Дамп: dump.sql (150MB)

## Документация
- README.md (минимальная)
EOF

git add ANALYSIS.md DEVLOG.md
git commit -m "Setup: project analysis completed"

2.4 РАЗВЁРТЫВАНИЕ НА ТЕСТЕ

ПРАВИЛО: ВСЕГДА сначала тест, НИКОГДА сразу прод.

# 1. Зависимости
composer install --no-dev

echo "[$(date +%Y-%m-%d\ %H:%M)] SETUP: dependencies installed" >> DEVLOG.md
git add composer.lock DEVLOG.md
git commit -m "Setup: dependencies installed"

# 2. БД
mysql -u root -p
CREATE DATABASE existing_db;
CREATE USER 'existing_user'@'localhost' IDENTIFIED BY 'Pass456';
GRANT ALL ON existing_db.* TO 'existing_user'@'localhost';
EXIT;

mysql -u existing_user -pPass456 existing_db < dump.sql

echo "[$(date +%Y-%m-%d\ %H:%M)] SETUP: database imported" >> DEVLOG.md
git add DEVLOG.md
git commit -m "Setup: database imported"

# 3. Конфиг БД
vim sites/default/settings.php
# Прописать $databases

echo "[$(date +%Y-%m-%d\ %H:%M)] SETUP: database configured" >> DEVLOG.md
git add sites/default/settings.php DEVLOG.md
git commit -m "Setup: database configured"

# 4. Nginx
sudo vim /etc/nginx/sites-available/test.existing.ru
sudo nginx -t
sudo systemctl reload nginx

echo "[$(date +%Y-%m-%d\ %H:%M)] SETUP: web server configured" >> DEVLOG.md

Проверка:

curl -I http://test.existing.ru/
# HTTP/1.1 200 OK ✓

drush status
# Drupal: 10.2.8 ✓
# Database: Connected ✓

Записать:

[2026-02-13 03:45] SETUP: deployment completed
✓ Сайт: http://test.existing.ru/
✓ Админка: http://test.existing.ru/admin
✓ БД подключена
✓ Модули работают
→ Проект развёрнут на тесте

2.5 СОЗДАНИЕ ЭТАЛОННЫХ ДАННЫХ

См. раздел 0.4 Эталонные данные в корне

Файл: .credentials.md

# CREDENTIALS: existing-project

## База данных
- Host: localhost
- Database: existing_db
- User: existing_user
- Password: Pass456

## Drupal Admin
- Username: admin
- Password: [см. старый сервер]

## Источник (справка)
- Старый сервер: old-server.com
- Старый путь: /var/www/project

Файл: .project-config.md

# PROJECT CONFIG: existing-project

## Источник
- Клонирован: 2026-02-13
- Старый сервер: old-server.com (справка)

## Окружение
- CMS: Drupal 10.2.8
- PHP: 8.4
- Database: MySQL 8.0

## Домены
- Test: http://test.existing.ru/
- Production: [будет позже]

## Переменные
DB_NAME=existing_db
DB_USER=existing_user
echo ".credentials.md" >> .gitignore
git add .gitignore .project-config.md DEVLOG.md
git commit -m "Setup: project config created"

2.6 ОЧИСТКА

# Кеш
drush cr

# Временные файлы
find . -name "*.log" -delete
rm -rf sites/default/files/tmp/*

# Проверка
curl -I http://test.existing.ru/
# HTTP/1.1 200 OK ✓

echo "[$(date +%Y-%m-%d\ %H:%M)] SETUP: cleanup completed" >> DEVLOG.md
git add -A
git commit -m "Setup: cleanup completed"

2.7 BACKUP ОНБОРДИНГА

Уровень: L4 (весь проект, см. раздел 0.6)

ВАЖНО: Это НЕ vanilla backup! Это backup рабочего проекта после онбординга.

cd ~/
tar -czf onboarding-$(date +%Y%m%d-%H%M%S).tar.gz existing-project/
mysqldump -u existing_user -pPass456 existing_db | gzip > onboarding-db.sql.gz

mkdir -p ~/backups/onboarding
mv onboarding-*.tar.gz ~/backups/onboarding/
mv onboarding-db.sql.gz ~/backups/onboarding/

echo "[$(date +%Y-%m-%d\ %H:%M)] BACKUP: L4 onboarding completed" >> existing-project/DEVLOG.md
echo "  Файлы: ~/backups/onboarding/onboarding-20260213-035500.tar.gz" >> existing-project/DEVLOG.md
echo "  БД: ~/backups/onboarding/onboarding-db.sql.gz" >> existing-project/DEVLOG.md
echo "  ✓ НЕ vanilla (рабочий проект)" >> existing-project/DEVLOG.md
echo "  → Backup L4 готов" >> existing-project/DEVLOG.md

cd existing-project
git add DEVLOG.md
git commit -m "Setup: backup L4 (onboarding) created"

2.8 ВЕРСИЯ (ОНБОРДИНГ)

ЕСЛИ есть версия в проекте:

git tag
# v2.3.1 ← сохраняем существующую

echo "[$(date +%Y-%m-%d\ %H:%M)] VERSION: onboarding at v2.3.1" >> DEVLOG.md
echo "  Онбординг завершён" >> DEVLOG.md
echo "  Версия проекта сохранена" >> DEVLOG.md

ЕСЛИ НЕТ версии:

git tag -a v1.0.0 -m "Onboarding: project ready for work"

echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" >> DEVLOG.md
echo "[$(date +%Y-%m-%d\ %H:%M)] VERSION: v1.0.0 (Onboarding)" >> DEVLOG.md
echo "  Состояние: Онбординг завершён" >> DEVLOG.md
echo "  НЕ vanilla (рабочий проект)" >> DEVLOG.md
echo "  Test: http://test.existing.ru/" >> DEVLOG.md
echo "  ✓ Готово к работе" >> DEVLOG.md
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" >> DEVLOG.md

git add DEVLOG.md
git commit -m "Setup: version v1.0.0 (onboarding completed)"

ИТОГО PATH B (ЧЕКЛИСТ)

ОНБОРДИНГ СУЩЕСТВУЮЩЕГО ПРОЕКТА:

□ 2.1 Проверка инфраструктуры (→ 0.0)
    ✓ Требования проекта известны
    ✓ Наш стек совместим

□ 2.2 Получение
    ✓ Git clone / scp
    ✓ Дамп БД получен

□ 2.3 Анализ
    ✓ ANALYSIS.md создан
    ✓ Зависимости известны

□ 2.4 Развёртывание на тесте
    ✓ composer install
    ✓ БД импортирована
    ✓ Конфиг настроен
    ✓ Сайт работает
    ✓ git commit каждый шаг

□ 2.5 Эталонные данные (→ 0.4)
    ✓ .credentials.md
    ✓ .project-config.md
    ✓ git commit

□ 2.6 Очистка
    ✓ Кеш, временные файлы
    ✓ Проверка

□ 2.7 Backup L4
    ✓ tar.gz + sql.gz
    ✓ НЕ vanilla (рабочий проект)
    ✓ git commit

□ 2.8 Версия
    ✓ Сохранена существующая ИЛИ v1.0.0
    ✓ Записано в DEVLOG

→ ОНБОРДИНГ ЗАВЕРШЁН
→ Можно работать (v1.1.0+)

PART 3: ЕЖЕДНЕВНАЯ РАБОТА

TODO: Будет добавлено позже.


ССЫЛКИ


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