Γράψατε ένα Telegram bot με aiogram, το δοκιμάσατε τοπικά, και λειτουργεί. Τώρα πρέπει να ζει κάπου που δεν κοιμάται όταν κλείνετε το laptop. Ένα μικρό VPS είναι το φυσικό σπίτι — αλλά υπάρχει ένα κενό μεταξύ του python bot.py σε μια συνεδρία SSH και ενός bot που πραγματικά μένει ενεργό μέσα από crashes, reboots, και το πέσιμο της σύνδεσής σας.
Αυτή είναι η production εκδοχή: ένα virtualenv, το token κρατημένο έξω από τον κώδικά σας, ένα systemd service που ανασταίνει το bot μόνο του, και μια καθαρή απάντηση στην ερώτηση που όλοι κάνουν τελικά — polling ή webhook;
Γιατί να μην το τρέξετε απλώς στο laptop σας
Ένα bot χρειάζεται μια σταθερή εξερχόμενη σύνδεση με το Telegram. Το laptop σας κοιμάται, επανεκκινεί για ενημερώσεις, και πηδά μεταξύ δικτύων — καθένα από αυτά ρίχνει το bot, και οι χρήστες χτυπούν έναν τοίχο σιωπής. Ένα VPS κρατά αυτή τη σύνδεση όλο το εικοσιτετράωρο. Αυτός είναι όλος ο λόγος να το μετακινήσετε από τη μηχανή σας, και είναι ο ίδιος λόγος που ένα Discord bot ανήκει σε έναν server επίσης.
Αν θέλετε απλώς τη γρηγορότερη διαδρομή «βάλ' το online» με ένα minimal bot, ο οδηγός host-a-Telegram-bot το καλύπτει. Αυτό το κομμάτι πάει ένα επίπεδο βαθύτερα: aiogram, ασφαλής χειρισμός token, και το να ξέρετε πότε να κλιμακώσετε.
Το bot, σε ένα virtualenv
Συνδεθείτε με SSH και κρατήστε το bot απομονωμένο στο δικό του venv — μην εγκαθιστάτε πακέτα system-wide, κάνει τις αναβαθμίσεις και τον καθαρισμό χάος αργότερα:
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
Ένα minimal aiogram 3 bot που διαβάζει το token του από το environment, όχι από μια hard-coded συμβολοσειρά:
# 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())
Κρατήστε το token έξω από τον κώδικά σας
Ποτέ μην επικολλάτε το token του BotFather στο bot.py — ένα push σε ένα δημόσιο repo και διέρρευσε. Βάλτε το σε ένα root-readable env file αντ' αυτού:
sudo tee /etc/tgbot.env >/dev/null <<'EOF'
BOT_TOKEN=123456:your-token-from-botfather
EOF
sudo chmod 600 /etc/tgbot.env
Ένα διαρρεύσαν token είναι ένα /revoke στο BotFather μακριά από το να διορθωθεί — αλλά ένα διαρρεύσαν οτιδήποτε άλλο σε μια κοινόχρηστη μηχανή είναι χειρότερο. Ένα αποκλειστικό VPS για το bot είναι ειλικρινά ασφαλέστερο σπίτι για το token από το καθημερινό laptop σας: αν διαρρεύσει, περιστρέφετε ένα token, όχι όλη την εγκατάστασή σας.
Το μέρος που το κρατά ζωντανό: systemd
Αυτό είναι που ξεχωρίζει ένα bot που τρέχει από ένα bot που μένει σε λειτουργία. Δημιουργήστε το service:
# /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
Τρέξτε το ως non-root χρήστη (botuser παραπάνω), όχι root — αν το bot παραβιαστεί ποτέ, το θέλετε περιορισμένο. Μετά:
sudo systemctl daemon-reload
sudo systemctl enable --now tgbot
Το Restart=always με RestartSec=3 σημαίνει ότι ένα crash — μια κακή ενημέρωση από το Telegram, μια unhandled exception, ένα OOM — φέρνει το bot πίσω σε τρία δευτερόλεπτα αντί να το αφήνει νεκρό μέχρι να το παρατηρήσετε. Παρακολουθήστε το ζωντανά:
journalctl -u tgbot -f
Αυτή είναι όλη η εγκατάσταση logging σας. Κανένα αρχείο log να περιστρέφετε, κανένα επιπλέον εργαλείο — το journald το έχει ήδη.
Ενημέρωση χωρίς δράμα downtime
Όταν αλλάζετε τον κώδικα ή ανεβάζετε το aiogram:
cd ~/tgbot && source venv/bin/activate
pip install -U aiogram # if upgrading the library
sudo systemctl restart tgbot
journalctl -u tgbot -n 30 --no-pager # confirm it came back clean
Η επανεκκίνηση αναβοσβήνει το bot για ένα-δυο δευτερόλεπτα. Για ένα polling bot αυτό είναι αόρατο στους χρήστες — το Telegram βάζει σε ουρά τις ενημερώσεις και τις παραδίδει μόλις το bot επανασυνδεθεί.
Polling vs webhook — η έντιμη εκδοχή
Αυτή είναι η απόφαση που οι άνθρωποι υπερσκέφτονται. Ιδού η απλή εκδοχή:
Το polling (start_polling, αυτό που χρησιμοποιεί ο κώδικας παραπάνω) κάνει το bot να ρωτά το Telegram «κάτι νέο;» σε μια μακρόβια σύνδεση. Δεν χρειάζεται τίποτα εκτός από εξερχόμενο διαδίκτυο — χωρίς domain, χωρίς TLS, χωρίς ανοιχτά εισερχόμενα ports. Τρέχει μια χαρά πίσω από NAT. Για τη συντριπτική πλειοψηφία των bots, αυτό είναι σωστό και θα πρέπει να σταματήσετε εδώ.
Το webhook κάνει το Telegram να σπρώχνει ενημερώσεις σε εσάς, που σημαίνει ότι πρέπει να εκθέσετε ένα δημόσιο HTTPS endpoint. Αυτό απαιτεί ένα domain και ένα προσβάσιμο εισερχόμενο port — οπότε είτε ένα αποκλειστικό δημόσιο IP είτε ένα reverse proxy μπροστά. Περισσότερη εγκατάσταση, περισσότερα πράγματα που σπάνε. Το κέρδος είναι χαμηλότερο latency και λιγότερο overhead σε μεγάλη κλίμακα — χιλιάδες ταυτόχρονοι χρήστες, βαρύς όγκος ενημερώσεων.
Ο πρακτικός κανόνας: ξεκινήστε με polling σε ένα πακέτο NAT. Μετακινηθείτε σε webhook μόνο όταν έχετε πραγματικά ξεπεράσει το polling — και αν το κάνετε, τότε ένα αποκλειστικό IP κερδίζει τη θέση του, γιατί χρειάζεστε αυτό το εισερχόμενο HTTPS endpoint.
Τι κοστίζει να το τρέχετε
Ένα polling bot είναι ελαφρύ. Κάθεται αδρανές στο long-poll του Telegram και αντιδρά σε μηνύματα, οπότε το box κυρίως περιμένει:
- $3 Nano (1 vCPU / 1 GB) — εντάξει για τα περισσότερα bots, ακόμη και αρκετά φλύαρα.
- $5 Micro (2 vCPU / 2 GB) — όταν το bot κρατά μια βάση δεδομένων (SQLite/Postgres), χειρίζεται media, ή εξυπηρετεί πολλούς χρήστες.
- Υψηλότερα μόνο αν το ίδιο το bot κάνει πραγματική δουλειά — επεξεργασία εικόνων, τοπικό μοντέλο, βαριά λογική ανά μήνυμα.
Η εγγραφή είναι μόνο-email και πληρώνετε σε USDC ή USDT σε Base ή Ethereum — χωρίς κάρτα, χωρίς ID. Μια κάρτα λειτουργεί επίσης, αλλά το on-ramp έχει ~$27 ελάχιστο, οπότε για ένα πακέτο $3 είναι πιο ομαλό να προσθέσετε ένα μικρό υπόλοιπο μία φορά και να αφήσετε τις ανανεώσεις να αντλούν από αυτό. Είναι μόνο-CPU, ένα datacenter στη Γερμανία — μη-θέμα για ένα bot, αξίζει να το ξέρετε αν χρειαζόσασταν GPU ή συγκεκριμένη περιοχή.
Η έντιμη κατακλείδα
Ένα Telegram bot είναι ένα από τα φθηνότερα πράγματα που μπορείτε να κάνετε self-host: ένα box $3, ένα systemd unit, και το polling σας δίνει ένα bot που είναι online μέσα από crashes και reboots χωρίς να το κάνετε νταντά. Στραφείτε σε ένα webhook και ένα μεγαλύτερο πακέτο μόνο όταν η κλίμακα πραγματικά το επιβάλλει — όχι επειδή ένα tutorial σας είπε ότι τα webhooks είναι «καλύτερα». Πάρτε το μικρό box, κρατήστε το token σε ένα env file, αφήστε το systemd να χειριστεί το uptime, και — πριν από οτιδήποτε άλλο — τρέξτε την checklist ασφαλείας νέου-VPS ώστε το ίδιο το box να είναι κλειδωμένο.
Έτοιμοι να φιλοξενήσετε το δικό σας; Ένα Telegram bot ελάχιστα χρησιμοποιεί πόρους — το Nano πακέτο ($3/μήνα) το τρέχει 24/7 χωρίς φασαρία.
Σχόλια
Δεν υπάρχουν ακόμη σχόλια. Γίνετε ο πρώτος.