From f339943e3bf02de30eb694eda894022053c06b48 Mon Sep 17 00:00:00 2001 From: aki Date: Sun, 20 Apr 2025 00:54:15 +0800 Subject: [PATCH 1/3] build(docker): Add Dockerfile --- Dockerfile | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..5eb9247 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,42 @@ +# Dockerfile + +# ---- Planner Stage ---- +# Use the official Rust Alpine image as a base for planning. +# We use the same base image for planner and builder for consistency. +FROM rust:1-alpine AS planner +WORKDIR /app +# Install cargo-chef for build caching +RUN apk add --no-cache musl-dev # Needed by chef +RUN cargo install cargo-chef --locked +COPY . . +# Compute dependencies. This output will be cached if Cargo.toml/lock haven't changed. +RUN cargo chef prepare --recipe-path recipe.json + +# ---- Builder Stage ---- +# Use the same Rust Alpine image for building. +FROM rust:1-alpine AS builder +WORKDIR /app +# Install build dependencies for Alpine +RUN apk add --no-cache build-base openssl-dev pkgconfig +# Install cargo-chef again (could optimize but simpler this way) +RUN cargo install cargo-chef --locked +# Copy the dependency recipe from the planner stage +COPY --from=planner /app/recipe.json recipe.json +# Build dependencies based on the recipe. This layer is cached efficiently. +RUN cargo chef cook --release --recipe-path recipe.json +# Copy application code +COPY . . +# Build the application binary, linking against pre-built dependencies +# Ensure the binary name matches your package name in Cargo.toml +RUN cargo build --release --bin discord-music-bot-lavalink-rs + +# ---- Runtime Stage ---- +# Use a minimal Alpine image for the final runtime environment. +FROM alpine:latest +WORKDIR /app +# Install runtime dependencies needed by the binary (e.g., SSL certs) +RUN apk add --no-cache ca-certificates openssl +# Copy the compiled application binary from the builder stage +COPY --from=builder /app/target/release/discord-music-bot-lavalink-rs /app/ +# Set the binary as the entrypoint +CMD ["./discord-music-bot-lavalink-rs"] \ No newline at end of file -- 2.47.2 From 472111bd578bd2b3abe8f6ceb5142e51ed2dbdc1 Mon Sep 17 00:00:00 2001 From: aki Date: Sun, 20 Apr 2025 00:54:39 +0800 Subject: [PATCH 2/3] build(docker): Add Docker Compose and Lavalink Configuration --- application.yml | 32 ++++++++++++++++++++++++++++++++ compose.yml | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 application.yml create mode 100644 compose.yml diff --git a/application.yml b/application.yml new file mode 100644 index 0000000..dfd8935 --- /dev/null +++ b/application.yml @@ -0,0 +1,32 @@ +# application.yml (Example) +server: # REST and WS server + port: 2333 + address: 0.0.0.0 # Listen on all interfaces within the container +lavalink: + server: + password: "youshallnotpass" # CHANGE THIS to a strong password + sources: + youtube: true + bandcamp: true + soundcloud: true + twitch: true + vimeo: true + http: true + local: false + # bufferDurationMs: 400 # How many milliseconds of audio to buffer? Lower values are less safe. + # youtubePlaylistLoadLimit: 6 # Number of pages at 100 tracks each + # playerUpdateInterval: 5 # How frequently to send player updates to clients, in seconds + # youtubeSearchEnabled: true + # soundcloudSearchEnabled: true + # bandcampSearchEnabled: true # Not implemented by LavaLink currently + # Default values are generally fine + # You can find more options here: https://github.com/lavalink-devs/Lavalink/blob/master/IMPLEMENTATION.md#configuration +logging: + file: + max-history: 30 + max-size: 1GB + path: ./logs/ + + level: + root: INFO + lavalink: INFO \ No newline at end of file diff --git a/compose.yml b/compose.yml new file mode 100644 index 0000000..8dbd268 --- /dev/null +++ b/compose.yml @@ -0,0 +1,46 @@ +# docker-compose.yml + +version: '3.8' + +services: + # The Rust Discord Bot Service + app: + # Build the image from the Dockerfile in the current directory (.) + build: . + container_name: discord-bot-app + restart: unless-stopped + # Pass environment variables from the .env file + env_file: + - .env + # Depend on the lavalink service to ensure it starts first (best practice) + depends_on: + - lavalink + + # The LavaLink Service + lavalink: + # Use a Java Runtime Environment image (Alpine base for smaller size) + image: eclipse-temurin:17-jre-alpine + container_name: lavalink-server + restart: unless-stopped + # Set the working directory inside the container + working_dir: /opt/lavalink + # Mount the local Lavalink.jar and application.yml into the container + volumes: + - ./Lavalink.jar:/opt/lavalink/Lavalink.jar:ro # Mount Jar read-only + - ./application.yml:/opt/lavalink/application.yml:ro # Mount config read-only + - ./logs:/opt/lavalink/logs # Mount logs directory (optional) + # Expose the LavaLink port to the host machine (optional, but useful for debugging) + # and makes it reachable by the 'app' service via Docker network. + ports: + - "2333:2333" + # Command to run LavaLink inside the container + command: ["java", "-jar", "Lavalink.jar"] + +# Define networks (optional, Docker Compose creates a default one) +# networks: +# default: +# driver: bridge + +# Define volumes (optional, if you need persistent data beyond logs) +# volumes: +# lavalink_logs: \ No newline at end of file -- 2.47.2 From b445fd1421d1fd47ef242f3a2b65f6fe4f009b8e Mon Sep 17 00:00:00 2001 From: aki Date: Sun, 20 Apr 2025 00:54:50 +0800 Subject: [PATCH 3/3] chore(docker): Add .dockerignore --- .dockerignore | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..25b941d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +# .dockerignore + +.git +.gitignore +target/ +.env +*.md +Lavalink.jar +application.yml \ No newline at end of file -- 2.47.2