VPS'te Discord Bot Barındırma: Botunuzu 7/24 Çevrimiçi Tutun
- 18 Ekim 2026
- 09:00
- Yazar: Adrien Roche
- Eğitimler

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 birsys.exit()de fark etmez.RestartSec=5ise 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 Pythonstdout'u blok hâlinde tamponlar veprint()satırları journal'a dakikalarca gecikmeyle ya da yalnızca çıkışta ulaşır.Protect*,PrivateTmpveNoNewPrivilegessatırları, dosya sisteminin geri kalanını bot için salt okunur veya görünmez kılar; botun yazması gereken her diziniReadWritePaths=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öntem | SSH çıkışına dayanır | Çökmede yeniden başlar | Yeniden başlatmada açılır | Sonuç |
|---|---|---|---|---|
nohup / & | Evet | Hayır | Hayır | Yalnızca hızlı testler için. |
screen / tmux | Evet | Hayır | Hayır, betiklenmedikçe | Hata ayıklama için, üretim için değil. |
| pm2 | Evet | Evet | Evet, pm2 startup + pm2 save sonrası | Node.js ekipleri için iyi; günlükler ve yeniden başlatmalar için tek bir CLI. |
| systemd birimi | Evet | Evet (Restart=) | Evet (enable) | Önerilir; ek yazılım yok, sertleştirme yerleşik. |
Docker, restart: unless-stopped | Evet | Evet | Evet, Docker daemon ile | Bot 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?
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?
Tek bir VPS üzerinde birden fazla Discord botu çalıştırabilir miyim?
/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?
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.
İlgili yazılar




