# music_bot_v2 디스코드 음악봇 + 웹 대시보드 모노레포. 디스코드에서 명령으로 음악을 틀 수도 있고, 웹에서 로그인해 검색·재생·대기열을 제어할 수도 있다. 성인인증(연령제한) 영상 재생까지 지원한다. ## 구성 | 디렉터리 | 내용 | 문서 | |----------|------|------| | [`bot/`](bot) | 디스코드 봇 본체(discord.js + shoukaku/Lavalink). 검색·재생·대기열·자동재생·연령제한 우회. | [bot/README.md](bot/README.md) | | [`page/`](page) | 웹 대시보드(Next.js 16 + NextAuth + Redis). 브라우저에서 봇 제어·상태 표시. | [page/README.md](page/README.md) | | [`resolver/`](resolver) | `ytresolver.py` — yt-dlp 기반 오디오 URL 리졸버(+systemd 유닛). 봇이 연령제한/SABR 우회에 사용. | 아래 + bot/README §1·2 | | [`scripts/`](scripts) | `refresh-cookies.mjs` — 유튜브 쿠키(`ytcookie.txt`) 재발급 스크립트(Chromium). | bot/README §4 | ## 전체 아키텍처 ``` ┌─────────────── 디스코드 제어 평면 ───────────────┐ [Discord 유저] ── 명령 ──▶ 봇(music1/2/3, .5 docker) ── shoukaku ──▶ Lavalink(.6:2333) │ ▲ └ youtube-plugin(일반) │ │ 재생 직전 리졸브 ▼ │ ytresolver(.5:8779) ── yt-dlp(+쿠키) ──▶ 직접 오디오 URL │ (Lavalink http 소스로 재생) │ ┌───────── Redis(.7) Pub/Sub + Key ─────────┐ ← 제어/상태 버스 │ │ [브라우저] ──▶ 웹 대시보드 page/(Next.js, NextAuth) ──┘ · site→bot: "site-bot" 명령 + 결과키 폴링(botRpc) · bot→site: "bot-site" 이벤트 → SSE 실시간 표시 ``` - **봇**과 **대시보드**는 직접 연결되지 않고 **Redis**로 느슨하게 연동된다(대시보드는 Redis만 있으면 봇과 통신). - 봇은 유튜브 연령제한 영상을 Lavalink만으로는 못 틀어서, `resolver/`가 쿠키로 직접 오디오 URL을 뽑아 우회한다. - 봇 서버(.5)와 Lavalink(.6)가 같은 공인 IP라, .5에서 뽑은 스트림 URL을 .6이 그대로 재생한다. ## 빠르게 보기 - 봇 배포/쿠키/검색·재생 동작·성능·트러블슈팅 → [bot/README.md](bot/README.md) - 대시보드 개발/환경변수/Redis 통신 구조/API·UI → [page/README.md](page/README.md) ## 리포 규칙 - `bot/.gitignore`가 `*.env`, `*.db`를 제외 → 실제 토큰/DB는 커밋되지 않는다. 예시는 [`bot/.env.example`](bot/.env.example). - 원격: Gitea `git.tkrmagid.kr/tkrmagid/music_bot_v2` (`master`).