A standalone audio sending node based on Lavaplayer and Koe. Allows for sending audio without it ever reaching any of your shards.
Being used in production by FredBoat, Dyno, LewdBot, and more.
A basic example bot is available.
Warning
Lavalink v4 is now in beta! See here for more information.
Table of Contents
- Powered by Lavaplayer
- Minimal CPU/memory footprint
- Twitch/YouTube stream support
- Event system
- Seeking
- Volume control
- REST API for resolving Lavaplayer tracks, controlling players, and more
- Statistics (good for load balancing)
- Basic authentication
- Prometheus metrics
- Docker images
- Plugin support
- Java 17 LTS or newer required. (we recommend running the latest LTS version or newer)
- OpenJDK or Zulu running on Linux AMD64 is officially supported.
Support for other JVMs is also best-effort. Periodic CPU utilization stats are prone not to work everywhere.
Lavalink also runs on other hardware, but support is best-effort. Here is a list of known working hardware:
Operating System | Architecture | Lavaplayer | JDA-NAS | Timescale | AVX2 |
---|---|---|---|---|---|
linux | x86-64 | ✅ | ✅ | ✅ | ✅ |
linux | x86 | ✅ | ✅ | ✅ | ✅ |
linux | arm | ✅ | ✅ | ✅ | ❌ |
linux | armhf | ✅ | ❌ | ❌ | ❌ |
linux | aarch32 | ✅ | ❌ | ❌ | ❌ |
linux | aarch64 | ✅ | ✅ | ✅ | ❌ |
linux-musl | x86-64 | ✅ | ✅ | ✅ | ✅ |
linux-musl | aarch64 | ✅ | ✅ | ✅ | ❌ |
windows | x86-64 | ✅ | ✅ | ✅ | ✅ |
Windows | x86 | ✅ | ✅ | ✅ | ✅ |
darwin | x86-64 | ✅ | ✅ | ✅ | ✅ |
darwin | aarch64e | ✅ | ✅ | ✅ | ❌ |
Please see here
Lavalink follows Semantic Versioning.
The version number is composed of the following parts:
MAJOR breaking API changes
MINOR new backwards compatible features
PATCH backwards compatible bug fixes
PRERELEASE pre-release version
BUILD additional build metadata
Version numbers can come in different combinations, depending on the release type:
`MAJOR.MINOR.PATCH` - Stable release
`MAJOR.MINOR.PATCH+BUILD` - Stable release with additional build metadata
`MAJOR.MINOR.PATCH-PRERELEASE` - Pre-release
`MAJOR.MINOR.PATCH-PRERELEASE+BUILD` - Pre-release additional build metadata
Client | Platform | Compatible With | Additional Information |
---|---|---|---|
Lavalink.kt | Kotlin | Kord/JDA/Any | Kotlin Coroutines |
DisGoLink | Go | Any | |
Mafic | Python | discord.py V2/nextcord/disnake/py-cord | |
Moonlink.js | Node.js | Any | |
Magmastream | Node.js | Any | |
Lavacord | Node.js | Any | |
Shoukaku | Node.js | Any | |
Lavalink-Client | Node.js | Any | |
FastLink | Node.js | Any | |
Riffy | Node.js | Any | |
DisCatSharp | .NET | DisCatSharp | v10.4.2+ |
Lavalink4NET | .NET | Discord.Net/DSharpPlus/Remora | v4+ |
Coglink | C | Concord | |
lavalink-rs | Rust, Python | Any | tokio -based, asyncio -based |
v3.7 supporting Client Libraries
Client | Platform | Compatible With | Additional Information |
---|---|---|---|
Lavalink.kt | Kotlin | JDA/Kord/Any | Kotlin Coroutines |
lavaplay.py | Python | Any* | *asyncio -based libraries only |
Mafic | Python | discord.py V2/nextcord/disnake/py-cord | |
Wavelink | Python | discord.py V2 | |
Pomice | Python | discord.py V2 | |
Lavacord | Node.js | Any | |
Poru | Node.js | Any | |
Shoukaku | Node.js | Any | |
Cosmicord.js | Node.js | Any | |
DisCatSharp | .NET | DisCatSharp | Only prior v10.4.1 |
Nomia | .NET | DSharpPlus | |
Lavalink4NET | .NET | Discord.Net/DSharpPlus | < v4 |
DisGoLink | Go | Any |
Or alternatively, you can create your own client library, following the implementation documentation.
Any client libraries marked with Unmaintained
have been marked as such as their repositories have not received any commits for at least 1 year since time of checking,
however they are listed as they may still support Lavalink, and/or have not needed maintenance, however keep in mind that compatibility and full feature support is not guaranteed.
The server configuration is done in application.yml
. You can find an example configuration here.
Alternatively, you can also use environment variables to configure the server. The environment variables are named the same as the keys in the application.yml
file, but in uppercase and with .
replaced with _
. For example, server.port
becomes SERVER_PORT
.
For arrays, the index is appended to the key, starting at 0. For example, LAVALINK_PLUGINS_0_DEPENDENCY
refers to the dependency
key of the first plugin.
List of all env keys
SERVER_PORT
SERVER_ADDRESS
LAVALINK_PLUGINS_0_DEPENDENCY
LAVALINK_PLUGINS_0_REPOSITORY
LAVALINK_PLUGINS_1_DEPENDENCY
LAVALINK_PLUGINS_1_REPOSITORY
LAVALINK_PLUGINS_DIR
LAVALINK_SERVER_PASSWORD
LAVALINK_SERVER_SOURCES_YOUTUBE
LAVALINK_SERVER_SOURCES_BANDCAMP
LAVALINK_SERVER_SOURCES_SOUNDCLOUD
LAVALINK_SERVER_SOURCES_TWITCH
LAVALINK_SERVER_SOURCES_VIMEO
LAVALINK_SERVER_SOURCES_HTTP
LAVALINK_SERVER_SOURCES_LOCAL
LAVALINK_SERVER_FILTERS_VOLUME
LAVALINK_SERVER_FILTERS_EQUALIZER
LAVALINK_SERVER_FILTERS_KARAOKE
LAVALINK_SERVER_FILTERS_TIMESCALE
LAVALINK_SERVER_FILTERS_TREMOLO
LAVALINK_SERVER_FILTERS_VIBRATO
LAVALINK_SERVER_FILTERS_DISTORTION
LAVALINK_SERVER_FILTERS_ROTATION
LAVALINK_SERVER_FILTERS_CHANNEL_MIX
LAVALINK_SERVER_FILTERS_LOW_PASS
LAVALINK_SERVER_BUFFER_DURATION_MS
LAVALINK_SERVER_FRAME_BUFFER_DURATION_MS
LAVALINK_SERVER_OPUS_ENCODING_QUALITY
LAVALINK_SERVER_RESAMPLING_QUALITY
LAVALINK_SERVER_TRACK_STUCK_THRESHOLD_MS
LAVALINK_SERVER_USE_SEEK_GHOSTING
LAVALINK_SERVER_PLAYER_UPDATE_INTERVAL
LAVALINK_SERVER_YOUTUBE_SEARCH_ENABLED
LAVALINK_SERVER_SOUNDCLOUD_SEARCH_ENABLED
LAVALINK_SERVER_GC_WARNINGS
LAVALINK_SERVER_RATELIMIT_IP_BLOCKS
LAVALINK_SERVER_RATELIMIT_EXCLUDE_IPS
LAVALINK_SERVER_RATELIMIT_STRATEGY
LAVALINK_SERVER_RATELIMIT_SEARCH_TRIGGERS_FAIK
LAVALINK_SERVER_RATELIMIT_RETRY_LIMIT
LAVALINK_SERVER_YOUTUBE_CONFIG_EMAIL
LAVALINK_SERVER_YOUTUBE_CONFIG_PASSWORD
LAVALINK_SERVER_HTTP_CONFIG_PROXY_HOST
LAVALINK_SERVER_HTTP_CONFIG_PROXY_PORT
LAVALINK_SERVER_HTTP_CONFIG_PROXY_USER
LAVALINK_SERVER_HTTP_CONFIG_PROXY_PASSWORD
METRICS_PROMETHEUS_ENABLED
METRICS_PROMETHEUS_ENDPOINT
SENTRY_DSN
SENTRY_ENVIRONMENT
SENTRY_TAGS_SOME_KEY
SENTRY_TAGS_ANOTHER_KEY
LOGGING_FILE_PATH
LOGGING_LEVEL_ROOT
LOGGING_LEVEL_LAVALINK
LOGGING_REQUEST_ENABLED
LOGGING_REQUEST_INCLUDE_CLIENT_INFO
LOGGING_REQUEST_INCLUDE_HEADERS
LOGGING_REQUEST_INCLUDE_QUERY_STRING
LOGGING_REQUEST_INCLUDE_PAYLOAD
LOGGING_REQUEST_MAX_PAYLOAD_LENGTH
LOGGING_LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE
LOGGING_LOGBACK_ROLLINGPOLICY_MAX_HISTORY
Download binaries from the Download Server, GitHub releases (specific versions prior to v3.5
can be found in the CI Server) or GitHub actions.
Put an application.yml
file in your working directory. (Example here)
Run with java -jar Lavalink.jar
from the same directory
If you're using a Systemd-based Linux distribution you may want to install Lavalink as a background service. You will need to create a lavalink.service
file inside /usr/lib/systemd/system
. Create the file with the following template (replacing the values inside the <>
brackets):
[Unit]
# Describe the service
Description=Lavalink Service
# Configure service order
After=syslog.target network.target
[Service]
# The user which will run Lavalink
User=<usr>
# The group which will run Lavalink
Group=<usr>
# Where the program should start
WorkingDirectory=</home/usr/lavalink>
# The command to start Lavalink
ExecStart=java -Xmx4G -jar </home/usr/lavalink>/Lavalink.jar
# Restart the service if it crashes
Restart=on-failure
# Delay each restart by 5s
RestartSec=5s
[Install]
# Start this service as part of normal system start-up
WantedBy=multi-user.target
To initiate the service, run
sudo systemctl daemon-reload
sudo systemctl enable lavalink
sudo systemctl start lavalink
In addition to the usual log files, you can also view the log with sudo journalctl -u lavalink
.
Docker images can be found under packages with old builds prior to v3.7.4
being available on Docker Hub.
There are 2 image variants Ubuntu
and Alpine
, the Alpine
variant is smaller and can be used with the -alpine
suffix, for example ghcr.io/lavalink-devs/lavalink:3-alpine
.
Install Docker & Docker Compose
Create a docker-compose.yml
with the following content:
version: "3.8"
services:
lavalink:
image: ghcr.io/lavalink-devs/lavalink:4 # pin the image version to Lavalink v4
container_name: lavalink
restart: unless-stopped
environment:
- _JAVA_OPTIONS=-Xmx6G # set Java options here
- SERVER_PORT=2333 # set lavalink server port
- LAVALINK_SERVER_PASSWORD=youshallnotpass # set password for lavalink
volumes:
- ./application.yml:/opt/Lavalink/application.yml # mount application.yml from the same directory or use environment variables
- ./plugins/:/opt/Lavalink/plugins/ # persist plugins between restarts, make sure to set the correct permissions (user: 322, group: 322)
networks:
- lavalink
expose:
- 2333 # lavalink exposes port 2333 to connect to for other containers (this is for documentation purposes only)
ports:
- 2333:2333 # you only need this if you want to make your lavalink accessible from outside of containers
networks:
lavalink: # create a lavalink network you can add other containers to, to give them access to Lavalink
name: lavalink
Run docker compose up -d
. See Docker Compose Up
If your bot also runs in a docker container you can make that container join the lavalink network and use lavalink
(service name) as the hostname to connect.
See Docker Networking & Docker Compose Networking