Objetivos de aprendizaje
Después de leer este artículo podrás:
- Entender qué hace Lavalink y por qué lo usan los bots de música
- Saber cómo se conectan el bot, la biblioteca cliente y el servidor Lavalink
- Configurar el application.yml y planificar el hosting
En esta página
Reproducir música en un bot de Discord da más trabajo de lo que parece. Hay que buscar la pista, decodificar el audio, codificarlo en Opus y mandar los paquetes por una conexión de voz sin cortes. Hacerlo dentro del propio bot consume CPU y memoria, y cualquier bloqueo afecta también a los comandos normales.
Lavalink resuelve esto sacando el audio del bot. Es un programa aparte que hace el trabajo pesado, mientras el bot se ocupa solo de comandos y eventos.
¿Qué es Lavalink?#
Lavalink es un nodo de envío de audio independiente (standalone), basado en la biblioteca Lavaplayer y en el proyecto Koe. Es software libre, mantenido en github.com/lavalink-devs/Lavalink. Funciona como un servidor propio, expone una API REST y un WebSocket, y envía el audio directamente a Discord sin que pase por los shards de tu bot.
No es un bot y no tiene comandos de usuario. Es una pieza de infraestructura que tu bot controla.
¿Cómo funciona Lavalink por dentro?#
Tres piezas hablan entre sí:
- El bot recibe
/playde un usuario. - Una biblioteca cliente dentro del bot pasa el pedido al servidor Lavalink e informa los datos de la conexión de voz de Discord.
- El servidor Lavalink carga la pista, aplica filtros, codifica el audio y lo envía al canal de voz.
El bot y el servidor intercambian mensajes por HTTP (REST) y por WebSocket. El bot manda "reproduce esta pista", "pausa", "cambia el volumen" y recibe eventos como "la pista terminó". El audio nunca vuelve al bot.
Para autenticarse, el cliente envía la contraseña configurada en el encabezado Authorization. Para comprobar que el servidor está en pie, GET /version devuelve la versión en texto plano.
¿Para qué sirve y cuándo vale la pena?#
Lavalink tiene sentido cuando:
- el bot reproduce música o audio de fuentes externas;
- el bot está en muchos servidores y el audio pesa en el proceso principal;
- quieres reiniciar o actualizar el bot sin tocar el servicio de audio;
- varios bots o instancias pueden compartir pocos nodos de audio.
Trae filtros listos (ecualizador, karaoke, timescale, tremolo, vibrato, rotación, entre otros) y fuentes como SoundCloud, Bandcamp, Twitch, Vimeo y enlaces HTTP.
No vale la pena para un bot que solo reproduce un archivo corto de vez en cuando o que no usa voz. Tampoco resuelve los derechos de autor: reproduce lo que entrega la fuente, y respetar las condiciones de cada plataforma sigue siendo responsabilidad de quien opera el bot.
¿Qué necesito para ejecutar un servidor Lavalink?#
- Una versión LTS de Java. Consulta el mínimo en la documentación, que recomienda la LTS más nueva.
- Un archivo
application.ymlen el directorio de ejecución. - Una contraseña y un puerto (el ejemplo oficial usa 2333).
- Una biblioteca cliente compatible con Lavalink v4 en tu bot.
Un application.yml mínimo:
server:
port: 2333
address: 0.0.0.0
lavalink:
server:
password: "cambia-esta-contrasena"
sources:
youtube: false
soundcloud: true
plugins:
- dependency: "dev.lavalink.youtube:youtube-plugin:VERSION"
snapshot: falseCambia VERSION por la versión actual que aparece en la pestaña Releases de youtube-source. El ejemplo oficial trae la contraseña youshallnotpass: nunca la dejes en producción.
Para ejecutarlo, la documentación indica el binario (java -jar Lavalink.jar), systemd en Linux o Docker. En Docker, la imagen oficial es ghcr.io/lavalink-devs/lavalink:4, con el archivo montado en /opt/Lavalink/application.yml.
¿Cómo se conecta el bot a Lavalink?#
Cada lenguaje tiene clientes mantenidos por la comunidad, listados en lavalink.dev/clients: Shoukaku, Riffy y Moonlink.js para JavaScript; Wavelink y Mafic para Python; Lavalink-Client para la JVM. Wavelink 3, por ejemplo, funciona con Lavalink v4; consulta en PyPI la versión mínima de Python. Un esqueleto con discord.py y Wavelink 3 (pip install -U wavelink):
import os
import discord
import wavelink
from discord.ext import commands
class Bot(commands.Bot):
async def setup_hook(self):
node = wavelink.Node(
uri=os.environ["LAVALINK_URI"], # ej.: http://localhost:2333
password=os.environ["LAVALINK_PASSWORD"],
)
await wavelink.Pool.connect(nodes=[node], client=self)
intents = discord.Intents.default()
intents.message_content = True
bot = Bot(command_prefix="!", intents=intents)
@bot.command()
async def play(ctx, *, busqueda: str):
if not ctx.author.voice:
return await ctx.send("Primero entra en un canal de voz.")
player = ctx.voice_client or await ctx.author.voice.channel.connect(cls=wavelink.Player)
pistas = await wavelink.Playable.search(busqueda)
if pistas:
await player.play(pistas[0])
bot.run(os.environ["DISCORD_TOKEN"])Guarda la URI, la contraseña y el token en variables de entorno, nunca en el código. Si todavía no tienes un bot, empieza por cómo crear un bot de Discord.
¿Por qué YouTube no suena en Lavalink?#
El soporte de YouTube que venía integrado en el servidor se marcó como obsoleto y queda desactivado en el application.yml de ejemplo. El camino indicado es el plugin youtube-source, que exige apagar la fuente integrada (youtube: false) y declarar el plugin, como en el ejemplo de arriba.
Al ser un plugin, evoluciona por separado del servidor y puede necesitar una actualización cuando YouTube cambia algo. Si la música dejó de sonar de repente, revisa primero los logs y la versión del plugin, y mira por qué un bot de música deja de reproducir YouTube.
¿Qué cuidados exige el hosting?#
Lavalink es un proceso Java que tiene que estar encendido todo el tiempo: si se cae, toda la música se detiene. Planifica cuatro puntos:
- Disponibilidad continua. El mismo razonamiento de mantener un bot de Discord en línea 24/7 vale para el nodo de audio.
- Memoria. La JVM acepta un tope de heap con
JAVA_TOOL_OPTIONS=-Xmx.... Mide el consumo real con algunas canciones sonando a la vez antes de fijar el valor, y mira cuánta RAM necesita un bot de Discord. - Latencia. Cuanto más cerca esté Lavalink del bot, mejor.
- Seguridad. Usa una contraseña fuerte y no expongas el puerto sin necesidad: quien tiene la contraseña controla tu nodo.
Cómo hacerlo en Square Cloud#
En Square Cloud, el bot y el nodo de audio pasan a ser dos aplicaciones en la misma cuenta: Lavalink corre como aplicación web (desde 512 MB), y reinicias cada una sin tumbar a la otra. En el application.yml, usa port: ${PORT} para escuchar en el puerto que define la plataforma; el bot se conecta al subdominio de la aplicación por el puerto 443, con conexión segura (secure: true, o una URI https:// en Wavelink). El runtime de Java de la plataforma ejecuta el servidor; comprueba que su versión de Java cumple el mínimo que exige Lavalink.
Haces el deploy por ZIP en el panel, con la CLI, por GitHub o con la extensión de VS Code. El archivo de configuración squarecloud.app es opcional: el panel genera el runtime, la memoria y el archivo principal en el deploy, y escribir el archivo en la raíz del proyecto es la alternativa. La RAM del plan es un pool compartido entre tus aplicaciones, con un mínimo de 256 MB por aplicación en segundo plano, como el bot. Los contenedores están siempre encendidos, el reinicio automático viene activado en el deploy desde el panel y levanta el proceso de nuevo cuando termina con error, y los logs aparecen en tiempo real en el panel.
El bot de Discord puede usar discord.js, discord.py, JDA y otras bibliotecas, con sharding y voz, y la latencia media hasta el Gateway de Discord es de cerca de 30 ms. Mira los detalles en hosting de bots de Discord.
Hosting de bots
Tu bot en línea 24/7, con reinicio automático
Preguntas frecuentes
¿Lavalink es un bot?
No. Lavalink es un servidor de audio. Quien entra en Discord y responde comandos sigue siendo tu bot, que usa una biblioteca cliente para hablar con Lavalink.
¿Necesito Java para usar Lavalink?
Sí, para el servidor: Lavalink corre en la JVM, y la versión mínima de Java está en la documentación oficial. Tu bot puede estar escrito en otro lenguaje, como Python o JavaScript.
¿Puedo ejecutar Lavalink en el mismo lugar que el bot?
Puedes, pero es un proceso separado, en Java. Mucha gente ejecuta los dos en aplicaciones distintas para reiniciar uno sin tumbar al otro.
¿Por qué mi Lavalink no reproduce YouTube?
El soporte de YouTube integrado en el servidor está obsoleto y viene desactivado en el application.yml de ejemplo. YouTube funciona con un plugin aparte, youtube-source; sin él, los enlaces y las búsquedas de YouTube suelen fallar.
Más en Bots
Ver los 33 artículos- ¿Cuánto cuesta hospedar un bot de Discord?El costo de hospedar un bot de Discord depende de la RAM, el tiempo en línea, la base de datos y los servicios externos. Aprende a estimar el tuyo.
- Correr un bot en el celular (Termux) o en tu PC vs hospedarloUn bot en tu PC o celular (Termux) se cae cuando el equipo se apaga, se suspende o pierde la red. Compara las tres opciones y cuándo sirve cada una.
- Cómo mantener tu bot de Discord en línea 24/7Para mantener un bot de Discord en línea 24/7, ejecuta el proceso en una máquina siempre encendida con reinicio automático. Compara PC, VPS con pm2 o systemd.
- Por qué tu bot de Discord se apaga o aparece offlineUn bot de Discord aparece offline cuando el proceso se cae, el token es inválido, falta una intent o se acaba la memoria. Diagnostica y corrige cada causa.