Bot Discorda 24/7 na VPS: systemd lub Docker, token i logi
Bot Discorda w Pythonie (discord.py) albo Node.js (discord.js) działający całą dobę: token w pliku środowiskowym, systemd lub Docker, logi i restart po awarii.
Redakcja serwisu Dealownia · ceny i fakty ze stron dostawców, jak sprawdzamy
Bot Discorda, który działa całą dobę: startuje sam po restarcie serwera, wstaje po awarii, zapisuje logi w jednym miejscu, a jego token nie ląduje ani w repozytorium, ani w historii poleceń. Pokazujemy dwie drogi – bota w Pythonie (discord.py) jako usługę systemd i bota w Node.js (discord.js) w Dockerze. Wybierz tę, która pasuje do języka, w którym piszesz; obie działają na Ubuntu 24.04 LTS oraz Debianie 12 i 13.
Czego potrzebujesz
- Aplikację z botem w Discord Developer Portal i jego token (zakładka Bot). Jeśli bot czyta treść zwykłych wiadomości, włącz tam też uprawnienie „Message Content Intent” – bez tego pole z treścią będzie puste.
- VPS przygotowany jak w poradniku od zera: użytkownik z sudo, logowanie kluczem, ufw. Bot nie potrzebuje otwartych portów – sam łączy się z Discordem połączeniem wychodzącym.
- Rozmiar serwera: ani dokumentacja discord.py, ani discord.js nie podaje wymagań sprzętowych. Prosty bot na kilku serwerach Discorda to jeden proces, więc najmniejszy plan z 1 vCPU i 1 GB RAM jest rozsądnym punktem wyjścia. Więcej potrzebujesz, gdy bot gra muzykę, przetwarza obrazy albo trzyma w pamięci dane tysięcy serwerów – wtedy patrz na zużycie (
systemctl status,docker stats) zamiast zgadywać. - Kod bota w repozytorium Git (prywatnym albo publicznym – token i tak w nim nie wyląduje).
Więcej tanich planów jest w rankingu VPS do 20 zł. Jeśli myślisz o darmowej maszynie, najpierw przeczytaj o haczykach darmowych VPS.
Krok 1. Token poza repozytorium
Token bota daje pełną kontrolę nad botem. Kto go ma, może w jego imieniu pisać, banować i usuwać kanały wszędzie tam, gdzie bot ma uprawnienia. Przewodnik discord.js mówi wprost, żeby nie commitować plików z sekretami, i podaje taki .gitignore:
W projekcie w Pythonie dopisz jeszcze katalog środowiska wirtualnego (.venv). Na serwerze token trzymasz w pliku .env, czytelnym tylko dla właściciela. Wpisz go edytorem, nie przez echo – wtedy nie zostanie w historii powłoki:
Plik .env leży obok katalogu z kodem, a nie w nim, więc git pull ani git add . go nie dotkną.
Wariant A. Python i systemd
Dokumentacja discord.py wymaga Pythona 3.8 lub nowszego. Ubuntu 24.04 i oba Debiany mają nowszego; na Ubuntu i Debianie moduł venv jest w osobnym pakiecie:
Bot czyta token ze zmiennej środowiskowej, nie z kodu. Minimalny przykład na wzór szybkiego startu discord.py – plik app/bot.py (nie nazywaj go discord.py, bo przesłoni bibliotekę):
Usługa działa jako osobny użytkownik bez powłoki, któremu katalog z kodem wystarczy tylko do odczytu:
Plik /etc/systemd/system/discord-bot.service:
Restart=always z RestartSec=10 podnosi bota po każdym wyjściu, a dziesięć sekund przerwy chroni przed limitem systemd, który po kilku szybkich restartach z rzędu przestaje próbować. ProtectSystem=strict montuje cały system plików tylko do odczytu – jeśli bot zapisuje dane (np. bazę SQLite), dodaj StateDirectory=discord-bot i zapisuj w /var/lib/discord-bot. client.run() w discord.py sam konfiguruje logowanie na standardowe wyjście błędów, więc wszystko trafia do journalctl.
Wariant B. Node.js w Dockerze
Ten wariant wymaga Dockera z wtyczką Compose (instalacja w poradniku od zera). Wersję Node wybierasz w obrazie, więc nie musisz instalować jej na hoście. Aktualne wydanie discord.js 14 wymaga według swojego package.json Node.js 18 lub nowszego; w przykładzie jest obraz z Node 24, czyli linią LTS.
Minimalny app/index.js w stylu przewodnika discord.js:
app/Dockerfile (zakłada, że w repozytorium jest package-lock.json):
Dodaj do .dockerignore co najmniej node_modules i .env, żeby lokalne pliki nie trafiły do obrazu. Plik /opt/apps/discord-bot/compose.yaml:
env_file przekazuje token do kontenera jako zmienną, a obraz go nie zawiera – możesz go bezpiecznie zbudować ponownie albo wysłać do rejestru. Nie ma tu sekcji ports, bo bot niczego nie nasłuchuje. Lokalnie, bez Dockera, ten sam plik wczytasz flagą zalecaną w przewodniku: node --env-file=.env index.js.
Krok 2. Aktualizacja kodu
Wariant A:
Wariant B:
Jeśli bot ma komendy ukośnikowe (slash commands), po zmianie ich definicji trzeba je ponownie zarejestrować w Discordzie – zwykle osobnym skryptem albo przy starcie, zależnie od tego, jak napisałeś bota.
Najczęstsze problemy
Improper token has been passedalboTokenInvalid. Token jest nieaktualny (każdy reset w Developer Portal unieważnia stary) albo do.envtrafiło coś poza nim, np. przypadkiem wklejony inny identyfikator z portalu (Application ID, Client Secret). Zapisz linię dokładnie jakoDISCORD_TOKEN=wartośći sprawdź, czy zmienna dociera do procesu:sudo systemctl show discord-bot -p EnvironmentFilesalbodocker compose exec bot printenv DISCORD_TOKEN | wc -c.- Bot jest online, ale nie widzi treści wiadomości. Brakuje Message Content Intent – w kodzie (
intents.message_content = TruealboGatewayIntentBits.MessageContent) i w Developer Portal. Musi być włączony w obu miejscach. - Usługa ciągle się restartuje. Zobacz przyczynę w
journalctl -u discord-bot -n 50albodocker compose logs bot. Błąd w kodzie przy starcie zRestart=alwaysoznacza pętlę logowań, a Discord ogranicza liczbę nowych sesji bota na dobę – nie zostawiaj takiej pętli na noc. - Token trafił do repozytorium. Usunięcie pliku w następnym commicie nie wystarczy, token zostaje w historii. Od razu zresetuj go w Developer Portal (zakładka Bot), wpisz nowy do
.envi zrestartuj bota. ModuleNotFoundError: No module named 'discord'w systemd.ExecStartwskazuje systemowego Pythona zamiast tego z.venv. Podaj pełną ścieżkę do.venv/bin/python.
Co dalej
Bot to proces, którego nikt nie pilnuje, więc dołóż powiadomienie o awarii – np. Uptime Kuma z monitorem typu push, którego adres bot wywołuje co minutę; gdy wywołania ustaną, dostaniesz alert. Jeśli bot zapisuje dane, objęte kopiami powinny być /var/lib/discord-bot albo wolumeny Dockera; wysyłkę kopii poza serwer opisuje poradnik o restic i rclone. Zanim zostawisz VPS bez nadzoru, przejdź listę kontrolną zabezpieczeń.