Botunuzu bilgisayarınızda node index.js ya da python bot.py ile çalıştırdınız, her şey yolunda. Sonra terminali kapattınız veya bilgisayar uyku moduna geçti ve bot çevrimdışı oldu. "Discord botu 7/24 nasıl açık tutulur?" sorusunun cevabı aslında basit: botun kodu, sürekli açık ve internete bağlı bir makinede, bir süreç yöneticisinin gözetiminde çalışmalıdır.

Bu yazıda neden kendi bilgisayarınızın yetmediğini, VDS/VPS üzerinde PM2, systemd ve Docker ile botu nasıl ayakta tutacağınızı, ortam değişkenlerini, logları, çökme sonrası yeniden başlatmayı, düzgün kapanmayı ve izlemeyi anlatıyoruz. Botu henüz yazmadıysanız önce Discord bot nasıl yapılır rehberimize bakın.

Kendi bilgisayarınız neden yetmez?

Kendi bilgisayarınız neden yetmez? Bilgisayar kapandığında, uykuya geçtiğinde veya yeniden başladığında bot düşer., Ev internetindeki kesintiler ve IP değişimleri bağlantıyı...

Gateway kullanan bir bot Discord'a sürekli açık bir WebSocket bağlantısı kurar. Belgeye göre bağlantı kurulunca Discord bir heartbeat_interval bildirir ve bot bu aralıkla düzenli olarak heartbeat göndermek zorundadır. Heartbeat zamanında gitmezse bağlantı kapatılır. Pycord rehberi bunu sade bir dille anlatır: terminali kapattığınızda program durur, heartbeat gönderilmez ve bot komutları işleyemez.

  • Bilgisayar kapandığında, uykuya geçtiğinde veya yeniden başladığında bot düşer.
  • Ev internetindeki kesintiler ve IP değişimleri bağlantıyı koparır.
  • Güncelleme sonrası otomatik yeniden başlatmalar botu sessizce kapatır.
  • Bot çökerse sizi bekler; kimse onu yeniden başlatmaz.

Pycord rehberi barındırma türlerini de karşılaştırır: paylaşımlı hosting genellikle web siteleri içindir ve bot için önerilmez; VPS çoğu kullanıcı için en iyi seçimdir; fiziksel dedicated sunucu ise küçük botlar için gereğinden fazladır.

VDS veya VPS seçimi

Discord botu için Linux çalışan küçük bir sanal sunucu genellikle yeterlidir. Kaynak ihtiyacı botun büyüklüğüne, kullandığınız dile ve önbelleğe aldığınız veriye göre değişir. Müzik botu çalıştıracak ve Lavalink'i aynı makinede tutacaksanız Java'nın bellek ihtiyacını hesaba katın (bkz. müzik botu rehberi). VDS ile VPS farkını VPS ve VDS karşılaştırma yazımızda, VDS'in ne olduğunu VDS rehberimizde anlattık.

Token ve ortam değişkenleri

Token'ı asla kodun içine yazmayın. Sunucuda bir .env dosyası veya servis yöneticisinin ortam değişkeni özelliğini kullanın; .env dosyasını .gitignore içine ekleyin. Token sızarsa Developer Portal'da Bot sayfasından "Reset Token" ile yenileyin. Ayrıntılar bot token güvenliği, .env en iyi pratikleri ve .gitignore rehberi yazılarında.

bash
# /home/bot/discord-bot/.env  (izinleri: chmod 600)
DISCORD_TOKEN=buraya_token_gelecek

Yöntem 1: PM2 ile Node.js botu

PM2, Node.js uygulamaları için bir süreç yöneticisidir. discord.js rehberine göre süreçleri başlatma, durdurma, yeniden başlatma, izleme ve işletim sistemi açılışında otomatik başlatma özelliklerini sunar.

bash
npm install --global pm2

cd /home/bot/discord-bot
pm2 start index.js --name bot
pm2 monit          # tüm süreçlerin çıktısını canlı izler

pm2 startup        # açılışta başlatma için komutu üretir, çıktıdaki komutu çalıştırın
pm2 save           # mevcut süreç listesini kaydeder

pm2 startup çıktısında size root olarak çalıştırmanız gereken bir komut verilir; o komutu çalıştırdıktan sonra pm2 save ile listeyi kaydedin. Windows için discord.js rehberi pm2-installer projesini önerir. PM2'nin --watch seçeneği dosya değişince süreci yeniden başlatır; rehber bunu geliştirme ortamı için anar, üretimde genellikle kapalı tutulur.

Yöntem 2: systemd servisi (Node.js ve Python)

Linux sunucularda ek bir araç kurmadan botu servis olarak çalıştırmanın yolu systemd'dir. Lavalink belgelerindeki servis şablonu da aynı yaklaşımı kullanır: Restart=on-failure ile çökme halinde yeniden başlatma ve RestartSec ile gecikme. Botu root yerine ayrı bir kullanıcıyla çalıştırın ve token'ı EnvironmentFile= ile verin.

