Discord bot hosting, botunuzun bilgisayarınız kapalıyken de çalışmaya devam etmesi demektir. Bir botu kendi makinenizde node index.js yazarak çalıştırmak geliştirme aşamasında yeterlidir; ama bilgisayarı kapattığınız anda bot düşer, terminal penceresi kapandığında süreç sonlanır ve bir hata oluştuğunda kimse yeniden başlatmaz.
Doğru çözüm, botu bir sunucuda süreç yöneticisi altında çalıştırmaktır. Bu rehberde Ubuntu 24.04 üzerinde Node.js ve Python botlarının kurulumunu, pm2 ve systemd yapılandırmalarını gerçek dosya içerikleriyle, log yönetimini, otomatik yeniden başlatmayı ve güvenlik önlemlerini bulacaksınız.
Gereksinimler ve Sunucu Seçimi#
Discord botları genellikle hafif uygulamalardır: ağ geçidine bir WebSocket bağlantısı açar, olayları dinler ve komutlara yanıt verir. Kaynak ihtiyacı botun ne yaptığına göre değişir.
| Bot türü | RAM | Not |
|---|---|---|
| Moderasyon / yardımcı bot | 8 GB paket yeterli | Bot birkaç yüz MB tüketir; sunucuda başka işler de çalışabilir |
| Veritabanı kullanan bot | 8 GB | PostgreSQL veya MariaDB ile birlikte |
| Müzik botu | 8-12 GB | Ses kodlama CPU yoğun; saat hızı önemli |
| Birden çok bot + panel | 12-16 GB | Her bot ayrı süreç olarak izlenmeli |
| Görüntü/veri işleme | 16 GB ve üzeri | İş kuyruğu ve ayrı işçi süreçleri gerekir |
Disk tarafında NVMe SSD ve en az 50 GB alan planlayın; loglar ve veritabanı zamanla büyür. İşlemcide yüksek saat hızlı AMD Ryzen tercih edin, özellikle ses işleyen botlarda fark belirgindir. Uygun paketleri VDS sayfasında inceleyebilir, seçim kriterleri için sunucu kiralama rehberine bakabilirsiniz.
Sunucuyu Hazırlama#
Sunucuya SSH ile bağlanın ve botu root ile çalıştırmayın. Ayrı bir kullanıcı açmak, botta bir güvenlik açığı çıktığında zararı sınırlar.
# Sistemi güncelle
sudo apt update && sudo apt upgrade -y
# Bot için ayrı kullanıcı oluştur (giriş kabuğu yok)
sudo adduser --system --group --home /opt/discordbot --shell /bin/bash discordbot
# Çalışma dizinini hazırla
sudo mkdir -p /opt/discordbot/bot
sudo chown -R discordbot:discordbot /opt/discordbot
# Temel araçlar
sudo apt install -y git curl build-essential
SSH bağlantısını hiç kurmadıysanız SSH bağlantı rehberi ile başlayın, komutlara yabancıysanız Linux temel komutları sayfasına göz atın.
Node.js Kurulumu#
Ubuntu depolarındaki Node.js sürümü genellikle eskidir. Discord kütüphaneleri güncel LTS sürümünü ister; NodeSource deposunu kullanın:
# NodeSource LTS deposunu ekle ve Node.js'i kur
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs
# Sürümleri doğrula
node -v
npm -v
# Örnek çıktı:
# v22.14.0
# 10.9.2
-
Node.js (resmî site)LTSAç
-
Python (resmî site)Aç
-
PuTTY (Windows’tan SSH)İndir
-
WinSCP (dosya aktarımı)İndir
Bağlantılar resmî kaynaklara gider. pm2 ve bot kütüphaneleri npm üzerinden kurulur, ayrı indirme gerektirmez.
Bot Kodunu Sunucuya Alma ve Token Yönetimi#
# Bot kullanıcısına geç
sudo -u discordbot -i
cd /opt/discordbot/bot
# Kodu depodan çek
git clone https://github.com/kullanici/botunuz.git .
# Bağımlılıkları üretim modunda kur
npm ci --omit=dev
Token’ı asla kaynak koda yazmayın. Ortam değişkeni dosyası oluşturun:
# /opt/discordbot/bot/.env
DISCORD_TOKEN=BURAYA_GERCEK_TOKEN
CLIENT_ID=123456789012345678
GUILD_ID=987654321098765432
NODE_ENV=production
LOG_LEVEL=info
DATABASE_URL=postgresql://botuser:parola@localhost:5432/botdb
# Dosyayı yalnızca sahibi okuyabilsin
chmod 600 /opt/discordbot/bot/.env
# .gitignore içine mutlaka ekleyin
echo ".env" >> /opt/discordbot/bot/.gitignore
echo "node_modules/" >> /opt/discordbot/bot/.gitignore
echo "logs/" >> /opt/discordbot/bot/.gitignore
pm2 ile Süreç Yönetimi#
pm2, Node.js uygulamaları için tasarlanmış bir süreç yöneticisidir: botu arka planda tutar, çöktüğünde yeniden başlatır, logları yönetir ve kaynak kullanımını gösterir.
# pm2'yi global kur
sudo npm install -g pm2
# Sürümü doğrula
pm2 -v
Botu doğrudan komutla başlatmak yerine bir yapılandırma dosyası yazın. Bu dosya, ayarların kaybolmamasını ve tekrar edilebilir olmasını sağlar:
// /opt/discordbot/bot/ecosystem.config.js
module.exports = {
apps: [
{
name: 'discord-bot',
script: './index.js',
cwd: '/opt/discordbot/bot',
instances: 1,
exec_mode: 'fork',
// Otomatik yeniden başlatma
autorestart: true,
watch: false,
max_restarts: 10,
min_uptime: '30s',
restart_delay: 5000,
exp_backoff_restart_delay: 200,
// Bellek sızıntısına karşı koruma
max_memory_restart: '600M',
// Ortam
env: {
NODE_ENV: 'production',
},
// Loglar
output: '/opt/discordbot/logs/out.log',
error: '/opt/discordbot/logs/error.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss',
merge_logs: true,
// Kapatma sırasında temiz çıkış için süre tanı
kill_timeout: 5000,
},
],
};
# Log dizinini oluştur
mkdir -p /opt/discordbot/logs
# Botu başlat
cd /opt/discordbot/bot
pm2 start ecosystem.config.js
# Durumu gör
pm2 status
# Örnek çıktı:
# ┌────┬───────────────┬─────────┬─────────┬──────────┬────────┬──────┐
# │ id │ name │ mode │ status │ cpu │ mem │ ↺ │
# ├────┼───────────────┼─────────┼─────────┼──────────┼────────┼──────┤
# │ 0 │ discord-bot │ fork │ online │ 0.4% │ 92.1mb │ 0 │
# └────┴───────────────┴─────────┴─────────┴──────────┴────────┴──────┘
Sunucu yeniden başladığında botun otomatik açılması#
# pm2'nin systemd servisi oluşturmasını sağla
pm2 startup systemd -u discordbot --hp /opt/discordbot
# Komutun çıktısında verilen sudo satırını aynen çalıştırın, örneğin:
# sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u discordbot --hp /opt/discordbot
# Mevcut süreç listesini kaydet
pm2 save
# Test edin
sudo reboot
# Tekrar bağlanıp:
pm2 status
Günlük pm2 komutları#
pm2 logs discord-bot # canlı log akışı
pm2 logs discord-bot --lines 200 # son 200 satır
pm2 restart discord-bot # yeniden başlat
pm2 reload discord-bot # güncelleme sonrası yumuşak yeniden yükleme
pm2 stop discord-bot # durdur
pm2 delete discord-bot # listeden kaldır
pm2 monit # canlı CPU/RAM izleme ekranı
pm2 describe discord-bot # ayrıntılı bilgi ve yeniden başlatma sayısı
pm2 install pm2-logrotate ve ardından pm2 set pm2-logrotate:max_size 20M, pm2 set pm2-logrotate:retain 14. Dolan disk, botu değil tüm sunucuyu durdurur.systemd ile Süreç Yönetimi#
Python, Java ya da Go ile yazılmış bir bot çalıştırıyorsanız ya da ek bağımlılık istemiyorsanız systemd doğru araçtır. İşletim sisteminin kendi servis altyapısıdır.
# /etc/systemd/system/discord-bot.service
[Unit]
Description=Discord Bot
Documentation=https://batihost.com/wiki/discord-bot-hosting-kurulumu.php
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=discordbot
Group=discordbot
WorkingDirectory=/opt/discordbot/bot
# Ortam değişkenlerini dosyadan oku
EnvironmentFile=/opt/discordbot/bot/.env
ExecStart=/usr/bin/node /opt/discordbot/bot/index.js
# Çökerse her zaman yeniden başlat
Restart=always
RestartSec=10
# Sonsuz döngüye girmesin: 300 saniyede en fazla 5 deneme
StartLimitIntervalSec=300
StartLimitBurst=5
# Kaynak sınırları
MemoryMax=1G
CPUQuota=200%
# Güvenlik sıkılaştırma
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/discordbot
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictSUIDSGID=true
# Log
StandardOutput=journal
StandardError=journal
SyslogIdentifier=discord-bot
[Install]
WantedBy=multi-user.target
# Servisi tanıt ve başlat
sudo systemctl daemon-reload
sudo systemctl enable --now discord-bot
# Durumu kontrol et
sudo systemctl status discord-bot
# Örnek çıktı:
# ● discord-bot.service - Discord Bot
# Loaded: loaded (/etc/systemd/system/discord-bot.service; enabled)
# Active: active (running) since Wed 2026-08-12 03:14:22 +03; 12min ago
# Main PID: 4128 (node)
# Tasks: 11 (limit: 9451)
# Memory: 88.4M (max: 1.0G)
# CPU: 3.812s
# Canlı log takibi
sudo journalctl -u discord-bot -f
# Son 200 satır
sudo journalctl -u discord-bot -n 200 --no-pager
# Yalnızca hataları filtrele
sudo journalctl -u discord-bot -p err --since "1 hour ago"
Python botu için ExecStart#
Python kullanıyorsanız sanal ortam oluşturup servis dosyasındaki ExecStart satırını değiştirmeniz yeterlidir:
cd /opt/discordbot/bot
python3 -m venv venv
./venv/bin/pip install -U pip
./venv/bin/pip install -r requirements.txt
# Servis dosyasında:
# ExecStart=/opt/discordbot/bot/venv/bin/python /opt/discordbot/bot/main.py
Log Yönetimi ve İzleme#
Bot çöktüğünde neden çöktüğünü bilmek, yeniden başlatmaktan daha önemlidir. İki şeyi kurun: yapılandırılmış log ve kaynak izleme.
# journald log boyutunu sınırla
sudo mkdir -p /etc/systemd/journald.conf.d
sudo tee /etc/systemd/journald.conf.d/limit.conf > /dev/null <<'EOF'
[Journal]
SystemMaxUse=500M
MaxRetentionSec=30day
EOF
sudo systemctl restart systemd-journald
# Botun bellek kullanımını anlık gör
ps -o pid,user,%cpu,%mem,rss,etime,cmd -C node
# Örnek çıktı:
# PID USER %CPU %MEM RSS ELAPSED CMD
# 4128 discord 0.6 1.1 90124 00:42:17 node /opt/discordbot/bot/index.js
Botun kaç kez yeniden başladığını izlemek, sessiz sorunları yakalamanın en pratik yoludur. pm2’de pm2 describe çıktısındaki restart sayacı, systemd’de systemctl show discord-bot -p NRestarts bunu gösterir. Sayaç sürekli artıyorsa bot sağlıklı değildir. Kalıcı izleme ve uyarı kurmak için sunucu izleme rehberine bakın.
Sık Karşılaşılan Sorunlar#
| Belirti | Sebep | Çözüm |
|---|---|---|
| Bot SSH kapanınca duruyor | Süreç terminale bağlı çalışıyor | pm2 veya systemd ile servis haline getirin |
| Sunucu yeniden başlayınca bot açılmıyor | pm2 save yapılmamış ya da servis enable değil | pm2 startup + pm2 save ya da systemctl enable |
| Sürekli yeniden başlıyor | Başlangıçta hata veriyor, token yanlış olabilir | Logları okuyun; .env yolunu ve token’ı doğrulayın |
| Zamanla RAM tüketimi artıyor | Bellek sızıntısı (dinleyici birikimi, önbellek) | max_memory_restart / MemoryMax koyun, kodu profilleyin |
| 429 Too Many Requests | Discord API hız sınırı | İstekleri kuyruğa alın, toplu işlemleri yavaşlatın |
| Disk doldu, bot durdu | Log dosyaları büyümüş | logrotate ya da pm2-logrotate kurun |
| Komutlar sunucuda görünmüyor | Slash komutları kaydedilmemiş | Komut kayıt betiğini çalıştırın; global kayıt yayılması zaman alır |
| Bot çevrim içi ama yanıt vermiyor | Gerekli intent açılmamış | Geliştirici portalından ilgili intent’i etkinleştirin |
Güvenlik ve Yedekleme#
- Botu root ile çalıştırmayın. Ayrı bir sistem kullanıcısı zorunludur.
- Token’ı ve veritabanı parolasını
.env’de tutun, izni600olsun, depoya göndermeyin. - Bot izinlerini daraltın. Discord’da “Administrator” yetkisi vermek yerine yalnızca gereken izinleri seçin.
- Bağımlılıkları güncel tutun.
npm auditçıktısını düzenli kontrol edin. - Güvenlik duvarını kapalı tutun. Bot dışarıdan bağlantı kabul etmez; yalnızca SSH portu açık olsun. Kural yönetimi: firewall yapılandırması.
- Veritabanını yedekleyin. Bot verisi (ekonomi, seviye, ayarlar) kaybedilirse geri gelmez.
# Basit yedek betiği: /opt/discordbot/yedek.sh
#!/bin/bash
TARIH=$(date +%F_%H%M)
HEDEF=/opt/discordbot/yedek
mkdir -p "$HEDEF"
# Veritabanı
pg_dump -U botuser botdb > "$HEDEF/botdb_$TARIH.sql"
# Yapılandırma ve kod (node_modules hariç)
tar --exclude='node_modules' --exclude='logs' \
-czf "$HEDEF/bot_$TARIH.tar.gz" -C /opt/discordbot bot
# 14 günden eski yedekleri sil
find "$HEDEF" -type f -mtime +14 -delete
# Betiği çalıştırılabilir yap ve her gece 04:00'te çalıştır
chmod +x /opt/discordbot/yedek.sh
crontab -e
# Eklenecek satır:
0 4 * * * /opt/discordbot/yedek.sh >> /opt/discordbot/logs/yedek.log 2>&1
Yedekleri sunucu dışında da tutmak gerekir; planlamayı 3-2-1 yedekleme kuralı sayfasında anlattık.
Güncelleme Akışı#
-
Yedek alın#
Güncelleme öncesi veritabanı ve yapılandırma yedeği alın. Geri dönmeniz gerekebilir.
-
Kodu çekin#
sudo -u discordbot git -C /opt/discordbot/bot pull -
Bağımlılıkları güncelleyin#
sudo -u discordbot npm ci --omit=dev—npm installyerinenpm cikullanmak kilit dosyasına birebir uyar ve sürpriz sürüm değişimini engeller. -
Servisi yeniden yükleyin#
pm2:
pm2 reload discord-bot— systemd:sudo systemctl restart discord-bot -
Logları kontrol edin#
İlk iki dakika logları izleyin. Hata yoksa güncelleme tamamdır; hata varsa yedekten dönün.
Özetle#
Discord botunu 7/24 çalıştırmanın özü, onu bir süreç yöneticisine teslim etmektir. Node.js botları için pm2 pratik ve zengin bir çözümdür; farklı diller karışıksa ya da ek bağımlılık istemiyorsanız systemd daha temizdir. İkisinde de üç şey mutlaka yapılandırılmalıdır: çökme sonrası otomatik yeniden başlatma, sunucu açılışında otomatik başlama ve dosyaya yazılan loglar.
Güvenlik tarafında kural basit: bot ayrı bir kullanıcıyla çalışsın, token .env içinde ve 600 izinle dursun, depoya gitmesin. Log döndürmeyi kurun ki disk dolmasın, veritabanını düzenli yedekleyin ve yeniden başlatma sayacını izleyin — sessizce sürekli çöken bir bot, hiç çalışmayan bottan daha zor fark edilir.