Files
Botinator/docker-compose.yaml
ksan cab8f32542
CI/CD / build (push) Successful in 44s
CI/CD / deploy (push) Successful in 15s
fixing root permissions inside container
2026-07-10 01:22:46 +02:00

52 lines
1.9 KiB
YAML

# Runs the bot together with a Lavalink v4 server for music playback.
# docker compose up -d --build # build the bot image locally and start
#
services:
bot:
image: git.ksan.dev/ksan/botinator:latest
build: .
container_name: botinator
restart: unless-stopped
depends_on:
- lavalink
# BOT_TOKEN, GUILD_ID, LAVALINK_PASSWORD, ... come from .env.
env_file:
- .env
environment:
- LAVALINK_URI=ws://lavalink:2333
# Catchphrases and the AR-meter user lists are supplied at deploy time,
# not baked into the image.
volumes:
- ./catchphrases.txt:/app/catchphrases.txt:ro
- ./always100.txt:/app/always100.txt:ro
- ./always90.txt:/app/always90.txt:ro
lavalink:
image: ghcr.io/lavalink-devs/lavalink:4
container_name: lavalink
restart: unless-stopped
# A mounted volume at /opt/Lavalink/plugins is created root-owned (the image
# has no plugins dir for Docker to copy ownership from), but Lavalink runs as
# a non-root user and can't write there. Run as root so it can download the
# plugin jars into the volume. The container is internal-only.
user: "0:0"
env_file:
- .env
environment:
- _JAVA_OPTIONS=-Xmx1G
# Lavalink reads this for lavalink.server.password in application.yml.
# Keep it equal to LAVALINK_PASSWORD (what the bot uses to connect).
- LAVALINK_SERVER_PASSWORD=${LAVALINK_PASSWORD}
volumes:
- ./lavalink/application.yml:/opt/Lavalink/application.yml:ro
# Named volume (managed by Docker) rather than a host bind mount. Docker
# initializes it from the image, so it's owned by Lavalink's container user
# and the plugin jars download without permission errors. No root-owned (or
# UID-mismatched) plugins/ dir in the deploy directory.
- lavalink-plugins:/opt/Lavalink/plugins
ports:
- "2333:2333"
volumes:
lavalink-plugins: