Files
Learn_System/DEPLOY-TRUENAS.md
T
Maxim Dolgolyov 047a3a7e15 deploy: compose.truenas.yml + инструкция под SCALE/сборку-на-NAS
- compose.truenas.yml: готовый host-path compose (build на NAS / или image), env
  с JWT_SECRET/CLIENT_ORIGIN, healthcheck start_period 40s (запас на первичные миграции).
- DEPLOY-TRUENAS.md: переписан под реальный кейс (TrueNAS SCALE, сборка образа на NAS,
  без Docker на ПК): датасет → код по SMB → docker build → правка JWT/пути →
  docker compose up / Custom App → проверка → домен/HTTPS/бэкапы. PC-сборка и CORE — в конце.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 20:12:56 +03:00

118 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Установка 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`. Через ~3040 с 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).