Bot Node.js hostowany u nas działa całą dobę i po awarii uruchamia się ponownie sam. Pokażemy, jak przygotować projekt na komputerze, co przesłać, a czego nie, jak skonfigurować uruchamianie i jak sprawdzić wersję Node.js.
Czego potrzebujesz
- Bot Discord w StormHost
- Kod bota w JavaScript (Node.js), najlepiej przetestowany na komputerze
- Token bota z Discord Developer Portal (poradnik)
- Około 15 minut
Jak bot działa na naszych serwerach#
- Środowiskiem jest Node.js. Bot to zwykła aplikacja Node.js, zazwyczaj zbudowana z biblioteką discord.js.
- Plikami bota zarządzasz w zakładce Pliki (menedżer plików w przeglądarce).
- Uruchamianie ustawiasz w zakładce Ustawienia: Polecenie startowe (pełne polecenie, tylko do odczytu) i Zmienne (na przykład nazwa pliku głównego).
- Wyjście bota (wszystko z
console.logi błędy) wyświetla zakładka Konsola, w której są też przyciski Start, Restart i Stop. - Automatyczny restart: gdy bot się zawiesi, uruchamia się ponownie. Działa 24 godziny na dobę, nawet gdy Twój komputer jest wyłączony.
- Pamięć jest ograniczona pakietem. Zużycie widzisz pod konsolą.
Przygotowanie projektu na komputerze#
Zalecana struktura projektu:
muj-bot/
├── package.json
├── package-lock.json
├── index.js
├── deploy-commands.js
├── .env
├── .gitignore
├── commands/
│ └── utility/
│ └── ping.js
└── node_modules/package.json#
package.json opisuje projekt: jego nazwę, plik, od którego się uruchamia, i pakiety, których potrzebuje. Utwórz go w folderze projektu poleceniem npm init -y, a pakiety dodaj poleceniem npm install discord.js dotenv. Potem popraw wynik tak, aby wyglądał mniej więcej tak:
{
"name": "muj-bot",
"version": "1.0.0",
"private": true,
"main": "index.js",
"type": "commonjs",
"scripts": {
"start": "node index.js"
},
"engines": {
"node": ">=18"
},
"dependencies": {
"discord.js": "^14.27.0",
"dotenv": "^18.0.5"
}
}| Pole | Co robi | Co ustawić |
|---|---|---|
name | Nazwa projektu. Małymi literami, bez spacji. | Dowolna, na przykład muj-bot. |
version | Wersja Twojego bota. | 1.0.0; możesz ją podnosić przy kolejnych zmianach. |
private | true zapobiega przypadkowemu opublikowaniu projektu w rejestrze npm. | true |
main | Plik główny, od którego bot startuje. | Ten sam plik, który uruchamiasz, zwykle index.js. |
type | commonjs = kod używa require(), module = kod używa import. | Zależy od Twojego kodu. Poradniki discord.js używają commonjs. |
scripts.start | Polecenie dla npm start na komputerze. | node index.js |
engines.node | Mówi, jakiej wersji Node.js bot potrzebuje. Nie zmienia wersji, tylko ostrzega. | >=18 dla discord.js 14. |
dependencies | Pakiety, których bot potrzebuje, z wersjami. ^14.27.0 oznacza „14.27.0 lub dowolna nowsza 14.x”. | Wypełnia je npm install <PAKIET>; nie wpisuj ich ręcznie. |
Plik package-lock.json powstaje automatycznie i blokuje dokładne wersje wszystkich pakietów. Prześlij go na serwer razem z package.json, aby serwer zainstalował te same wersje co Twój komputer.
JSON nie wybacza błędów
W package.json klucze i ciągi znaków muszą być w podwójnych cudzysłowach, po ostatnim elemencie bloku nie może być przecinka, a komentarze są niedozwolone. Jeden błąd i instalacja pakietów kończy się błędem EJSONPARSE.
Co przesłać, a czego nie#
| Plik lub folder | Przesłać? | Dlaczego |
|---|---|---|
index.js, commands/, events/ i pozostały kod | Tak | Sam bot. |
package.json, package-lock.json | Tak | Na ich podstawie instalowane są pakiety. |
.env z tokenem | Tak, tylko na serwer | Bot czyta z niego token. Nigdy nie wysyłaj go na GitHub ani nikomu nie udostępniaj (poradnik). |
node_modules/ | Nie | Tysiące plików. Pakiety powinny być instalowane na serwerze. Poza tym pakiety z kodem natywnym zbudowane w Windows nie działałyby na serwerze. |
.git/, logs/, dane testowe | Nie | Serwer ich nie potrzebuje. |
Przesyłanie w strefie klienta#
- W strefie klienta otwórz Moje usługi, kliknij swojego bota i przejdź do zakładki Pliki.
- Zostań w folderze głównym
/. Tutaj trafiapackage.json, a najlepiej także plik główny bota. - Kliknij Prześlij i wybierz pliki z katalogu głównego projektu (
index.js,package.json,package-lock.json,.env…). Pliki możesz też przeciągnąć do okna. - Dla każdego podfolderu (na przykład
commands) kliknij Nowy folder, otwórz go i prześlij do niego pliki. Całych folderów nie da się przesłać naraz.
Duży projekt z wieloma folderami łatwiej przesłać przez SFTP; dostęp skonfiguruje dla Ciebie pomoc techniczna (kontakt). Limity menedżera plików znajdziesz w poradniku o zarządzaniu plikami.
Konfiguracja uruchamiania#
- Przejdź do zakładki Ustawienia.
- Rozwiń Polecenie startowe i sprawdź, jakie polecenie uruchamia bota. Polecenie jest tylko do odczytu. Jeśli zakrywa je kreskowany pasek, włączony jest tryb streamera. Kliknij Pokaż szczegóły u góry.
- W sekcji Zmienne znajdź zmienną pliku głównego (po opisie, zazwyczaj z wartością domyślną
index.js) i wpisz nazwę swojego pliku głównego, na przykładindex.jslubbot.js. - Kliknij Zapisz.
Zmiany zmiennych zaczynają obowiązywać przy następnym uruchomieniu bota.
Instalacja pakietów#
Pakiety z package.json muszą zostać zainstalowane na serwerze.
- Sprawdź, czy Polecenie startowe zawiera
npm install. - Jeśli tak, pakiety są instalowane automatycznie przy każdym uruchomieniu bota. Konsola pokazuje wtedy wynik instalacji, na przykład
added 25 packages. Dlatego pierwsze uruchomienie trwa dłużej. - Jeśli
npm installnie ma w poleceniu albo pakiety mimo to się nie instalują (bot zgłaszaCannot find module 'discord.js'), skontaktuj się z nami. Nie przesyłaj folderunode_modulesz komputera.
Aby dodać nowy pakiet, zainstaluj go na komputerze (npm install <PAKIET>), prześlij na serwer nowe package.json i package-lock.json i zrestartuj bota.
Wersja Node.js#
Wersję Node.js, na której działa bot, poznasz z jego wyjścia. Dodaj na samej górze pliku głównego:
console.log('Node.js', process.version);Po uruchomieniu Konsola pokaże na przykład Node.js v22.….
process.version– wersja Node.js, na której aktualnie działa kod, w formiev<MAJOR>.<MINOR>.<PATCH>.
Co z tym zrobić:
| Biblioteka lub funkcja | Wymagana wersja Node.js |
|---|---|
| discord.js 14 | 18 lub nowsza |
process.loadEnvFile() (wczytywanie .env bez pakietu) | 20.12 lub nowsza |
require() pakietów istniejących tylko jako moduły ES | 20.19 lub 22.12 i nowsze |
Na komputerze używaj tej samej wersji głównej co na serwerze, aby kod zachowywał się tak samo. Zalecane są wersje LTS (według stanu na 1 października 2026 Node.js 24 jest aktywnym LTS, a Node.js 22 LTS w fazie utrzymania). Pole engines w package.json nie zmienia wersji na serwerze. Jeśli Twój bot potrzebuje innej wersji Node.js, skontaktuj się z nami.
Pierwsze uruchomienie i kontrola#
Przejdź do zakładki Konsola i kliknij Start.
Obserwuj wyjście:
Wyniktext Node.js v22.… Ready! Logged in as MujBot#1234Linię
Ready! …wypisuje bot z poradnika pierwszy bot discord.js. Twój bot może wypisać coś innego.Na Discordzie bot ma zieloną kropkę (online).
Aktualizacja kodu#
- Popraw i przetestuj kod na komputerze.
- W zakładce Pliki prześlij zmienione pliki. Przy przesyłaniu pliku o tej samej nazwie pojawi się pytanie, czy go nadpisać; potwierdź.
- W zakładce Konsola kliknij Restart. Node.js wczytuje kod tylko przy starcie.
Przed większą zmianą pobierz ważne pliki na komputer (przycisk Pobierz), aby mieć do czego wrócić.
Bot z bazą danych#
Dane, które mają przetrwać restart (punkty, ostrzeżenia, ustawienia serwera), przechowuj w bazie danych, a nie w zmiennych w pamięci.
W zakładce Baza danych utwórz bazę: Nazwa bazy danych, na przykład
bot, Dozwolone połączenia z%, a następnie przycisk Utwórz bazę danych. LiniaWykorzystano X z Ypokazuje, ile baz możesz mieć.Zapisz dane dostępowe w pliku
.envna serwerze:.envini DB_HOST=<IP_BAZY_DANYCH> DB_PORT=3306 DB_USER=<UZYTKOWNIK> DB_PASSWORD=<HASLO> DB_NAME=<NAZWA_BAZY><IP_BAZY_DANYCH>i port znajdziesz w polu Host (części przed i po dwukropku); resztę skopiuj z pól Użytkownik, Hasło i Nazwa bazy danych.Na komputerze zainstaluj bibliotekę
mysql2(npm install mysql2) i utwórz połączenie w kodzie:db.jsJavaScript const mysql = require('mysql2/promise'); const pool = mysql.createPool({ host: process.env.DB_HOST, port: Number(process.env.DB_PORT), user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, connectionLimit: 5, }); module.exports = pool;mysql.createPool({ … })– tworzy zestaw połączeń, które są używane wielokrotnie. Jest odporniejszy niż pojedyncze połączenie, które może zostać zerwane po dłuższej bezczynności.Number(– wartości zprocess. env. DB_ PORT) .envsą tekstem; port musi być liczbą.connectionLimit: 5– maksymalnie 5 połączeń naraz. Dla bota to aż nadto.
Użycie:
const db = require('./db');, a potemconst [rows] = await db.query('SELECT * FROM points WHERE user_id = ?', [id]);. Znak zapytania to symbol zastępczy: biblioteka wstawia wartość do zapytania w bezpieczny sposób, co chroni przed SQL injection.
Regularnie eksportuj bazę danych, na przykład programem HeidiSQL (instrukcja).
Czyste wyłączanie bota#
Gdy klikniesz Stop lub Restart, proces otrzymuje sygnał do zakończenia. Bot może się poprawnie wylogować i dokończyć zapisy:
async function ukoncit(signal) {
console.log(`Otrzymano ${signal}, wyłączam bota…`);
await client.destroy();
process.exit(0);
}
process.on('SIGINT', ukoncit);
process.on('SIGTERM', ukoncit);process.on('SIGINT' | 'SIGTERM', …)– przechwytuje żądanie zakończenia (na komputerze wysyła je Ctrl+C, na serwerze zatrzymanie bota).client.destroy()– rozłącza bota z Discordem.process.exit(0)– kończy proces z kodem 0 (bez błędu).
Jeśli używasz bazy danych, zamknij ją także przed process.exit (await pool.end()).
Dla zaawansowanych: TypeScript i inne kroki budowania#
Serwer uruchamia JavaScript. Kod w TypeScript (lub z innym krokiem budowania) skompiluj na komputerze (na przykład npx tsc), prześlij na serwer wynikowe pliki .js (zazwyczaj folder dist) i w Zmiennych ustaw jako plik główny plik skompilowany. Pliki źródłowe .ts ani pakiety deweloperskie (devDependencies) nie są na serwerze potrzebne.
Weryfikacja#
- Konsola pokazuje wyjście startowe bez błędów, a bot nie zawiesza się w kółko.
- Bot jest online na Discordzie i odpowiada na polecenia.
- Po kliknięciu Restart bot wraca do stanu online w ciągu kilku sekund.
Rozwiązywanie problemów#
Error: Cannot find module 'discord.js'#
Pakiety nie są zainstalowane. Sprawdź, czy package.json leży w folderze głównym i ma discord.js w dependencies. Następnie postępuj zgodnie z sekcją „Instalacja pakietów”.
Error: Cannot find module '/…/index.js'#
Plik główny nie zgadza się z ustawieniami: plik ma inną nazwę, leży w podfolderze albo nie zgadza się wielkość liter (Index.js i index.js to na serwerze dwa różne pliki). Popraw zmienną pliku głównego albo przenieś plik do folderu głównego.
npm error code EJSONPARSE#
package.json nie jest poprawnym JSON-em (brakujący przecinek lub cudzysłów, zbędny przecinek, komentarz). Popraw go na komputerze, sprawdź poleceniem npm install i prześlij ponownie.
Bot uruchamia się i od razu pada, w kółko#
Automatyczny restart nie naprawi błędu w kodzie. Znajdź w Konsoli pierwszy błąd po starcie (linia z Error i lista plików pod nią), popraw go i uruchom bota ponownie. Najczęstsze komunikaty objaśniamy w poradniku logi i błędy.
An invalid token was provided. lub Used disallowed intents#
Problem dotyczy tokenu lub intentów w Developer Portal. Kroki znajdziesz w poradniku token i intenty.
SyntaxError: Cannot use import statement outside a module#
Kod używa import, ale projekt jest skonfigurowany pod require(). Ustaw "type": "module" w package.json albo przepisz kod na require(). Więcej w poradniku logi i błędy.
Podsumowanie
- Kod,
package.json,package-lock.jsoni.envprześlij do folderu głównego w zakładce Pliki. Nie przesyłajnode_modules. mainwpackage.jsoni zmienna pliku głównego w zakładce Ustawienia muszą wskazywać ten sam plik.- Pakiety są instalowane na serwerze. Czy dzieje się to automatycznie, poznasz po
npm installw Poleceniu startowym. - Wersję Node.js sprawdzisz przez
console.. discord.js 14 wymaga Node.js 18 lub nowszego.log( process. version) - Po każdej zmianie kodu zrestartuj bota.