Веб-система учёта товаров по партиям: админка с ролями, фото/видео (локально и YouTube), QR для потребителей и PWA-сканер.
- Next.js 15 (App Router) + TypeScript
- Prisma + PostgreSQL
- Auth.js (Credentials)
- PWA (
manifest+ service worker) - Деплой: Railway (
nixpacks.toml)
Нужен PostgreSQL (например Docker):
docker run --name batch-pg -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=batch_tracker -p 5432:5432 -d postgres:16
cp .env.example .env
# DATABASE_URL уже подходит к контейнеру выше
npm install
npx prisma migrate deploy
npm run db:seed
npm run devОткройте http://localhost:3000.
- Создайте проект на Railway и добавьте сервис из GitHub-репозитория.
- Добавьте плагин PostgreSQL и привяжите
DATABASE_URLк веб-сервису. - Задайте переменные:
| Переменная | Значение |
|---|---|
AUTH_SECRET |
openssl rand -base64 32 |
AUTH_TRUST_HOST |
true |
NEXT_PUBLIC_APP_URL |
публичный URL приложения (https://….up.railway.app) |
CRON_SECRET |
случайная строка для джобы медиа |
DATABASE_URL |
из плагина Postgres (обычно подтягивается сам) |
- Volume на путь
/data(уже используется кодом черезDATA_DIR=/data), иначе загруженные файлы пропадут при редеплое. - После деплоя: вход
admin@local/Admin123!— сразу смените пароль. - Cron (каждые 10–15 мин):
curl -H "Authorization: Bearer $CRON_SECRET" https://ВАШ-URL/api/jobs/media-pipeline
Сборка ставит ffmpeg через Nixpacks для сжатия архива видео.
См. .env.example. Опционально YouTube: YOUTUBE_CLIENT_ID, YOUTUBE_CLIENT_SECRET, YOUTUBE_REFRESH_TOKEN (npm run youtube:auth).
После seed:
- Email:
admin@local - Пароль:
Admin123! - Роль:
SUPER_ADMIN
| Роль | Права |
|---|---|
VIEWER |
Просмотр товаров, партий, журнала |
EDITOR |
+ создание/редактирование партий и медиа |
ADMIN |
+ CRUD товаров |
SUPER_ADMIN |
+ управление пользователями |
| Путь | Назначение |
|---|---|
/login |
Вход |
/admin |
Дашборд и поиск |
/admin/products |
Товары |
/admin/batches |
Партии, медиа, QR |
/admin/users |
Пользователи (супер-админ) |
/admin/audit |
Журнал изменений |
/b/[token] |
Публичная страница партии (QR) |
/scan |
Мобильный сканер QR (PWA) |
- Загрузка на сервер → 2. фон: YouTube → 3. сжатие в
storage/archive/→ 4. удаление через 90 дней.
QR не меняется (/b/{publicToken}).
npm run media:pipelinenpm run dev— разработкаnpm run build/npm start— продnpm run db:deploy— миграцииnpm run db:seed— сид админа (только если ещё нет)npm run youtube:auth— refresh token YouTubenpm run media:pipeline— очередь YouTube/архив + purge