From 6daf1993d1a0ad5865bce086ec31433af56730cf Mon Sep 17 00:00:00 2001 From: aki Date: Wed, 23 Apr 2025 21:55:40 +0800 Subject: [PATCH] build(docker): add Dockerfile, Docker Compose config, and update README --- Dockerfile | 23 +++++++++++++ README.md | 80 ++++++++++++++++++++++++++-------------------- docker-compose.yml | 24 ++++++++++++++ 3 files changed, 93 insertions(+), 34 deletions(-) create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9102054 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +# Use official Node.js LTS image +FROM node:18-alpine + +# Create app directory +WORKDIR /app + +# Install build dependencies and copy manifest +RUN apk add --no-cache python3 make g++ + +COPY package.json pnpm-lock.yaml ./ + +# Install dependencies +RUN npm ci + +# Copy source code +COPY . . + +# Expose no ports (Discord bot) +# Define default environment variables (optional) +ENV NODE_ENV=production + +# Start the bot +CMD ["node", "src/index.js"] diff --git a/README.md b/README.md index 1dc9873..677e20a 100644 --- a/README.md +++ b/README.md @@ -1,57 +1,69 @@ # discord-music-bot -Discord music bot template written in Rust using `serenity` and `lavalink-rs`. +Discord music bot template written in NodeJS using `discord.js` and `erela.js`, with Lavalink support. ## Features -- Slash commands: `/ping`, `/join`, `/play`, `/leave` -- LavaLink integration for audio playback -- Modular command handler structure + +- Slash commands: `/ping`, `/join`, `/play`, `/leave` +- Lavalink integration for audio playback +- Modular command handler structure ## Prerequisites -- Rust (stable toolchain) -- A Discord application with bot token -- LavaLink server running (see [LavaLink](https://github.com/freyacodes/Lavalink)) + +- Node.js (>=14) +- pnpm or npm +- A Discord application with bot token +- LavaLink server for audio streaming ## Setup 1. Copy `.env.example` to `.env` and fill in your credentials: - ``` + ```env DISCORD_TOKEN=your_discord_bot_token + CLIENT_ID=your_discord_application_id LAVALINK_HOST=127.0.0.1 LAVALINK_PORT=2333 LAVALINK_PASSWORD=your_lavalink_password ``` - -2. Build the project: +2. Install dependencies: ```sh - cargo build --release + pnpm install + ``` +3. Run tests: + ```sh + npm test + ``` +4. Register slash commands: + ```sh + npm start # or node deploy-commands.js + ``` +5. Start the bot: + ```sh + npm start ``` -3. Run the bot: - ```sh - cargo run --release - ``` +## Docker + +A `Dockerfile` and `docker-compose.yml` are provided for containerized deployment. + +- Build and run with Docker Compose: + ```sh + docker-compose up --build + ``` +- Environment variables are loaded from `.env`. +- Lavalink service is configured in `docker-compose.yml` alongside the bot. ## Project Structure -- `src/main.rs` - Bot entry point, initializes Serenity and LavaLink clients -- `src/handler.rs` - Serenity event handlers (ready, interaction, voice updates) -- `src/lavalink_handler.rs` - LavaLink event handlers -- `src/state.rs` - TypeMap keys for shared state -- `src/utils.rs` - Utility functions (env management) -- `src/commands/` - Modular slash command definitions and handlers - -## Commands - -- `/ping` - Replies with "Pong!" -- `/join` - Bot joins your voice channel -- `/play url:` - Plays audio from the given URL -- `/leave` - Bot leaves the voice channel - -## TODO -- Implement actual command logic in `src/commands/*.rs` -- Add error handling and command concurrency management -- Expand LavaLink event handlers +- `src/index.js` — Entry point +- `src/commands/` — Slash command modules +- `src/events/` — Discord event handlers +- `src/structures/` — Erela.js (Lavalink) event wiring +- `src/utils/logger.js` — Logging setup +- `deploy-commands.js` — Slash command registration script +- `Dockerfile` — Bot container image +- `docker-compose.yml` — Multi-service setup (bot + Lavalink) ## License -MIT \ No newline at end of file + +MIT diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..0f99b26 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,24 @@ +version: '3.8' + +services: + lavalink: + image: jagrosh/lavalink:latest + container_name: lavalink + ports: + - "2333:2333" + environment: + - LAVALINK_PASSWORD=${LAVALINK_PASSWORD} + volumes: + # Optional: mount custom configuration if needed + # - ./application.yml:/opt/Lavalink/application.yml + + bot: + build: . + container_name: discord-music-bot + env_file: + - .env + environment: + - LAVALINK_HOST=lavalink + - LAVALINK_PORT=2333 + depends_on: + - lavalink