Ospitare un bot Discord attivo giorno e notte - Guida completa

Guida passo passo per mettere in produzione il tuo bot Discord su un VPS, attivo giorno e notte. Con PM2 (Node.js) e systemd (Python).

Presentazione

Hai scritto un bot Discord con discord.js o discord.py? Perché resti attivo giorno e notte ti serve un VPS. Ecco come procedere.

Passaggio 1: scegliere e ordinare un VPS

Un VPS di base (1 vCPU, 1-2 GB di RAM, SSD) basta per la maggior parte dei bot Discord. Da By-Hoster metti in conto circa 4,99 € al mese.

  1. Vai sull'area clienti By-Hoster
  2. Scegli « VPS Linux » → distribuzione Ubuntu 22.04 LTS
  3. Conferma e paga: il VPS viene consegnato in 60 secondi per e-mail, con gli accessi SSH

Passaggio 2: collegarsi in SSH e preparare la macchina

  1. Collegati in SSH: ssh root@votre-ip
  2. Aggiorna il sistema: apt update && apt upgrade -y
  3. Crea un utente diverso da root: adduser botuser && usermod -aG sudo botuser
  4. Installa Node.js 20 LTS: curl -fsSL https://deb.nodesource.com/setup_20.x | bash && apt install -y nodejs (per Node) oppure Python 3: apt install -y python3 python3-pip python3-venv (per Python)

Passaggio 3: mettere in linea il tuo bot

  1. Carica il codice con Git: git clone https://github.com/vous/votre-bot.git
  2. Installa le dipendenze: npm install (Node) oppure pip install -r requirements.txt (Python)
  3. Crea un file .env con il tuo token Discord; non metterlo mai in Git
  4. Prova avviando a mano: node bot.js oppure python bot.py

Passaggio 4: tenere il bot attivo giorno e notte

Per Node.js: usa PM2.

  1. Installa PM2: npm install -g pm2
  2. Avvia il bot: pm2 start bot.js --name discord-bot
  3. Imposta l'avvio automatico al riavvio: pm2 startup && pm2 save
  4. Guarda i registri: pm2 logs discord-bot

Passaggio 5: mettere in sicurezza il VPS del bot Discord

Un bot Discord esposto su Internet è un bersaglio privilegiato per gli attacchi a forza bruta su SSH, le scansioni delle porte e i tentativi di sfruttare falle. Tre misure bastano a eliminare il 99 % delle minacce: accesso SSH solo tramite chiave, firewall UFW restrittivo e fail2ban contro gli attacchi a dizionario.

  1. Disattivare l'accesso SSH con password: genera una chiave sul tuo computer (ssh-keygen -t ed25519), copiala sul VPS (ssh-copy-id botuser@votre-ip), poi modifica /etc/ssh/sshd_config mettendo PasswordAuthentication no e PermitRootLogin no. Ricarica con: systemctl restart sshd
  2. Attivare UFW (il firewall di Ubuntu): ufw default deny incoming && ufw default allow outgoing && ufw allow ssh && ufw enable. Il tuo bot Discord apre connessioni in uscita (verso gateway.discord.gg): nessuna porta in entrata è necessaria
  3. Installare fail2ban: apt install -y fail2ban && systemctl enable --now fail2ban. Blocca automaticamente ogni IP che sbaglia più di 5 accessi SSH in 10 minuti (blocco di 1 ora di serie)
  4. Aggiornamenti di sicurezza automatici: apt install -y unattended-upgrades && dpkg-reconfigure --priority=low unattended-upgrades. Le correzioni critiche (CVE) si installano da sole
  5. Tenere il token Discord in un .env fuori dal deposito: aggiungi .env al tuo .gitignore e caricalo con dotenv (Node) o python-dotenv (Python). Non mettere mai il token su GitHub: Discord revoca in pochi secondi i token finiti allo scoperto

Risoluzione dei problemi: il mio bot Discord va in crash, che faccio?

