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:
- $3 Nano (1 vCPU / 1 GB) — fin til de fleste bots, selv temmelig snakkesalige.
- $5 Micro (2 vCPU / 2 GB) — når botten holder en database (SQLite/Postgres), håndterer medier eller betjener mange brugere.
- Højere kun, hvis botten selv laver rigtigt arbejde — billedbehandling, en lokal model, tung per-besked-logik.
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.
Kommentarer
Ingen kommentarer endnu. Vær den første.