Система нагород за донати для стрімінгу в реальному часі. Адмін-панель для активації дебафів/нагород, віджет OBS для відображення активних елементів з таймером.
npm install
npm run devЗапускає:
- API + WebSocket сервер на
http://localhost:3456 - React фронтенд на
http://localhost:5173
| Сторінка | URL | Призначення |
|---|---|---|
| Адмін-панель | http://localhost:5173/admin | Активація донатів, зміна цін, керування дебафами |
| Головна | http://localhost:5173/ | Соцмережі та опис |
| Меню для глядачів | http://localhost:5173/menu | Список усіх нагород та цін |
| Розіграші | http://localhost:5173/giveaways | Публічний список розіграшів |
| Віджет OBS | унікальний URL з адмін-панелі | Оверлей для джерела браузера в OBS |
- У OBS додайте Джерело браузера
- Скопіюйте URL віджета OBS з адмін-панелі (формат:
/widgets/ваш-унікальний-токен) - Ширина: 500, висота: 400
- Увімкніть Оновлювати браузер при активації сцени
- Вимкніть Вимкнути джерело, коли не видиме (зберігає WebSocket-з'єднання)
- Фон прозорий — розмістіть джерело там, де потрібен оверлей
Коли ви активуєте донат з адмін-панелі, віджет миттєво оновлюється через WebSocket і показує:
- Назву категорії
- Назву дебафа/нагороди
- Ім'я донатера (якщо вказано)
- Таймер зворотного відліку з прогрес-баром (для нагород з таймером)
Нагороди з таймером автоматично зникають після закінчення часу. Нагороди без таймера залишаються видимими, доки ви не натиснете Зупинити в адмін-панелі.
/admin захищено паролем. Меню (/menu) та віджет OBS залишаються публічними.
Перший запуск: відкрийте /admin і створіть пароль (мінімум 4 символи). Пароль зберігається в data/settings.json.
Через змінні середовища (рекомендовано для продакшну):
cp .env.example .env
# Встановіть ADMIN_PASSWORD у .env
ADMIN_PASSWORD=your-secure-password npm startСесія триває 7 днів (httpOnly cookie). Кнопка Вийти в адмін-панелі завершує сесію.
У продакшні (NODE_ENV=production) cookies мають прапор Secure — адмін-панель потребує HTTPS (через nginx + Let's Encrypt або інший reverse proxy).
cp .env.example .env
# Відредагуйте .env — обовʼязково встановіть ADMIN_PASSWORD
npm run docker:build
npm run docker:upДодаток слухає порт 3456 (або HOST_PORT з .env). Дані зберігаються у Docker volume obs-menu-data (data/customizations.json, data/settings.json).
Корисні команди:
npm run docker:logs # логи
npm run docker:down # зупинитиПеревірка здоровʼя: GET /api/health
git clone <repo> /opt/digital_legacy_obs_menu
cd /opt/digital_legacy_obs_menu
cp .env.example .env
# ADMIN_PASSWORD=... TRUST_PROXY=true
npm ci
npm run build
npm run pm2:start
pm2 save
pm2 startup # один раз — автозапуск після перезавантаженняОновлення після git pull:
npm run deploy:pm2Корисні команди: npm run pm2:logs, npm run pm2:restart, npm run pm2:stop
nginx проксує домен на 127.0.0.1:3456 (див. deploy/nginx.conf.example).
git clone <repo> /opt/digital_legacy_obs_menu
cd /opt/digital_legacy_obs_menu
npm ci
npm run build
cp .env.example .env
# ADMIN_PASSWORD=... TRUST_PROXY=true
# systemd (приклад)
sudo cp deploy/digital-legacy-obs.service.example /etc/systemd/system/digital-legacy-obs.service
sudo systemctl daemon-reload
sudo systemctl enable --now digital-legacy-obs- Запустіть додаток на
127.0.0.1:3456 - Скопіюйте
deploy/nginx.conf.example, замінітьYOUR_DOMAIN sudo certbot --nginx -d YOUR_DOMAIN- У
.envвстановітьTRUST_PROXY=true(увімкнено за замовчуванням у prod)
nginx проксує HTTP і WebSocket (Socket.IO) на один upstream.
| Змінна | Опис |
|---|---|
ADMIN_PASSWORD |
Пароль адмін-панелі (рекомендовано для prod) |
PORT |
Порт сервера (за замовч.: 3456) |
HOST |
Адреса bind (за замовч.: 0.0.0.0) |
TRUST_PROXY |
true за reverse proxy — для HTTPS cookies |
NODE_ENV |
production для prod |
HOST_PORT |
Лише Docker Compose — зовнішній порт |
- Адмін:
https://YOUR_DOMAIN/admin - Головна:
https://YOUR_DOMAIN/ - Меню:
https://YOUR_DOMAIN/menu - Розіграші:
https://YOUR_DOMAIN/giveaways - Віджет: скопіюйте URL з адмін-панелі (
/widgets/...)
npm run build
npm startОбслуговує API та фронтенд на порту 3456 (локально):
- Адмін:
http://localhost:3456/admin - Меню:
http://localhost:3456/menu - Віджет: унікальний URL з
/admin
Для серверного деплою див. розділ Деплой на сервер вище.
Усі донати налаштовані в server/donations.js:
- Ігрові дебафи — дебафи з таймером (5–10 хв)
- Музика — ручна зупинка
- Взаємодія — поєднання таймерних та ручних
- Великі запити — переважно ручні; марафон Hogwarts Legacy має таймер 3 год
Редагуйте server/donations.js, щоб змінити ціни, тривалість або додати нові нагороди.
server/
index.js Express API + Socket.IO
donations.js Каталог донатів
state.js In-memory стан активних дебафів
src/
pages/AdminPanel.jsx Адмін UI
pages/ObsWidget.jsx OBS оверлей
hooks/useActiveDebuffs.js Спільний хук real-time стану
| Метод | Endpoint | Опис |
|---|---|---|
| GET | /api/health |
Health check для моніторингу / Docker |
| GET | /api/donations |
Список усіх категорій донатів |
| GET | /api/widget |
Унікальний токен і шлях віджета |
| POST | /api/widget/regenerate |
Згенерувати нове посилання віджета |
| POST | /api/categories |
Додати категорію { name } |
| PATCH | /api/categories/:id |
Перейменувати категорію { name } |
| POST | /api/categories/:id/donations |
Додати донат до категорії |
| PATCH | /api/donations/:id/price |
Оновити ціну { price } |
| GET | /api/active |
Список активних дебафів |
| POST | /api/active |
Активувати { donationId, donorName? } |
| DELETE | /api/active/:id |
Зупинити один дебаф |
| DELETE | /api/active |
Очистити все |
Події Socket.IO: active:update, active:activate, active:deactivate, active:clear, donations:update, donations:updatePrice, donations:addCategory, donations:renameCategory, donations:addDonation
Кастомізації каталогу зберігаються в data/customizations.json. Токен віджета — у data/settings.json.