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:
@@ -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
|
||||
Reference in New Issue
Block a user