Як створити Telegram-бота для логування повідомлень у файл на Ubuntu-сервері
Невеликий Telegram-бот може бути зручним журналом для звернень, службових повідомлень або тестування інтеграцій. У цій статті зберемо робочий варіант для Ubuntu-сервера: бот приймає текстові повідомлення, записує їх у файл, не тримає токен у коді та автоматично запускається після перезавантаження сервера.
Приклад використовує pyTelegramBotAPI. Він працює через long polling, тому не потребує відкритого HTTP-порту або webhook. Для реального проєкту варто пам’ятати: журнали можуть містити персональні дані. Не збирайте зайвого, обмежуйте доступ до файлів і повідомляйте користувачів про обробку даних, якщо бот використовується не лише вами.
1. Підготовка Ubuntu-сервера
Підключіться до сервера через SSH. Команди нижче встановлять Python, створять окрему директорію для застосунку та окремого системного користувача без прав адміністратора.
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3 python3-venv python3-pip
# Окремий системний користувач для бота
sudo adduser --system --group --home /opt/telegram-logger telegrambot
# Каталог застосунку
sudo mkdir -p /opt/telegram-logger
sudo chown -R telegrambot:telegrambot /opt/telegram-logger
sudo -u telegrambot -H bash
cd /opt/telegram-logger
2. Віртуальне середовище та залежності
Віртуальне середовище ізолює бібліотеки бота від системного Python. Це значно спрощує оновлення та відновлення сервера.
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install pyTelegramBotAPI python-dotenv
# Фіксуємо версії для майбутнього відновлення
pip freeze > requirements.txt
3. Код бота
Створіть файл bot.py. Бот записує дату, ідентифікатор чату, дані автора та текст повідомлення. Для самого журналу використовується ротація: коли файл досягає 5 МБ, створюється новий, а кілька попередніх копій зберігаються поруч.
import logging
import os
import sys
from logging.handlers import RotatingFileHandler
from pathlib import Path
import telebot
from dotenv import load_dotenv
BASE_DIR = Path(__file__).resolve().parent
load_dotenv(BASE_DIR / ".env")
TOKEN = os.getenv("BOT_TOKEN")
if not TOKEN:
sys.exit("BOT_TOKEN не знайдено. Перевірте файл .env")
LOG_FILE = BASE_DIR / "messages.log"
logger = logging.getLogger("telegram_logger")
logger.setLevel(logging.INFO)
file_handler = RotatingFileHandler(
LOG_FILE,
maxBytes=5 * 1024 * 1024,
backupCount=5,
encoding="utf-8",
)
file_handler.setFormatter(
logging.Formatter("%(asctime)s | chat=%(chat)s | user=%(user)s | %(message)s")
)
logger.addHandler(file_handler)
console_handler = logging.StreamHandler()
console_handler.setFormatter(logging.Formatter("%(asctime)s | %(levelname)s | %(message)s"))
logger.addHandler(console_handler)
bot = telebot.TeleBot(TOKEN, parse_mode=None)
@bot.message_handler(content_types=["text"])
def log_text_message(message):
user = message.from_user
username = f"@{user.username}" if user.username else "без username"
full_name = " ".join(part for part in [user.first_name, user.last_name] if part)
author = f"{full_name or 'Невідомий користувач'} ({username}, id={user.id})"
logger.info(
message.text.replace("\n", " "),
extra={"chat": message.chat.id, "user": author},
)
bot.reply_to(message, "Повідомлення записано в журнал.")
@bot.message_handler(content_types=["photo", "document", "video", "audio", "voice", "sticker"])
def log_non_text_message(message):
user = message.from_user
author = f"{user.first_name or 'Невідомий користувач'} (id={user.id})"
logger.info(
"Отримано вкладення: %s",
message.content_type,
extra={"chat": message.chat.id, "user": author},
)
bot.reply_to(message, "Вкладення зафіксовано. Текст повідомлення не зберігається.")
if __name__ == "__main__":
logger.info("Бот запущено", extra={"chat": "-", "user": "-"})
bot.infinity_polling(
skip_pending=True,
timeout=30,
long_polling_timeout=30,
allowed_updates=["message"],
)
Запис у messages.log матиме приблизно такий вигляд:
2026-07-22 14:30:05,123 | chat=123456789 | user=Іван Петренко (@ivan, id=123456789) | Добрий день
4. Безпечне зберігання токена
Токен не має потрапляти до bot.py, Git-репозиторію чи скриншотів. Створіть у тому ж каталозі файл .env:
nano .env
BOT_TOKEN=вставте_сюди_токен_від_BotFather
Обмежте права на файл і поверніть собі звичайну сесію, якщо ви працювали від імені системного користувача.
chmod 600 .env
exit
5. Тестовий запуск
sudo -u telegrambot -H bash
cd /opt/telegram-logger
source venv/bin/activate
python bot.py
Надішліть боту повідомлення. У другому терміналі перевірте журнал:
tail -f /opt/telegram-logger/messages.log
6. Запуск через systemd
systemd запускатиме бота після перезавантаження сервера, перезапускатиме його після помилки та збиратиме службові логи.
sudo nano /etc/systemd/system/telegram-logger.service
[Unit]
Description=Telegram Logger Bot
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=telegrambot
Group=telegrambot
WorkingDirectory=/opt/telegram-logger
EnvironmentFile=/opt/telegram-logger/.env
ExecStart=/opt/telegram-logger/venv/bin/python /opt/telegram-logger/bot.py
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Збережіть файл і активуйте сервіс:
sudo systemctl daemon-reload
sudo systemctl enable --now telegram-logger
sudo systemctl status telegram-logger
7. Перевірка та обслуговування
- Перегляд живих логів сервісу:
sudo journalctl -u telegram-logger -f - Перезапуск після зміни коду:
sudo systemctl restart telegram-logger - Перевірка останніх записів у файлі:
tail -n 50 /opt/telegram-logger/messages.log - Оновлення бібліотек: активуйте
venv, виконайтеpip install -U pyTelegramBotAPI python-dotenvі перезапустіть сервіс.
Що можна додати далі
Ця основа вже достатня для стабільного запуску. Наступним кроком можна додати команди /start і /help, запис звернень у базу даних, надсилання сповіщень адміністратору, обробку файлів або інтеграцію з CRM чи системою бронювання. Головне правило лишається тим самим: конфігурація і токени зберігаються окремо від коду, а сервіс має мінімально необхідні права.