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

type: standard
aspect: process
title: "ИНИЦИАЛИЗАЦИЯ IT ПРОЕКТА"
version: 1.0.0
date: 2026-02-19
status: active


ИНИЦИАЛИЗАЦИЯ IT ПРОЕКТА

Версия: 2.1.0
Дата: 2026-02-14
Назначение: Детальное руководство по созданию нового проекта (PATH A) и онбордингу существующего (PATH B) + аудит и рефакторинг


НАВИГАЦИЯ

Основы: IT_PROJECTS.md
Операции: PROJECT_OPS.md
Разработка: PROJECT_DEV.md


СОДЕРЖАНИЕ

ЧАСТЬ 1: ПОНЯТИЯ
├── 1.1 Три состояния проекта
├── 1.2 Два пути (PATH A vs PATH B)
├── 1.3 Версионирование
└── 1.4 Эталонные данные в корне

ЧАСТЬ 2: PATH A — СОЗДАНИЕ С НУЛЯ
├── 2.1 Проверка инфраструктуры
├── 2.2 Создание Zero
├── 2.3 Настройка → Vanilla
├── 2.4 Создание эталонных данных
├── 2.5 Создание Vanilla backup (L3)
└── 2.6 Готово к разработке

ЧАСТЬ 3: PATH B — ОНБОРДИНГ
├── 3.1 Проверка инфраструктуры
├── 3.2 Получение проекта
├── 3.3 Анализ проекта
├── 3.4 Развёртывание на тесте
├── 3.5 Онбординг → v1.0.0
├── 3.6 Создание эталонных данных
└── 3.7 Backup онбординга

ЧАСТЬ 4: АУДИТ И РЕФАКТОРИНГ
├── 4.1 Чеклист аудита проекта
├── 4.2 Типичные проблемы
├── 4.3 Когда нужен рефакторинг
├── 4.4 Алгоритм рефакторинга
├── 4.5 Чеклист после рефакторинга
└── 4.6 Регулярный аудит

ЧАСТЬ 1: ПОНЯТИЯ

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

ZERO         VANILLA           WORKING          PRODUCTION
─────────    ──────────────    ─────────────    ─────────────
Установлено  Голый дистрибутив Версии с кодом  Релиз в проде
НЕ работает  v0.0.0            v0.1.0+          v1.0.0+
БД нет       БД есть           Custom модули    Стабильно

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

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

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


1.2 ДВА ПУТИ

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! Это рабочий проект

Ключевая разница:
- PATH A → получаем Vanilla (чистый дистрибутив)
- PATH B → получаем Working project (уже с кодом)


Новая версия vs Новый проект

НОВАЯ ВЕРСИЯ (эволюция):

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

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

Проект А (Drupal 10) → завершён
            ↓
Проект Б (Drupal 11) → PATH A заново
           ↑
    НОВАЯ vanilla v0.0.0

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

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


1.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): Баг-фикс


1.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, добавить в .gitignore)

# 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!)


ЧАСТЬ 2: PATH A — СОЗДАНИЕ С НУЛЯ

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

ЭТАПЫ:

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

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

Что проверить:

# 1. Диск
df -h
# Нужно: минимум 10GB свободно

# 2. PHP
php -v
# Нужно: 8.1+ (рекомендуется 8.4)

# 3. База данных
mysql --version
# Нужно: MySQL 8.0+ или MariaDB 10.6+

# 4. Веб-сервер
nginx -v
# Нужно: nginx 1.20+

# 5. Composer
composer --version
# Нужно: 2.x

Записать проверку:

cat > DEVLOG.md << 'EOF'
# DEVLOG: {project_name}

## [INFRA CHECK] 2026-02-13 03:00

✓ PHP 8.4
✓ MySQL 8.0
✓ nginx 1.24
✓ Composer 2.7
✓ Диск: 45GB свободно

→ ГОТОВО для создания проекта
EOF

Если не хватает ресурсов:
→ См. PROJECT_OPS.md


2.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. Записать
cat >> DEVLOG.md << 'EOF'

## [ZERO] 2026-02-13 03:05

