Files
TenerifeProp/MIGRATION_AUDIT_REPORT.md
APAW Agent Sync 3bcc705e3b docs: add deployment guides, audit reports, and production sync scripts
- 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
2026-05-13 23:44:38 +01:00

8.7 KiB
Raw Permalink Blame History

Аудит возможности миграции 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/bunhono/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.passwordbcrypt

Использование: 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:testjest / 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 не окупается.

Оптимальный путь:

  1. Установить Bun на сервере (15 минут).
  2. Загрузить файлы проекта.
  3. Запустить через PM2.
  4. Nginx уже настроен BrainyCP.

Если обязательно нужна MySQL — внедряйте Repository Pattern и ORM (drizzle-orm), но это отдельный проект.


Отчёт подготовлен после анализа кода (32 файла, 6,011 строк) и конфигурации сервера.