# Server Лёгкий файловый backend без внешних зависимостей. Быстрый старт - Полный локальный viewer с backend/API: `npm run serve` или `npm --prefix server start` (PORT=8080 по умолчанию). Если порт занят, сервер попробует 8081/8082/8083 автоматически. - Ручной выбор порта: `PORT=8088 npm --prefix server start` - Клиент отдельно (только статика, без API): `npm run serve:frontend` или `npx http-server frontend -p 9001` и открыть http://localhost:9001 - Старый статический корень без backend оставлен как `npm run serve:static`; для проверки upload/comments/share/LOD его не использовать. Статика: раздаётся из `../frontend/dist`, при отсутствии сборки — из `../frontend`. Хранилище: `server/data/projects/index.json` (список) + `server/data/projects/proj_.json` (полный проект). Upload-артефакты лежат в `server/data/uploads`, публичные share-ссылки — в `server/data/shares/index.json`, а пользовательские ссылки/ref-count моделей — в `server/data/models/registry.json`. При старте директории и индексы создаются при необходимости. API: - `GET /api/projects[?type=project|template]` — укороченный список из `index.json`. - `GET /api/projects/:id` — полный JSON проекта. - `POST /api/projects` — создать проект, генерируется `id`, `createdAt`, `updatedAt`, сохраняется файл и обновляется индекс. - `POST /api/uploads?filename=&projectId=` — сохранить оригинальный файл модели в `server/data/uploads`. - `DELETE /api/uploads/asset` — снять ссылку текущего пользователя на модель и физически удалить asset только если больше нет user/share refs. - `DELETE /api/uploads/version` — удалить версию, если на неё нет чужих refs или публичных share-ссылок. - `GET /api/conversions/status?src=` — получить статус подготовки viewer-артефакта. Для `.step/.stp` ответ помечается `conversion.status=conversion_required`: оригинал уже доступен для скачивания, а preview должен появиться после работы `NodeDcBimConverter`, который готовит GLB и metadata/tree. Локальный Beam compose: - `docker compose -f docker-compose.beam.yml up ndc-beam-viewer` - `docker compose -f docker-compose.beam.yml up nodedc-bim-converter` Synology Beam compose: - скопировать `.env.synology.example` в `.env` рядом с `docker-compose.beam.yml`; - заполнить `NODEDC_INTERNAL_ACCESS_TOKEN` тем же значением, что и в platform `.env.synology`; - запустить `docker compose -f docker-compose.beam.yml up -d ndc-beam-viewer nodedc-bim-converter`. Поле `ownerId` пока всегда `null`, но оставлено для будущих пользователей/шаринга. NODE.DC auth/share: - `NODEDC_BIM_AUTH_REQUIRED=1` включает вход через Launcher handoff. - `NODEDC_BIM_SERVICE_SLUG=bim-viewer` должен совпадать со slug сервиса в Launcher. - `NODEDC_INTERNAL_ACCESS_TOKEN` должен совпадать с Launcher internal token. - `NODEDC_LAUNCHER_BASE_URL` — публичный Launcher URL для редиректа на login/launch. - `NODEDC_LAUNCHER_INTERNAL_URL` — внутренний URL Launcher для `/api/internal/handoff/consume`. - `NODEDC_BIM_PUBLIC_URL` — публичный URL viewer-а для share-ссылок, на проде `https://bim.nodedc.tech`. - `NODEDC_BIM_HOST_PORT` — host-port для `docker-compose.beam.yml`; на Synology BIM публикуется как `18100:8080`. - `NODEDC_BIM_COOKIE_SAMESITE=None` и `NODEDC_BIM_COOKIE_SECURE=1` нужны для BIM в iframe на `ops.nodedc.ru`. - `NODEDC_BIM_DATA_ROOT` — опциональный корень файлового storage вместо `server/data`. - `POST /api/shares` создаёт публичную read-only ссылку на upload artifact; `/share/` открывает viewer в guest mode. - `GET /api/models` возвращает личные активные модели текущего пользователя. - `POST /api/models/refs` сохраняет существующий upload artifact в личные модели текущего пользователя. - `DELETE /api/models/refs` снимает личную ссылку и удаляет физические файлы только при отсутствии других refs/share.