Drupal deployed:
- Версия: 11.3.3
- Путь: ~/new.site.ru
- ✓ Файлы на месте
→ ZERO создан (БД не подключена)
EOF

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

Проверка Zero:

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

Статус:
- ✓ Система развёрнута
- ⏳ БД не подключена
- ⏳ Система НЕ работает
- → Следующий шаг: подключить БД


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

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

Шаг 1: Создать БД

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

cat >> DEVLOG.md << 'EOF'

## [SETUP] 2026-02-13 03:10

Database created:
- DB: site_db
- User: site_user
✓ Готово
EOF

git add DEVLOG.md
git commit -m "Setup: database created"

Шаг 2: Установить CMS

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 ✓

cd ..
cat >> DEVLOG.md << 'EOF'

## [SETUP] 2026-02-13 03:12

Drupal installed:
- Сайт: http://new.site.ru/
- Админка: http://new.site.ru/admin
- Логин: admin / Admin123!
✓ Система работает
EOF

git add sites/default/settings.php DEVLOG.md
git commit -m "Setup: Drupal installed"

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

# Включить ТОЛЬКО модули из дистрибутива
drush en locale -y

cat >> DEVLOG.md << 'EOF'

## [SETUP] 2026-02-13 03:15

Module enabled:
- locale (из коробки)
✓ Готово
EOF

git add DEVLOG.md
git commit -m "Setup: module locale enabled"

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

Проверка Vanilla:

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

# Админка доступна
curl -I http://new.site.ru/admin
# HTTP/1.1 200 OK ✓

# Только базовые модули
drush pml --status=enabled --no-core | wc -l
# 1 (только locale) ✓

Записать Vanilla:

cat >> DEVLOG.md << 'EOF'

## [v0.0.0] VANILLA — 2026-02-13 03:20

✓ Сайт: http://new.site.ru/
✓ Админка: http://new.site.ru/admin
✓ Логин: admin / Admin123!
✓ Модули: ТОЛЬКО locale (из коробки)
✓ НЕТ custom кода
✓ НЕТ contrib модулей

→ VANILLA (голый дистрибутив) готов

ОТКАТ:
git checkout v0.0.0
EOF

git add DEVLOG.md
git commit -m "Vanilla: v0.0.0 готов"
git tag v0.0.0
git push origin --tags

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

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

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

cat > .credentials.md << 'EOF'
# CREDENTIALS: new.site.ru

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

## CMS Admin
- Username: admin
- Password: Admin123!
EOF

# Добавить в .gitignore
echo ".credentials.md" >> .gitignore

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

cat > .project-config.md << 'EOF'
# PROJECT CONFIG: new.site.ru

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

## Домены
- Production: site.ru
- Development: new.site.ru

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

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

git add .gitignore .project-config.md DEVLOG.md
git commit -m "Config: эталонные данные созданы"

2.5 СОЗДАНИЕ VANILLA BACKUP (L3)

ЧТО: Сохранить контрольную точку Vanilla для отката.

# 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-$(date +%Y%m%d-%H%M%S).sql.gz"

# 3. Записать
cd new.site.ru
cat >> DEVLOG.md << 'EOF'

## [BACKUP L3] 2026-02-13 03:25

Vanilla backup created:
- Files: ~/vanilla-20260213-032500.tar.gz
- DB: ~/vanilla-db-20260213-032500.sql.gz
✓ Контрольная точка Vanilla готова

ОТКАТ:
cd ~/
tar -xzf vanilla-20260213-032500.tar.gz
gunzip -c vanilla-db-20260213-032500.sql.gz | mysql -u site_user -pSecurePass123 site_db
EOF

git add DEVLOG.md
git commit -m "Backup: Vanilla L3 создан"

Хранение:

~/
├── new.site.ru/                     ← Рабочий проект
├── vanilla-20260213-032500.tar.gz   ← L3 backup (файлы)
└── vanilla-db-20260213-032500.sql.gz ← L3 backup (БД)

Детали backup: PROJECT_OPS.md


2.6 ГОТОВО К РАЗРАБОТКЕ

Checklist:
- [x] Zero создан
- [x] Vanilla настроен (v0.0.0)
- [x] Эталонные данные созданы (.credentials.md, .project-config.md)
- [x] Backup L3 создан
- [x] Git тег v0.0.0
- [x] DEVLOG заполнен

