type: standard
aspect: process
title: "ИНИЦИАЛИЗАЦИЯ IT ПРОЕКТА"
version: 1.0.0
date: 2026-02-19
status: active
Версия: 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 Регулярный аудит
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
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
Формат: 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): Баг-фикс
ПРАВИЛО: Вся информация хранится ОДИН РАЗ в корне. Остальное — ссылки.
Структура:
{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!)
ЦЕЛЬ: Из "ничего" создать Vanilla (голый дистрибутив), готовый к разработке.
ЭТАПЫ:
НИЧЕГО → Zero → Vanilla (v0.0.0) → Backup L3 → Готово к разработке
Что проверить:
# 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
ЧТО: Развернуть систему из коробки (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 ✓ (ожидаемо, БД не подключена)
Статус:
- ✓ Система развёрнута
- ⏳ БД не подключена
- ⏳ Система НЕ работает
- → Следующий шаг: подключить БД
ЧТО: Настроить систему до голого дистрибутива.
Шаг 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
ЧТО: Создать .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: эталонные данные созданы"
ЧТО: Сохранить контрольную точку 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
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
ЦЕЛЬ: Завести готовый проект на наш сервер и подготовить к работе.
⚠️ ВАЖНО: Онбординг НЕ даёт Vanilla. Vanilla = только голый дистрибутив.
ЭТАПЫ:
Получение → Анализ → Развёртывание → Онбординг (v1.0.0) → Backup → Работа
Особенность 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
Если несовместимо:
→ Установить нужные версии ПЕРЕД онбордингом
Способ 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"
ЧТО узнать:
- 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"
⚠️ ПРАВИЛО: ВСЕГДА сначала тест, НИКОГДА сразу прод.
Шаг 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"
ЧТО: Зафиксировать текущее состояние как 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
Файл: .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: эталонные данные созданы"
ЧТО: Сохранить контрольную точку онбординга.
# 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 создан"
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
ЦЕЛЬ: Периодически проверять правильность ведения проекта и проводить рефакторинг.
КОГДА ПРОВЕРЯТЬ:
- Раз в месяц (регулярный аудит)
- Перед релизом в production
- После онбординга нового члена команды
- Когда код стал сложно поддерживать
- Накопился технический долг
Проверка структуры:
# Эталонные данные в корне
[ ] .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 → разобрать
Проблема 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/
Признаки технического долга:
| Признак | Критичность | Действие |
|---|---|---|
| Код дублируется >3 раз | 🟡 Средняя | Вынести в функцию |
| Функция >100 строк | 🟡 Средняя | Разбить на мелкие |
| TODO >1 месяца | 🟡 Средняя | Сделать или удалить |
| Нет тестов | 🟠 Высокая | Добавить тесты |
| Закомментированный код >50 строк | 🟠 Высокая | Удалить |
| Изменения в core | 🔴 Критично | Откатить + переделать |
| Нет DEVLOG >2 месяцев | 🔴 Критично | Восстановить |
| Нет backup | 🔴 Критично | Создать немедленно |
Когда планировать рефакторинг:
- Накопилось >5 🟡 средних проблем
- Есть хотя бы 1 🔴 критичная
- Код стал сложно поддерживать
- Новые фичи занимают в 2× дольше
ПРАВИЛО: Рефакторинг = как разработка (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
Проверка работоспособности:
# Тесты
./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: рефакторинг откачен"
ПРАВИЛО: Аудит раз в месяц (или перед релизом).
Процесс:
# Создать файл аудита
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 (аудит и рефакторинг)