NUOVO 📢 Offerta di lancio limitata: fino al 70% di sconto sul tuo primo mese, per tutti i giochi!Vedi i piani

Come ospitare un bot TelegramBots (Java) 24/7

Hosting di bot TelegramUpdated Nov 6, 202613 min read

Per ospitare un bot TelegramBots (Java) 24/7 lo fai girare su una macchina sempre accesa: un VPS Linux con un servizio systemd che lo riavvia quando si ferma, oppure un piano bot sull'hosting di bot Telegram PlayNHost (da 1,99 US$ al mese), dove carichi un jar eseguibile, incolli il token di @BotFather e premi Start. Nel nostro test un bot con TelegramBots 10.3.0, la libreria Java di rubenlagus, ha usato circa 91 MB di memoria con Java 21 e ha ricevuto la risposta di Telegram 1,5 secondi dopo l'avvio. Usa il suo modulo di long polling: i nostri piani non hanno ancora un indirizzo HTTPS pubblico per un webhook. I passaggi su PlayNHost:

  1. Nella pagina Hosting di bot Telegram, fai clic su Crea server su un piano. Nella finestra dell'ordine, rispondi a Per quale piattaforma è il tuo bot? con Telegram e scegli Java.
  2. Sul tuo computer, compila il bot con il pom.xml qui sotto: mvn package scrive target/bot.jar, con TelegramBots all'interno.
  3. Apri il tuo server nel pannello. La scheda Configura il tuo bot in Panoramica si apre su Connetti a Telegram; il suo primo passaggio, Cosa viene eseguito, dovrebbe dire Questo bot esegue Java Bot.
  4. In Connetti a Telegram, incolla il token sotto Incolla il token del bot, fai clic su Connessione, controlla il nome del bot mostrato e fai clic su Sì, continua.
  5. In Il tuo codice, fai clic su Carica i file e carica bot.jar nella cartella principale.
  6. Nella pagina Bot, riquadro Codice, controlla che File di avvio sia bot.jar e che Runtime sia Java 21 (recommended), oppure Java 17 o 25. Se cambi File di avvio, fai clic su Salva accanto; un nuovo Runtime viene salvato appena lo scegli.
  7. Fai clic su Avvia il bot e apri Console. Quando il tuo bot stampa Logged in as @your_bot, l'indicatore in Panoramica diventa Online su Telegram.
  8. Nella pagina Bot, riquadro Telegram, fai clic su Apri in Telegram e invia /start al tuo bot.

La creazione del bot in @BotFather e i passaggi del pannello sono spiegati in Come ospitare un bot Telegram. Questa pagina riguarda TelegramBots stesso: cosa usa su un server e cosa sapere prima di ospitarlo.

Cosa abbiamo misurato

LibreriaVersioneMemoria senza caricoDall'avvio alla risposta di TelegramDimensione del jar
TelegramBots (rubenlagus)10.3.091 MB1,5 s9,6 MB
Solo Java 21, nessuna libreria21.0.12.138 MBnessuna0,0 MB

Come: sul nostro nodo, in un container usa e getta configurato come un piano bot da 1 GB (l'immagine Java 21 e l'esatto comando java del nostro tipo di bot Java), il bot ha chiamato getMe di Telegram con un token falso, che Telegram ha rifiutato; la memoria è quella residente 15 secondi dopo quella risposta, il tempo di avvio va dall'avvio alla risposta e ogni valore è la mediana delle esecuzioni da 2 a 4.

Sono valori minimi: ancora nessuna chat, nessun dato e nessun polling. Il tuo codice, ciò che tiene in memoria e il numero di chat si sommano, e lo script di avvio lascia crescere l'heap di Java fino all'80 per cento del piano (vedi sotto). Confronta i numeri con i piani dell'hosting di bot Telegram e scegli in base a ciò che fa il tuo bot.

Un bot TelegramBots minimo

Risponde a /start, legge il token da TELEGRAM_BOT_TOKEN (il pannello lo passa al tuo codice con questo nome e anche come BOT_TOKEN, TOKEN, TELEGRAM_TOKEN e TELOXIDE_TOKEN) e stampa una riga di pronto. Due file:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>bot</artifactId>
  <version>1.0</version>
  <properties>
    <maven.compiler.release>17</maven.compiler.release>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.telegram</groupId>
      <artifactId>telegrambots-longpolling</artifactId>
      <version>10.3.0</version>
    </dependency>
    <dependency>
      <groupId>org.telegram</groupId>
      <artifactId>telegrambots-client</artifactId>
      <version>10.3.0</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>2.0.12</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>bot</finalName>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.7.1</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <appendAssemblyId>false</appendAssemblyId>
          <archive>
            <manifest>
              <mainClass>Bot</mainClass>
            </manifest>
          </archive>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

