RDP Monster

VPS'te Discord Bot Barındırma: Botunuzu 7/24 Çevrimiçi Tutun

VPS'te Discord Bot Barındırma: Botunuzu 7/24 Çevrimiçi Tutun

Discord botları neden gerçekten bir VPS üzerinde çevrimiçi kalır

Bir Discord botu web sayfası değildir. Oturum açtıktan sonra Discord'un gateway'ine kalıcı bir WebSocket bağlantısı tutar ve sürekli olarak heartbeat yanıtlamak zorundadır; süreç durduğunda bot çevrimdışı görünür ve tüm komutlar başarısız olur. Uyumayan bir süreç şeklindeki bu tek gereklilik, "ücretsiz" barındırmanın çoğunu devre dışı bırakır:

  • Heroku ücretsiz dyno'larını Kasım 2022'de kaldırdı.
  • Replit artık ücretsiz projeleri çalışır durumda tutmuyor; always-on ücretli dağıtımlara taşındı.
  • Glitch uygulama barındırmayı 2025'te sonlandırdı.
  • Hareketsizlikten sonra uyuyan ücretsiz web katmanları, her boşta kaldıklarında gateway bağlantısını keser; kullanıcılar açısından o bot basitçe kapalıdır.

VPS üzerinde Discord bot barındırma bunu kökten çözer: gün boyu çalışan, root erişimli bir Linux makinesi; burada bot, init sistemi tarafından yönetilen sıradan bir servistir. Bu rehber bunu Ubuntu 24.04 üzerinde (22.04 ve Debian 12 için de geçerli) discord.py ve discord.js ile kurar, ardından token yönetimini, yeniden başlatmaları, günlükleri, güncellemeleri ve belleği ele alır.

VPS'i hazırlayın: ayrı bir kullanıcı ve bir çalışma ortamı

Önce ön kapıyı güvene alın: Ubuntu'da SSH'ı etkinleştirin ve sertleştirin (anahtar kimlik doğrulaması, root girişinin kapatılması ve ufw ile). Bir bot Discord'a dışarı doğru bağlanır ve gelen porta ihtiyaç duymaz, bu yüzden güvenlik duvarı SSH dışında her şeye kapalı kalabilir.

Adım 1: bot için yetkisiz bir hesap oluşturun

sudo useradd -r -m -d /opt/mybot -s /usr/sbin/nologin bot

Ayrı bir hesap, hatalı bir botun ya da ele geçirilmiş bir npm veya PyPI bağımlılığının SSH anahtarlarınızı okuyamaması ve diğer servislere dokunamaması demektir. Her şey bot kullanıcısına ait olan /opt/mybot içinde durur.

Adım 2 (Python): discord.py'yi sanal ortama kurun

sudo apt update && sudo apt install -y python3 python3-venv python3-pip
sudo -u bot python3 -m venv /opt/mybot/.venv
sudo -u bot /opt/mybot/.venv/bin/pip install -U discord.py python-dotenv

discord.py 2.x, Python 3.8 veya daha yenisini gerektirir; Ubuntu 24.04 sürüm 3.12, 22.04 ise 3.10 ile gelir, dolayısıyla dağıtımın yorumlayıcısı yeterlidir. discord.py[voice] ve ffmpeg paketlerini yalnızca ses kanalları için ekleyin.

Adım 3 (Node.js): güncel bir LTS ve discord.js kurun

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
sudo -u bot bash -c 'cd /opt/mybot && npm init -y && npm install discord.js dotenv'

Ubuntu'nun kendi nodejs paketi upstream'in epey gerisinde kalır ve discord.js v14 modern bir çalışma ortamı ister; bu yüzden güncel bir LTS için NodeSource (yukarıdaki) veya nvm kullanın. nvm ile which node çalıştırın ve o mutlak yolu servis biriminde kullanın.

Token'ı koddan uzak tutun: .env dosyası

