Semua Panduan VPS GratisTutorial LinuxDocker & DeployWebsite & WordPressBot & OtomasiKeamanan ServerFree Tier CloudBelajar DevOps
VPSGratis.ID›Bot Telegram 24 Jam di VPS dengan Python: Pandua
Bot & Otomasi

Bot Telegram 24 Jam di VPS dengan Python: Panduan Aman 2026

✍️ Maya Kusuma 📅 31 Oktober 2026 ⏱️ 7 mnt baca 👁️ 0×

Bot yang Tidak Pernah Mati Justru Paling Berbahaya

Bot Telegram yang berjalan di laptop hampir tidak punya risiko, karena ia mati begitu Anda menutup layar. Begitu dipindah ke VPS dan hidup 24 jam, situasinya berbalik: token Anda tersimpan di server yang selalu menyala, port SSH terbuka ke seluruh internet, dan setiap kelalaian kecil punya waktu tak terbatas untuk dieksploitasi.

Artikel ini membahas cara membuat bot Telegram dengan Python yang jalan terus di VPS, tetapi dengan sudut pandang yang sering dilewatkan tutorial lain: apa yang bisa salah, dan bagaimana mencegahnya sejak baris pertama. Kodenya singkat. Kebiasaan amannya yang menentukan.

Risiko Nyata yang Perlu Anda Antisipasi

Sebelum menulis kode, kenali dulu lawan Anda. Tabel berikut merangkum risiko yang paling sering menimpa bot kecil di VPS beserta cara menutupnya.

RisikoPenyebab UmumDampakMitigasi
Token bocorToken tertulis di kode lalu masuk repositori publikBot dibajak untuk spam atau phishingSimpan di file environment, revoke lewat BotFather jika ragu
Brute force SSHLogin password dan akun root aktifServer diambil alihKunci SSH, nonaktifkan login root dan password
Perintah disalahgunakanBot merespons siapa sajaOrang asing menjalankan fitur sensitifAllowlist ID pengguna
Proses mati diam-diamError tak tertangani, server rebootBot offline tanpa Anda sadarsystemd dengan restart otomatis
Dependensi usangLibrary tidak pernah diperbaruiCelah keamanan yang sudah diketahuiJadwalkan pembaruan dan pin versi

Perhatikan bahwa sebagian besar risiko ini bukan soal Python, melainkan soal server. Karena itu langkah pertama ada di sistem operasi, bukan di editor kode.

Langkah 1: Siapkan Server dengan Fondasi yang Aman

Untuk latihan semacam ini, VPS percobaan sangat cocok karena Anda bebas bereksperimen tanpa takut merusak server produksi. Jika belum punya, Anda bisa melihat opsi dari penyedia vps gratis lalu memilih yang sesuai kebutuhan belajar Anda. Detail penawaran terkini selalu ada di www.vpsgratis.id atau panel my.vpsgratis.id.

Setelah masuk ke server Ubuntu atau Debian, buat user khusus dan jangan jalankan bot sebagai root. Analogi sederhananya: Anda tidak memberi kunci seluruh gedung kepada petugas kebersihan yang hanya butuh akses satu ruangan.

# Perbarui paket sistem
sudo apt update && sudo apt upgrade -y

# Buat user khusus tanpa hak sudo untuk menjalankan bot
sudo adduser --disabled-password --gecos '' botuser

# Aktifkan firewall: hanya izinkan SSH
sudo apt install -y ufw python3-venv python3-pip
sudo ufw default deny incoming
sudo ufw allow OpenSSH
sudo ufw enable

Bot dengan mode polling (dijelaskan di bawah) tidak butuh port masuk tambahan. Artinya, permukaan serangan Anda tetap sekecil mungkin: hanya SSH.

Kunci SSH dan Fail2ban

Pastikan Anda sudah login dengan kunci SSH, lalu ubah PasswordAuthentication menjadi no dan PermitRootLogin menjadi no di konfigurasi sshd. Tambahkan fail2ban agar IP yang berulang kali gagal login diblokir otomatis. Dua langkah ini saja sudah menutup mayoritas serangan otomatis yang menyapu internet setiap hari.

Langkah 2: Buat Bot dan Amankan Token

Buka Telegram, cari BotFather, kirim perintah /newbot, dan ikuti instruksinya. Anda akan mendapat token. Anggap token ini setara password: siapa pun yang memilikinya bisa mengendalikan bot Anda sepenuhnya.