Un bot che cade in produzione raramente dipende da un VPS difettoso: nel 90 % dei casi è un errore dell'applicazione (token scaduto, eccezione non gestita, memoria esaurita, limite di frequenza imposto da Discord). Ecco la lista di controllo da seguire nell'ordine.

  • Verificare lo stato del processo: pm2 status (Node) oppure systemctl status mon-bot (Python). Cerca « online » o « active (running) ». Se leggi « errored » o « failed », passa al punto successivo
  • Leggere i registri recenti: pm2 logs discord-bot --lines 100 oppure journalctl -u mon-bot -n 100 --no-pager. Le voci Discord tipiche da riconoscere: DiscordAPIError[401] = token non valido o revocato, DiscordAPIError[429] = limite di frequenza, UnhandledPromiseRejection = eccezione asincrona non gestita
  • Token non valido (401 Unauthorized): rigenera un token su discord.com/developers/applications → Bot → Reset Token. Aggiorna il tuo .env e poi lancia pm2 restart discord-bot
  • Bot ucciso per memoria esaurita (OOM): verifica con dmesg | grep -i "killed process". Se è confermato, o il tuo codice perde memoria (una cache che cresce senza fine) o il VPS è troppo piccolo: passa a 4 GB di RAM
  • Bot risulta offline ma il processo gira: probabilmente Discord ha chiuso la WebSocket. Attiva autoReconnect: true in discord.js (è già così di serie) oppure scrivi un gestore on('disconnect') che richiami client.login()
  • Forzare un riavvio pulito: pm2 restart discord-bot --update-env ricarica il codice E le variabili d'ambiente. Per ripartire proprio da zero: pm2 delete discord-bot && pm2 start bot.js --name discord-bot
  • Sorveglianza continua: imposta pm2 install pm2-logrotate (evita di riempire il disco) e un webhook Discord tramite pm2-discord-webhook, che ti avvisa se il bot va in crash più di 3 volte in 5 minuti

Andare oltre: aggiungere una base di dati al tuo bot

Un bot Discord serio ha bisogno di memoria duratura: configurazione per ciascun server, statistiche degli utenti, economia virtuale, cache dei comandi slash, moderazione (avvisi, silenziamenti). Tre scelte, a seconda del bisogno: PostgreSQL per dati relazionali affidabili, MongoDB per strutture flessibili, Redis per la cache veloce e le classifiche.

  • PostgreSQL (consigliato per l'80 % dei bot): apt install -y postgresql postgresql-contrib. Crea una base: sudo -u postgres createdb monbot. Ottimo insieme a Prisma ORM (Node): npm i @prisma/client prisma, poi definisci i tuoi modelli in schema.prisma ed esegui npx prisma migrate dev. Tipi controllati, migrazioni versionate: perfetto per dati come server, utenti e avvisi
  • MongoDB (per strutture che cambiano): apt install -y mongodb-org e poi systemctl enable --now mongod. Usa Mongoose (Node): npm i mongoose. Comodo per conservare configurazioni JSON annidate (impostazioni del server con elenchi di ruoli, canali personalizzati e così via) senza dover definire in anticipo una struttura rigida
  • Redis (cache e classifiche in tempo reale): apt install -y redis-server. Usa ioredis (Node) o redis-py (Python). Ideale per: cache dei comandi slash (durata 1 ora), conteggio dei punti esperienza in un insieme ordinato (ZADD leaderboard 1500 user_id e poi ZREVRANGE leaderboard 0 9 WITHSCORES per i primi 10), limite di frequenza contro lo spam per ogni utente
  • Esempio minimo con Prisma (Node e PostgreSQL): model Guild { id String @id; prefix String @default("!"); xpEnabled Boolean @default(true); warnings Warning[] } e poi, nel bot: const guild = await prisma.guild.upsert({ where: { id: msg.guildId }, update: {}, create: { id: msg.guildId } }). Così il bot ricorda in modo duraturo le impostazioni di ciascun server
  • Buone abitudini: salva la base ogni giorno (pg_dump monbot > backup.sql con cron), non esporre mai PostgreSQL o MongoDB sull'IP pubblica (con UFW nega tutto tranne SSH), e usa un insieme di connessioni riutilizzabili per non saturare la base se il bot cresce

Domande frequenti

Per un bot semplice: almeno 1 GB di RAM. Per un bot con base di dati e diverse centinaia di server: 2-4 GB di RAM. Il VPS di base By-Hoster a 4,99 € al mese basta al 90 % dei bot.

Sì, a patto di aver impostato pm2 startup (Node) o un servizio systemd (Python). Il bot riparte da solo dopo il riavvio.

PM2 è un gestore di processi per Node.js con pannello integrato, registri a colori, sorveglianza di processore e memoria in tempo reale e lavoro in gruppo: ideale per discord.js. systemd è il gestore di servizi nativo di Linux: più di basso livello ma universale (Node, Python, Go, Rust). Per Python con discord.py o aiogram di norma si preferisce systemd, perché PM2 è pensato per Node.