Запуск проекта (Next.js + Prisma/Postgres + Django Admin)

Актуально на: 2026-02-13

Путь проекта: D:\Code\project_try_create_interface

Обновление 2026-02-13

См. CHANGELOG.md и PERFORMANCE.md (оптимизация автосейва и настройка «Главная вкладка»).

Требования

  • Node.js (рекомендуется LTS) + npm
  • Python 3.11+
  • PostgreSQL (локально или в Docker)

1) Подготовка базы (1 раз)

В .env в корне проекта должен быть DATABASE_URL, например:

DATABASE_URL="postgresql://app:app_pass@localhost:5432/app_db?schema=public"

Если базы/пользователя ещё нет (пример для psql):

CREATE USER app WITH PASSWORD 'app_pass';
CREATE DATABASE app_db OWNER app;
GRANT ALL PRIVILEGES ON DATABASE app_db TO app;

2) Запуск приложения (Next.js) — порт 3000

Откройте Терминал A (PowerShell):

cd D:\Code\project_try_create_interface
npm install

Применить миграции Prisma + перегенерировать Prisma Client (делайте после любых изменений в prisma/schema.prisma или миграциях):

npx prisma migrate deploy
npx prisma generate

2.1 Миграция legacy JSON → нормализованные таблицы (вариант B)

Если у вас уже есть проекты, созданные до нормализации (данные лежат в ProjectWorkspaceState.state), можно перенести их в новые таблицы:

# убедитесь что DATABASE_URL указывает на нужную БД
node backfill_project_state.js

2.2 Проверка, что данные действительно попали в таблицы (audit)

Если вы “не видите” этапы календаря/продукты в новых таблицах, сначала проверьте и выведите отчёт:

node audit_project_data.js

Если скрипт покажет, что в legacy JSON данные есть, но в нормализованных таблицах их нет — можно автоматически починить:

node audit_project_data.js --fix

Запуск dev-сервера:

npm run dev

Открыть:

  • http://localhost:3000/
  • Проекты (таблица): http://localhost:3000/projects?view=table

3) Запуск Django Admin — порт 8000

Откройте Терминал B (PowerShell).

3.1 Установка зависимостей (1 раз)

cd D:\Code\project_try_create_interface
python -m venv .venv
.\.venv\Scripts\activate
pip install -r django_admin\requirements.txt

Проверка, что используется python из venv:

where python

Первая строка должна быть: ...\project_try_create_interface\.venv\Scripts\python.exe

3.2 Миграции Django и суперпользователь (1 раз)

cd D:\Code\project_try_create_interface\django_admin
python .\manage.py migrate
python .\manage.py createsuperuser

3.3 Запуск админки

cd D:\Code\project_try_create_interface\django_admin
python .\manage.py runserver 8000

Открыть:

  • http://127.0.0.1:8000/admin/

4) Что важно про “пустой/демо” проект

При создании проекта в UI (/projects) есть выбор:

  • Пустой — без данных (содержимое пустое).
  • Демо — создаётся проект с примером данных (заполняются нормализованные таблицы варианта B: ProjectInfo/ProjectSettings/ProjectProduct/ProjectCalendarNode/...).

5) Частые проблемы и решения

5.1 Prisma: findUnique of undefined / “модель не найдена”

Это значит, что Prisma Client не перегенерирован под текущую схему.

cd D:\Code\project_try_create_interface
npx prisma migrate deploy
npx prisma generate

Потом перезапустите npm run dev.

5.2 Django: ModuleNotFoundError: No module named 'dotenv'

Значит вы запускаете не из .venv или не ставили зависимости:

cd D:\Code\project_try_create_interface
.\.venv\Scripts\activate
pip install -r django_admin\requirements.txt

5.3 Django admin “без стилей”, в логе 404 на /static/admin/...

Сейчас по умолчанию DEBUG=1, поэтому обычно всё ок. Если вы вручную выключали:

Remove-Item Env:DJANGO_DEBUG -ErrorAction SilentlyContinue

и перезапустите python .\manage.py runserver 8000.

5.4 Переменная DATABASE_URL “не та”

Если вы вручную делали $env:DATABASE_URL=..., это может перебить .env. Сбросить в текущей консоли:

Remove-Item Env:DATABASE_URL -ErrorAction SilentlyContinue

5.5 Prisma: P2002 при сохранении календарного плана

Если в логе появляется ошибка вида Unique constraint failed на ProjectCalendarNode/ProjectCalendarPaymentScheduleItem, это обычно значит, что в БД ещё не применена миграция для “составных ключей” календаря или у вас старая схема Prisma Client.

cd D:\Code\project_try_create_interface
npx prisma migrate deploy
npx prisma generate

Если npx prisma migrate deploy падает с ошибкой миграции (например, P3018 / 42P07 “отношение … уже существует”), это значит миграция частично успела примениться. В этом случае:

npx prisma migrate resolve --rolled-back 20260202223500_calendar_composite_keys
npx prisma migrate deploy

6) Рекомендуемая схема “два терминала”

  • Терминал A: npm run dev (Next.js, http://localhost:3000)
  • Терминал B: python .\manage.py runserver 8000 (Django admin, http://127.0.0.1:8000/admin/)

Структура данных в БД

См. DB_DATA.md — описание всех сущностей/таблиц и что в них хранится.

Просмотр данных (UI)

Самый простой способ посмотреть данные в базе:

npx prisma studio

Конвертация Office → PDF (превью Word/PowerPoint)

PDF-превью Word-документов, презентаций и презентаций «с подменой значений», а также экспорт справочника меток в PDF выполняются на сервере. Поддерживаются два бэкенда:

БэкендКогда используетсяТребования
powershellWindows-разработкаУстановленные Microsoft Word и PowerPoint (COM)
gotenbergПрод (Linux-контейнер) и Windows без OfficeЗапущенный сервис Gotenberg (LibreOffice)

Выбор бэкенда — переменная OFFICE_PDF_CONVERTER:

  • auto (по умолчанию): на Windows сначала Office COM, при неудаче — Gotenberg (если задан GOTENBERG_URL); на Linux/macOS — только Gotenberg;
  • gotenberg / powershell — принудительный выбор.

Локальный запуск Gotenberg

docker run --rm -p 3001:3000 gotenberg/gotenberg:8

и в .env:

GOTENBERG_URL="http://localhost:3001"

Прод

Сервис gotenberg описан в docker-compose.yml, приложение получает GOTENBERG_URL автоматически. Каталог uploads/ вынесен в volume planforge_uploads — исходники документов, копии «с подменой» и кэш сконвертированных PDF переживают redeploy.

Шрифты конвертера

Сервис собирается из Dockerfile.gotenberg. Базовый образ уже содержит Liberation, Carlito, Caladea, DejaVu и Noto — метрически совместимые замены Arial, Calibri, Cambria и Times New Roman. Сверх этого ставятся оригинальные шрифты Microsoft (ttf-mscorefonts-installer: Arial, Times New Roman, Courier New, Georgia, Verdana, Trebuchet MS, Impact, Comic Sans MS) и популярные кириллические семейства (PT Sans/Serif/Mono, Roboto, Open Sans, Inter, Montserrat, Fira Code, JetBrains Mono). Образ вырастает примерно на 120 МБ.

MS-шрифты скачиваются со sourceforge во время сборки. Если сеть закрыта, соберите без них:

docker compose build --build-arg INSTALL_MSCOREFONTS=false gotenberg

Вёрстка от этого не поедет — Liberation метрически совпадает с Arial, отличаться будут только сами начертания глифов.

Если конвертер недоступен, приложение не падает: Word открывается встроенным DOCX-просмотрщиком, презентации — встроенным PPTX-просмотрщиком, недоступным остаётся только PDF-режим.