EQVPS

Kør en Telegram-bot 24/7 på en VPS: aiogram, systemd, polling kontra webhook

4. jul. 2026 · 5 min. læsning · EQVPS Team

Du skrev en Telegram-bot med aiogram, testede den lokalt, og den virker. Nu skal den bo et sted, der ikke sover, når du lukker den bærbare. En lille VPS er det naturlige hjem — men der er et gab mellem python bot.py i en SSH-session og en bot, der faktisk forbliver oppe gennem nedbrud, genstarter og din forbindelse, der ryger.

Dette er produktions-versionen: et virtualenv, token'et holdt ude af din kode, en systemd-tjeneste der genopliver botten på egen hånd, og et klarøjet svar på spørgsmålet, alle til sidst stiller — polling eller webhook?

Hvorfor ikke bare køre den på din bærbare

En bot har brug for en stabil udgående forbindelse til Telegram. Din bærbare sover, genstarter for opdateringer og hopper mellem netværk — hver af disse dropper botten, og brugere rammer en mur af stilhed. En VPS holder den forbindelse døgnet rundt. Det er hele grunden til at flytte den væk fra din maskine, og det er den samme grund til, at en Discord-bot også hører hjemme på en server.

Hvis du bare vil have den hurtigst mulige "få den online"-vej med en minimal bot, dækker host-en-Telegram-bot-gennemgangen det. Dette stykke går et niveau dybere: aiogram, sikker token-håndtering, og at vide, hvornår man skal skalere.

Botten, i et virtualenv

SSH ind og hold botten isoleret i sit eget venv — installér ikke pakker system-bredt, det gør opgraderinger og oprydning til et rod senere:

sudo apt update && sudo apt install -y python3-venv
mkdir ~/tgbot && cd ~/tgbot
python3 -m venv venv && source venv/bin/activate
pip install -U aiogram

En minimal aiogram 3-bot, der læser sit token fra miljøet, ikke fra en hardcodet streng:

# bot.py
import asyncio, logging, os
from aiogram import Bot, Dispatcher
from aiogram.types import Message
from aiogram.filters import CommandStart

logging.basicConfig(level=logging.INFO)
dp = Dispatcher()

@dp.message(CommandStart())
async def start(m: Message):
    await m.answer("Alive and running on a VPS.")

async def main():
    bot = Bot(os.environ["BOT_TOKEN"])
    await dp.start_polling(bot)

if __name__ == "__main__":
    asyncio.run(main())

Hold token'et ude af din kode

Indsæt aldrig BotFather-token'et i bot.py — ét push til et offentligt repo, og det er lækket. Læg det i en root-læsbar env-fil i stedet:

sudo tee /etc/tgbot.env >/dev/null <<'EOF'
BOT_TOKEN=123456:your-token-from-botfather
EOF
sudo chmod 600 /etc/tgbot.env

Et lækket token er ét /revoke i BotFather væk fra at være fikset — men et lækket hvad-som-helst-andet på en delt maskine er værre. En dedikeret VPS til botten er ærligt et sikrere hjem for token'et end din daglige bærbare: hvis det lækker, roterer du ét token, ikke hele din opsætning.

Den del der holder den i live: systemd

Det er, hvad der adskiller en bot, der kører, fra en bot, der forbliver kørende. Opret tjenesten:

# /etc/systemd/system/tgbot.service
[Unit]
Description=Telegram bot (aiogram)
After=network-online.target
Wants=network-online.target

[Service]
User=botuser
WorkingDirectory=/home/botuser/tgbot
EnvironmentFile=/etc/tgbot.env
ExecStart=/home/botuser/tgbot/venv/bin/python bot.py
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

Kør den som en ikke-root-bruger (botuser ovenfor), ikke root — hvis botten nogensinde kompromitteres, vil du have den boxet ind. Så:

sudo systemctl daemon-reload
sudo systemctl enable --now tgbot

Restart=always med RestartSec=3 betyder, at et nedbrud — en dårlig opdatering fra Telegram, en uhåndteret undtagelse, et OOM — bringer botten tilbage på tre sekunder i stedet for at efterlade den død, indtil du bemærker det. Se den live:

journalctl -u tgbot -f

Det er hele din lognings-opsætning. Ingen log-filer at rotere, ingen ekstra værktøjer — journald har det allerede.

At opdatere uden nedetids-drama

Når du ændrer koden eller bumper aiogram:

cd ~/tgbot && source venv/bin/activate
pip install -U aiogram          # hvis du opgraderer biblioteket
sudo systemctl restart tgbot
journalctl -u tgbot -n 30 --no-pager   # bekræft den kom tilbage rent

