İlk Siparişe Özel %20 İndirim Kodu:
VDS Yönetimi

Linux VDS'te 7/24 Discord Botu Çalıştırma (Node.js ve PM2)

Ubuntu Linux VDS üzerinde Discord botunu PM2 ve systemd ile 7/24 sürekli açık tutma, Node.js ortamı, bellek yönetimi ve güvenlik yapılandırması.

5 dk okuma

İçindekiler

Discord botunuzu kişisel bilgisayarınızda çalıştırdığınızda bilgisayarın kapanması, uyku moduna geçmesi veya internet bağlantısının dalgalanması botun çevrimdışı kalmasına yol açar. Bir Discord botunu 7/24 sürekli aktif tutmanın en kararlı yolu, sürekli ağ ve güç altyapısına sahip bir Linux sanal sunucu (VDS) kullanmaktır. Bu rehberde Ubuntu Linux üzerinde Node.js çalışma ortamının kurulmasını, ayrıcalıksız bir sistem kullanıcısı ile güvenlik izolasyonunu, PM2 süreç yöneticisi ile otomatik yeniden başlatma yapılandırmasını ve alternatif systemd servis birimi kurulumunu bulabilirsiniz.

Discord Gateway ve bağlantı sürekliliği mantığı

Discord botları sunucuya gelen komutları ve olayları dinlemek için Discord Gateway ile sürekli açık kalan iki yönlü bir WebSocket bağlantısı kurar. Bu bağlantı belirli zaman aralıklarıyla gönderilen sinyal paketleri (heartbeat ping-pong) ile canlı tutulur. Kişisel bir bilgisayarda işletim sistemi uyku moduna girdiğinde, ağ bağdaştırıcısı enerji tasarrufuna geçtiğinde veya yerel internet IP adresi değiştiğinde bu WebSocket oturumu düşer.

Ücretsiz barındırma platformları veya paylaşımlı konteynerler ise belirli bir süre işlem yapılmadığında bot sürecini uykuya alabilir ya da giden ağ isteklerine kısıtlamalar uygulayabilir. Bir Performans VPS ortamında ise süreç tamamen sizin kontrolünüzdeki bağımsız sanal sunucu kaynakları üzerinde çalışır ve bağlantı kopmadan 7/24 sürdürülür.

Bot barındırma yöntemleri karşılaştırması

Aşağıdaki tabloda bot çalıştırmak için kullanılan üç temel yöntemin teknik sınırları ve operasyonel özellikleri karşılaştırılmıştır:

Barındırma YöntemiAğ ve Çalışma DurumuSüreç KararlılığıToken ve Veri GüvenliğiUygunluk Durumu
Kişisel BilgisayarBilgisayar açık kaldığı sürece aktif; elektrik ve ağ kesintilerinde koparArka plan servisi kurulmadığında konsol kapanınca dururYerel diskte saklanır; dış erişim riski düşüktürYalnızca yerel test ve bot geliştirme aşaması
Ücretsiz Konteyner Platformlarıİşlem yapılmadığında uyku moduna geçebilir; kota sınırları bulunurBellek aşımında süreç aniden sonlandırılabilirPaylaşımlı ortamda ortam değişkeni sızıntı riskiDüşük kaynak tüketen deneme projeleri
Linux VDS SunucuSürekli aktif ağ ve bağımsız donanım kaynaklarıPM2 veya systemd ile çökmelerde anında otomatik yeniden başlarAyrıcalıksız sistem kullanıcısı ve chmod 600 dosya izinleriÇok sunuculu topluluk botları ve üretim ortamı

Sistem paketlerinin güncellenmesi ve Node.js ortamı

Ubuntu 24.04 üzerinde Node.js uygulamalarını çalıştırmak için öncelikle sistem paket listesini güncelleyip Node.js ve npm paket yöneticisini kurun:

apt-get update
apt-get install -y nodejs npm

Kurulum tamamlandıktan sonra paketlerin sistemde başarıyla yer aldığını doğrulamak için sürüm numaralarını kontrol edebilirsiniz:

node -v
npm -v

PM2 süreç yöneticisinin kurulması

Node.js projelerinde kod içinde yakalanmayan bir hata oluştuğunda Node.js süreci durur. PM2 (Process Manager 2), arka planda çalışan süreçleri izler, olası çökmelerde botu milisaniyeler içinde yeniden başlatır ve sistem kaynaklarını takip eder.

PM2'yi sistem genelinde kullanılabilir hale getirmek için npm üzerinden küresel olarak kurun:

npm install -g pm2

Güvenlik izolasyonu: sistem kullanıcısı, .env ve dosya izinleri

Bir sunucu uygulamasını doğrudan root yetkileriyle çalıştırmak güvenlik ilkelerine aykırıdır. Olası bir paket veya bağımlılık açığında tüm işletim sisteminin etkilenmesini önlemek için bot dosyalarını yönetecek ayrıcalıksız bir sistem kullanıcısı tanımlanmalıdır.