src/main/java/Bot.java

import org.telegram.telegrambots.client.okhttp.OkHttpTelegramClient;
import org.telegram.telegrambots.longpolling.TelegramBotsLongPollingApplication;
import org.telegram.telegrambots.longpolling.util.DefaultLongPollingUpdateConsumer;
import org.telegram.telegrambots.meta.api.methods.GetMe;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
import org.telegram.telegrambots.meta.api.objects.Update;
import org.telegram.telegrambots.meta.api.objects.User;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
import org.telegram.telegrambots.meta.exceptions.TelegramApiRequestException;
import org.telegram.telegrambots.meta.generics.TelegramClient;

public class Bot extends DefaultLongPollingUpdateConsumer {
    private final TelegramClient client;

    Bot(TelegramClient client) {
        this.client = client;
    }

    @Override
    public void consume(Update update) {
        if (update.hasMessage() && update.getMessage().hasText()
                && update.getMessage().getText().startsWith("/start")) {
            SendMessage reply = SendMessage.builder()
                    .chatId(update.getMessage().getChatId())
                    .text("Hello! I am running on PlayNHost.")
                    .build();
            try {
                client.execute(reply);
            } catch (TelegramApiException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws Exception {
        String token = System.getenv("TELEGRAM_BOT_TOKEN");
        if (token == null || token.isBlank()) {
            System.out.println("No TELEGRAM_BOT_TOKEN found. Paste your bot token on the Bot page, then restart.");
            System.exit(1);
        }

        TelegramClient client = new OkHttpTelegramClient(token);
        User me = null;
        try {
            me = client.execute(new GetMe());
        } catch (TelegramApiRequestException e) {
            if (e.getErrorCode() != null && e.getErrorCode() == 401) {
                System.out.println("Telegram did not accept the bot token. Paste the current one from @BotFather on the Bot page, then restart.");
                System.exit(1);
            }
            throw e;
        }

        try (TelegramBotsLongPollingApplication app = new TelegramBotsLongPollingApplication()) {
            // Long polling: registerBot removes a webhook left on the bot, then asks Telegram for messages.
            app.registerBot(token, new Bot(client));
            System.out.println("Logged in as @" + me.getUserName());
            Thread.currentThread().join();
        }
    }
}

Compilalo con Maven 3.9 e un JDK 17 o più recente, e prova il jar sul tuo computer:

mvn package
java -jar target/bot.jar

Senza token stampa No TELEGRAM_BOT_TOKEN found. e si ferma, il che dimostra che il jar parte e trova la sua classe principale. Carica target/bot.jar. Ferma ogni copia che esegui sul tuo computer con il token reale prima di avviare quella sul server, altrimenti le due copie ricevono errori 409 Conflict da Telegram.

La chiamata getMe controlla il token prima che inizi il polling e restituisce il nome utente del bot per la riga di pronto. Logged in as @your_bot è la riga che porta l'indicatore su Online su Telegram.

Se il token è sbagliato

Nel nostro test, con un token falso, la chiamata getMe di TelegramBots è fallita con questo errore:

TelegramApiRequestException: Error executing org.telegram.telegrambots.meta.api.methods.GetMe query: [401] Unauthorized

Il bot qui sopra intercetta quel rifiuto (codice di errore 401) e stampa invece Telegram did not accept the bot token. Paste the current one from @BotFather on the Bot page, then restart. Il pannello legge quella riga e mostra il banner Telegram non ha accettato il token del bot sopra Console. Per risolvere, in @BotFather invia /mybots, scegli il tuo bot, poi API Token, e copia di nuovo il token. Nella pagina Bot, riquadro Telegram, fai clic su Sostituisci il token, incollalo, fai clic su Salva il token, poi su Riavvia ora.

Cosa sapere su TelegramBots su un server

  • Versioni: TelegramBots 10.3.0 è uscito il 7 set 2026 e supporta la Bot API 10.3 di Telegram. Richiede Java 17 o più recente, quindi ogni Runtime offerto dal pannello (Java 17, 21 o 25) lo esegue.
  • Due pacchetti, a differenza dei vecchi tutorial. Dalla versione 7.0.0 (marzo 2024) la libreria è divisa in telegrambots-longpolling, che riceve i messaggi, e telegrambots-client, che li invia. I tutorial che estendono TelegramLongPollingBot sono stati scritti per il vecchio pacchetto telegrambots, rilasciato per l'ultima volta come 6.9.7.1; quella classe non c'è in 10.3.0, quindi il loro codice non compila.
  • Usa il long polling. La libreria ha anche un modulo webhook, ma un webhook richiede un indirizzo HTTPS pubblico, che i nostri piani non includono ancora. registerBot nel modulo di long polling chiama deleteWebhook prima di partire, quindi un webhook rimasto da un vecchio host viene rimosso e i messaggi in attesa restano. Se arrivi da un host con webhook: Come spostare un bot Telegram su PlayNHost.
  • Aggiungi una libreria di log, o la libreria resta muta. TelegramBots scrive i log tramite SLF4J. Senza un provider SLF4J nel tuo jar, SLF4J stampa un avviso una volta e poi scarta ogni riga di log della libreria, compresi gli errori del polling. Il pom.xml qui sopra aggiunge slf4j-simple, che scrive le righe della libreria a livello INFO e superiore sullo standard error, così compaiono in Console.
  • Gli errori di polling vengono ritentati, non lanciati. Quando una chiamata getUpdates fallisce, TelegramBots registra Error received from Telegram GetUpdates Request, retrying in ... millis e riprova, quindi il processo continua a girare. L'attesa parte da circa mezzo secondo e cresce della metà ogni volta fino a circa un minuto (con una variazione casuale, fino a 90 secondi); quando sono passati 15 minuti senza una chiamata riuscita, aspetta 15 minuti tra un tentativo e l'altro. Quindi, dopo aver risolto la causa, riavvia il bot invece di aspettare. Solo il codice di stato HTTP, nella riga Caused by dello stack trace sotto, dice cosa è andato storto; la descrizione dell'errore di Telegram non viene stampata. Poiché registerBot ha già rimosso ogni webhook, un 409 lì significa quasi sempre che un'altra copia del bot sta facendo polling con lo stesso token: fermala. Vedi Come risolvere l’errore 409 Conflict di un bot Telegram.
  • La lezione ufficiale, aggiornata: implementa LongPollingSingleThreadUpdateConsumer, che la 10.3.0 segna come obsoleta a favore della classe DefaultLongPollingUpdateConsumer usata sopra; entrambe gestiscono gli aggiornamenti uno alla volta su un thread in background. La sua riga di pronto, MyAmazingBot successfully started!, non porta l'indicatore su Online su Telegram: stampa una riga che inizia con Logged in as, come sopra.
  • Tieni main() in attesa. Il polling gira sui thread propri della libreria; la lezione termina main() con Thread.currentThread().join() perché il programma non finisca, e il bot qui sopra fa lo stesso.
  • Limite di memoria: lo script di avvio esegue Java con -XX:MaxRAMPercentage=80.0 e il garbage collector G1, quindi l'heap può usare fino all'80 per cento della memoria del piano. Se si riempie, Java stampa java.lang.OutOfMemoryError e il pannello mostra Il tuo bot ha esaurito la memoria.
  • Un jar, niente installato sul server. Il tipo di bot Java avvia java -jar sul tuo File di avvio e non ha un campo Pacchetti, quindi tutto deve stare nel jar. Carica un nuovo jar per aggiornare il bot.

Ospitalo tu su un VPS Linux

Un VPS ha bisogno solo di un runtime Java, perché il jar lo compili sul tuo computer. Su Debian 13 o Ubuntu 24.04 installa Java 21; Debian 12 include Java 17, che esegue anch'esso il jar qui sopra:

sudo apt update
sudo apt install openjdk-21-jre-headless
java -version

Crea un utente per il bot e copia il jar sul server (per esempio con scp), poi nella sua cartella:

sudo useradd --system --create-home --home-dir /opt/mybot mybot
sudo cp bot.jar /opt/mybot/
sudo chown -R mybot: /opt/mybot

Tieni il token fuori dal codice, in un file che solo root può leggere:

sudo sh -c 'echo "TELEGRAM_BOT_TOKEN=123456789:your-token" > /etc/mybot.env'
sudo chmod 600 /etc/mybot.env

Crea /etc/systemd/system/mybot.service:

[Unit]
Description=TelegramBots Telegram bot
Wants=network-online.target
After=network-online.target

[Service]
User=mybot
WorkingDirectory=/opt/mybot
EnvironmentFile=/etc/mybot.env
ExecStart=/usr/bin/java -XX:MaxRAMPercentage=80.0 -jar /opt/mybot/bot.jar
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Avvialo ora e a ogni avvio della macchina, poi segui il suo output:

sudo systemctl daemon-reload
sudo systemctl enable --now mybot
sudo journalctl -u mybot -f

Restart=always riavvia il bot 5 secondi dopo che termina o va in crash, ma non dopo che lo fermi con systemctl stop. Su un VPS, -XX:MaxRAMPercentage è una quota della memoria dell'intera macchina, quindi abbassalo se ci girano altri programmi. Per aggiornare, copia il nuovo jar sopra il vecchio ed esegui sudo systemctl restart mybot.

Self-hosting o piano bot

Su un VPS che gestisci tu, ti occupi di:

  • Aggiornamenti e sicurezza del sistema operativo, e aggiornamenti di Java.
  • Copiare ogni nuovo jar, il file di servizio, il file del token e i suoi permessi.
  • Leggere journalctl per capire perché il bot si è fermato o non risponde più.
  • I backup di tutto ciò che il tuo bot salva.

In cambio un VPS esegue qualsiasi cosa e puoi dargli un dominio con HTTPS per un webhook.

Su un piano bot PlayNHost se ne occupa il pannello:

  • Java 17, 21 o 25 da un selettore, con il limite dell'heap e il garbage collector già impostati.
  • Il token, verificato con Telegram prima di essere salvato, conservato cifrato e passato al tuo codice con cinque nomi.
  • Il riavvio del bot dopo un crash. Se va in crash di nuovo entro un minuto, resta fermo e Console ne spiega il motivo.
  • Un pulsante Rimuovi il webhook nel riquadro Telegram e banner sopra Console che indicano la causa, come un token rifiutato o la mancanza di memoria.
  • Caricamento dal browser e backup dal pannello.

Domande frequenti

Il mio bot TelegramBots gira ma non risponde a nulla e non stampa nulla. Perché?

Quasi sempre il jar non ha un provider SLF4J, quindi le righe di errore della libreria vengono scartate mentre continua a ritentare. Aggiungi slf4j-simple come nel pom.xml qui sopra, compila di nuovo e guarda Console. Un 409 ripetuto significa che un'altra copia del bot sta facendo polling con lo stesso token; un 401 ripetuto significa che il token è stato revocato in @BotFather. Dopo la correzione, riavvia il bot: l'attesa di TelegramBots tra i tentativi può arrivare a 15 minuti.

Posso usare il modulo webhook di TelegramBots?

Non ancora sui nostri piani: un webhook richiede un indirizzo HTTPS pubblico, che non includono. Il long polling non ne richiede, perché è il bot a chiedere a Telegram i nuovi messaggi. Usa telegrambots-longpolling come in questa pagina.

TelegramBots richiede un piano più grande di un bot Python o Node.js?

Non per la libreria in sé. Nello stesso test, eseguito allo stesso modo, TelegramBots ha usato 91 MB, python-telegram-bot 22.8 ha usato 44 MB, grammY 1.46.0 ha usato 60 MB e aiogram 3.31.0 ha usato 173 MB, tutti ben sotto gli 0,5 GB del piano più piccolo. Ciò che il tuo bot tiene in memoria decide il resto. Su Java la memoria dipende anche dall'heap: lo script di avvio lo lascia crescere fino all'80 per cento del piano, e il garbage collector decide quanto ne usa.

Quale versione di Java scelgo?

Java 21, quella consigliata, a meno che il tuo codice non richieda la 25. TelegramBots 10.3.0 richiede Java 17 o più recente. Compila con un release non più recente del Runtime che scegli: un jar compilato per un Java più nuovo si ferma con UnsupportedClassVersionError.

Pronto a far girare il tuo bot TelegramBots giorno e notte? Guarda i piani sull'hosting di bot Telegram.

Il tuo bot è già ospitato altrove? Spostalo da noi

ULTIMI ARTICOLI