Servery a DevOps

Hosting Discord bota 24/7 na VPS – systemd, pm2, nebo Docker

Jak provozovat Discord bota nepřetržitě na Linux VPS. Bezpečné uložení tokenu, systemd služba pro Python i Node.js, pm2, Docker a nasazení nové verze.

12. 10. 2026 · 4 min čtení

Bot spuštěný na vlastním počítači funguje, dokud počítač neusne nebo nezavřete terminál. Pro nepřetržitý provoz potřebujete server a správce procesů, který bota spustí po startu systému a po pádu ho restartuje. Tento článek řeší provoz, ne psaní bota – předpokládáme, že bot lokálně funguje.

Jaký server stačí

Discord bot je síťově nenáročná aplikace: drží jedno websocketové spojení s Discord Gateway a reaguje na události. Malý bot pro pár serverů vystačí s nejmenším VPS (1 vCPU, 1 GB RAM). Víc prostředků potřebují boti, kteří:

  • přehrávají hudbu (dekódování zvuku přes FFmpeg),
  • jsou na tisících serverů (sharding),
  • dělají náročné výpočty nebo drží velké cache.

Bot nepotřebuje žádný otevřený port – spojení navazuje sám ven. Výjimkou jsou boti s HTTP interakcemi (Interactions Endpoint URL) nebo webovým dashboardem.

Token nikdy v kódu

Token bota je jako heslo. Kdo ho má, ovládá bota. Uložte ho do souboru s proměnnými prostředí mimo repozitář:

sudo mkdir -p /etc/mujbot
sudo tee /etc/mujbot/env > /dev/null <<'EOF'
DISCORD_TOKEN=vas_token
EOF
sudo chmod 600 /etc/mujbot/env

V kódu ho čtěte z prostředí:

import os
TOKEN = os.environ["DISCORD_TOKEN"]
const token = process.env.DISCORD_TOKEN;

Pokud token unikne (např. do veřejného gitu), okamžitě ho v Discord Developer Portalu resetujte (Bot → Reset Token).

Varianta 1: systemd (doporučeno)

Systemd je součástí každé moderní distribuce, nic dalšího neinstalujete.

Připravte uživatele a aplikaci (příklad pro Python):

sudo adduser --system --group --home /opt/mujbot mujbot
sudo -u mujbot git clone https://github.com/uzivatel/mujbot.git /opt/mujbot/app
cd /opt/mujbot/app
sudo -u mujbot python3 -m venv .venv
sudo -u mujbot .venv/bin/pip install -r requirements.txt

Soubor /etc/systemd/system/mujbot.service:

[Unit]
Description=Muj Discord bot
After=network-online.target
Wants=network-online.target

[Service]
User=mujbot
Group=mujbot
WorkingDirectory=/opt/mujbot/app
EnvironmentFile=/etc/mujbot/env
ExecStart=/opt/mujbot/app/.venv/bin/python bot.py
Restart=always
RestartSec=5
NoNewPrivileges=true
ProtectSystem=full
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Pro Node.js změňte ExecStart, např. ExecStart=/usr/bin/node index.js (cestu ověřte příkazem which node).

sudo systemctl daemon-reload
sudo systemctl enable --now mujbot
systemctl status mujbot
journalctl -u mujbot -f

Python ve výchozím stavu bufferuje výstup a logy v journalu se pak objevují se zpožděním. Pomůže řádek Environment=PYTHONUNBUFFERED=1 v sekci [Service].

Varianta 2: pm2 (Node.js)

pm2 je oblíbený správce procesů z ekosystému Node.js:

sudo npm install -g pm2
cd /opt/mujbot/app
DISCORD_TOKEN=vas_token pm2 start index.js --name mujbot
pm2 save
pm2 startup

pm2 startup vypíše příkaz, který je potřeba spustit se sudo – zaregistruje pm2 do systemd. Užitečné příkazy: pm2 logs mujbot, pm2 restart mujbot, pm2 status.

Token je lepší předávat přes konfigurační soubor ecosystem.config.js mimo git nebo přes .env načtený knihovnou dotenv, než ho psát do příkazové řádky (zůstane v historii shellu).

Varianta 3: Docker

Pro bota v Pythonu stačí jednoduchý Dockerfile:

FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "-u", "bot.py"]

A compose.yaml:

services:
  bot:
    build: .
    restart: unless-stopped
    env_file: /etc/mujbot/env
docker compose up -d --build
docker compose logs -f

restart: unless-stopped zajistí restart po pádu i po rebootu serveru.

Které řešení zvolit

systemd pm2 Docker
Instalace navíc nic Node.js + pm2 Docker
Jazyk jakýkoli hlavně Node.js jakýkoli
Izolace závislostí venv/node_modules node_modules kompletní image
Vhodné když jeden nebo pár botů už používáte pm2 máte víc služeb v Dockeru

Bota lze provozovat i v Pterodactylu – existují eggy pro Python a Node.js boty, které umí stáhnout kód z gitu.

Nasazení nové verze

S systemd stačí jednoduchý postup:

cd /opt/mujbot/app
sudo -u mujbot git pull
sudo -u mujbot .venv/bin/pip install -r requirements.txt
sudo systemctl restart mujbot

Pokud bot registruje slash příkazy, nedělejte to při každém startu – Discord má na registraci příkazů rate limity. Registraci spouštějte samostatným skriptem jen při změně příkazů.

Hlídání, že bot žije

  • Restart=always řeší pády procesu, ale ne „zamrznutí“, kdy proces běží a bot je offline. Knihovny (discord.py, discord.js) se po výpadku spojení obvykle znovu připojí samy.
  • Pro upozornění použijte externí monitoring – např. Uptime Kuma s typem „Push“: bot každou minutu zavolá URL a když volání přestanou chodit, přijde upozornění.

Pokud máte VPS připojený v ColdHost AI, nastavení služby můžete projít v režimu Server a DevOps – AI navrhne příkazy, vy je jednotlivě schválíte a výstup (třeba z journalctl) uvidí rovnou.