NOWOŚĆ 📢 Ograniczona oferta na start: do 70% zniżki na pierwszy miesiąc, na każdą grę!Zobacz plany

Jak hostować bota TelegramBots (Java) 24/7

Hosting botów TelegramUpdated Nov 6, 202612 min read

Żeby hostować bota TelegramBots (Java) 24/7, uruchamiasz go na maszynie, która zawsze działa: na VPS z Linuksem z usługą systemd, która uruchamia go ponownie, gdy się zatrzyma, albo w planie dla botów w hostingu botów Telegram PlayNHost (od 1,99 USD miesięcznie), gdzie wgrywasz jeden uruchamialny jar, wklejasz token z @BotFather i naciskasz Start. W naszym teście bot na TelegramBots 10.3.0, bibliotece Java autorstwa rubenlagus, zużył ok. 91 MB pamięci na Javie 21 i dostał odpowiedź Telegrama 1,5 sekundy po uruchomieniu. Użyj jego modułu long polling: nasze plany nie mają jeszcze publicznego adresu HTTPS dla webhooka. Kroki w PlayNHost:

  1. Na stronie Hosting botów Telegram kliknij Utwórz serwer przy wybranym planie. W oknie zamówienia odpowiedz na Na jaką platformę jest Twój bot? wybierając Telegram i wybierz Java.
  2. Na swoim komputerze zbuduj bota z pom.xml poniżej: mvn package zapisuje target/bot.jar z TelegramBots w środku.
  3. Otwórz swój serwer w panelu. Karta Skonfiguruj swojego bota na stronie Przegląd otwiera się na Połącz z Telegramem; jej pierwszy krok, Co działa, powinien pokazywać Ten bot uruchamia Java Bot.
  4. W Połącz z Telegramem wklej token w polu Wklej token swojego bota, kliknij Połączenie, sprawdź wyświetloną nazwę bota i kliknij Tak, dalej.
  5. W Twój kod kliknij Prześlij pliki i wgraj bot.jar do głównego folderu.
  6. Na stronie Bot, w okienku Kod, sprawdź, czy Plik startowy to bot.jar, a Runtime to Java 21 (recommended), albo Java 17 lub 25. Jeśli zmienisz Plik startowy, kliknij obok Zapisz; nowy Runtime zapisuje się od razu po wybraniu.
  7. Kliknij Uruchom bota i otwórz Console. Gdy twój bot wypisze Logged in as @your_bot, znacznik w sekcji Przegląd zmieni się na Online w Telegramie.
  8. Na stronie Bot, w okienku Telegram, kliknij Otwórz w Telegramie i wyślij swojemu botowi /start.

Tworzenie bota w @BotFather i kroki w panelu opisuje Jak hostować bota Telegram. Ta strona dotyczy samego TelegramBots: czego używa na serwerze i co warto wiedzieć przed hostowaniem.

Co zmierzyliśmy

BibliotekaWersjaPamięć bez obciążeniaOd uruchomienia do odpowiedzi TelegramaRozmiar jara
TelegramBots (rubenlagus)10.3.091 MB1,5 s9,6 MB
Sama Java 21, bez biblioteki21.0.12.138 MBbrak0,0 MB

Jak: na naszym własnym węźle, w jednorazowym kontenerze ustawionym jak plan dla botów z 1 GB (obraz Java 21 i dokładne polecenie java naszego typu bota Java) bot wywołał getMe Telegrama z fałszywym tokenem, który Telegram odrzucił; pamięć to pamięć rezydentna 15 sekund po tej odpowiedzi, czas startu liczymy od uruchomienia do odpowiedzi, a każda wartość to mediana uruchomień od 2 do 4.

To wartości minimalne: jeszcze bez czatów, bez danych i bez pollingu. Dochodzą do nich twój kod, to, co trzyma w pamięci, i liczba czatów, a skrypt startowy pozwala stercie Javy urosnąć do 80 procent planu (patrz niżej). Porównaj liczby z planami w hostingu botów Telegram i wybierz według tego, co robi twój bot.

Minimalny bot TelegramBots

Odpowiada na /start, czyta token z TELEGRAM_BOT_TOKEN (panel przekazuje go twojemu kodowi pod tą nazwą, a także jako BOT_TOKEN, TOKEN, TELEGRAM_TOKEN i TELOXIDE_TOKEN) i wypisuje linię gotowości. Dwa pliki:

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();
        }
    }
}

Zbuduj go z Mavenem 3.9 i JDK 17 lub nowszym i przetestuj jar na swoim komputerze:

mvn package
java -jar target/bot.jar

Bez tokena wypisuje No TELEGRAM_BOT_TOKEN found. i się zatrzymuje, co dowodzi, że jar startuje i znajduje swoją klasę główną. Wgraj target/bot.jar. Zatrzymaj każdą kopię uruchomioną na komputerze z prawdziwym tokenem, zanim uruchomisz tę na serwerze, bo inaczej obie kopie dostaną od Telegrama błędy 409 Conflict.