Bot token'ı, bot üzerinde tam denetim veren bir paroladır: onu asla bot.py veya index.js içine yapıştırmayın, asla depoya işlemeyin. Yalnızca bot hesabının okuyabileceği /opt/mybot/.env dosyasına koyun ve bunu echo yerine bir metin düzenleyiciyle yapın; çünkü komut satırına yazılan bir token kabuk geçmişinize düşer:

sudo -u bot nano /opt/mybot/.env        # one line: DISCORD_TOKEN=your-token-here
sudo chmod 600 /opt/mybot/.env
echo ".env" | sudo -u bot tee -a /opt/mybot/.gitignore

Biçim satır başına bir KEY=value şeklindedir; tırnak yok, export yok. python-dotenv ve dotenv npm paketi bu dosyayı okur; systemd de aynı dosyayı EnvironmentFile= ile enjekte edebilir (bir sonraki bölüm). İkisini birlikte kullanmak zararsızdır, çünkü hiçbir kütüphane zaten var olan bir değişkeni ezmez. Token bir şekilde sızarsa, Developer Portal'da Bot → Reset Token altından hemen sıfırlayın.

discord.py ve discord.js ile asgari bir bot

Her iki örnek de token'ı ortamdan okur, Message Content intent'ini etkinleştirir ve !ping komutuna yanıt verir. Developer Portal'da bir uygulama oluşturun, bir bot kullanıcısı ekleyin, token'ı kopyalayın (yalnızca bir kez gösterilir), Bot → Privileged Gateway Intents altında Message Content Intent'i açın ve botu bot kapsamıyla OAuth2 URL üreticisi üzerinden bir test sunucusuna davet edin.

discord.py: /opt/mybot/bot.py

import os
import discord
from dotenv import load_dotenv

load_dotenv()

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

@client.event
async def on_ready():
    print(f"Logged in as {client.user}")

@client.event
async def on_message(message):
    if message.author == client.user:
        return
    if message.content == "!ping":
        await message.channel.send("pong")

client.run(os.environ["DISCORD_TOKEN"])

discord.js: /opt/mybot/index.js

require("dotenv").config();
const { Client, GatewayIntentBits, Events } = require("discord.js");

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

client.once(Events.ClientReady, (c) => {
  console.log(`Logged in as ${c.user.tag}`);
});

client.on(Events.MessageCreate, (message) => {
  if (message.author.bot) return;
  if (message.content === "!ping") message.reply("pong");
});

client.login(process.env.DISCORD_TOKEN);

Bir kez ön planda çalıştırın: sudo -u bot /opt/mybot/.venv/bin/python /opt/mybot/bot.py veya sudo -u bot node /opt/mybot/index.js, Logged in as satırını bekleyin, !ping gönderin, sonra Ctrl-C yapın. Şu anda bot yalnızca SSH oturumunuz sürdüğü müddetçe yaşar: terminali kapatmak alt süreçlerine SIGHUP gönderir ve bot ölür.

Restart=always ile systemd altında çalıştırın

systemd zaten Ubuntu'nun init sistemidir; dolayısıyla botu oturum kapatma, çökme ve yeniden başlatma sonrasında çevrimiçi tutmanın en temiz yolu bir servis birimidir: ek bir daemon yok ve günlükler journal'a düşer.

Adım 1: birimi yazın

sudo nano /etc/systemd/system/mybot.service
[Unit]
Description=Discord bot
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=bot
Group=bot
WorkingDirectory=/opt/mybot
EnvironmentFile=/opt/mybot/.env
Environment=PYTHONUNBUFFERED=1
ExecStart=/opt/mybot/.venv/bin/python /opt/mybot/bot.py
Restart=always
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/mybot

[Install]
WantedBy=multi-user.target

