¿Qué es Lavalink? Cómo hospedar un bot de música

Lavalink es un servidor de audio independiente, basado en Lavaplayer, que busca, decodifica y envía música a Discord para tu bot. El bot solo manda comandos.

Actualizado el 5 min de lectura

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.

Usuario/playGatewayde DiscordeventoTu botcliente Lavalinkcomandosy eventosServidorLavalinkaudioCanal de vozescucha
El bot solo envía comandos; el servidor Lavalink carga la pista y envía el audio directo al canal de voz.

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.

Tres piezas hablan entre sí:

  1. El bot recibe /play de un usuario.
  2. Una biblioteca cliente dentro del bot pasa el pedido al servidor Lavalink e informa los datos de la conexión de voz de Discord.
  3. 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.

  • Una versión LTS de Java. Consulta el mínimo en la documentación, que recomienda la LTS más nueva.
  • Un archivo application.yml en 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:

yaml
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: false

Cambia 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.

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):

python
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.

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

Más información

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.

Siguiente artículo¿Cuánta RAM necesita un bot de Discord?Un bot de Discord pequeño funciona bien con 256 a 512 MB de RAM. Mira qué hace crecer el consumo, cómo medir tu bot y cómo reducir la caché.