Simpan token di file environment yang hanya bisa dibaca pemiliknya, bukan di dalam kode.

# Buat file environment di luar folder kode
sudo tee /etc/tgbot.env > /dev/null <<'EOF'
BOT_TOKEN=isi_token_dari_botfather
ALLOWED_IDS=123456789
EOF

# Batasi akses: hanya root yang boleh membaca/menulis
sudo chown root:root /etc/tgbot.env
sudo chmod 600 /etc/tgbot.env

Poin Penting: Token tidak boleh muncul di kode, riwayat Git, log, atau tangkapan layar. Jika pernah terlanjur terekspos, jangan ragu: revoke dan buat token baru lewat BotFather. Biayanya hanya beberapa menit, sedangkan risikonya adalah bot Anda dipakai orang lain.

Langkah 3: Tulis Bot Python yang Defensif

Siapkan lingkungan virtual agar dependensi terisolasi, lalu pasang library python-telegram-bot.

sudo mkdir -p /opt/tgbot/data
sudo chown -R botuser:botuser /opt/tgbot
sudo -u botuser python3 -m venv /opt/tgbot/venv
sudo -u botuser /opt/tgbot/venv/bin/pip install python-telegram-bot

Sekarang kodenya. Perhatikan dua hal: token dibaca dari environment, dan perintah sensitif hanya dilayani untuk ID yang masuk allowlist.

import logging
import os

from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes, filters

# Log ke stdout agar ditangkap oleh journald (systemd)
logging.basicConfig(
    format='%(asctime)s %(levelname)s %(name)s: %(message)s',
    level=logging.INFO,
)
# Cegah URL berisi token tercatat di log level INFO
logging.getLogger('httpx').setLevel(logging.WARNING)

# Gagal cepat jika token tidak ada (KeyError lebih jelas daripada bot diam)
TOKEN = os.environ['BOT_TOKEN']
ALLOWED_IDS = {
    int(i) for i in os.environ.get('ALLOWED_IDS', '').split(',') if i.strip()
}


async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Perintah publik: aman dijawab siapa saja."""
    await update.message.reply_text('Halo! Bot aktif.')


async def status(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Perintah admin: hanya lolos jika ID ada di allowlist."""
    await update.message.reply_text('Server sehat dan bot berjalan.')


