# Установка 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).