Статус Vanilla:

VANILLA v0.0.0 — Готов к разработке

✓ Сайт работает: http://new.site.ru/
✓ Админка доступна
✓ Backup L3 есть
✓ Git: v0.0.0

→ Следующий шаг: разработка (v0.1.0+)
→ См. [PROJECT_DEV.md](PROJECT_DEV.md)

Для начала разработки:
1. Прочитать PROJECT_OPS.md (окружения, deployment)
2. Определить режим работы (полный цикл / быстрый)
3. Создать первую фичу → v0.1.0


ЧАСТЬ 3: PATH B — ОНБОРДИНГ

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

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

ЭТАПЫ:

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

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

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

Проверка:

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

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

# 3. Записать
cat > DEVLOG.md << 'EOF'
# DEVLOG: existing-project

## [INFRA CHECK] 2026-02-13 10:00

Требования проекта:
- PHP: >=8.1
- MySQL: >=5.7

Наш стек:
- PHP: 8.4 ✓
- MySQL: 8.0 ✓

→ Совместимо, готово для онбординга
EOF

Если несовместимо:
→ Установить нужные версии ПЕРЕД онбордингом


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

Способ A: Git clone

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

cat >> DEVLOG.md << 'EOF'

## [PROJECT] 2026-02-13 10:05

Cloned from git:
- Source: https://github.com/user/project.git
- Commit: 7f3a891
EOF

git add DEVLOG.md
git commit -m "Onboarding: project cloned"

Способ B: Копирование с сервера

# На удалённом сервере
cd /var/www/
tar -czf project-backup-$(date +%Y%m%d).tar.gz project/

# На нашем сервере
scp user@old-server:/var/www/project-backup-20260213.tar.gz ~/
tar -xzf project-backup-20260213.tar.gz
mv project existing-project

cd existing-project
cat > DEVLOG.md << 'EOF'
# DEVLOG: existing-project

## [PROJECT] 2026-02-13 10:10

Copied from server:
- Source: user@old-server:/var/www/project
- Archive: project-backup-20260213.tar.gz
EOF

git init
git add .
git commit -m "Onboarding: project copied"

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

ЧТО узнать:
- CMS/Framework?
- Зависимости?
- Модули (contrib + custom)?
- Конфиги?
- БД?

Анализ:

cd ~/existing-project

# Тип проекта
ls -la
# composer.json → PHP (Drupal/Laravel)

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

# Модули
ls modules/contrib/
ls modules/custom/

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

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

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

## Модули (custom)
- custom_shop (магазин)
- custom_sync (синхронизация с 1С)

## База данных
- Дамп: dump.sql (150MB)
- Таблицы: ~120

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

cat >> DEVLOG.md << 'EOF'

## [ANALYSIS] 2026-02-13 10:15

Project analyzed:
- Drupal 10.2
- 3 contrib + 2 custom модуля
- DB: 150MB
✓ См. ANALYSIS.md
EOF

git add ANALYSIS.md DEVLOG.md
git commit -m "Onboarding: project analyzed"

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

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

Шаг 1: Зависимости

composer install --no-dev

cat >> DEVLOG.md << 'EOF'

## [SETUP] 2026-02-13 10:20

Dependencies installed:
- composer install completed
✓ vendor/ готов
EOF

git add composer.lock DEVLOG.md
git commit -m "Setup: dependencies installed"

Шаг 2: База данных

# Создать БД
mysql -u root -p
CREATE DATABASE existing_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'existing_user'@'localhost' IDENTIFIED BY 'Pass456';
GRANT ALL PRIVILEGES ON existing_db.* TO 'existing_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

# Импортировать дамп
mysql -u existing_user -pPass456 existing_db < dump.sql

cat >> DEVLOG.md << 'EOF'

## [SETUP] 2026-02-13 10:25

Database imported:
- DB: existing_db
- Size: 150MB
- Tables: ~120
✓ Готово
EOF

git add DEVLOG.md
git commit -m "Setup: database imported"

Шаг 3: Конфигурация БД

vim sites/default/settings.php
# Прописать $databases