Aşağıdaki komut, oturum açma yetkisi sınırlandırılmış botuser kullanıcısını ve /opt/discord-bot dizinini oluşturur:

useradd -r -m -d /opt/discord-bot -s /bin/bash botuser
mkdir -p /opt/discord-bot/app
chown -R botuser:botuser /opt/discord-bot

Proje dizinine geçip Node.js paket yapısını başlatın; Discord API kütüphanesi olan discord.js ve ortam değişkenlerini yönetmek için dotenv paketini kurun:

cd /opt/discord-bot/app
sudo -u botuser npm init -y
sudo -u botuser npm install dotenv discord.js

Bot tokeni gibi hassas anahtarlar kesinlikle JavaScript dosyalarının içine doğrudan yazılmamalıdır. Ortam değişkenlerini saklamak için bir .env.example şablonu oluşturun, ardından bu şablonu .env dosyasına kopyalayarak dosya izinlerini yalnızca botuser kullanıcısının okuyabileceği şekilde (chmod 600) kısıtlayın:

cat <<'EOF' | sudo -u botuser tee /opt/discord-bot/app/.env.example
DISCORD_TOKEN="BURAYA_DISCORD_BOT_TOKENI_YAZIN"
CLIENT_ID="BURAYA_UYGULAMA_ID_YAZIN"
EOF
cp /opt/discord-bot/app/.env.example /opt/discord-bot/app/.env
chmod 600 /opt/discord-bot/app/.env
chown botuser:botuser /opt/discord-bot/app/.env

Örnek bot yapısı ve çalıştırma testi

Aşağıdaki komut ile temel bir bot giriş dosyası oluşturun. Bu yapı, .env dosyasındaki token değeri tanımlanmadığında hata fırlatmak yerine uyarı vererek güvenli bir şekilde sonlanır:

cat <<'EOF' | sudo -u botuser tee /opt/discord-bot/app/index.js
require('dotenv').config();

const token = process.env.DISCORD_TOKEN;
const isPlaceholder = !token || token === 'BURAYA_DISCORD_BOT_TOKENI_YAZIN';

if (isPlaceholder) {
  console.log('Bilgi: Discord bot tokeni henüz girilmedi. Lütfen .env dosyasını düzenleyin.');
  process.exit(0);
}

const { Client, GatewayIntentBits } = require('discord.js');
const client = new Client({
  intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages]
});

client.once('ready', () => {
  console.log(`Bot ${client.user.tag} olarak oturum açtı.`);
});

client.login(token);
EOF

Ortamın ve dosya yollarının doğruluğunu sınamak için bot dosyasını çalıştırın:

cd /opt/discord-bot/app
sudo -u botuser node index.js

Komut çalıştırıldığında token henüz yapılandırılmadığı için bilgilendirme mesajı görüntülenir ve süreç sıfır çıkış koduyla tamamlanır:

Bilgi: Discord bot tokeni henüz girilmedi. Lütfen .env dosyasını düzenleyin.

PM2 süreç yöneticisi ile otomatik yeniden başlatma ve bellek koruması

PM2'yi doğrudan komut satırı parametreleriyle başlatmak yerine bir yapılandırma dosyası (ecosystem.config.js) kullanmak, yeniden başlatma politikalarını ve bellek sınırlarını tek merkezden yönetmenizi sağlar.

Discord botlarında üçüncü taraf paketler veya önbellekler zamanla bellek sızıntısına yol açabilir. max_memory_restart parametresi, bot belirlenen bellek sınırını (örneğin 300 MB) aştığında süreci otomatik olarak yeniden başlatır. Ayrıca exp_backoff_restart_delay seçeneği, bot bir hata nedeniyle döngüsel çöküşe (crash loop) girdiğinde her denemede bekleme süresini katlayarak artırır; bu sayede Discord API hız limitlerine veya günlük oturum açma engellerine takılmanız önlenir.

Aşağıdaki komut ile yapılandırma dosyasını oluşturun:

cat <<'EOF' | sudo -u botuser tee /opt/discord-bot/app/ecosystem.config.js
module.exports = {
  apps: [{
    name: 'discord-bot',
    script: 'index.js',
    cwd: '/opt/discord-bot/app',
    autorestart: true,
    watch: false,
    max_memory_restart: '300M',
    exp_backoff_restart_delay: 100,
    env: {
      NODE_ENV: 'production'
    }
  }]
};
EOF

Botunuzun .env dosyasına gerçek Discord Bot Token bilginizi ekledikten sonra PM2 ile süreci başlatıp durumunu denetleyebilirsiniz:

# örnek, çalıştırma
cd /opt/discord-bot/app
pm2 start ecosystem.config.js
pm2 status
pm2 logs discord-bot
pm2 save
pm2 startup

