Discord'da müzik botu yapmak, sıradan bir komut botundan farklıdır: metin mesajları gateway ve REST API üzerinden akarken ses, ayrı bir ses gateway'i ve UDP bağlantısı üzerinden gider. Üstelik ses verisinin Opus formatında kodlanması, şifrelenmesi ve artık uçtan uca şifreleme (E2EE) protokolüne uyması gerekir.
Bu yazıda Discord ses bağlantılarının temelini, DAVE adlı uçtan uca şifreleme gereksinimini, discord.js'in @discordjs/voice paketiyle Lavalink arasındaki farkı ve bir Lavalink sunucusunun nasıl kurulacağını resmî belgeler üzerinden anlatıyoruz. Botun genel yapısı için önce Discord bot nasıl yapılır yazımıza göz atabilirsiniz.
Discord ses bağlantısı nasıl çalışır?

Belgelere göre ses bağlantıları gateway'e benzer şekilde çalışır ama farklı bir payload kümesi ve ses verisi için ayrı bir UDP bağlantısı kullanır. Bu yüzden botunuzun çalıştığı makinenin UDP paketlerini alabilmesi, gerekirse bir güvenlik duvarı veya NAT arkasından da bunu yapabilmesi gerekir. Discord, bu durumlar için "IP Discovery" adlı bir mekanizma sunar.
- Ses gateway'i için belgenin önerdiği sürüm 8'dir. Sürüm belirtmeden veya 4'ten düşük sürümle yapılan bağlantılar 18 Kasım 2024'ten beri reddedilir.
- Taşıma şifrelemesinde
aead_aes256_gcm_rtpsizetercih edilen,aead_xchacha20_poly1305_rtpsizeise zorunlu olarak desteklenmesi gereken moddur. - Ses kanalına bağlanmak için
CONNECT, ses göndermek içinSPEAKizni gerekir. İzinlerin ayrıntısı izinler ve rol hiyerarşisi yazımızda.
Bu ayrıntıları kendiniz yazmanız gerekmez; kütüphaneler sizin yerinize halleder. Ama hangi aracı seçeceğinizi anlamak için arkada ne olduğunu bilmek faydalıdır.
DAVE: uçtan uca şifreleme zorunluluğu
Discord, Eylül 2024'ten itibaren DM, grup DM, ses kanalları ve Go Live yayınlarındaki ses ve görüntüyü uçtan uca şifrelemeye (E2EE) taşıyor. Belgedeki uyarıya göre 1 Mart 2026'dan itibaren bu alanlarda yalnızca E2EE görüşmeler destekleniyor. Bu protokolün adı DAVE'dir ve katılımcılar anahtarlarını bir MLS (Messaging Layer Security) grubu üzerinden değiş tokuş eder.
Pratik sonucu şu: kullandığınız ses kütüphanesinin DAVE desteği olmalı. Eski, bakımı bırakılmış bir ses kütüphanesi ya da Lavalink istemcisi kullanıyorsanız botunuz ses kanalına bağlanamayabilir. İyi haber, popüler araçların büyük kısmı bu desteği ekledi:
- discord.js rehberine göre
@discordjs/voice, DAVE için@snazzah/daveypaketini kullanır ve bu paket önceden kurulu gelir. - Lavalink, DAVE desteğini v4.2.0 sürümüyle ekledi. Sürüm notları, DAVE kullanmak için istemci kütüphanenizi de destekleyen bir sürüme güncellemeniz gerektiğini belirtir.
- Lavalink'in istemci listesi, her istemcinin DAVE desteğini ayrı bir sütunda gösterir.
@discordjs/voice mi, Lavalink mi?
Node.js ile müzik botu yaparken iki temel yol vardır. Birincisi sesi doğrudan bot sürecinde işleyen @discordjs/voice, ikincisi sesi ayrı bir Java sunucusunda işleyen Lavalink.
| @discordjs/voice | Lavalink | |
|---|---|---|
| Nerede çalışır? | Botun kendi Node.js sürecinde | Ayrı bir Java sunucusunda (bot ona bağlanır) |
| Gereksinim | Node.js; çoğu kaynak için FFmpeg, Opus kütüphanesi | Java 17 veya üstü, application.yml |
| Dil bağımsız mı? | Hayır, Node.js | Evet; Java, Python, Node.js, .NET, Go, Rust istemcileri var |
| Kaynaklar | Kendi verdiğiniz dosya veya akış | Yerleşik kaynaklar ve eklentiler |
| Uygun olduğu durum | Az sunucu, yerel dosya, basit ses | Çok sunucu, filtreler, birden fazla bot veya dil |
@discordjs/voice ile en basit örnek
Rehbere göre @discordjs/voice, ek bağımlılık olmadan Ogg ve WebM Opus dosyalarını çalabilir; MP3 gibi diğer formatlar için FFmpeg gerekir. Ses bağlantısının çalışması için istemcide GuildVoiceStates intent'i açık olmalıdır; aksi halde bağlantı signalling durumunda takılı kalır. Intent'ler için intent rehberimize bakın.
const { Client, GatewayIntentBits } = require('discord.js');
const {
joinVoiceChannel, createAudioPlayer, createAudioResource, VoiceConnectionStatus,
} = require('@discordjs/voice');
const client = new Client({
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildVoiceStates],
});
function cal(kanal) {
const connection = joinVoiceChannel({
channelId: kanal.id,
guildId: kanal.guild.id,
adapterCreator: kanal.guild.voiceAdapterCreator,
});
const player = createAudioPlayer();
// Lisansına sahip olduğunuz yerel bir dosya
player.play(createAudioResource('/home/bot/sesler/ornek.mp3'));
connection.subscribe(player);
connection.on(VoiceConnectionStatus.Ready, () => console.log('Ses bağlantısı hazır'));
}
client.login(process.env.DISCORD_TOKEN);Bağlantıyı işiniz bitince connection.destroy() ile kapatın. Rehber, bunun hem botun kanaldan çıkması hem de bellek sızıntısını önlemek için önemli olduğunu vurgular. Kurulu bağımlılıkları görmek için generateDependencyReport() fonksiyonunu kullanabilirsiniz.
Lavalink nedir?