cat >> DEVLOG.md << 'EOF'

## [SETUP] 2026-02-13 10:30

Database configured:
- settings.php обновлён
✓ Готово
EOF

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 ln -s /etc/nginx/sites-available/test.existing.ru \
            /etc/nginx/sites-enabled/

sudo nginx -t
sudo systemctl reload nginx

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

cat >> DEVLOG.md << 'EOF'

## [SETUP] 2026-02-13 10:35

Nginx configured:
- Domain: test.existing.ru
- Config: /etc/nginx/sites-available/test.existing.ru
✓ Сайт доступен
EOF

git add DEVLOG.md
git commit -m "Setup: nginx configured"

Шаг 5: Проверка работоспособности

# Главная
curl -s http://test.existing.ru/ | grep "<title>"
# <title>Existing Site</title> ✓

# Админка
curl -I http://test.existing.ru/admin
# HTTP/1.1 200 OK ✓

# Модули
drush pml --status=enabled | grep custom
# custom_shop ✓
# custom_sync ✓

cat >> DEVLOG.md << 'EOF'

## [TEST] 2026-02-13 10:40

Работоспособность проверена:
✓ Главная страница работает
✓ Админка доступна
✓ Custom модули активны

→ Готово к онбордингу
EOF

git add DEVLOG.md
git commit -m "Test: workability verified"

3.5 ОНБОРДИНГ → v1.0.0

ЧТО: Зафиксировать текущее состояние как v1.0.0.

cat >> DEVLOG.md << 'EOF'

## [v1.0.0] ONBOARDING — 2026-02-13 10:45

Проект завершён:
✓ Развёрнут на test.existing.ru
✓ БД импортирована
✓ Модули работают
✓ Тесты пройдены

→ ОНБОРДИНГ завершён
→ Это НЕ vanilla, это рабочий проект

ОТКАТ:
git checkout v1.0.0
mysqldump existing_db > onboarding-backup.sql
EOF

git add DEVLOG.md
git commit -m "Onboarding: v1.0.0 завершён"
git tag v1.0.0
git push origin --tags

⚠️ ВАЖНО:
- v1.0.0 = онбординг завершён
- Это НЕ vanilla (это рабочий проект с кодом)
- Vanilla = только при PATH A


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

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

cat > .credentials.md << 'EOF'
# CREDENTIALS: existing-project

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

## CMS Admin
- Username: admin
- Password: [получить из БД или у клиента]
EOF

echo ".credentials.md" >> .gitignore

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

cat > .project-config.md << 'EOF'
# PROJECT CONFIG: existing-project

## Окружение
- CMS: Drupal 10.2
- PHP: 8.1+
- Database: MySQL 8.0

## Домены
- Production: existing.ru
- Test: test.existing.ru

## Переменные
DB_NAME=existing_db
DB_USER=existing_user

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

git add .gitignore .project-config.md DEVLOG.md
git commit -m "Config: эталонные данные созданы"

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

ЧТО: Сохранить контрольную точку онбординга.

# 1. Backup файлов
cd ~/
tar -czf "onboarding-$(date +%Y%m%d-%H%M%S).tar.gz" existing-project/

# 2. Backup БД
mysqldump -u existing_user -pPass456 existing_db | \
  gzip > "onboarding-db-$(date +%Y%m%d-%H%M%S).sql.gz"

# 3. Записать
cd existing-project
cat >> DEVLOG.md << 'EOF'

## [BACKUP] 2026-02-13 10:50

Onboarding backup created:
- Files: ~/onboarding-20260213-105000.tar.gz
- DB: ~/onboarding-db-20260213-105000.sql.gz
✓ Контрольная точка готова

ОТКАТ:
cd ~/
tar -xzf onboarding-20260213-105000.tar.gz
gunzip -c onboarding-db-20260213-105000.sql.gz | mysql -u existing_user -pPass456 existing_db
EOF

git add DEVLOG.md
git commit -m "Backup: onboarding backup создан"

3.8 ГОТОВО К РАБОТЕ