discord.js için ExecStart=/usr/bin/node /opt/mybot/index.js ayarlayın ve PYTHONUNBUFFERED satırını çıkarın. Önemli direktifler:

  • Restart=always, süreci her çıkışta yeniden başlatır; çökme de temiz bir sys.exit() de fark etmez. RestartSec=5 ise anında ölen bir botun (hatalı token, sözdizimi hatası) sıkı bir döngüde dönmesini engeller.
  • Wants=/After=network-online.target, başlangıcı ağ hazır olana dek geciktirir; böylece yeniden başlatma sonrası ilk oturum açma DNS yüzünden başarısız olmaz.
  • PYTHONUNBUFFERED=1: terminal olmadan Python stdout'u blok hâlinde tamponlar ve print() satırları journal'a dakikalarca gecikmeyle ya da yalnızca çıkışta ulaşır.
  • Protect*, PrivateTmp ve NoNewPrivileges satırları, dosya sisteminin geri kalanını bot için salt okunur veya görünmez kılar; botun yazması gereken her dizini ReadWritePaths= içine ekleyin.

Adım 2: etkinleştirin, başlatın ve doğrulayın

sudo systemctl daemon-reload
sudo systemctl enable --now mybot
systemctl status mybot
sudo systemctl kill --signal=KILL mybot   # simulate a crash; status is active again after 5 s

enable açılış sembolik bağını oluşturur, --now ise birimi başlatır. kill satırı asıl testtir: birkaç saniye sonra systemctl status mybot active (running) gösteriyorsa yeniden başlatma politikası çalışıyordur ve bir sudo reboot açılış yolunu kanıtlar. Diğer tüm servislerin yanında görmek için systemctl ile çalışan servisleri listeleyin; mybot.service olarak görünür ve systemctl is-enabled mybot yeniden başlatmadan sonra geri geleceğini doğrular.

Alternatif: pm2 ve screen, nohup ile Docker karşılaştırması

Bir botu ayakta tutmanın her yolu üç soruyu yanıtlar: SSH çıkışına dayanıyor mu, çökmede yeniden başlıyor mu ve yeniden başlatmada açılıyor mu?

YöntemSSH çıkışına dayanırÇökmede yeniden başlarYeniden başlatmada açılırSonuç
nohup / &EvetHayırHayırYalnızca hızlı testler için.
screen / tmuxEvetHayırHayır, betiklenmedikçeHata ayıklama için, üretim için değil.
pm2EvetEvetEvet, pm2 startup + pm2 save sonrasıNode.js ekipleri için iyi; günlükler ve yeniden başlatmalar için tek bir CLI.
systemd birimiEvetEvet (Restart=)Evet (enable)Önerilir; ek yazılım yok, sertleştirme yerleşik.
Docker, restart: unless-stoppedEvetEvetEvet, Docker daemon ileBot zaten imaj olarak dağıtılıyorsa iyi.

pm2, Node.js dünyasında yaygın tercihtir ve Python'u da idare eder. Onu botun sahibi olan hesapla çalıştırın:

sudo npm install -g pm2
cd /opt/mybot
pm2 start index.js --name mybot
pm2 start bot.py --name mybot --interpreter /opt/mybot/.venv/bin/python   # Python variant
pm2 save
pm2 startup                    # prints a sudo command to run once
pm2 logs mybot
pm2 install pm2-logrotate      # ~/.pm2/logs/ otherwise grows forever

pm2 startup, kaydedilmiş süreç listenizi açılışta dirilten bir pm2-<user> systemd birimi üretir; yani pm2, systemd'nin yerini almaz, üzerine oturur: tek bir bot için doğrudan systemd kullanmanın dürüst gerekçesi budur. pm2, birden fazla Node süreci ya da onu zaten bilen bir ekip söz konusu olduğunda yerini hak eder.

Konteynerleri tercih ediyorsanız, karşılığı bir Compose dosyasındaki restart: unless-stopped ayarıdır; Ubuntu VPS üzerine Docker kurma rehberi motoru, Compose'u ve açılış davranışını anlatır. Oradaki ufw uyarısı, hiçbir port yayımlamayan bir botu etkilemez.