ini
# /etc/systemd/system/discord-bot.service
[Unit]
Description=Discord Bot
After=network-online.target
Wants=network-online.target

[Service]
User=bot
Group=bot
WorkingDirectory=/home/bot/discord-bot
EnvironmentFile=/home/bot/discord-bot/.env
ExecStart=/usr/bin/node index.js
# Python için: ExecStart=/home/bot/discord-bot/.venv/bin/python bot.py
Restart=on-failure
RestartSec=10s

[Install]
WantedBy=multi-user.target
bash
sudo systemctl daemon-reload
sudo systemctl enable --now discord-bot
sudo systemctl status discord-bot
sudo journalctl -u discord-bot -f    # canlı log

node yolunu which node komutuyla kontrol edin; nvm ile kurulan Node.js farklı bir klasörde olabilir. Servis dosyalarının tüm seçenekleri için systemd servis dosyası rehberimize, temel Linux komutları için Linux sunucu komutları yazımıza bakın.

Yöntem 3: Docker ve Docker Compose

Yöntem 3: Docker ve Docker Compose: Node.js için hızlı kurulum, pm2 monit ile kolay izleme, systemd, Docker Compose

Docker, botu bağımlılıklarıyla birlikte paketleyip her sunucuda aynı şekilde çalıştırmanızı sağlar. Üretim için birkaç kural: node_modules ve .env dosyalarını imaja kopyalamayın (.dockerignore kullanın), token'ı ortam değişkeniyle verin.

dockerfile
# Dockerfile
FROM node:24-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
USER node
CMD ["node", "index.js"]
bash
# .dockerignore
node_modules
.env
.git
yaml
# compose.yml
services:
  bot:
    build: .
    restart: unless-stopped
    env_file: .env

docker compose up -d ile başlatın, docker compose logs -f bot ile logları izleyin. restart: unless-stopped, konteyner çöktüğünde veya sunucu yeniden başladığında botu tekrar ayağa kaldırır. Kullandığınız discord.js sürümünün README dosyasında belirtilen Node.js sürümüyle uyumlu bir taban imaj seçin. Ayrıntılı örnekler için Dockerfile yazma rehberi ve Docker Compose rehberi yazılarımıza bakın.

YöntemArtısıDikkat edilecek nokta
PM2Node.js için hızlı kurulum, pm2 monit ile kolay izlemeAçılışta başlatma için pm2 startup ve pm2 save gerekir
systemdEk araç yok, Node.js ve Python için aynı yapı, journalctl loglarıServis dosyası ve kullanıcı ayarlarını doğru yazmak gerekir
Docker ComposeTaşınabilir, bağımlılıklar imajın içinde, Lavalink gibi ek servislerle birlikte yönetilirİmaj boyutu ve .dockerignore kurallarına dikkat

Çökme döngüsü tehlikesi: 1000 IDENTIFY sınırı

Çökme döngüsü tehlikesi: 1000 IDENTIFY sınırı: systemd'de RestartSec ile yeniden başlatmalar arasına gecikme koyun., Açılış hatalarını (eksik token, hatalı config) loglayın ve...

Otomatik yeniden başlatma iyi bir şeydir ama bir uyarısı vardır. Gateway belgesine göre bir uygulama 24 saatte en fazla 1000 IDENTIFY çağrısı yapabilir; bu sınır tüm shard'lar için geçerlidir ve RESUME çağrılarını kapsamaz. Sınıra ulaşıldığında uygulamanın tüm aktif oturumları sonlandırılır, bot token'ı sıfırlanır ve sahibine e-posta gönderilir.

Bot, açılışta hemen çöken bir hataya sahipse ve süreç yöneticiniz onu bekleme olmadan sürekli yeniden başlatıyorsa, her başlatma yeni bir IDENTIFY demektir. Bu yüzden:

  • systemd'de RestartSec ile yeniden başlatmalar arasına gecikme koyun.
  • Açılış hatalarını (eksik token, hatalı config) loglayın ve düzeltmeden botu döngüye sokmayın.
  • Logları düzenli kontrol edin; aynı hatanın tekrar tekrar görünmesi bir döngü işaretidir.

Düzgün kapanma (graceful shutdown)

Süreç yöneticiniz botu durdururken (örneğin systemctl stop veya docker compose down) sürece SIGTERM sinyali gönderir. Bu anda gateway bağlantısını ve veritabanını düzgün kapatmak, yarım kalan yazmaları önler. Gateway belgesine göre bağlantıyı 1000 veya 1001 kapanış koduyla kapattığınızda oturum geçersiz olur ve bot çevrimdışı görünür.

javascript
const { Client, GatewayIntentBits, Events } = require('discord.js');

const client = new Client({ intents: [GatewayIntentBits.Guilds] });

