Appearance
Отчёт по задачам проекта Partizap (backend)
Период: 23 января — 10 марта 2026 Общий объём: ~46 000 строк кода, 340+ файлов, 115+ коммитов Инструменты: PHP 8.3, Slim 4, Doctrine, PostgreSQL 16, Redis 7, Centrifugo, S3 (Selectel), Claude Code
Оценка «Без AI» — сколько часов заняла бы задача при полностью ручной разработке. Оценка «С Claude Code» — сколько часов ушло фактически с учётом ускорения от AI-ассистента.
Этап 1: Инфраструктура — настройка серверов
| # | Задача | Без AI | С Claude Code |
|---|---|---|---|
| 1.1 | Настройка VPS: ОС, пользователи, SSH-ключи, фаервол | 4 ч | 3 ч |
| 1.2 | Установка и настройка PostgreSQL 16 (dev: partizap_dev, prod: partizap_prod, PgBouncer на prod) | 4 ч | 2.5 ч |
| 1.3 | Установка и настройка Redis 7 (Primary-Replica с Sentinel, разделение по БД 0–3, dev/prod с префиксами) | 4 ч | 2.5 ч |
| 1.4 | Установка PHP 8.3 + PHP-FPM (два пула: partizap-dev, partizap-prod) | 3 ч | 2 ч |
| 1.5 | Настройка Nginx: виртуальные хосты dev.partizap.ru / partizap.ru, SSL, HTTP Basic Auth | 4 ч | 2.5 ч |
| 1.6 | Настройка S3-хранилища Selectel (два бакета: partizap-dev, partizap-prod, приватный + публичный) | 3 ч | 2 ч |
| 1.7 | Настройка GitLab (self-hosted): репозиторий, SSH-доступ, токены | 3 ч | 2 ч |
| 1.8 | Установка и настройка YouTrack (трекер задач) | 3 ч | 2 ч |
| 1.9 | Настройка DNS-записей для всех доменов и поддоменов (dev, prod, gitlab, youtrack) | 2 ч | 1.5 ч |
| 1.10 | Выпуск и установка SSL-сертификатов (Let's Encrypt) для всех доменов | 2 ч | 1.5 ч |
| 1.11 | Регистрация и настройка облачного Sentry (проекты dev/prod, DSN, алерты) | 2 ч | 1.5 ч |
| 1.12 | Настройка почтового сервиса (SMTP) | 2 ч | 1.5 ч |
| 1.13 | Документирование инфраструктуры (dev-prod-infrastructure.md) | 3 ч | 1 ч |
| Итого по этапу | 39 ч | 25.5 ч |
Этап 2: Основа backend (5–6 февраля)
| # | Задача | Без AI | С Claude Code |
|---|---|---|---|
| 2.1 | Скелет Slim 4 + PHP-DI + Doctrine + health check | 4 ч | 1.5 ч |
| 2.2 | Полная реализация backend: все сущности, auth (сессии), Store/Vendor/Admin endpoint'ы, сидер | 16 ч | 5 ч |
| 2.3 | Выравнивание схемы и сущностей по MVP-спецификации | 6 ч | 2 ч |
| 2.4 | Исправления: MailerService, body parsing, route args, session handling, миграции | 4 ч | 1.5 ч |
| Итого по этапу | 30 ч | 10 ч |
Этап 3: Безопасность и бизнес-логика (7 февраля)
| # | Задача | Без AI | С Claude Code |
|---|---|---|---|
| 3.1 | Security hardening: CSRF middleware, CSP, rate limiting, admin CRUD, background jobs | 8 ч | 3 ч |
| 3.2 | Криптографические токены сброса пароля (вместо verification codes) | 2 ч | 0.5 ч |
| 3.3 | Сортировка и мультиполевая курсорная пагинация товаров | 4 ч | 1.5 ч |
| 3.4 | M:N категории и совместимость товаров (product_categories, product_compatibility) | 3 ч | 1 ч |
| 3.5 | Избранное: добавление, удаление, список | 2 ч | 0.5 ч |
| 3.6 | Переработка пайплайна загрузки изображений (синхронная обработка, dual S3 bucket, 6 вариантов) | 6 ч | 2 ч |
| 3.7 | Stampede-protected кэширование справочных данных | 3 ч | 1 ч |
| 3.8 | Исправления: DQL CAST, CSRF session binding, CSP | 3 ч | 1 ч |
| Итого по этапу | 31 ч | 10.5 ч |
Этап 4: Диагностика и мониторинг (6–8 февраля)
| # | Задача | Без AI | С Claude Code |
|---|---|---|---|
| 4.1 | Диагностическая панель: Service Health, Database, Routes, Endpoint Tester | 8 ч | 3 ч |
| 4.2 | 6 дополнительных табов: Marketplace, Security, Search, Cache, Audit, Architecture | 6 ч | 2 ч |
| 4.3 | Интеграция Sentry SDK с Monolog | 2 ч | 0.5 ч |
| 4.4 | Мониторинг: log viewer, error tracking, performance, Sentry API | 4 ч | 1.5 ч |
| 4.5 | PHPUnit таб со структурированными результатами | 2 ч | 0.5 ч |
| 4.6 | Исправления и доработки диагностики (PHPUnit FPM, NaN, toggle, /api prefix) | 3 ч | 1 ч |
| Итого по этапу | 25 ч | 8.5 ч |
Этап 5: Деплой и CI/CD (7, 16 февраля)
| # | Задача | Без AI | С Claude Code |
|---|---|---|---|
| 5.1 | Nginx-конфиг и smoke-test скрипт для dev-деплоя | 3 ч | 1.5 ч |
| 5.2 | Маршрутизация /api/* → PHP-FPM, / → Nuxt (подготовка к фронту) | 2 ч | 1 ч |
| 5.3 | GitLab CI/CD pipeline + deploy script | 4 ч | 1.5 ч |
| 5.4 | Исправления CI: shell executor, PHPStan tmpDir, .env, deploy script | 3 ч | 1.5 ч |
| 5.5 | Рефакторинг структуры каталогов (flatten development/) | 1 ч | 0.5 ч |
| 5.6 | Удаление .env из git, fix deploy stash | 1 ч | 0.5 ч |
| Итого по этапу | 14 ч | 6.5 ч |
Этап 6: Изображения и сидирование (8–10 февраля)
| # | Задача | Без AI | С Claude Code |
|---|---|---|---|
| 6.1 | Исправление коллизий URL вариантов изображений в S3 | 2 ч | 0.5 ч |
| 6.2 | Добавление массива images в ответы Store/Vendor/Favorites | 3 ч | 1 ч |
| 6.3 | Команда seed-products с реальными изображениями и гео-данными Москвы | 4 ч | 1.5 ч |
| 6.4 | Интеграция Wikimedia Commons API для изображений по категориям | 2 ч | 1 ч |
| 6.5 | Исправление avatar URL (S3StorageService + CDN) + миграция | 2 ч | 0.5 ч |
| Итого по этапу | 13 ч | 4.5 ч |
Этап 7: Чат (11–13 февраля)
| # | Задача | Без AI | С Claude Code |
|---|---|---|---|
| 7.1 | Real-time чат: сущности, actions, Centrifugo интеграция | 12 ч | 4 ч |
| 7.2 | Centrifugo Docker setup + nginx WebSocket proxy | 3 ч | 1.5 ч |
| 7.3 | Online presence middleware + миниатюры изображений в чате | 3 ч | 1 ч |
| 7.4 | Улучшения чата: product images, delivered status, system messages, read boundaries, disconnect proxy | 6 ч | 2 ч |
| 7.5 | Centrifugo health check + admin UI + nginx proxy | 2 ч | 1 ч |
| 7.6 | Мультигородская гео-фильтрация товаров и поиска | 3 ч | 1 ч |
| 7.7 | Исправление: Centrifugo connect proxy блокируется CSRF | 1 ч | 0.5 ч |
| 7.8 | Nginx: поддержка Nuxt frontend proxy + bypass basic auth для SSR | 2 ч | 1 ч |
| Итого по этапу | 32 ч | 12 ч |
Этап 8: Автомобильная иерархия (14–15 февраля)
| # | Задача | Без AI | С Claude Code |
|---|---|---|---|
| 8.1 | 4-й уровень иерархии: car_modifications (сущность, миграция, endpoints) | 4 ч | 1.5 ч |
| 8.2 | Команда импорта seed-данных для 4-уровневой иерархии авто | 3 ч | 1 ч |
| 8.3 | Durable online presence (persist last_seen_at в БД) | 2 ч | 0.5 ч |
| 8.4 | Исправления: modification_id в совместимости, категории в деталях товара | 2 ч | 0.5 ч |
| 8.5 | Атрибутные категории (оригинал/неоригинал) + рефакторинг steering | 2 ч | 0.5 ч |
| 8.6 | Поддержка множественных OEM номеров при создании/обновлении товара | 2 ч | 0.5 ч |
| Итого по этапу | 15 ч | 4.5 ч |
Этап 9: Документация для фронтенда (7–16 февраля)
| # | Задача | Без AI | С Claude Code |
|---|---|---|---|
| 9.1 | Проектирование архитектуры фронтенда (FSD, Nuxt 4, tech stack) | 8 ч | 3 ч |
| 9.2 | Frontend API reference: все endpoints, форматы, CSRF, пагинация, коды ошибок | 4 ч | 1.5 ч |
| 9.3 | Гайд по реализации auth-страниц в Nuxt | 3 ч | 1 ч |
| 9.4 | Frontend CI/CD: GitLab pipeline, PM2, deploy, nginx proxy | 2 ч | 0.5 ч |
| 9.5 | Гайд по чату для фронтенда: REST API, Centrifugo, Zod-схемы, i18n | 4 ч | 1.5 ч |
| 9.6 | Гайд по автомобильной иерархии: YMMM cascade, composable pattern | 3 ч | 1 ч |
| 9.7 | Документация ответов auth-эндпоинтов с русскими текстами | 2 ч | 0.5 ч |
| 9.8 | Документ по интеграции справочных данных (TecDoc, OEM, кросс-ссылки) | 3 ч | 1 ч |
| Итого по этапу | 29 ч | 10 ч |
Этап 10: Доработки (16, 22–23 февраля)
| # | Задача | Без AI | С Claude Code |
|---|---|---|---|
| 10.1 | «Remember me» в авторизации | 2 ч | 0.5 ч |
| 10.2 | Исправление сброса пароля (не сохранялся в БД) | 1 ч | 0.5 ч |
| 10.3 | Исправление ссылок в email (prefix /auth/) | 1 ч | 0.5 ч |
| 10.4 | Валидация циклических ссылок в категориях | 1 ч | 0.5 ч |
| 10.5 | Фильтрация товаров по категории с потомками (recursive CTE) | 2 ч | 0.5 ч |
| 10.6 | Водяной знак «Partizap» на изображениях товаров | 3 ч | 1 ч |
| Итого по этапу | 10 ч | 3.5 ч |
Этап 11: Телефоны, фильтры и асинхронные изображения (23, 25 февраля)
| # | Задача | Без AI | С Claude Code |
|---|---|---|---|
| 11.1 | Аудит полей: region_id и account_type в Actions, чеклист реализации в CLAUDE.md | 2 ч | 0.5 ч |
| 11.2 | Реорганизация категорий по структуре Avito (миграция + сброс кэша) | 3 ч | 1 ч |
| 11.3 | Мультителефон: таблица user_phones, сущность, CRUD-эндпоинты, интеграция в профиль и товары, документация, диагностика | 8 ч | 2.5 ч |
| 11.4 | Фильтры is_available/condition в листинге и поиске + модерационные email | 3 ч | 1 ч |
| 11.5 | Эндпоинт похожих товаров (/store/products/{id}/similar) | 2 ч | 0.5 ч |
| 11.6 | Исправление TTL кода верификации (15 мин → 24 ч) | 1 ч | 0.5 ч |
| 11.7 | Рефакторинг констант блокировки логина (magic numbers → named constants) | 1 ч | 0.5 ч |
| 11.8 | Асинхронная обработка изображений через Redis-очередь (Symfony Messenger) | 4 ч | 1.5 ч |
| 11.9 | Документирование новых эндпоинтов, фильтров и async-обработки изображений | 2 ч | 0.5 ч |
| Итого по этапу | 26 ч | 8.5 ч |
Этап 12: Поиск по сообщениям чата (26 февраля)
| # | Задача | Без AI | С Claude Code |
|---|---|---|---|
| 12.1 | Дизайн фичи: brainstorming + design doc (in-chat + global search, UX, FSD-структура) | 3 ч | 1 ч |
| 12.2 | Имплементация плана с полным кодом для backend и frontend | 2 ч | 0.5 ч |
| 12.3 | Backend: repository methods (searchInConversation, searchAll), 2 Action класса, роуты | 4 ч | 1 ч |
| 12.4 | Обновление API reference + readiness status + task report | 2 ч | 0.5 ч |
| Итого по этапу | 11 ч | 3 ч |
Этап 13: Code review и рефакторинг (1–2 марта)
| # | Задача | Без AI | С Claude Code |
|---|---|---|---|
| 13.1 | Полный code review backend: анализ 14 проблем, план исправлений | 4 ч | 1 ч |
| 13.2 | Рефакторинг DI-контейнера: замена 21 use($settings) → $c->get('settings'), включение компиляции | 3 ч | 0.5 ч |
| 13.3 | Нормализация ответов User: добавление business_profile в MeAction и UpdateUserAction | 2 ч | 0.5 ч |
| 13.4 | 4 новых enum (MessageType, ReportStatus, PaymentStatus, PaymentType) + интеграция в сущности и callers | 4 ч | 1 ч |
| 13.5 | Усиление rate limiting (IP-based вместо email-based), транзакционное удаление товаров, JsonResponder в RemoveFavoriteAction | 3 ч | 0.5 ч |
| 13.6 | Документация: отчёт по code review, полная секция Admin Endpoints в API reference | 4 ч | 1 ч |
| Итого по этапу | 20 ч | 4.5 ч |
Этап 14: Тестирование (2 марта)
| # | Задача | Без AI | С Claude Code |
|---|---|---|---|
| 14.1 | 20 unit-тестов для 4 enum (backed values, from, tryFrom, case count) | 2 ч | 0.5 ч |
| 14.2 | 42 unit-теста для сущностей Message, Report, Payment (конструкторы, сеттеры, enum-переходы, toArray) | 6 ч | 1 ч |
| 14.3 | 30 feature-тестов для 7 action-классов (MeAction, UpdateUserAction, DeleteProductAction, ApproveProduct, RejectProduct, RemoveFavorite, SendMessage) | 8 ч | 1.5 ч |
| 14.4 | 8 unit-тестов для сервисов AdminAuditLogger и SystemMessageService | 3 ч | 0.5 ч |
| 14.5 | Исправления: снятие final с 3 сервисов для мокирования, reflection для entity ID в тестах | 1 ч | 0.5 ч |
| 14.6 | Инвентарь тестов в диагностической панели (PHPUnit таб) | 2 ч | 0.5 ч |
| Итого по этапу | 22 ч | 4.5 ч |
Этап 15: Продакшн-деплой и сидирование (2 марта)
| # | Задача | Без AI | С Claude Code |
|---|---|---|---|
| 15.1 | MR develop → main, merge, deploy production | 1 ч | 0.5 ч |
| 15.2 | Перенос справочных данных dev → prod: 9 таблиц (42 500+ записей), обход FK-ограничений categories | 3 ч | 0.5 ч |
| 15.3 | Сброс Redis-кэша production, верификация API-эндпоинтов на partizap.ru | 1 ч | 0.5 ч |
| 15.4 | Обновление CLAUDE.md: деплой, кэширование, сидирование, тестирование | 2 ч | 0.5 ч |
| Итого по этапу | 7 ч | 2 ч |
Сводная таблица
| Этап | Описание | Без AI | С Claude Code | Экономия |
|---|---|---|---|---|
| 1 | Настройка серверов dev + prod | 39 ч | 25.5 ч | 35% |
| 2 | Основа backend | 30 ч | 10 ч | 67% |
| 3 | Безопасность и бизнес-логика | 31 ч | 10.5 ч | 66% |
| 4 | Диагностика и мониторинг | 25 ч | 8.5 ч | 66% |
| 5 | Деплой и CI/CD | 14 ч | 6.5 ч | 54% |
| 6 | Изображения и сидирование | 13 ч | 4.5 ч | 65% |
| 7 | Чат (Centrifugo) | 32 ч | 12 ч | 63% |
| 8 | Автомобильная иерархия | 15 ч | 4.5 ч | 70% |
| 9 | Документация для фронтенда | 29 ч | 10 ч | 66% |
| 10 | Доработки | 10 ч | 3.5 ч | 65% |
| 11 | Телефоны, фильтры и async-изображения | 26 ч | 8.5 ч | 67% |
| 12 | Поиск по сообщениям чата | 11 ч | 3 ч | 73% |
| 13 | Code review и рефакторинг | 20 ч | 4.5 ч | 78% |
| 14 | Тестирование (100 новых тестов) | 22 ч | 4.5 ч | 80% |
| 15 | Продакшн-деплой и сидирование | 7 ч | 2 ч | 71% |
| 16 | Миграция на два VPS | 20 ч | 8 ч | 60% |
| 17 | Диагностика и инфра-фиксы | 6 ч | 2 ч | 67% |
| ИТОГО | 350 ч | 128 ч | 63% |
Этап 16: Миграция на два VPS (9–10 марта)
| # | Задача | Без AI | С Claude Code |
|---|---|---|---|
| 16.1 | Планирование миграции: ресурсный анализ, план two-VPS архитектуры, прогноз роста по DAU | 3 ч | 1 ч |
| 16.2 | Миграция серверов: настройка VPS 2 (DevOps), NAT-gateway через VPS 1, nginx reverse proxy, SSL для dev/gitlab/track субдоменов | 6 ч | 3 ч |
| 16.3 | Обновление CLAUDE.md для two-VPS архитектуры (project root + server) | 2 ч | 0.5 ч |
| 16.4 | Исправление phpredis 6.x brPop (возврат [] вместо false на таймауте) и удаление двойного префикса ключей | 2 ч | 0.5 ч |
| 16.5 | Обновление deploy script для two-VPS (prod → SSH на VPS 1, dev → локально на VPS 2) | 2 ч | 1 ч |
| 16.6 | Миграция фронтенда с PM2 на Docker контейнеры, обновление CI/CD документации | 3 ч | 1 ч |
| 16.7 | Обновление документации: frontend-ci-cd.md (Docker), migration notes в отчётах | 2 ч | 1 ч |
| Итого по этапу | 20 ч | 8 ч |
Этап 17: Диагностика и инфра-фиксы (10 марта)
| # | Задача | Без AI | С Claude Code |
|---|---|---|---|
| 17.1 | Диагностика пайплайна загрузки изображений: анализ логов воркера, проверка S3, Redis-очереди, GD, водяного знака | 2 ч | 0.5 ч |
| 17.2 | Выявление причины «бесконечного processing» — анализ фронтенд-кода (отсутствие polling статуса image, потеря контекста draft при reload) | 2 ч | 0.5 ч |
| 17.3 | Исправление персистентного роутинга netplan (перенос routes с верхнего уровня внутрь eth1, удаление дублирования) | 1 ч | 0.5 ч |
| 17.4 | Проверка работоспособности всех сервисов после перезагрузки VPS 2 | 1 ч | 0.5 ч |
| Итого по этапу | 6 ч | 2 ч |
Примечания к оценке
- «Без AI» — экспертная оценка трудозатрат для middle/senior PHP-разработчика, включая исследование, реализацию, тестирование и отладку.
- «С Claude Code» — оценка фактических трудозатрат с учётом того, что AI-ассистент генерировал код, документацию, конфиги и тесты, а разработчик формулировал задачи, ревьюил результат и выполнял ручные операции на серверах.
- Инфраструктурные задачи (этап 1) имеют наименьшую экономию (~37%), так как требуют ручного взаимодействия с серверами, SSH, установки пакетов и верификации.
- Генерация кода и документации (этапы 2–4, 8–9) дают высокую экономию (65–70%), так как Claude Code эффективно генерирует объёмный, но структурированный контент.
- Тестирование и code review (этапы 13–14) показали наибольшую экономию (78–80%), так как AI эффективно генерирует повторяющиеся тестовые шаблоны и системно анализирует кодовую базу на предмет проблем.