Günlükler, güncellemeler ve bellek boyutlandırma

Günlükler

journalctl -u mybot -f                    # follow live
journalctl -u mybot --since "1 hour ago"
journalctl -u mybot -p err -b             # errors since boot
sudo journalctl --vacuum-size=200M        # cap journal size

journald döndürme ve sıkıştırmayı kendisi yapar. Bot kendi günlük dosyasını yazıyorsa, Python'da logging.handlers.RotatingFileHandler, Node'da pino veya winston ile döngüsel bir taşıyıcı kullanın; böylece konuşkan bir handler diski dolduramaz.

Güncellemeler

cd /opt/mybot
sudo -u bot git pull
sudo -u bot .venv/bin/pip install -U -r requirements.txt   # Node: sudo -u bot npm ci
sudo systemctl restart mybot

Yeniden başlatma gateway bağlantısını birkaç saniyeliğine düşürür; kütüphane yeniden bağlanır ve kullanıcılar bunu nadiren fark eder. Kütüphane sürümlerini requirements.txt veya package-lock.json içinde sabitleyin ve büyük bir sürüm atlamasından önce değişiklik günlüğünü okuyun. İşletim sistemini sudo apt update && sudo apt upgrade ya da unattended-upgrades ile güncel tutun.

Bot ne kadar RAM ister?

Genel sayılardan boyutlandırmayın; ölçün. systemctl status mybot bir Memory: satırı yazdırır, pm2 list de aynısını gösterir. Yalnızca komut çalıştıran bir discord.py botu genelde onlarca megabaytta boşta durur; bir discord.js botu üstüne Node çalışma ortamını taşır. Bellek durumla birlikte büyür: büyük sunucularda üye ve mesaj önbellekleri, ses ve müzik (her akış için bir ffmpeg süreci), görsel üretimi veya bir veritabanı. Pratikte 1 GB RAM, işletim sistemi artı küçük ya da orta ölçekli bir botu rahatça çalıştırır; ses ağırlıklı botlar veya tek makinede birkaç bot 2 GB ve üzerini haklı çıkarır ve 2.500 sunucunun üzerinde Discord sharding zorunlu kılar, bu da ayak izini katlar. İki ucuz emniyet kemeri: birimde MemoryMax=512M, böylece bir sızıntı makineyi düşürmek yerine botu yeniden başlatır, ve küçük bir takas dosyası.

Bütün bunlar, gün boyu açık kalan ve root erişimi olan bir Linux makinesini varsayar. O makine hâlâ gerekiyorsa, rdp.monster'ın Discord bot VPS'i ödeme onaylandıktan yaklaşık 10 saniye sonra çevrimiçi olur; ayrılmış CPU ve RAM, tam root erişimi, sınırsız (adil kullanım) bant genişliği, KYC yok, kripto kabul edilir, aylık 8,99 $'dan başlar. Böylece yukarıdaki systemctl enable --now mybot adımı, bot yeşile dönmeden önce yazdığınız son şey olabilir.

Sık sorulan sorular

Bir Discord botunu 7/24 ücretsiz barındırabilir miyim?

Artık güvenilir biçimde değil: botları uyanık tutan ücretsiz katmanlar kaldırıldı ya da hareketsizlikte uykuya geçiyor.
Heroku ücretsiz dyno'ları Kasım 2022'de kaldırdı, Replit always-on özelliğini ücretli dağıtımlara taşıdı ve Glitch uygulama barındırmayı 2025'te sonlandırdı. Kalan ücretsiz web katmanları hareketsizlikten sonra uykuya geçer, bu da botun gateway bağlantısını kapatır. Botu kendi bilgisayarınızda çalıştırmak, bilgisayar yeniden başlayana veya uykuya geçene kadar işe yarar. En ucuz güvenilir seçenek, yaklaşık 1 GB RAM'li küçük bir VPS'tir; orada systemd botu çökmede ve yeniden başlatmada tekrar ayağa kaldırır ve kimse onu boşta kaldığı için askıya almaz.