client.once(Events.ClientReady, (c) => console.log(`Hazır: ${c.user.tag}`));
client.on(Events.Error, (err) => console.error('İstemci hatası:', err));
client.on(Events.Warn, (msg) => console.warn('Uyarı:', msg));

process.on('unhandledRejection', (err) => console.error('Yakalanmamış promise:', err));

async function kapat(sinyal) {
  console.log(`${sinyal} alındı, kapanıyor...`);
  await client.destroy();
  // veritabanı bağlantısını da burada kapatın
  process.exit(0);
}
process.on('SIGTERM', () => kapat('SIGTERM'));
process.on('SIGINT', () => kapat('SIGINT'));

client.login(process.env.DISCORD_TOKEN);

discord.py tarafında sürüm notlarına göre Client.run() sinyal işlemeyi içerir. Yine de veritabanı gibi kendi açtığınız kaynakları kapanışta kapatmayı unutmayın. Python başlangıcı için discord.py ile bot yapımı yazısına bakın.

Loglar ve izleme

7/24 çalışan bir botta neyin ters gittiğini ancak loglardan anlarsınız. Yapılandırılmış log kullanmak (Node.js için pino veya winston, Python için logging modülü) arama ve filtrelemeyi kolaylaştırır. Şunları mutlaka loglayın:

  • Bot hazır olduğunda (READY) ve bağlantı yeniden kurulduğunda (RESUMED)
  • Gateway kapanış kodları; anlamları Opcodes and Status Codes sayfasında
  • Yakalanmamış hatalar ve promise redleri (süreç yöneticisi botu yeniden başlatsın)
  • 401, 403 ve 429 yanıtlarının sayısı (rate limit için 429 hatası yazımıza bakın)

discord.py, Client.run() kullanıldığında discord logger'ı için varsayılan bir yapılandırma kurar. Belge, logging yapılandırılmazsa hata ve uyarıların görünmeyeceğini, bu yüzden kurulmasını şiddetle önerir. Dosyaya yazmak için log_handler parametresi kullanılır:

python
import logging
import os
import discord

intents = discord.Intents.default()
client = discord.Client(intents=intents)

handler = logging.FileHandler(filename='discord.log', encoding='utf-8', mode='w')
client.run(os.getenv('DISCORD_TOKEN'), log_handler=handler, log_level=logging.INFO)

Basit bir izleme için botun gateway gecikmesini (heartbeat ping) bir komutla gösterebilir, sunucuda ise CPU ve bellek kullanımını düzenli kontrol edebilirsiniz. Kod güncellemelerini otomatikleştirmek isterseniz GitHub Actions ile VPS deploy rehberimize göz atın. Oyun sunucusu panelleri kullanıyorsanız Pterodactyl paneli de botları yönetmek için bir seçenektir.

Alternatif: sürekli açık sunucu gerektirmeyen botlar

Botunuz yalnızca slash komutlarına ve butonlara yanıt veriyorsa, mesaj veya üye olaylarını dinlemiyorsa, gateway yerine HTTP interactions kullanabilirsiniz. Bu modelde sürekli açık bir bağlantı yoktur; Cloudflare Workers gibi sunucusuz platformlarda çalışabilir. Farkları HTTP interactions ve Cloudflare Workers rehberimizde anlattık.

Sık Sorulan Sorular

Ücretsiz hosting ile bot 7/24 açık kalır mı?

Pycord rehberi ücretsiz paylaşımlı ortamların genellikle çok sınırlı kaynak verdiğini ve bot için önerilmediğini belirtir. Uyku moduna giren veya süreci belirli sürede durduran ortamlarda gateway botu kesintisiz çalışmaz. Kesintisiz çalışma için kendi yönettiğiniz bir VDS veya VPS en öngörülebilir seçenektir.

PM2 mi systemd mi kullanmalıyım?

İkisi de iş görür. Yalnızca Node.js kullanıyorsanız PM2 pratiktir. Python botu da çalıştırıyorsanız veya ek araç kurmak istemiyorsanız systemd daha sadedir. Birden fazla servisi (bot, Lavalink, veritabanı) birlikte yönetiyorsanız Docker Compose düşünebilirsiniz.

Bot token'ım neden kendiliğinden sıfırlandı?

Olası sebeplerden biri 24 saatlik 1000 IDENTIFY sınırının aşılmasıdır; bu genellikle çökme döngüsünden kaynaklanır. Token'ın herkese açık bir yere sızması da bir sebep olabilir. Yeni token'ı Developer Portal'dan alıp .env dosyanızı güncelleyin.

Botum açık görünüyor ama komutlara cevap vermiyor. Ne yapmalıyım?

Logları kontrol edin. Etkileşim 3 saniye içinde yanıtlanmıyorsa kullanıcı "Etkileşim başarısız oldu" mesajı görür; çözümü etkileşim başarısız oldu hatası yazımızda.

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: systemd servis dosyası rehberi · Node.js cluster ve PM2 · Docker Compose rehberi · VDS nedir · Bot token güvenliği · Sharding nedir · HTTP interactions