Skip to content
mrVanich
Назад до нотаток

Як створити 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 чи системою бронювання. Головне правило лишається тим самим: конфігурація і токени зберігаються окремо від коду, а сервіс має мінімально необхідні права.