Checklist:
- [x] Проект получен
- [x] Анализ завершён (ANALYSIS.md)
- [x] Развёрнут на тесте
- [x] Работоспособность проверена
- [x] Онбординг → v1.0.0
- [x] Эталонные данные созданы
- [x] Backup создан
- [x] DEVLOG заполнен

Статус:

ONBOARDING v1.0.0 — Готов к работе

✓ Сайт: http://test.existing.ru/
✓ Модули работают
✓ Backup есть
✓ Git: v1.0.0

→ Следующий шаг: работа над проектом (v1.1.0+)
→ См. [PROJECT_DEV.md](PROJECT_DEV.md)

Для начала работы:
1. Прочитать PROJECT_OPS.md (окружения, deployment)
2. Определить режим (полный / быстрый цикл)
3. Начать разработку → v1.1.0


ЧАСТЬ 4: АУДИТ И РЕФАКТОРИНГ

ЦЕЛЬ: Периодически проверять правильность ведения проекта и проводить рефакторинг.

КОГДА ПРОВЕРЯТЬ:
- Раз в месяц (регулярный аудит)
- Перед релизом в production
- После онбординга нового члена команды
- Когда код стал сложно поддерживать
- Накопился технический долг


4.1 ЧЕКЛИСТ АУДИТА ПРОЕКТА

Проверка структуры:

# Эталонные данные в корне
[ ] .credentials.md существует (НЕ в git)
[ ] .project-config.md существует (в git)
[ ] PROJECT.md актуален
[ ] DEVLOG.md ведётся (последняя запись < 7 дней)

# Git
[ ] Все изменения закоммичены
[ ] Теги версий есть (v0.x.x, v1.x.x)
[ ] .gitignore содержит .credentials.md
[ ] Нет vendor/ в git (для Composer)
[ ] Нет node_modules/ в git (для npm)

# Backup
[ ] Vanilla backup есть (L3)  PATH A
[ ] Onboarding backup есть  PATH B
[ ] Backup < 30 дней (свежий)

# Код
[ ] НЕТ изменений в core/ (Drupal)
[ ] НЕТ изменений в vendor/
[ ] Кастомный код в modules/custom/ или themes/custom/
[ ] Нет закомментированного кода (> 10 строк)
[ ] Нет TODO старше месяца

Команды для проверки:

# 1. Структура
ls -la .credentials.md .project-config.md PROJECT.md DEVLOG.md
# Все файлы есть ✓

# 2. Git статус
git status
# nothing to commit, working tree clean ✓

git tag
# v0.0.0, v0.1.0, v1.0.0 ✓

# 3. Последний commit в DEVLOG
git log -1 --format="%ai" DEVLOG.md
# 2026-02-10 (< 7 дней) ✓

# 4. Изменения в core
git log --oneline --all -- core/ vendor/
# (пусто) ✓

# 5. Backup vanilla
ls -lt ~/backups/vanilla/ | head -5
# vanilla-20260210.tar.gz (свежий) ✓

# 6. Закомментированный код
grep -r "^[[:space:]]*#.*TODO" modules/custom/ | wc -l
# Если > 10 → разобрать

4.2 ТИПИЧНЫЕ ПРОБЛЕМЫ

Проблема 1: DEVLOG не ведётся

Симптом:

git log -1 --format="%ai" DEVLOG.md
# 2025-12-15 ← 2 месяца назад!

Решение:

# Восстановить DEVLOG из git истории
git log --oneline --since="2025-12-15" > /tmp/commits.txt

# Вручную добавить записи в DEVLOG.md
vim DEVLOG.md
# Заполнить пропущенные действия

git add DEVLOG.md
git commit -m "Docs: восстановлен DEVLOG за 2 месяца"

Проблема 2: Нет эталонных данных

Симптом:

ls .credentials.md .project-config.md
# No such file or directory

Решение:

# Создать эталонные данные
# См. раздел 1.4 или 2.4 (PATH A/B)

cat > .credentials.md << 'EOF'
# CREDENTIALS: project_name
...
EOF

cat > .project-config.md << 'EOF'
# PROJECT CONFIG: project_name
...
EOF

echo ".credentials.md" >> .gitignore
git add .gitignore .project-config.md
git commit -m "Config: эталонные данные созданы"

Проблема 3: Изменения в core

Симптом:

