047a3a7e15
- 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>
118 lines
6.3 KiB
Markdown
118 lines
6.3 KiB
Markdown
# Установка 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).
|