Discord botu VPS üzerinde statik IP veya açık port ister mi?

Hayır: bot Discord'a dışarı doğru bağlanır, bu yüzden hiçbir gelen portun açık olması gerekmez ve IP önemsizdir.
Bir gateway botu Discord'a giden bir WebSocket açar ve olayları aynı bağlantı üzerinden alır; dolayısıyla VPS'teki güvenlik duvarı SSH dışında her şeye kapalı kalabilir ve sunucunun IP'si kullanıcılara hiç görünmez. Açık bir porta ve genel bir alan adına yalnızca, Discord'un kaydettiğiniz bir URL üzerinden çağırdığı HTTP etkileşim uç noktalarına geçerseniz ya da bir web paneli eklerseniz ihtiyaç duyarsınız. O durumda bunu bir ters vekil sunucu ile HTTPS arkasına alın.

Tek bir VPS üzerinde birden fazla Discord botu çalıştırabilir miyim?

Evet, bot başına bir systemd birimi (veya pm2 süreci), ideal olarak her biri kendi kullanıcısı ve dizini altında.
Hiçbir şey sizi makine başına tek botla sınırlamaz. Her bota /opt/bot-a ve /opt/bot-b gibi kendi dizinini, kendi token'ıyla kendi .env dosyasını ve kendi birim dosyasını verin, sonra her birini systemctl enable --now ile açın. Ayrı sistem kullanıcıları, bir bottaki hatanın diğerinin token'ını okumasını engeller. Tek ortak bütçe RAM ve CPU'dur: birim başına systemctl status izleyin ve toplam sınıra yaklaştığında daha büyük bir plana geçin.

Discord botunu Windows VPS'te mi yoksa Linux VPS'te mi barındırmalıyım?

Botlar için varsayılan Linux'tur: daha ucuz, daha hafif ve araçlar (systemd, pm2, Docker) onun için tasarlanmış.
Hem discord.py hem discord.js Windows üzerinde çalışır ve bot yalnızca Windows'ta çalışan bir uygulamaya bağlıysa ya da masaüstünü tercih ediyorsanız Windows VPS doğru seçimdir. Sade bir bot için Linux kazanır: işletim sistemi RAM'in çok küçük bir kısmını kullanır, minimal bir sunucunun saldırı yüzeyi neredeyse yoktur ve bir süreci hayatta tutmak on satırlık bir systemd birimidir. Windows'ta aynı açılışta-yeniden-başlatma davranışını elde etmek için Task Scheduler veya NSSM kullanır, daha fazla tıklama yaparsınız.

Adrien Roche, Altyapı ve Hosting Editörü

Windows Server ve Linux filolarını 10+ yıldır işleten sistem mühendisi. Adrien, rdp.monster altyapı dokümantasyonunu yönetir ve RDP, VPS hosting, sunucu yönetimi, ağ ve gizlilik araçları üzerine rehberlerimizi yazar.

Bayilik programımıza kaydolun

Bilgileriniz

Ad Soyad(Zorunlu)
E-posta adresinizi girin, şu adreste bir hesabınız olmalı: manager.rdp.monster !

Şirketiniz

Varsa web sitenizin adresini girin
Hizmetleri müşterilerinize nasıl satacağınızı kısaca anlatın; örneğin forumlarda insanlarla konuşarak.

Canavarlar bile çerezlere bayılır!

Tarama deneyiminizi geliştirmek, kişiselleştirilmiş reklam veya içerik sunmak ve trafiğimizi analiz etmek için çerez kullanıyoruz. «Kabul Et»'e tıklayarak çerez kullanımımızı onaylarsınız.