- BRAINYCP_DEPLOY_GUIDE.md: complete human deployment guide - AI_DEPLOY_CONTEXT.md: machine-readable deploy instructions for AI agents - sync-production.sh: universal deployment script (full/quick/status/logs/backup) - DEPLOY_PLAN.md: step-by-step deployment plan - DEPLOY_AUDIT_REPORT.md: server audit results - MIGRATION_AUDIT_REPORT.md: MySQL migration complexity analysis - SERVER_AUDIT_REPORT.md: server environment audit - Update README.md with BrainyCP deploy workflow and Git sync instructions Refs: production server 46.175.149.131, domain tenerifeprop.es
8.7 KiB
Аудит возможности миграции TenerifeProp с SQLite/Bun на MySQL/Node.js
Дата: 2026-05-13
1. Краткий вывод
Миграция возможна, но трудоёмкая. Проект жёстко завязан на Bun (bun:sqlite, hono/bun, Bun.password, crypto.randomUUID для SQLite primary keys). Нужно переписывать код под совместимость с Node.js + MySQL/PostgreSQL.
Сложность: Высокая (~15-20 часов работы).
2. Анализ Bun-зависимостей
2.1 bun:sqlite (SQLite-специфика)
Использование: 117 SQL-запросов в src/server/index.ts, дублирование в src/modules/database.ts.
Проблемы для MySQL/PostgreSQL:
| SQLite фича | MySQL эквивалент | PostgreSQL эквивалент | Сложность |
|---|---|---|---|
PRAGMA journal_mode=WAL |
Не применимо | Не применимо | Легко (убрать) |
PRAGMA busy_timeout=5000 |
Не применимо | Не применимо | Легко (убрать) |
INTEGER PRIMARY KEY AUTOINCREMENT |
INT AUTO_INCREMENT PRIMARY KEY |
SERIAL PRIMARY KEY |
Легко |
TEXT DEFAULT (datetime('now')) |
DATETIME DEFAULT CURRENT_TIMESTAMP |
TIMESTAMPTZ DEFAULT NOW() |
Легко |
datetime('now') в запросах |
NOW() |
NOW() |
Легко |
ON CONFLICT(...) DO UPDATE SET (upsert) |
INSERT ... ON DUPLICATE KEY UPDATE |
INSERT ... ON CONFLICT DO UPDATE |
Средне |
JSON поля (images, videos, badges) |
JSON тип (MySQL 5.7+) |
JSONB |
Средне |
crypto.randomUUID() для id |
UUID() MySQL или gen_random_uuid() PG |
gen_random_uuid() |
Средне |
TEXT для JSON строк |
JSON тип |
JSONB |
Легко |
2.2 hono/bun → hono/node-server
Причина: serveStatic из hono/bun использует Bun-специфичные API для чтения файлов.
Затронуто:
import { serveStatic } from 'hono/bun'
// 25+ вызовов serveStatic в src/server/index.ts
// + src/server/routes-static.ts
Решение: Заменить на serveStatic из @hono/node-server или настроить Nginx отдавать статику напрямую, а Hono — только API.
Оценка: Средне. ~10 строк кода + проверка совместимости путей.
2.3 Bun.password → bcrypt
Использование: 7 мест, включая:
Bun.password.hashSync(password, { algorithm: 'bcrypt', cost: 10 })
await Bun.password.verify(password, hash)
Решение: Заменить на bcrypt.hashSync(password, 10) и bcrypt.compare(password, hash).
Важно: bcrypt уже есть в package.json! Просто переключиться с Bun.password на bcrypt.
Оценка: Легко. ~7 строк.
2.4 crypto.randomUUID()
Используется 23 раза для генерации UUID первичных ключей.
Решение: Можно оставить crypto.randomUUID() — оно работает в Node.js 16+. Или заменить на модуль uuid (уже в зависимостях).
Оценка: Легко.
2.5 bun:test → jest / vitest
5 файлов используют import { describe, it, expect } from 'bun:test'.
Решение: Заменить на import { describe, it, expect } from '@jest/globals' или использовать встроенный node:test.
Оценка: Легко. ~5 строк.
3. Архитектурные изменения
3.1 Слоистая архитектура (Repository Pattern)
Текущий код содержит 117 прямых SQL-запросов в контроллерах (антипаттерн). При переходе на MySQL/PostgreSQL крайне рекомендуется выделить слой репозиториев:
src/
├── repositories/ # Новый слой
│ ├── PropertyRepository.ts
│ ├── LeadRepository.ts
│ ├── UserRepository.ts
│ └── ...
├── services/ # Бизнес-логика
├── controllers/ # HTTP-handlers
└── db/ # Подключение к БД
Без рефакторинга на Repository: каждый SQL-запрос придётся адаптировать под MySQL вручную (117 мест = высокий риск ошибок).
С рефакторингом: изменения концентрируются в 5-7 файлах репозиториев.
3.2 Библиотека для работы с БД
| Вариант | MySQL | PostgreSQL | Плюсы | Минусы |
|---|---|---|---|---|
| mysql2 | ✅ | ❌ | Нативный, быстрый, Promise API | Только MySQL |
| pg | ❌ | ✅ | Стандарт для PostgreSQL | Только PostgreSQL |
| drizzle-orm | ✅ | ✅ | TypeScript-first, миграции, zero-config | Новая зависимость |
| prisma | ✅ | ✅ | ORM, миграции, типизация | Тяжёлый |
Рекомендация: mysql2 для простоты или drizzle-orm для типовой безопасности.
4. Оценка трудоёмкости
4.1 По задачам
| Задача | Часы | Риск |
|---|---|---|
Замена bun:sqlite на mysql2 + подключение |
2-3 | Низкий |
| Рефакторинг SQL-запросов под MySQL синтаксис | 6-8 | Средний (117 мест) |
| Создание слоя Repository (рекомендуется) | 8-12 | Низкий (инвестиция) |
Замена hono/bun на hono/node-server |
1-2 | Низкий |
Замена Bun.password на bcrypt |
0.5 | Низкий |
Миграция bun:test на Node.js tests |
1-2 | Низкий |
| Создание SQL-схемы под MySQL | 2-3 | Средний |
| Перенос данных (seed / дамп) | 1-2 | Средний |
| Тестирование на сервере BrainyCP | 4-6 | Высокий (интеграция) |
| Итого без Repository | ~15-20 | Высокий |
| Итого с Repository | ~25-30 | Низкий |
4.2 Альтернатива: Docker на сервере
Если на сервере можно запустить Docker (не через BrainyCP, а напрямую):
- Создать
docker-compose.prod.ymlс Bun-контейнером. - BrainyCP продолжает проксировать Nginx → порт 3003.
- Внутри контейнера: Bun + SQLite (как сейчас локально).
Время: 2-4 часа. Риск: Низкий (работает точно как локально). Требования: Docker на сервере + root-доступ.
5. Сравнение вариантов
| Вариант | Время | Сложность | Надёжность | Поддержка |
|---|---|---|---|---|
| Оставить Bun на сервере (V1) | 2-4 часа | Низкая | Высокая | Стандартна |
| Docker-контейнер на сервере | 2-4 часа | Низкая | Высокая | Идентична локальной |
| Миграция на MySQL + Node.js | 15-30 часов | Высокая | Средняя | Нужен рефакторинг |
| BrainyCP Next.js | 15-30 часов | Высокая | Средняя | Полный рерайт |
6. Рекомендация
Миграция на MySQL/Node.js — избыточно дорого и рискованно. Проект маленький (~6K строк), с простой схемой. Переписывание ради развёртывания в BrainyCP не окупается.
Оптимальный путь:
- Установить Bun на сервере (15 минут).
- Загрузить файлы проекта.
- Запустить через PM2.
- Nginx уже настроен BrainyCP.
Если обязательно нужна MySQL — внедряйте Repository Pattern и ORM (drizzle-orm), но это отдельный проект.
Отчёт подготовлен после анализа кода (32 файла, 6,011 строк) и конфигурации сервера.