EQVPS

Τρέξτε ένα Telegram bot 24/7 σε VPS: aiogram, systemd, polling vs webhook

Jul 4, 2026 · 6 λεπτά ανάγνωσης · EQVPS Team

Γράψατε ένα 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 κυρίως περιμένει:

Η εγγραφή είναι μόνο-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 χωρίς φασαρία.

Συχνές ερωτήσεις

Polling ή webhook — ποιο να χρησιμοποιήσω;

Ξεκινήστε με polling. Λειτουργεί από οποιοδήποτε box με εξερχόμενο διαδίκτυο — χωρίς domain, χωρίς ανοιχτά ports, χωρίς TLS — και είναι άφθονο για τα περισσότερα bots. Αλλάξτε σε webhook μόνο όταν τρέχετε σε κλίμακα (χιλιάδες χρήστες) ή χρειάζεστε το χαμηλότερο δυνατό latency· ένα webhook χρειάζεται δημόσιο HTTPS endpoint, που σημαίνει domain και προσβάσιμο εισερχόμενο port (ένα αποκλειστικό IP, ή ένα reverse proxy), οπότε είναι περισσότερα κινούμενα μέρη. Για το 95% των bots, το polling σε ένα μικρό VPS είναι η σωστή απάντηση.

Χρειάζομαι αποκλειστικό IP ή domain για ένα Telegram bot;

Όχι για polling — το bot κάνει μόνο εξερχόμενες κλήσεις στο Telegram, οπότε ένα πακέτο NAT με port-forwarded SSH είναι αρκετό. Χρειάζεστε δημόσιο HTTPS endpoint (domain + εισερχόμενο port, δηλ. αποκλειστικό IP ή reverse proxy) μόνο αν αλλάξετε σε webhook mode. Τα περισσότερα bots δεν το χρειάζονται ποτέ.

Τι μέγεθος VPS χρειάζεται ένα aiogram bot;

Το μικρότερο. Ένα polling bot κυρίως περιμένει το long-poll του Telegram, οπότε 1 vCPU / 1 GB (ένα $3 Nano) χειρίζεται τα περισσότερα bots άνετα. Ανεβείτε μόνο όταν το ίδιο το bot κάνει τη βαριά δουλειά — μια βάση δεδομένων, επεξεργασία media, ή ένα τοπικό μοντέλο — που σας σπρώχνει προς 2 GB ($5) ή περισσότερα.

Πώς κρατάω το bot να τρέχει αφού αποσυνδεθώ;

Τρέξτε το ως systemd service με Restart=always. Εκκινημένο στο terminal σας πεθαίνει όταν κλείνει το SSH· κάτω από systemd επιβιώνει αποσύνδεσης, επανεκκινεί σε crash, και επιστρέφει μετά από επανεκκίνηση. Αυτή είναι η γραμμή μεταξύ ενός demo και κάτι που μπορείτε να εμπιστευτείτε.

← Πίσω στο BlogΔείτε πακέτα & τιμές →

Σχόλια

Δεν υπάρχουν ακόμη σχόλια. Γίνετε ο πρώτος.

Αφήστε ένα σχόλιο

Τα σχόλια ελέγχονται πριν εμφανιστούν.