Lavalink, Discord ses sunucularına müzik akışı göndermek için kullanılan, Java ile yazılmış bağımsız bir ses oynatıcı düğümüdür (node). Lavaplayer ve koe projelerine dayanır. Botunuz şarkı arama, oynatma, durdurma, ses seviyesi ve filtre gibi işleri Lavalink'e REST ve WebSocket üzerinden yaptırır; ses kodlaması ve Discord'a gönderimi Lavalink tarafında olur. Böylece bot süreciniz ses işlemenin yükünü taşımaz.
Kurulum: Java ve Lavalink.jar
Lavalink belgelerine göre gereksinim Java 17 veya üstüdür. En kolay yol bağımsız jar dosyasıdır:
- Java 17+ kurun.
- GitHub'daki son sürümden
Lavalink.jardosyasını indirip ayrı bir klasöre koyun. - Aynı klasöre bir
application.ymloluşturun. - Klasörde
java -jar Lavalink.jarkomutunu çalıştırın.
Belge, Linux'ta önerilen yöntemin systemd servisi olduğunu, deneyimli kullanıcılar için ise Docker'ı önerdiğini belirtir. Docker imajları GitHub Container Registry'de ghcr.io/lavalink-devs/lavalink:4 gibi etiketlerle yayınlanır; 4-alpine ve 4-distroless varyantları da vardır. Docker Compose kullanımına genel bakış için Docker Compose rehberimize göz atın.
application.yml temel ayarları
Aşağıdaki kesit Lavalink'in resmî örnek dosyasından kısaltılmıştır. Varsayılan port 2333'tür; password değerini mutlaka değiştirin.
server:
port: 2333
address: 0.0.0.0
lavalink:
plugins:
# - dependency: "grup:eklenti:surum" # eklenti koordinatları
# repository: "https://maven.example.com/releases"
server:
password: "buraya-guclu-bir-sifre"
sources:
youtube: false
bandcamp: true
soundcloud: true
twitch: true
vimeo: true
nico: true
http: true
local: false
filters:
volume: true
equalizer: true
logging:
file:
path: ./logs/Örnek dosyadaki iki not önemlidir. Birincisi, yerleşik YouTube kaynağının artık kullanımdan kaldırıldığı (deprecated) ve güncelleme almayacağı, bunun yerine ayrı bir eklentinin önerildiğidir. İkincisi, http kaynağını bir proxy olmadan açık bırakmanın sunucunuzun IP adresini açığa çıkarabileceğidir. Aynı ayarlar ortam değişkenleriyle de verilebilir (örneğin LAVALINK_SERVER_PASSWORD).
Eklentiler
Lavalink, ek ses kaynakları, filtreler, REST uç noktaları gibi işlevleri üçüncü taraf eklentilerle kazanır. plugins klasörüne konan tüm .jar dosyaları yüklenir; ayrıca application.yml içindeki lavalink.plugins listesine eklenti koordinatı yazarak otomatik indirme yapılabilir. Resmî eklenti listesinde kaynak eklentileri, arama, şarkı sözü ve ek filtre eklentileri yer alır. Her eklentinin kurulum adımları kendi deposunda anlatılır.
Lavalink'i systemd ile arka planda çalıştırmak
Belgedeki şablonun sadeleştirilmiş hali aşağıdadır. Bot ile aynı mantıkla çökme halinde yeniden başlatılır. Servis dosyaları hakkında daha fazlası için systemd servis dosyası rehberimize bakın.
[Unit]
Description=Lavalink Service
After=syslog.target network.target
[Service]
User=lavalink
Group=lavalink
WorkingDirectory=/home/lavalink/lavalink
ExecStart=java -Xmx4G -jar /home/lavalink/lavalink/Lavalink.jar
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable lavalink
sudo systemctl start lavalink
sudo journalctl -u lavalinkLavalink istemci kütüphaneleri
Botunuz Lavalink'e doğrudan değil, bir istemci kütüphanesiyle bağlanır. İstemci, WebSocket bağlantısını /v4/websocket yoluna açar ve Authorization (config'teki şifre), User-Id (botun kullanıcı ID'si) ve Client-Name başlıklarını gönderir. Lavalink belgelerindeki listeden, DAVE desteği işaretli olan bazı istemciler:
| Platform | İstemciler (DAVE destekli) | Uyumlu olduğu kütüphaneler |
|---|---|---|
| Node.js | Shoukaku, Moonlink.js, Magmastream, Riffy, FastLink, Rainlink, lavaclient (v5+), Lavalink-Client (tomato6966) | Çoğu "Any"; Lavalink-Client discord.js ile uyumlu olarak listelenir |
| Python | Wavelink, Pomice, Mafic, SonoLink, lavalink.py, hikari-ongaku, lavaplay.py | discord.py V2, nextcord, py-cord, disnake, Hikari |
| Java/Kotlin | Lavalink-Client (lavalink-devs), Lavalink.kt | JDA, Discord4J, Kord |
| .NET | Lavalink4NET (v4+), DisCatSharp (v10.7.0+) | Discord.Net, DSharpPlus, Remora, NetCord |
| Go / Rust | DisGoLink / Anchorage, lavalink-rs | Any |
Belgede ayrıca DAVE desteği olmayan ve bakımı bırakılmış (Unmaintained) olarak işaretlenmiş istemciler de listelenir. Yeni bir projeye başlarken bunlardan kaçının. Hangi Discord kütüphanesini seçeceğinizden emin değilseniz kütüphane karşılaştırma yazımıza bakın.
Telif hakkı ve platform kuralları
Sık Sorulan Sorular
Müzik botum ses kanalına giriyor ama ses gelmiyor. Neden?
Önce botun o kanalda Connect ve Speak izinlerini kontrol edin. discord.js kullanıyorsanız GuildVoiceStates intent'inin açık olduğundan, FFmpeg'in kurulu olduğundan emin olun. Lavalink kullanıyorsanız istemci kütüphanenizin ve Lavalink sürümünüzün DAVE destekli olup olmadığına bakın.
Lavalink'i bot ile aynı sunucuda çalıştırabilir miyim?
Evet. Docker belgeleri, bot da bir konteynerdeyse aynı ağa katılıp lavalink servis adını hostname olarak kullanabileceğinizi anlatır. Java'nın bellek sınırını -Xmx ile belirlediğiniz için sunucunuzun belleğini buna göre planlayın.
Müzik botu HTTP interaction ile çalışır mı?
Hayır. Ses için gateway bağlantısı gerekir. HTTP tabanlı botların neyi yapıp neyi yapamadığını HTTP interactions yazımızda anlattık.
Botun sürekli açık kalması için ne yapmalıyım?
Bot ve Lavalink'i bir VDS veya VPS üzerinde servis olarak çalıştırın. Adım adım anlatım botu 7/24 aktif tutma rehberimizde.
Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.
İlgili içerikler: Discord botu 7/24 aktif tutma · Bot izinleri ve rol hiyerarşisi · Intent nedir · Bot kütüphaneleri karşılaştırma · Docker Compose rehberi · VDS nedir