async def on_error(update: object, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Tangkap error agar satu pesan buruk tidak mematikan seluruh bot."""
    logging.exception('Error saat memproses update', exc_info=context.error)


def main() -> None:
    app = Application.builder().token(TOKEN).build()
    app.add_handler(CommandHandler('start', start))
    # Filter user_id menolak pengirim lain sebelum handler dijalankan
    app.add_handler(CommandHandler('status', status, filters=filters.User(user_id=ALLOWED_IDS)))
    app.add_error_handler(on_error)
    app.run_polling(drop_pending_updates=True)


if __name__ == '__main__':
    main()

Simpan sebagai /opt/tgbot/bot.py. Untuk mengetahui ID Telegram Anda, cukup minta bot khusus pencari ID di Telegram, lalu masukkan angkanya ke ALLOWED_IDS.

Polling atau Webhook: Mana yang Lebih Aman?

Pertanyaan ini sering muncul, dan jawabannya bergantung pada seberapa besar permukaan serangan yang mau Anda tanggung. Tabel berikut membandingkan keduanya.

AspekPollingWebhook
Port masukTidak perlu, hanya koneksi keluarWajib membuka port HTTPS
Sertifikat TLSTidak diperlukanWajib dan harus diperbarui
KompleksitasRendahSedang (domain, reverse proxy)
Risiko serangan langsungSangat kecilEndpoint publik bisa dipindai
Cocok untukBot pribadi, tim kecil, belajarBot trafik tinggi yang butuh latensi rendah

Untuk bot pertama Anda, polling hampir selalu pilihan yang lebih bijak. Anda bisa pindah ke webhook nanti ketika kebutuhan benar-benar menuntut.

Langkah 4: Jalankan 24 Jam dengan systemd

Banyak pemula menjalankan bot dengan screen atau nohup, lalu heran kenapa bot hilang setelah server reboot. Ada cara yang jauh lebih andal. Tabel di bawah membandingkan pilihan yang umum dipakai.

MetodeRestart otomatis saat crashJalan setelah rebootLog terpusatCatatan
screen / tmuxTidakTidakManualCocok hanya untuk uji coba
nohupTidakTidakFile biasaMudah terlupa
systemdYaYajournalctlStandar di Ubuntu/Debian, minim dependensi
Docker + restart policyYaYadocker logsBagus untuk isolasi, perlu belajar Docker

Untuk satu bot sederhana, systemd sudah lebih dari cukup. Buat file /etc/systemd/system/tgbot.service:

[Unit]
Description=Bot Telegram Python
After=network-online.target
Wants=network-online.target

[Service]
User=botuser
WorkingDirectory=/opt/tgbot
# Token dibaca dari file yang hanya bisa diakses root
EnvironmentFile=/etc/tgbot.env
ExecStart=/opt/tgbot/venv/bin/python bot.py
Restart=on-failure
RestartSec=5

# Hardening: batasi apa yang bisa disentuh proses ini
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/tgbot/data

[Install]
WantedBy=multi-user.target

Baris di bawah komentar hardening itu berfungsi seperti sekat di kapal: seandainya satu bagian bocor, kerusakannya tidak menjalar ke seluruh sistem. Jika bot Anda berhasil diretas lewat celah di library, penyerang tetap terkurung dalam folder data dan tidak bisa menulis ke sistem.

sudo systemctl daemon-reload
sudo systemctl enable --now tgbot

# Cek status dan log terbaru
sudo systemctl status tgbot
sudo journalctl -u tgbot -f

Coba uji: kirim /start ke bot, lalu jalankan sudo reboot. Jika bot menjawab lagi beberapa menit kemudian tanpa Anda sentuh, berarti pengaturannya sudah benar.

Langkah 5: Pantau, Perbarui, dan Cadangkan

Bot yang jalan 24 jam bukan berarti bot yang bisa dilupakan. Ada tiga kebiasaan ringan yang membuat perbedaan besar.

  • Pantau log. Periksa journalctl sesekali. Lonjakan error atau pesan dari ID asing sering menjadi tanda pertama ada yang mencoba mengutak-atik bot.
  • Perbarui terjadwal. Aktifkan unattended-upgrades untuk paket sistem, dan perbarui library Python secara berkala setelah mengujinya.
  • Cadangkan data. Jika bot menyimpan data pengguna, salin folder /opt/tgbot/data ke tempat lain dengan cron, misalnya tiap malam.

Satu fitur kecil yang berguna: minta bot mengirim pesan ke ID admin saat berhasil menyala. Jika Anda tiba-tiba menerima pesan itu padahal tidak merestart apa pun, berarti server sempat mati atau proses sempat crash. Itu sinyal gratis yang sering diabaikan.

Kesalahan Umum yang Sering Terjadi

Dari pola yang sering muncul pada bot pemula, berikut yang paling layak Anda hindari.

KesalahanKenapa BerbahayaPerbaikan
Token ditulis langsung di bot.pyMudah ikut ter-commit atau terbagi saat minta bantuanGunakan EnvironmentFile
Bot dijalankan sebagai rootCelah kecil menjadi akses penuh ke serverGunakan user khusus dan hardening systemd
Semua perintah terbuka untuk umumOrang asing bisa memicu fitur internalAllowlist ID per perintah
Log mencetak isi pesan dan tokenData sensitif tersimpan di berkas logTurunkan level log library HTTP
Tidak ada error handlerSatu input aneh bisa menjatuhkan botPasang error handler dan Restart=on-failure

Lanjutkan dengan Eksperimen yang Aman

Setelah fondasinya kokoh, Anda bebas berkreasi: bot pengingat jadwal kuliah, notifikasi saat server kehabisan disk, atau pemicu otomasi yang terhubung ke n8n dan cron. Server yang sama bahkan bisa melayani proyek lain; kalau Anda penasaran, ada pembahasan tentang vps gratis untuk website yang bisa berjalan berdampingan dengan bot Anda, selama sumber dayanya dipantau.

Tantangan kecil untuk Anda hari ini: kirim perintah /status dari akun lain yang tidak ada di allowlist. Jika bot diam dan tidak menjawab, berarti pertahanan pertama Anda bekerja. Dari situ, tambahkan satu lapis lagi setiap minggu, dan dalam sebulan Anda punya bot yang bukan hanya hidup 24 jam, tetapi juga layak dipercaya.

Coba VPS gratis
Terapkan yang Anda baca langsung di VPSGratis.ID.
Kunjungi VPSGratis.ID ↗