f7c5f222a3
- 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>
20 lines
1.1 KiB
Bash
20 lines
1.1 KiB
Bash
#!/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
|