Files
stoat-mbot/.env.example
T
Leonid PershinandClaude Opus 5 a9b7ccdd16 Add music bot for self-hosted Stoat with web control panel
Plays audio into Stoat voice channels over LiveKit and exposes the same
player through both chat commands and a browser panel, so the two never
drift apart: everything routes through a single MusicManager.

- core: per-server GuildPlayer (queue, loop, shuffle, seek, volume,
  idle auto-leave) driving revoice.js/@livekit/rtc-node and ffmpeg
- sources: yt-dlp for YouTube/SoundCloud, direct media URLs and internet
  radio, optional local library with path-traversal guards
- bot: 18 chat commands with aliases, plus !panel one-time login links
- api: Fastify REST + WebSocket, sessions authenticated against the
  instance's own /auth/session/login (TOTP supported), permissions
  re-checked against Stoat membership and roles on every request
- web: React panel with search, queue editing, seek and volume
- deploy: Dockerfile, compose.override.yml and Caddyfile snippets for
  dropping the service into an existing /opt/stoat stack

Verified with npm run typecheck, both builds, and scripts/smoke-api.mjs
(9 API checks). Voice playback itself needs a live instance to test.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 23:12:43 +03:00

52 lines
2.2 KiB
Bash

# ---------------------------------------------------------------- Stoat ----
# Публичный адрес API вашего инстанса (тот же, что в клиенте).
# Внутри docker-сети Stoat можно использовать http://api:14702 — но тогда
# убедитесь, что LiveKit URL из join_call резолвится изнутри контейнера.
STOAT_API_URL=https://stoat.example.com/api
# Токен бота: Settings → My Bots → создать бота → скопировать токен.
STOAT_BOT_TOKEN=
# Префикс команд в чате.
COMMAND_PREFIX=!
# ------------------------------------------------------------- Веб-панель ---
PORT=3005
HOST=0.0.0.0
# Адрес, по которому панель открывается в браузере (без слэша в конце).
PUBLIC_URL=https://music.example.com
# Секрет для подписи сессионных cookie. Сгенерируйте: openssl rand -hex 32
JWT_SECRET=
# Срок жизни сессии панели, часов.
SESSION_TTL_HOURS=168
# ---------------------------------------------------------------- Аудио ----
# Путь к yt-dlp. В docker-образе он уже установлен.
YTDLP_PATH=yt-dlp
# Необязательно: файл cookies.txt для приватных/возрастных видео.
# YTDLP_COOKIES=/data/cookies.txt
# Необязательно: каталог с локальной медиатекой (смонтируйте том).
# LOCAL_MEDIA_DIR=/media/music
DEFAULT_VOLUME=60
MAX_QUEUE_SIZE=500
SEARCH_RESULT_LIMIT=10
# Через сколько секунд простоя бот выходит из голосового канала (0 — никогда).
IDLE_TIMEOUT_SECONDS=300
# --------------------------------------------------------------- Доступ ----
# false — управлять может любой участник сервера.
# true — только владелец, ManageServer или роль DJ_ROLE_NAME.
REQUIRE_DJ_ROLE=false
DJ_ROLE_NAME=DJ
# ----------------------------------------------------------------- Прочее ---
LOG_LEVEL=info
NODE_ENV=production