git log --oneline --all -- core/
# abc1234 Fix: изменён core файл ← ПЛОХО!

Решение:

# 1. Откатить изменения core
git revert abc1234

# 2. Исправить проблему ПРАВИЛЬНО (в custom коде)
# Например: hook_form_alter вместо патча core

git add modules/custom/
git commit -m "Fix: перенесено из core в custom hook"

Проблема 4: Нет vanilla backup (PATH A)

Симптом:

ls ~/backups/vanilla/
# (пусто)

Решение:

# ВНИМАНИЕ: Если проект уже v1.x.x (в production)
# → Vanilla backup создать НЕЛЬЗЯ (уже не vanilla)

# ЕСЛИ ещё v0.x.x → откатиться к v0.0.0 → backup
git checkout v0.0.0
cd ~/
tar -czf "backups/vanilla/vanilla-$(date +%Y%m%d-%H%M%S).tar.gz" project/
git checkout master  # вернуться

# ЕСЛИ v1.x.x → создать onboarding backup (не vanilla)
cd ~/
tar -czf "backups/onboarding-$(date +%Y%m%d-%H%M%S).tar.gz" project/

4.3 КОГДА НУЖЕН РЕФАКТОРИНГ

Признаки технического долга:

Признак Критичность Действие
Код дублируется >3 раз 🟡 Средняя Вынести в функцию
Функция >100 строк 🟡 Средняя Разбить на мелкие
TODO >1 месяца 🟡 Средняя Сделать или удалить
Нет тестов 🟠 Высокая Добавить тесты
Закомментированный код >50 строк 🟠 Высокая Удалить
Изменения в core 🔴 Критично Откатить + переделать
Нет DEVLOG >2 месяцев 🔴 Критично Восстановить
Нет backup 🔴 Критично Создать немедленно

Когда планировать рефакторинг:
- Накопилось >5 🟡 средних проблем
- Есть хотя бы 1 🔴 критичная
- Код стал сложно поддерживать
- Новые фичи занимают в 2× дольше


4.4 АЛГОРИТМ РЕФАКТОРИНГА

ПРАВИЛО: Рефакторинг = как разработка (backup → изменение → проверка → commit)

Шаги:

1. АУДИТ
    Чеклист 4.1
    Список проблем

2. ПРИОРИТИЗАЦИЯ
    Критичные (🔴)  сначала
    Высокие (🟠)  потом
    Средние (🟡)  по времени

3. BACKUP (L4)
    Полный backup проекта
    ПЕРЕД началом рефакторинга

4. РЕФАКТОРИНГ ПО ЧАСТЯМ
    Один модуль/файл за раз
    Проверка после каждого
    Git commit после каждого

5. ТЕСТЫ
    Проверить работоспособность
    Ничего не сломалось

6. DEVLOG + GIT TAG
    Записать что сделано
    Новая версия (v1.x.x  v1.x+1.0)

Пример:

# 1. АУДИТ
cat > /tmp/audit.md << 'EOF'
AUDIT RESULTS: 2026-02-14

ПРОБЛЕМЫ:
- 🔴 Нет DEVLOG 2 месяца
- 🟠 Нет тестов
- 🟡 Дублирование кода в 3 файлах

ПЛАН:
1. Восстановить DEVLOG (🔴)
2. Добавить базовые тесты (🟠)
3. Вынести дубли в функцию (🟡)
EOF

# 2. BACKUP (L4)
cd ~/
tar -czf "$INFRA/backups/before-refactor-$(date +%Y%m%d-%H%M%S).tar.gz" \
  project/

# 3. РЕФАКТОРИНГ ЧАСТЬ 1: DEVLOG
cd ~/project
git log --oneline --since="2025-12-01" > /tmp/commits.txt
vim DEVLOG.md  # заполнить пропуски

git add DEVLOG.md
git commit -m "Docs: восстановлен DEVLOG"

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

# 4. РЕФАКТОРИНГ ЧАСТЬ 2: Тесты
vim modules/custom/my_module/tests/MyModuleTest.php
# Добавить базовые тесты

git add modules/custom/my_module/tests/
git commit -m "Test: добавлены базовые тесты для my_module"