Wywołanie getMe sprawdza token, zanim zacznie się polling, i daje nazwę użytkownika bota do linii gotowości. Logged in as @your_bot to linia, która zmienia znacznik na Online w Telegramie.

Gdy token jest zły

W naszym teście, z fałszywym tokenem, wywołanie getMe w TelegramBots zakończyło się takim błędem:

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

Bot powyżej przechwytuje to odrzucenie (kod błędu 401) i zamiast tego wypisuje Telegram did not accept the bot token. Paste the current one from @BotFather on the Bot page, then restart. Panel czyta tę linię i pokazuje baner Telegram nie przyjął tokena twojego bota nad Console. Aby to naprawić, wyślij w @BotFather /mybots, wybierz swojego bota, potem API Token i skopiuj token jeszcze raz. Na stronie Bot, w okienku Telegram, kliknij Zastąp token, wklej go, kliknij Zapisz token, a potem Zrestartuj teraz.

Co warto wiedzieć o TelegramBots na serwerze

  • Wersje: TelegramBots 10.3.0 wyszedł 7 wrz 2026 i obsługuje Bot API 10.3 Telegrama. Wymaga Javy 17 lub nowszej, więc działa na każdym Runtime, który oferuje panel (Java 17, 21 lub 25).
  • Dwa pakiety, inaczej niż w starszych poradnikach. Od wersji 7.0.0 (marzec 2024) biblioteka składa się z telegrambots-longpolling, który odbiera wiadomości, i telegrambots-client, który je wysyła. Poradniki rozszerzające TelegramLongPollingBot powstały dla starego pakietu telegrambots, wydanego ostatnio jako 6.9.7.1; tej klasy nie ma w 10.3.0, więc ich kod się z nią nie skompiluje.
  • Używaj long pollingu. Biblioteka ma też moduł webhooka, ale webhook wymaga publicznego adresu HTTPS, którego nasze plany jeszcze nie zawierają. registerBot w module long polling wywołuje deleteWebhook przed startem, więc webhook pozostawiony przez dawnego hosta jest usuwany, a oczekujące wiadomości zostają. Przeprowadzka z hosta z webhookiem: Jak przenieść bota Telegram do PlayNHost.
  • Dodaj bibliotekę logowania, bo inaczej biblioteka milczy. TelegramBots loguje przez SLF4J. Bez dostawcy SLF4J w twoim jarze SLF4J raz wypisuje ostrzeżenie, a potem wyrzuca każdą linię logu biblioteki, także błędy z pollingu. pom.xml powyżej dodaje slf4j-simple, który zapisuje linie biblioteki od poziomu INFO w górę na standardowe wyjście błędów, więc widać je w Console.
  • Błędy pollingu są ponawiane, a nie zgłaszane. Gdy wywołanie getUpdates zawiedzie, TelegramBots loguje Error received from Telegram GetUpdates Request, retrying in ... millis i próbuje ponownie, więc proces dalej działa. Czekanie zaczyna się od ok. pół sekundy i rośnie za każdym razem o połowę do ok. minuty (z losowym rozrzutem, do 90 sekund); gdy minie 15 minut bez udanego wywołania, czeka 15 minut między próbami. Dlatego po usunięciu przyczyny zrestartuj bota zamiast czekać. Tylko kod statusu HTTP, w linii Caused by śladu stosu pod spodem, mówi, co poszło nie tak; własny opis błędu Telegrama nie jest wypisywany. Skoro registerBot już usunął webhook, 409 w tym miejscu najpewniej oznacza, że inna kopia bota robi polling z tym samym tokenem: zatrzymaj ją. Zobacz Jak naprawić błąd 409 Conflict bota Telegram.
  • Oficjalna lekcja, po aktualizacji: implementuje LongPollingSingleThreadUpdateConsumer, który wersja 10.3.0 oznacza jako przestarzały na rzecz klasy DefaultLongPollingUpdateConsumer użytej powyżej; obie przetwarzają aktualizacje po jednej w wątku w tle. Jej linia gotowości, MyAmazingBot successfully started!, nie zmienia znacznika na Online w Telegramie: wypisz linię zaczynającą się od Logged in as, jak wyżej.
  • Niech main() czeka. Polling działa na własnych wątkach biblioteki; lekcja kończy main() wywołaniem Thread.currentThread().join(), żeby program się nie zakończył, a bot powyżej robi to samo.
  • Limit pamięci: skrypt startowy uruchamia Javę z -XX:MaxRAMPercentage=80.0 i odśmiecaczem G1, więc sterta może zająć do 80 procent pamięci planu. Gdy się zapełni, Java wypisuje java.lang.OutOfMemoryError, a panel pokazuje Twojemu botowi zabrakło pamięci.
  • Jeden jar, nic nie instaluje się na serwerze. Typ bota Java uruchamia java -jar na twoim Plik startowy i nie ma pola Pakiety, więc wszystko musi być w jarze. Aby zaktualizować bota, wgraj nowy jar.

