# Установка LearnSpace на TrueNAS SCALE

Пошаговая инструкция под **твой случай: TrueNAS SCALE, сборка образа прямо на NAS**
(на рабочем ПК Docker не нужен). В репозитории уже есть `Dockerfile`, `docker-entrypoint.sh`
и готовый `compose.truenas.yml`.

Контейнер **самоинициализируется**: при старте применяет миграции БД, при первом запуске засевает права.
Данные (SQLite-БД, загрузки, бэкапы) лежат на датасете и переживают пересоздание/обновление контейнера.

> CORE (FreeBSD) Docker не умеет — см. раздел в конце. Если у тебя CORE — скажи, распишу отдельно.

---

## Шаг 1. Датасет под данные

TrueNAS → **Datasets → Add Dataset**: создай `tank/apps/learnspace` (вместо `tank` — имя своего пула).
Затем создай в нём три папки (через **System → Shell** или по SMB):
```sh
mkdir -p /mnt/tank/apps/learnspace/{data,uploads,backups}
```
Здесь будут жить БД, загрузки и бэкапы. Их защищают снапшоты/репликация TrueNAS.

## Шаг 2. Положить код проекта на NAS

Самое простое — по SMB скопировать папку репозитория в датасет, например в
`/mnt/tank/apps/learnspace/src` (нужны `Dockerfile`, `compose.truenas.yml`, `backend/`, `frontend/`, `js/`,
`docker-entrypoint.sh`). Папку `node_modules` копировать НЕ нужно — образ ставит зависимости сам.

Либо, если у NAS есть доступ к git-серверу:
```sh
cd /mnt/tank/apps/learnspace
git clone <адрес-репозитория> src
```

## Шаг 3. Включить SSH и собрать образ

System → **Services → SSH** → включить. Зайти в шелл NAS (ssh root@IP_NAS) и собрать:
```sh
cd /mnt/tank/apps/learnspace/src
docker build -t learnspace:latest .
```
(Сборка скачает зависимости и займёт пару минут.)

## Шаг 4. Настроить параметры запуска

Открой `compose.truenas.yml` (в папке src) и поправь **три вещи**:
1. Пути `/mnt/tank/apps/learnspace/...` — под свой пул, если он не `tank`.
2. `JWT_SECRET` — длинная случайная строка. Сгенерируй прямо на NAS:
   ```sh
   openssl rand -hex 32
   ```
   и вставь значение.
3. `CLIENT_ORIGIN` — адрес, по которому будешь открывать сайт (пока `http://IP_NAS:3000`, позже домен с https).

## Шаг 5. Запустить

**Способ 1 — командой (просто):**
```sh
cd /mnt/tank/apps/learnspace/src
docker compose -f compose.truenas.yml up -d
```

**Способ 2 — через UI TrueNAS (интегрированно, app виден в Apps):**
Apps → **Discover Apps → Custom App → Install via YAML** → вставь содержимое `compose.truenas.yml`
(этот способ — для SCALE 24.10 «ElectricEel» и новее; на 24.04 «Dragonfish» и старше используй Способ 1).

Первый старт сам накатит миграции и засеет права — отдельных команд не нужно.

## Шаг 6. Проверить

```sh
docker logs -f learnspace
```
Ожидаемо: `applying migrations...` → (на первом старте) `seeding permissions...` → `starting server...`
→ `Server running on port 3000`. Через ~30–40 с healthcheck станет «healthy».

Открой в браузере **http://IP_NAS:3000** и зарегистрируй первого пользователя.
(Нужен сразу админ — скажи, добавлю команду/скрипт создания админа.)

## Шаг 7. Домен и HTTPS (рекомендуется)

Порт 3000 — внутренний. Для домена с HTTPS поставь reverse-proxy (TrueNAS app **Nginx Proxy Manager**
или **Traefik**, либо внешний nginx) → проксировать на `IP_NAS:3000`. В `CLIENT_ORIGIN` укажи итоговый
публичный URL (иначе CORS заблокирует фронт). Для видеосвязи в классах за CGNAT/симметричным NAT нужен
TURN-сервер (coturn) — пропиши `TURN_URL/TURN_USER/TURN_PASS`.

## Обновление версии

1. Обнови код в `src` (git pull или перекопируй).
2. Пересобери и перезапусти:
   ```sh
   cd /mnt/tank/apps/learnspace/src
   docker compose -f compose.truenas.yml up -d --build
   ```
   Данные сохранятся (тома на датасете), новые миграции применятся автоматически.

## Бэкапы

Данные — в `/mnt/tank/apps/learnspace/{data,uploads}`. Настрой **снапшоты датасета** (+ репликацию при желании).
SQLite-файл — `data/learnspace.db`; консистентный бэкап лучше делать снапшотом ZFS или при остановленном app.

---

## Альтернатива: собрать на ПК (если поставишь Docker Desktop)

```bash
docker build -t learnspace:latest .
docker save learnspace:latest | gzip > learnspace.tar.gz   # перенести файл на NAS
```
На NAS: `docker load < learnspace.tar.gz`, затем в `compose.truenas.yml` заменить `build: .` на
`image: learnspace:latest` и выполнить Шаги 4–6.

## TrueNAS CORE (FreeBSD) — без Docker

CORE контейнеры не запускает. Варианты: **Linux-VM** (bhyve) с Docker внутри → следовать инструкции выше;
либо **jail** с Node ≥ 22: `npm ci --omit=dev` в `backend/`, прописать env, `npm run migrate &&
npm run seed:permissions`, запускать `node src/server.js` под supervisor (pm2/rc.d).
