# LearnSpace — деплой на TrueNAS SCALE (host-path тома на датасет). # Запуск из папки с кодом на NAS: docker compose -f compose.truenas.yml up -d # ⚠️ Перед запуском поправь: # 1) пути /mnt/tank/apps/learnspace/... под свой пул/датасет; # 2) JWT_SECRET — длинная случайная строка (на NAS: openssl rand -hex 32); # 3) CLIENT_ORIGIN — публичный адрес, по которому открываешь сайт. services: app: build: . # собрать образ из этого репозитория прямо на NAS # image: learnspace:latest # ← вместо build: ., если образ уже собран/загружен (docker load) container_name: learnspace restart: unless-stopped ports: - "3000:3000" # внешний:внутренний — поменяй левую часть при конфликте порта volumes: - /mnt/tank/apps/learnspace/data:/app/backend/data # SQLite-БД (learnspace.db) - /mnt/tank/apps/learnspace/uploads:/app/backend/uploads # загрузки (картинки и т.п.) - /mnt/tank/apps/learnspace/backups:/app/backups # бэкапы environment: - NODE_ENV=production - PORT=3000 - JWT_SECRET=ЗАМЕНИ_НА_СЛУЧАЙНУЮ_СТРОКУ # openssl rand -hex 32 — обязательно! - JWT_EXPIRES_IN=7d - DB_PATH=/app/backend/data/learnspace.db - UPLOADS_DIR=/app/backend/uploads - CLIENT_ORIGIN=http://NAS_IP:3000 # публичный URL (для CORS); потом — домен с https # --- необязательно --- # TURN для видеосвязи (классы/доска) за NAT: # - TURN_URL=turn:turn.example.com:3478 # - TURN_USER=user # - TURN_PASS=pass # LLM «Спроси» (Groq и т.п.): # - ASSISTANT_LLM_URL=https://api.groq.com/openai/v1/chat/completions # - ASSISTANT_LLM_KEY= # - ASSISTANT_LLM_MODEL=llama-3.3-70b-versatile healthcheck: test: ["CMD", "wget", "-qO-", "http://localhost:3000/api/health"] interval: 30s timeout: 5s start_period: 40s # запас на первичные миграции при первом старте retries: 3