Genstarten blinker botten i et sekund eller to. For en polling-bot er det usynligt for brugere — Telegram køer opdateringer og leverer dem, når botten genforbinder.

Polling kontra webhook — den ærlige version

Det er beslutningen, folk overtænker. Her er den ligefremme version:

Polling (start_polling, hvad koden ovenfor bruger) får botten til at spørge Telegram "noget nyt?" på en langtlevende forbindelse. Den har ikke brug for andet end udgående internet — intet domæne, ingen TLS, ingen åbne indgående porte. Den kører fint bag NAT. For det overvældende flertal af bots er dette korrekt, og du bør stoppe her.

Webhook får Telegram til at skubbe opdateringer til dig, hvilket betyder, at du skal eksponere et offentligt HTTPS-endpoint. Det kræver et domæne og en tilgængelig indgående port — så enten en dedikeret offentlig IP eller en reverse proxy foran. Mere opsætning, flere ting der går i stykker. Gevinsten er lavere latens og mindre overhead ved stor skala — tusinder af samtidige brugere, tung opdaterings-volumen.

Den praktiske regel: start med polling på et NAT-abonnement. Skift til en webhook kun, når du faktisk er vokset ud af polling — og hvis du gør, er det, når en dedikeret IP tjener sin plads, fordi du har brug for det indgående HTTPS-endpoint.

Hvad det koster at køre

En polling-bot er let. Den idler på Telegrams long-poll og reagerer på beskeder, så boksen venter mest:

Tilmelding er kun-e-mail, og du betaler i USDC eller USDT på Base eller Ethereum — intet kort, intet ID. Et kort virker også, men on-rampen har et ~$27-minimum, så for et $3-abonnement er det glattere at fylde en lille saldo op én gang og lade fornyelser trække fra den. Det er kun CPU, ét datacenter i Tyskland — et ikke-problem for en bot, værd at vide, hvis du havde brug for en GPU eller en bestemt region.

Den ærlige bundlinje

En Telegram-bot er en af de billigste ting, du kan self-hoste: en $3-boks, en systemd-unit, og polling giver dig en bot, der er online gennem nedbrud og genstarter uden, at du passer den. Grib til en webhook og et større abonnement kun, når skala faktisk tvinger det — ikke fordi en tutorial fortalte dig, at webhooks er "bedre". Få den lille boks, hold token'et i en env-fil, lad systemd håndtere oppetiden, og — før noget andet — kør ny-VPS-sikkerhedstjeklisten, så selve boksen er låst ned.


Klar til at hoste din? En Telegram-bot bruger knap nok ressourcer — Nano-abonnementet ($3/md) kører den 24/7 uden besvær.

FAQ

Polling eller webhook — hvilken bør jeg bruge?

Start med polling. Det virker fra enhver boks med udgående internet — intet domæne, ingen åbne porte, ingen TLS — og det er rigeligt til de fleste bots. Skift til en webhook kun, når du kører i stor skala (tusinder af brugere) eller har brug for den lavest mulige latens; en webhook har brug for et offentligt HTTPS-endpoint, hvilket betyder et domæne og en tilgængelig indgående port (en dedikeret IP eller en reverse proxy), så det er flere bevægelige dele. For 95% af bots er polling på en lille VPS det rigtige svar.

Har jeg brug for en dedikeret IP eller et domæne til en Telegram-bot?

Ikke til polling — botten laver kun udgående kald til Telegram, så et NAT-abonnement med port-videresendt SSH er nok. Du har kun brug for et offentligt HTTPS-endpoint (domæne + indgående port, dvs. en dedikeret IP eller reverse proxy), hvis du skifter til webhook-tilstand. De fleste bots har aldrig brug for det.

Hvilken størrelse VPS har en aiogram-bot brug for?

Den mindste. En polling-bot venter mest på Telegrams long-poll, så 1 vCPU / 1 GB (en $3 Nano) håndterer de fleste bots komfortabelt. Skalér kun op, når botten selv laver det tunge løft — en database, medie-behandling eller en lokal model — hvilket skubber dig mod 2 GB ($5) eller mere.

Hvordan holder jeg botten kørende, efter jeg logger ud?

Kør den som en systemd-tjeneste med Restart=always. Startet i din terminal dør den, når SSH lukker; under systemd overlever den logud, genstarter ved nedbrud og kommer tilbage efter en genstart. Det er linjen mellem en demo og noget, du kan forlade dig på.

← Tilbage til blogSe planer & priser →

Kommentarer

Ingen kommentarer endnu. Vær den første.

Skriv en kommentar

Kommentarer modereres, før de vises.