deploy(docker): self-init entrypoint (миграции+засев прав) + гайд по TrueNAS

- docker-entrypoint.sh: при старте node migrations-runner (идемпотентно) + seed-permissions
  только если role_permissions пуста → контейнер поднимается на чистом томе без ручных шагов
  (сервер раньше fail-fast без миграций). Dockerfile: ENTRYPOINT через tini + entrypoint,
  нормализация CRLF (sed) + chmod, label BQ-System → LearnSpace.
- DEPLOY-TRUENAS.md: пошагово для TrueNAS SCALE (датасет → образ → Custom App compose с host-path
  томами и JWT_SECRET → авто-миграции → reverse-proxy/HTTPS/TURN → бэкапы), заметка про CORE.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-19 19:53:24 +03:00
parent d63c99cae9
commit f7c5f222a3
3 changed files with 145 additions and 5 deletions
+19
View File
@@ -0,0 +1,19 @@
#!/bin/sh
# LearnSpace — инициализация контейнера: применить миграции (идемпотентно),
# при первом старте засеять права, затем запустить сервер.
set -e
cd /app/backend
echo "[entrypoint] applying migrations..."
node src/db/migrations-runner.js
# Засев прав — только если реестр пуст (первый запуск): schema-check сервера
# требует непустую role_permissions. Идемпотентно и безопасно при перезапусках.
NEED_SEED=$(node -e "try{const {DatabaseSync}=require('node:sqlite');const db=new DatabaseSync(process.env.DB_PATH||'./data/learnspace.db');const n=db.prepare('SELECT COUNT(*) AS n FROM role_permissions').get().n;process.stdout.write(n>0?'0':'1')}catch(e){process.stdout.write('1')}")
if [ "$NEED_SEED" = "1" ]; then
echo "[entrypoint] seeding permissions (first run)..."
node src/db/seed-permissions.js || echo "[entrypoint] seed-permissions skipped/failed (non-fatal)"
fi
echo "[entrypoint] starting server..."
exec node src/server.js