Hostuj go sam na VPS z Linuksem

VPS potrzebuje tylko środowiska Java, bo jar budujesz na własnym komputerze. Na Debianie 13 lub Ubuntu 24.04 zainstaluj Javę 21; Debian 12 ma Javę 17, która też uruchomi jar powyżej:

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

Utwórz użytkownika dla bota i skopiuj jar na serwer (na przykład przez scp), potem do jego folderu:

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

Trzymaj token poza kodem, w pliku czytelnym tylko dla roota:

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

Utwórz /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

Uruchom go teraz i przy każdym starcie systemu, a potem śledź jego wyjście:

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

Restart=always uruchamia bota ponownie 5 sekund po jego zakończeniu lub awarii, ale nie po zatrzymaniu go przez systemctl stop. Na VPS -XX:MaxRAMPercentage to część pamięci całej maszyny, więc zmniejsz go, jeśli działają tam inne programy. Aby zaktualizować, skopiuj nowy jar na stary i uruchom sudo systemctl restart mybot.

Własny serwer czy plan dla botów

Na VPS, którym zarządzasz sam, zajmujesz się:

  • Aktualizacjami i bezpieczeństwem systemu oraz aktualizacjami Javy.
  • Kopiowaniem każdego nowego jara, plikiem usługi, plikiem z tokenem i jego uprawnieniami.
  • Czytaniem journalctl, żeby dowiedzieć się, dlaczego bot się zatrzymał albo przestał odpowiadać.
  • Kopiami zapasowymi wszystkiego, co przechowuje twój bot.

W zamian VPS uruchomi wszystko i możesz mu nadać domenę z HTTPS dla webhooka.

W planie dla botów PlayNHost robi to za ciebie panel:

  • Java 17, 21 lub 25 z listy wyboru, z ustawionym limitem sterty i odśmiecaczem.
  • Token, sprawdzony w Telegramie przed zapisem, przechowywany w postaci zaszyfrowanej i przekazywany twojemu kodowi pod pięcioma nazwami.
  • Ponowne uruchomienie bota po awarii. Jeśli awaria powtórzy się w ciągu minuty, bot zostaje zatrzymany, a Console podaje powód.
  • Przycisk Usuń webhook w okienku Telegram i banery nad Console nazywające przyczynę, na przykład odrzucony token lub brak pamięci.
  • Wgrywanie z przeglądarki i kopie zapasowe z panelu.

Pytania, które ludzie zadają

Mój bot TelegramBots działa, ale nic nie odpowiada i nic nie wypisuje. Dlaczego?

Najczęściej jar nie ma dostawcy SLF4J, więc własne linie błędów biblioteki są wyrzucane, podczas gdy ona dalej ponawia próby. Dodaj slf4j-simple jak w pom.xml powyżej, zbuduj ponownie i zajrzyj do Console. Powtarzające się 409 oznacza, że inna kopia bota robi polling z tym samym tokenem; powtarzające się 401 oznacza, że token został unieważniony w @BotFather. Po naprawie zrestartuj bota: czekanie TelegramBots między próbami może sięgnąć 15 minut.

Czy mogę użyć modułu webhooka TelegramBots?

Jeszcze nie w naszych planach: webhook wymaga publicznego adresu HTTPS, którego nie zawierają. Long polling go nie potrzebuje, bo bot sam pyta Telegram o nowe wiadomości. Użyj telegrambots-longpolling tak jak na tej stronie.

Czy TelegramBots potrzebuje większego planu niż bot w Pythonie lub Node.js?

Nie z powodu samej biblioteki. W tym samym teście, uruchomionym tak samo, TelegramBots zużył 91 MB, python-telegram-bot 22.8 zużył 44 MB, grammY 1.46.0 zużył 60 MB, a aiogram 3.31.0 zużył 173 MB, wszystkie znacznie poniżej 0,5 GB najmniejszego planu. Resztę rozstrzyga to, co twój bot trzyma w pamięci. W Javie pamięć zależy też od sterty: skrypt startowy pozwala jej urosnąć do 80 procent planu, a odśmiecacz decyduje, ile z tego zajmie.

Którą wersję Javy wybrać?

Javę 21, zalecaną, chyba że twój kod potrzebuje 25. TelegramBots 10.3.0 wymaga Javy 17 lub nowszej. Buduj z release nie nowszym niż wybrany Runtime: jar zbudowany dla nowszej Javy zatrzymuje się z UnsupportedClassVersionError.

Gotowy, by twój bot TelegramBots działał całą dobę? Zobacz plany w hostingu botów Telegram.

Twój bot działa już gdzie indziej? Przenieś go do nas

NASZE OSTATNIE WPISY