De bot beantwoordt elk bericht totdat de laptop dichtgaat. Daarna krijgen gebruikers geen antwoord meer. Een kleine VPS lost dat op voor een paar dollar per maand. De beste VPS voor een Telegram-bot hangt af van de manier waarop de bot updates ontvangt: hij vraagt ze zelf bij Telegram op, of Telegram stuurt ze naar de bot.
Die keuze bepaalt welke poorten en welk certificaat nodig zijn en of een openbare IPv4-verbinding vereist is.
De korte versie
- Gebruik long polling voor één bot op een VPS. Daarvoor zijn geen domein, certificaat of open poort nodig.
- Webhooks vereisen HTTPS op poort 443, 80, 88 of 8443 en een openbaar IPv4-adres. Telegram levert geen webhooks via IPv6.
- 512 MB of RAM is a workable start for one bot with no local database.
- Houd de bot actief met systemd, of met het herstartbeleid van Docker als je al containers uitrolt.
- Kies een aanbieder op basis van IPv4 en beschikbare RAM-reserve, niet alleen op de geadverteerde prijs.
Polling of webhooks: de keuze die je serververeisten bepaalt
Een Telegram-bot ontvangt updates op twee manieren. Bij long polling roept de bot getUpdates aan en houdt Telegram het verzoek open totdat een update binnenkomt of de wachttijd verstrijkt. Elke verbinding begint dus op je server. Bij een webhook registreer je eenmalig een URL met setWebhook, waarna Telegram elke update via HTTPS met een POST-verzoek naar die URL stuurt.
| Vereiste | Long polling (getUpdates) |
Webhook (setWebhook) |
|---|---|---|
| Inkomende poort | Geen; alleen uitgaande verzoeken | HTTPS op 443, 80, 88 of 8443 |
| Openbaar IPv4 | Niet vereist | Vereist; IPv6 wordt niet ondersteund voor webhooks |
| Domein en certificaat | Niet nodig | Certificaat vereist; een domein is gebruikelijk, maar een zelfondertekend certificaat kan het IP-adres als CN gebruiken |
| Proces | Draait continu | Beantwoordt continu HTTPS-verzoeken |
De webhookkolom volgt de webhookvereisten van Telegram.
Vraag de Bot API op om te zien welke methode je bot gebruikt:
curl "https://api.telegram.org/bot<YOUR_TOKEN>/getWebhookInfo"
Als het antwoord "url":"" bevat, is er geen webhook ingesteld en kan de bot long polling gebruiken. grammY gebruikt met bot.start() standaard long polling; python-telegram-bot gebruikt run_polling() of run_webhook().
Voor één bot op een eigen VPS zou ik polling gebruiken, wat ook het standaardadvies van grammY is. Webhooks zijn gunstiger als de server al een reverse proxy draait (een webserver die HTTPS-verzoeken doorstuurt naar je bot), als meerdere bots één HTTPS-endpoint delen, of op een serverlessplatform. Daarbij haalt Caddy het certificaat op en vernieuwt het zonder cronjob.
Een korte storing vertraagt berichten zonder ze te verliezen. Volgens de updateregels van de Bot API bewaart Telegram updates maximaal 24 uur totdat de bot ze ontvangt, bij beide methoden, en herhaalt het mislukte webhookverzoeken voordat het opgeeft.
Als de webhook zijn poort rechtstreeks gebruikt, beperk de toegang dan tot de bronbereiken die Telegram publiceert. Als een reverse proxy poort 443 deelt met andere sites, pas de beperking dan alleen toe op het webhookpad of gebruik het geheime token van Telegram in plaats van al het overige HTTPS-verkeer te blokkeren. De webhookhandleiding noemt twee bronbereiken en waarschuwt dat ze kunnen veranderen. Met UFW als firewall van de host:
sudo ufw allow 22/tcp # keep SSH open before you enable the firewall
sudo ufw allow proto tcp from 149.154.160.0/20 to any port 443
sudo ufw allow proto tcp from 91.108.4.0/22 to any port 443
sudo ufw allow 80/tcp # if your HTTPS setup uses HTTP validation or redirects HTTP to HTTPS
sudo ufw enable
Wijzig 443 als de webhook op 80, 88 of 8443 luistert. Deze regels beschermen een bot die rechtstreeks op de host draait. Volgens de Docker-firewalldocumentatie omzeilt een gepubliceerde poort UFW, waardoor een webhookcontainer gestart met -p 443:443 voor iedereen bereikbaar blijft. Stel ook een secret_token in bij setWebhook. Telegram stuurt dit mee in de header X-Telegram-Bot-Api-Secret-Token van elk verzoek, en je afhandelingscode weigert verzoeken zonder die waarde.
De bot actief houden: systemd of Docker
Een Telegram-bot 24/7 draaien betekent dat hij na crashes en herstarts opnieuw moet starten. Op een VPS doet systemd dat, of Docker als de bot als image wordt geleverd.
Een systemd-unit is een kort configuratiebestand dat het init-systeem vertelt hoe het een programma start en herstart. Maak /etc/systemd/system/telegram-bot.service aan:
[Unit]
Description=Telegram bot
After=network-online.target
Wants=network-online.target
[Service]
User=bot
WorkingDirectory=/opt/bot
EnvironmentFile=/opt/bot/.env
ExecStart=/opt/bot/venv/bin/python bot.py
# Node: ExecStart=/usr/bin/node bot.js
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Zet het token in een .env-bestand in de projectmap als BOT_TOKEN=... en lees het met os.environ["BOT_TOKEN"] (Node: process.env.BOT_TOKEN), zodat het buiten de code blijft. Kopieer het project vervolgens naar de juiste plek en start het:
sudo mkdir -p /opt/bot
sudo cp -r ~/your-bot/. /opt/bot/ # your project, after git clone or scp from your machine; include .env and requirements.txt
sudo apt install -y python3-venv # Debian/Ubuntu
sudo useradd --system --no-create-home bot
sudo chown -R bot:bot /opt/bot
sudo -u bot python3 -m venv /opt/bot/venv
sudo -u bot /opt/bot/venv/bin/pip install -r /opt/bot/requirements.txt
# Node: skip the venv and pip commands above, then run:
cd /opt/bot && sudo -u bot npm ci
sudo chmod 600 /opt/bot/.env
sudo systemctl daemon-reload
sudo systemctl enable --now telegram-bot
systemctl status telegram-bot # look for: Active: active (running)
sudo journalctl -u telegram-bot -f # follow the bot's logs
Restart=always herstart de bot na zowel een normale afsluiting als een crash; on-failure slaat normale afsluitingen over, volgens de systemd.service-handleiding. RestartSec=5 laat tijd tussen pogingen, en WantedBy=multi-user.target samen met enable start de bot bij het opstarten. Als hij blijft herstarten, toont sudo journalctl -u telegram-bot -n 50 de fouttrace. Controleer eerst of BOT_TOKEN ontbreekt.
Bij Docker volstaat één optie:
docker run -d --name telegram-bot --restart unless-stopped --env-file .env your-bot-image
docker logs -f telegram-bot
In Compose is de regel restart: unless-stopped. De documentatie over Dockers herstartbeleid zegt dat de container terugkomt nadat hij stopt of de daemon herstart, maar niet nadat je hem zelf hebt gestopt. Dit dekt serverherstarts als Docker zelf bij het opstarten start, wat standaard gebeurt op Debian en Ubuntu. Voer elders sudo systemctl enable docker.service uit.
Mijn regel: voor één script op een kleine server gebruik je systemd, zonder extra daemon in het geheugen. Als je al images bouwt of andere containers draait, gebruik dan Docker en houd rekening met het RAM-verbruik van de daemon.
Geen van beide tools meldt dat je bot uitgevallen is. Een Uptime Kuma-pushmonitor op een tweede server kan dat wel. De bot roept periodiek de URL van de monitor aan, en Uptime Kuma waarschuwt je via Telegram wanneer die aanroepen stoppen.
Waar gratis hosting en thuisservers tekortschieten
Render schakelt een gratis webservice uit na 15 minuten zonder inkomend verkeer, en volgens de documentatie van Renders gratis abonnement duurt het ontwaken ongeveer een minuut. Een pollingbot ontvangt geen inkomend verkeer en wordt dus gestopt. Een webhookbot wordt gewekt door Telegrams POST-verzoek, met een koude start na rustige perioden. Of gratis hosting voor een Telegram-bot werkt, hangt dus af van de gebruikte methode.
De grammY-handleiding noemt serverlessplatforms geschikt voor webhooks, terwijl long polling een machine nodig heeft die dag en nacht draait. Fly.io rekent naar gebruik en vereist een geregistreerde betaalkaart.
Een Raspberry Pi of oude pc kan een pollingbot draaien zolang de machine, stroom en verbinding beschikbaar blijven. Voor webhooks thuis zijn ook een openbaar adres en portforwarding nodig. Voor een hobbybot kan elk van deze gratis mogelijkheden voldoende zijn.
Een VPS ondersteunt beide methoden tegen een vaste maandprijs.
Vijf VPS-aanbieders vergeleken voor een Telegram-bot
De tabel vergelijkt vijf betaalde instapabonnementen voor Telegram-bothosting tegen de geadverteerde maandprijzen per oktober 2026, exclusief belastingen. Actieprijzen worden waar van toepassing vermeld.
| Aanbieder | Specificaties instapabonnement | Maandprijs | Openbaar IPv4 | Facturering |
|---|---|---|---|---|
| Cloudzy | 1 vCPU (AMD EPYC), 512 MB DDR5, 20 GB NVMe, 1 TB dataverkeer | $ 2,48 actie ($ 4,95 normaal) | Inbegrepen, plus IPv6 | Per uur of per maand |
| DigitalOcean | 1 vCPU, 512 MiB, 10 GiB SSD, 500 GiB dataverkeer | Vanaf $ 4 | Inbegrepen | Per seconde, met de maandprijs als maximum |
| Vultr | 1 vCPU, 512 MB, 10 GB SSD, 512 GB dataverkeer | Vanaf $ 2,50 alleen IPv6; vanaf $ 3,50 met IPv4 | Alleen bij het abonnement van $ 3,50 | Per uur of per maand |
| Hetzner (Duitsland/Finland) | 2 vCPU, 4 GB, 40 GB SSD, 20 TB dataverkeer | Vanaf € 5,49 excl. btw | Extra, vanaf € 0,50/maand excl. btw (IPv6 gratis) | Per uur, tot maximaal de maandprijs |
| Linode (Akamai) | 1 vCPU, 1 GB, 25 GB opslag, 1 TB dataverkeer | Vanaf $ 5 | Inbegrepen | Per uur of per maand |
Vultrs IPv6-abonnement bevat geen IPv4 en bij Hetzner is het IPv4-adres niet in de prijs inbegrepen. Zonder IPv4 kunnen beide geen webhook ontvangen.
Een pollingbot kan uitsluitend op IPv6 draaien, omdat api.telegram.org een IPv6-adres heeft. Alle andere bestemmingen hebben dat ook nodig, waaronder pakketregisters, je Git-host en elke API die de bot aanroept. Controleer elke host voordat je kiest:
dig +short AAAA api.telegram.org
dig +short AAAA github.com
dig +short AAAA pypi.org # repeat for every host your bot or its installs reach
Een leeg antwoord betekent dat die host geen IPv6-adres heeft.
Is 512 MB genoeg voor een Telegram-bot?
Ik zou één bot zonder lokale database op 512 MB starten. De documentatie van python-telegram-bot noemt geen geheugenvereiste. Wat de server deelt, bepaalt het verbruik: het besturingssysteem, de Docker-daemon als je die gebruikt, en een eventuele lokale database. Meet het.
free -m # "available" is your headroom; the Swap row shows swap use
ps -o rss,cmd -p "$(systemctl show -p MainPID --value telegram-bot)" # bot's resident memory, in KB
docker stats --no-stream # per-container memory, if the bot runs in Docker
journalctl -k | grep -i "out of memory" # kernel OOM kills
Bij een out-of-memory-beëindiging (OOM) stopt de kernel een proces om RAM vrij te maken. systemd herstart de bot, dus die logregel kan het enige bewijs zijn. Ga naar 1 GB zodra OOM-beëindigingen optreden, swap voortdurend wordt gebruikt, of voordat je een lokale database of tweede bot toevoegt.
Welke kies je?
Voor één bot zou ik een abonnement van 512 MB met openbaar IPv4 inbegrepen kiezen. De aanbieder hangt vervolgens af van prijs, reservecapaciteit en waar je gebruikers zitten.
- Laagste huidige maandprijs: Cloudzy voor $ 2,48 tijdens de actie met 50% korting, inclusief IPv4 en IPv6.
- Laagste huidige prijs met IPv4: Cloudzy voor $ 2,48 tijdens de actie. Eigen IPv4 en IPv6 zijn inbegrepen.
- 1 GB of headroom for Docker or a small database: Linode, from $5 a month.
- Meerdere bots of een database, gebruikers in Europa: Hetzner, met de meeste middelen per euro in deze tabel als het abonnement beschikbaar is (in oktober 2026 stond het als niet beschikbaar vermeld). Tel voor webhooks de IPv4-kosten erbij op.
- Meer opslag en dataverkeer bij 512 MB: Cloudzy. Van de abonnementen van 512 MB biedt het de meeste opslag (20 GB NVMe tegenover 10) en het meeste dataverkeer (1 TB tegenover ongeveer 500 GB), inclusief IPv4 en IPv6. Met de huidige actieprijs is Cloudzy ook goedkoper dan de andere instapabonnementen in deze vergelijking.
Met de huidige actieprijs combineert Cloudzy de laagste maandprijs in deze vergelijking met meer opslag en dataverkeer dan de andere abonnementen van 512 MB. Het Cloudzy-abonnement van 512 MB wordt per uur afgerekend en heeft een geld-teruggarantie van 14 dagen, zodat je de bot enkele dagen kunt uitproberen voordat je je vastlegt. Kies de locatie die het dichtst bij je gebruikers ligt, implementeer een Cloudzy Linux-VPS en voeg de systemd-unit van hierboven toe.
Veelgestelde vragen
Wat is de goedkoopste VPS waarop een Telegram-bot kan draaien?
Per oktober 2026 is het Cloudzy-abonnement van 512 MB het goedkoopste van de vijf: $ 2,48 per maand tijdens de actie met 50% korting, inclusief eigen IPv4 en IPv6. De normale prijs is $ 4,95 per maand. Vultrs optie met alleen IPv6 begint iets hoger, vanaf $ 2,50.
Waarom hebben Telegram-webhooks HTTPS nodig?
Telegram vereist SSL/TLS voor webhooks ongeacht de gebruikte poort, volgens de webhookhandleiding. Het weigert gewoon HTTP en accepteert TLS 1.2 of nieuwer. Zonder TLS zou elk POST-verzoek de berichten van je gebruikers onversleuteld versturen. Een Let's Encrypt-certificaat werkt, net als een zelfondertekend certificaat dat je uploadt met setWebhook.
Kan een Telegram-bot draaien op 512 MB RAM?
Meestal wel, voor één bot zonder lokale database. Controleer het kernellog op beëindigingen wegens geheugentekort en ga naar 1 GB als ze optreden of wanneer je een database toevoegt.
Hoe houd ik een Telegram-bot actief na een herstart?
Schakel de systemd-service in met sudo systemctl enable --now telegram-bot, of start de container met --restart unless-stopped en schakel docker.service in zodat Docker bij het opstarten start.
Beperkt Telegram de aanvraagsnelheid van bots per IP-adres?
Telegrams bot-FAQ over limieten beschrijft limieten per bot en per chat; overstappen naar een nieuwe server mag je niet zien als een manier om ze te omzeilen. Bij overschrijding retourneert de API HTTP 429 met een waarde voor retry_after. Wacht zoveel seconden voordat je het opnieuw probeert.
Welke serverregio kies ik voor een Telegram-bot?
Kies de locatie het dichtst bij je gebruikers en de diensten die je bot aanroept, en meet vervolgens de verbindingstijd vanaf elke kandidaat met curl -o /dev/null -s -w '%{time_connect}\n' https://api.telegram.org.
Discussie
Reacties
Log in om mee te praten.