pm2 save komutu mevcut çalışan süreç listesini kaydeder, pm2 startup ise sunucu yeniden başladığında PM2'nin otomatik olarak devreye girmesi için gerekli başlangıç komutunu üretir.

Alternatif yöntem: systemd servis birimi ile yönetim

Ek bir süreç yöneticisi kullanmak istemiyorsanız, Linux'un yerel systemd servis altyapısını kullanarak da botunuzu bir arka plan servisi haline getirebilirsiniz.

Aşağıdaki komut, bot uygulamasını botuser yetkisiyle başlatan ve çökme durumunda 10 saniye sonra yeniden devreye alan bir systemd servis dosyası tanımlar:

cat <<'EOF' | tee /etc/systemd/system/discord-bot.service
[Unit]
Description=Discord Bot Servisi
After=network.target

[Service]
Type=simple
User=botuser
WorkingDirectory=/opt/discord-bot/app
ExecStart=/usr/bin/node /opt/discord-bot/app/index.js
Restart=always
RestartSec=10
EnvironmentFile=/opt/discord-bot/app/.env

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload

Servisi etkinleştirmek ve çalışma durumunu izlemek için aşağıdaki komutları kullanabilirsiniz:

# örnek, çalıştırma
systemctl enable --now discord-bot
systemctl status discord-bot
journalctl -u discord-bot -f

Sunucu altyapısı ve donanım seçimi

Discord botları yüzlerce sunucuda hizmet verdiğinde ve eşzamanlı ses, veritabanı veya web kancası (webhook) istekleri işlediğinde tek çekirdek performansı ve hızlı disk erişimi önem kazanır. Bot ve web projeleriniz için Performans VPS paketlerinde AMD Ryzen 9 7950X işlemci ve DDR5 bellek sunulur. Çok yüksek işlem gücü gerektiren büyük çaplı bot mimarileri için Ekstrem VDS paketlerinde AMD Ryzen 9 9950X işlemci ve ayrılmış (dedicated) vCore tahsis edilir. Depolama altyapısında ise Samsung 990 Pro Gen4 NVMe diskler yer alır.

Sunucular Mars İstanbul Veri Merkezi altyapısında barındırılır. Dış kaynaklı ağ saldırılarına karşı TRSHIELD DDoS koruması her pakette ek ücret olmadan dahildir. Ayrıca bot dosyalarınızda kapsamlı bir güncelleme veya altyapı değişikliği yapmadan önce sunucu durumunu koruma altına alabilmeniz için her VDS paketinde 1 adet ücretsiz snapshot hakkı sunulur. Güvenlik duvarı tarafında port açma veya ağ filtreleme kuralları hakkında ayrıntılı bilgi için VDS port açma ve güvenlik duvarı rehberini inceleyebilirsiniz.

Sık sorulan sorular

Discord botunu yerel bilgisayarda açık tutmak yerine neden VDS tercih edilir?

Yerel bilgisayar kapandığında, uyku moduna geçtiğinde veya ev internetinde anlık bir kopma yaşandığında botun Discord Gateway ile kurduğu WebSocket bağlantısı sonlanır ve bot çevrimdışı kalır. VDS sunucular sürekli çalışan ağ ve güç altyapısına sahip olduğu için botun günün her saati çevrim içi kalmasını sağlar.

PM2 süreç yöneticisi botun çalışmasında ne sağlar?

PM2, bot uygulamasını arka planda bir servis olarak çalıştırır. Beklenmeyen bir istisna veya bellek aşımı nedeniyle bot süreci kapansa bile PM2 süreci otomatik olarak yeniden başlatır. Ayrıca sunucu yeniden başladığında botun otomatik olarak ayağa kalkmasını sağlar.

Discord bot tokeni sunucuda nasıl korunmalıdır?

Bot tokeni doğrudan kod dosyalarının içine yazılmamalı, ortam değişkenlerini barındıran bir .env dosyasında saklanmalıdır. Bu dosyanın izinleri yalnızca botu çalıştıran sistem kullanıcısının okuyabileceği şekilde (chmod 600) sınırlandırılmalı ve yetkisiz erişimlere karşı korunmalıdır.

Botun çökme döngüsüne (crash loop) girmesi durumunda ne tür bir risk oluşur?

Bir kod hatası nedeniyle bot saniyeler içinde defalarca yeniden başladığında, Discord API uç noktalarına kısa sürede çok sayıda oturum açma (IDENTIFY) isteği gönderilir. Discord'un günlük oturum açma sınırlarına veya hız limitlerine takılmamak için PM2 yapılandırmasında kademeli yeniden başlatma gecikmesi tanımlanmalıdır.

Yeni sistem yönetimi ve ağ rehberlerimizi arama sonuçlarında öncelikli görmek için:Google'da tercih edilen kaynaklara ekle (dış bağlantı)