Hosting Bot Discord di VPS: Bot Online 24/7 Tanpa Putus
- 18 Oktober 2026
- 09.00
- Oleh Adrien Roche
- Tutorial

Mengapa VPS adalah tempat bot Discord benar-benar tetap online
Bot Discord bukan halaman web. Setelah login, bot mempertahankan koneksi WebSocket persisten ke gateway Discord dan harus menjawab heartbeat terus-menerus; begitu prosesnya berhenti, bot tampil offline dan semua perintah gagal. Satu syarat itu, proses yang tidak pernah tidur, menggugurkan sebagian besar hosting "gratis":
- Heroku menghapus dyno gratisnya pada November 2022.
- Replit tidak lagi menjaga proyek gratis tetap berjalan; fitur always-on dipindah ke deployment berbayar.
- Glitch mengakhiri layanan hosting aplikasinya pada 2025.
- Paket web gratis yang tidur setelah tidak aktif memutus koneksi gateway setiap kali menganggur; bagi pengguna, bot itu sekadar mati.
Hosting bot Discord di VPS menyelesaikan masalah ini dari akarnya: mesin Linux dengan akses root yang menyala sepanjang waktu, tempat bot menjadi salah satu service yang dikelola sistem init. Panduan ini membangunnya di Ubuntu 24.04 (berlaku juga untuk 22.04 dan Debian 12) dengan discord.py dan discord.js, lalu membahas penanganan token, restart, log, pembaruan, dan memori.
Siapkan VPS: satu pengguna khusus dan sebuah runtime
Amankan pintu depan lebih dulu: aktifkan SSH di Ubuntu dan perkuat konfigurasinya dengan autentikasi kunci, tanpa login root, dan ufw. Bot menghubungi Discord ke luar dan tidak butuh port masuk, jadi firewall bisa tetap tertutup untuk semuanya kecuali SSH.
Langkah 1: buat akun tanpa hak istimewa untuk bot
sudo useradd -r -m -d /opt/mybot -s /usr/sbin/nologin bot
Akun khusus berarti bot yang bermasalah atau dependensi npm maupun PyPI yang disusupi tidak bisa membaca kunci SSH Anda atau menyentuh service lain. Semuanya berada di /opt/mybot, dimiliki oleh bot.
Langkah 2 (Python): pasang discord.py di virtual environment
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 membutuhkan Python 3.8 atau lebih baru; Ubuntu 24.04 menyertakan 3.12 dan 22.04 menyertakan 3.10, jadi interpreter bawaan distribusi sudah memadai. Tambahkan discord.py[voice] dan ffmpeg hanya bila memakai kanal suara.
Langkah 3 (Node.js): pasang LTS terkini dan discord.js
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'
Paket nodejs bawaan Ubuntu jauh tertinggal dari upstream dan discord.js v14 butuh runtime modern, jadi gunakan NodeSource (di atas) atau nvm untuk LTS terkini. Dengan nvm, jalankan which node dan pakai path absolut itu di unit service.
Jauhkan token dari kode: berkas .env
Token bot adalah kata sandi dengan kendali penuh atas bot: jangan pernah menempelkannya ke bot.py atau index.js, jangan pernah men-commit-nya. Taruh di /opt/mybot/.env, hanya bisa dibaca akun bot, dan gunakan editor alih-alih echo, karena token yang diketik di baris perintah akan tersimpan di riwayat shell Anda:
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
Formatnya satu KEY=value per baris, tanpa tanda kutip, tanpa export. python-dotenv dan paket npm dotenv membacanya, dan systemd dapat menyuntikkan berkas yang sama lewat EnvironmentFile= (bagian berikutnya); memakai keduanya tidak berbahaya, karena kedua pustaka tidak menimpa variabel yang sudah ada. Jika token bocor, segera reset di Developer Portal pada Bot → Reset Token.
Bot minimal dengan discord.py dan discord.js
Kedua contoh membaca token dari environment, mengaktifkan intent Message Content, dan menjawab !ping. Di Developer Portal, buat sebuah application, tambahkan bot user, salin token (hanya ditampilkan sekali), aktifkan Message Content Intent di Bot → Privileged Gateway Intents, lalu undang bot ke server uji lewat OAuth2 URL generator dengan scope bot.
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);
Jalankan sekali di foreground: sudo -u bot /opt/mybot/.venv/bin/python /opt/mybot/bot.py atau sudo -u bot node /opt/mybot/index.js, tunggu pesan Logged in as, kirim !ping, lalu Ctrl-C. Untuk saat ini bot hanya hidup selama sesi SSH Anda: menutup terminal mengirim SIGHUP ke proses anaknya dan bot mati.
Jalankan lewat systemd dengan Restart=always
systemd sudah menjadi sistem init Ubuntu, jadi cara paling bersih menjaga bot tetap online setelah logout, crash, dan reboot adalah unit service: tanpa daemon tambahan, dan log langsung masuk ke journal.
Langkah 1: tulis unit-nya
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
Untuk discord.js, setel ExecStart=/usr/bin/node /opt/mybot/index.js dan hapus baris PYTHONUNBUFFERED. Direktif yang penting:
Restart=alwaysmenghidupkan ulang proses pada setiap keluaran, baik crash maupunsys.exit()yang bersih;RestartSec=5mencegah bot yang langsung mati (token salah, syntax error) berputar dalam loop rapat.Wants=/After=network-online.targetmenunda start sampai jaringan siap, sehingga login pertama setelah reboot tidak gagal karena DNS.PYTHONUNBUFFERED=1: tanpa terminal, Python melakukan block-buffer padastdout, sehingga barisprint()baru sampai ke journal beberapa menit kemudian atau hanya saat keluar.- Baris
Protect*,PrivateTmp, danNoNewPrivilegesmembuat sisa filesystem hanya-baca atau tak terlihat bagi bot; tambahkan direktori mana pun yang perlu ditulisi keReadWritePaths=.
Langkah 2: aktifkan, jalankan, dan verifikasi
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 membuat symlink boot dan --now menjalankan unit. Baris kill adalah uji sesungguhnya: jika beberapa detik kemudian systemctl status mybot menampilkan active (running), kebijakan restart berfungsi, dan sudo reboot membuktikan jalur boot-nya. Untuk melihatnya bersama semua service lain, tampilkan daftar service yang berjalan dengan systemctl; ia muncul sebagai mybot.service, dan systemctl is-enabled mybot memastikan ia kembali setelah restart.
Alternatif: pm2, dan perbandingannya dengan screen, nohup, serta Docker
Setiap cara menjaga bot tetap hidup menjawab tiga pertanyaan: apakah bertahan setelah logout SSH, hidup ulang saat crash, dan menyala saat reboot?
| Metode | Bertahan setelah logout SSH | Hidup ulang saat crash | Menyala saat reboot | Kesimpulan |
|---|---|---|---|---|
nohup / & | Yes | No | No | Hanya untuk uji cepat. |
screen / tmux | Yes | No | Tidak, kecuali dibuatkan skrip | Untuk debugging, bukan produksi. |
| pm2 | Yes | Yes | Ya, setelah pm2 startup + pm2 save | Cocok untuk tim Node.js; satu CLI untuk log dan restart. |
| unit systemd | Yes | Ya (Restart=) | Ya (enable) | Direkomendasikan; tanpa perangkat lunak tambahan, hardening sudah termasuk. |
Docker, restart: unless-stopped | Yes | Yes | Ya, bersama daemon Docker | Bagus bila bot memang sudah dikemas sebagai image. |
pm2 adalah pilihan populer di dunia Node.js dan bisa menangani Python juga. Jalankan sebagai akun pemilik bot:
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 menghasilkan unit systemd pm2-<user> yang menghidupkan kembali daftar proses tersimpan Anda saat boot, jadi pm2 berdiri di atas systemd alih-alih menggantikannya: itulah alasan jujur untuk memakai systemd secara langsung bagi satu bot. pm2 layak dipakai bila ada beberapa proses Node atau tim yang sudah terbiasa dengannya.
Jika Anda lebih suka kontainer, padanannya adalah restart: unless-stopped di berkas Compose; panduan memasang Docker di VPS Ubuntu membahas engine, Compose, dan perilaku saat boot. Catatan ufw di sana tidak memengaruhi bot, yang tidak membuka port apa pun.
Log, pembaruan, dan penentuan ukuran memori
Log
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 merotasi dan mengompresi log secara mandiri. Jika bot menulis berkas lognya sendiri, gunakan logging.handlers.RotatingFileHandler di Python atau transport rotatif dengan pino maupun winston di Node, supaya handler yang cerewet tidak memenuhi disk.
Pembaruan
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
Restart memutus koneksi gateway selama beberapa detik; pustaka akan menyambung kembali dan pengguna jarang menyadarinya. Kunci versi pustaka di requirements.txt atau package-lock.json dan baca changelog sebelum naik versi mayor. Jaga OS tetap mutakhir dengan sudo apt update && sudo apt upgrade atau unattended-upgrades.
Berapa RAM yang dibutuhkan bot?
Jangan menentukan ukuran dari angka umum; ukurlah. systemctl status mybot menampilkan baris Memory: dan pm2 list menunjukkan hal yang sama. Bot discord.py yang hanya menangani perintah biasanya menganggur di kisaran puluhan megabita; bot discord.js menanggung runtime Node di atasnya. Memori bertambah seiring state: cache member dan pesan di server besar, voice dan musik (satu proses ffmpeg per stream), pembuatan gambar, atau basis data. Dalam praktiknya RAM 1 GB nyaman menjalankan OS plus bot kecil atau menengah; bot yang berat di sisi voice atau beberapa bot dalam satu mesin membenarkan 2 GB atau lebih, dan di atas 2.500 server Discord mewajibkan sharding, yang melipatgandakan konsumsi. Dua jaring pengaman murah: MemoryMax=512M di unit, agar kebocoran memori memicu restart bot alih-alih menjatuhkan mesin, dan sebuah berkas swap kecil.
Semua ini mengandaikan sebuah mesin Linux dengan akses root yang menyala sepanjang waktu. Jika Anda masih membutuhkan mesin itu, VPS bot Discord rdp.monster online sekitar 10 detik setelah pembayaran dikonfirmasi, dengan CPU dan RAM khusus, akses root penuh, bandwidth tanpa batas (fair-use), tanpa KYC, menerima kripto, mulai $8.99/bulan, sehingga langkah systemctl enable --now mybot di atas bisa menjadi hal terakhir yang Anda ketik sebelum bot menyala hijau.
Pertanyaan yang sering ditanyakan
Bisakah saya meng-hosting bot Discord gratis 24/7?
systemd menghidupkan ulang bot saat crash dan reboot, dan tidak ada yang menangguhkannya karena menganggur.Apakah bot Discord perlu IP statis atau port terbuka di VPS?
Bisakah saya menjalankan beberapa bot Discord di satu VPS?
/opt/bot-a dan /opt/bot-b, .env-nya sendiri dengan tokennya sendiri, dan berkas unit-nya sendiri, lalu jalankan systemctl enable --now untuk masing-masing. Pengguna sistem terpisah mencegah bug di satu bot membaca token bot lainnya. Satu-satunya anggaran bersama adalah RAM dan CPU: pantau systemctl status per unit, dan pindah ke paket lebih besar saat totalnya mendekati batas.Sebaiknya meng-hosting bot Discord di VPS Windows atau Linux?
systemd sepuluh baris. Di Windows Anda perlu Task Scheduler atau NSSM untuk mendapat perilaku restart-saat-boot yang sama dengan lebih banyak klik.Adrien Roche, Editor Infrastruktur & Hosting
Insinyur sistem yang sudah 10+ tahun mengelola server Windows Server dan Linux. Adrien mengurus dokumentasi infrastruktur rdp.monster dan menulis panduan kami tentang RDP, hosting VPS, administrasi server, jaringan, dan tool privasi.