# Запустить
./vendor/bin/phpunit modules/custom/my_module/tests/
# OK (5 tests, 10 assertions) ✓

# 5. РЕФАКТОРИНГ ЧАСТЬ 3: Дубли
vim modules/custom/my_module/src/Helpers.php
# Вынести дублирующийся код

git add modules/custom/
git commit -m "Refactor: вынесены дубли в Helpers::commonFunction()"

# Проверка
./vendor/bin/phpunit
# OK ✓

# 6. ИТОГ
cat >> DEVLOG.md << 'EOF'

## [v1.2.0] REFACTOR — 2026-02-14

Выполнен рефакторинг:
✓ DEVLOG восстановлен за 2 месяца
✓ Добавлены базовые тесты (5 tests)
✓ Вынесены дубли в Helpers

BACKUP:
before-refactor-20260214-100000.tar.gz

→ Версия v1.2.0
EOF

git add DEVLOG.md
git commit -m "Refactor: завершён рефакторинг v1.2.0"
git tag v1.2.0
git push origin --tags

4.5 ЧЕКЛИСТ ПОСЛЕ РЕФАКТОРИНГА

Проверка работоспособности:

# Тесты
./vendor/bin/phpunit
# OK ✓

# Сайт работает
curl -I http://site.ru/
# HTTP/1.1 200 OK ✓

# Админка доступна
curl -I http://site.ru/admin
# HTTP/1.1 200 OK ✓

# Нет ошибок в логах
tail -50 /var/log/apache2/error.log
# (пусто или только warnings) ✓

Чеклист:
- [ ] Все тесты проходят
- [ ] Сайт работает
- [ ] Админка доступна
- [ ] Нет критичных ошибок в логах
- [ ] DEVLOG обновлён
- [ ] Git commit + tag
- [ ] Backup рефакторинга создан

Если что-то сломалось:

# ОТКАТ к backup перед рефакторингом
cd ~/
rm -rf project/
tar -xzf $INFRA/backups/before-refactor-20260214-100000.tar.gz

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

# Записать
cat >> DEVLOG.md << 'EOF'

## [ROLLBACK] 2026-02-14

Рефакторинг откачен:
- Причина: сломались тесты
- Backup: before-refactor-20260214-100000.tar.gz
✓ Откат выполнен
→ Попробовать рефакторинг по-другому
EOF

git add DEVLOG.md
git commit -m "Rollback: рефакторинг откачен"

4.6 РЕГУЛЯРНЫЙ АУДИТ

ПРАВИЛО: Аудит раз в месяц (или перед релизом).

Процесс:

# Создать файл аудита
cat > /tmp/audit-$(date +%Y-%m).md << 'EOF'
# PROJECT AUDIT: $(date +%Y-%m)

## Чеклист
- [ ] Эталонные данные на месте
- [ ] DEVLOG актуален
- [ ] Git теги есть
- [ ] Backup свежий (< 30 дней)
- [ ] Нет изменений в core
- [ ] Нет TODO > 1 месяца
- [ ] Тесты проходят

## Проблемы
(заполнить)

## План действий
(заполнить)
EOF

# Выполнить чеклист
vim /tmp/audit-$(date +%Y-%m).md

# Сохранить в проект
mv /tmp/audit-$(date +%Y-%m).md audit/$(date +%Y-%m).md
git add audit/
git commit -m "Audit: ежемесячный аудит $(date +%Y-%m)"

Папка audit/:

project/
└── audit/
    ├── 2026-01.md
    ├── 2026-02.md
    └── 2026-03.md

СВЯЗАННЫЕ ДОКУМЕНТЫ

Документ Назначение
IT_PROJECTS.md Основы разработки (мастер-индекс)
PROJECT_OPS.md Операции (окружения, deployment, backup)
PROJECT_DEV.md Ежедневная разработка
ROLLBACK_POLICY.md Политика отката
BACKUP.md Политика бэкапов

Версия: 2.1.0
История:
- v1.x: Часть монолитного PROJECT_WORKFLOW.md
- v2.0.0: Выделено в отдельный документ
- v2.1.0: Добавлена ЧАСТЬ 4 (аудит и рефакторинг)