Тариф успешно добавлен в корзину
В корзину

Как создать telegram-бота на Python

Создание телеграм-бота

Telegram-боты уже нашли широкое применение в самых разных сферах нашей жизни. Они эффективно автоматизируют рутину, упрощают коммуникацию и решают широкий спектр задач — от учёта финансов до клиентской поддержки. Популярность Telegram-ботов растет, потому что их просто использовать, можно гибко настраивать и интегрировать с другими сервисами.

В статье расскажем, как создать простого telegram-бота на Python, который будет сообщать нужные данные о сервере. Вы познакомитесь с разработкой тг-ботов с нуля и узнаете, как разместить их на сервере, чтобы они работали круглосуточно.

Что такое telegram-бот и зачем он нужен

Telegram-бот — это небольшая программа, которая работает внутри мессенджера Telegram и взаимодействует с пользователями через чат в формате «Вопрос — Ответ». Вы пишете сообщение в чат с ботом, бот его обрабатывает и сразу же делает то, что вы попросили. 

Telegram-бота можно создать для выполнения различных задач: от простых ответов по команде до более сложных операций, таких как проверка погоды, управление сервером или даже продажа товаров.

Подготовка к созданию бота

Перед созданием бота необходимо продумать его концепцию: определить ключевые задачи и выбрать технологический стек (язык программирования и сервер для размещения). Это сделает процесс разработки более эффективным.

В нашем случае мы создаём telegram-бота для мониторинга состояния сервера. Бот будет размещаться на этом же сервере. В качестве языка программирования выбран Python благодаря его популярности и обширным библиотекам для работы с Telegram.

Что будет уметь наш бот

По запросу пользователя бот будет предоставлять следующие данные о сервере:

  • количество активных пользователей;
  • загрузку процессора (CPU);
  • использование оперативной памяти (RAM);
  • нагрузку на дисковую подсистему (I/O);
  • скорость интернет-соединения;
  • аптайм (время непрерывной работы сервера).

Где будет находиться

Бота разместим на виртуальном сервере, так он будет доступен в любое время — простое решение для удаленного мониторинга. Если кратко, то чтобы реализовать задуманное, нам предстоит выполнить несколько шагов: сначала, по правилам Телеграма, мы должны зарегистрировать бота и получить API-токен, после — написать код на Python с нужной функциональностью, запустить нашего бота в Telegram и протестировать код, а затем разместить telegram-бот на нашем сервере. Далее разберем каждый шаг подробнее.

Регистрация бота через BotFather

Перед тем, как писать код, нам нужно получить уникальный API-токен нашего бота. Это делается через официального бота Telegram — BotFather. 

  1. В списке чатов нужно найти BotFather и кликнуть Start.
Регистрация бота через BotFather
  1. Далее выберите в списке команду /newbot и отправьте её. Затем, следуя инструкциям, укажите название бота и уникальное имя пользователя, которое должно заканчиваться на “bot”. 
Именуем телеграм-бота

Для справки: 

  • Имя, или название (name) — это то, что видят другие пользователи в списке контактов и чатов, и оно может быть не уникальным.
  • Имя пользователя (username), или ник — уникальный идентификатор в формате @username, который используется для поиска и упоминания в сообщениях.  

В нашем случае имя бота — bot_for_firstvds. Именно так он будет отображаться в списке чатов у пользователей этого бота, а ник — @test_firstvds_bot предназначен для поиска и упоминаний.

  1. В ответ BotFather пришлёт API-токен. Этот ключ будет нужен для подключения вашей программы к боту. 
Получение API-токена

Наш бот зарегистрирован, и мы получили его API. Можем двигаться дальше. Если хотите разобраться подробнее, в меню BotFather доступен мануал по Bot API.

Установка uv

Для начала нам нам нужно установить Python, для написания кода. Для удобства будет использовать uv.  Это чрезвычайно быстрый универсальный менеджер пакетов и проектов для Python, написанный на языке Rust. Он позволит нам удобно скачивать дополнительные пакеты и использовать нужную версию языка.

Windows

Откройте PowerShell и выполните команду из официальной инструкции uv:

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Закройте и снова откройте терминал, затем проверьте установку:

uv --version

Linux и macOS

curl -LsSf https://astral.sh/uv/install.sh | sh

После установки перезапустите оболочку и проверьте команду:

uv --version

Создание проекта

Создадим обычное приложение без упаковки в Python-пакет:

uv init --no-package --python 3.14 firstvds-bot
cd firstvds-bot

Добавим зависимости:

uv add pyTelegramBotAPI psutil python-dotenv

uv запишет зависимости в pyproject.toml, создаст файл блокировки uv.lock и при первом запуске подготовит виртуальное окружение .venv. Отдельно вызывать pip, создавать requirements.txt или активировать виртуальное окружение не нужно.

Итоговая структура проекта будет выглядеть так:

Файлы pyproject.toml и uv.lock создаются командами uv init и uv add. Остальные файлы заполним вручную.

Разберём каждый файл проекта:

  • .env — файл с конфиденциальными настройками: токеном Telegram-бота и списком пользователей, которым разрешён доступ. Он не должен попадать в Git-репозиторий.
  • .env.example — пример заполнения переменных окружения. Его можно использовать как шаблон для создания собственного .env.
  • .gitignore — список файлов и папок, которые Git не будет отслеживать: виртуальное окружение, кэш Python, собранные пакеты и .env с секретами.
  • .python-version — закрепляет используемую версию Python для инструментов управления версиями: в проекте указана Python 3.14.
  • main.py — главный файл Telegram-бота. Запускает бота, обрабатывает команду /start, проверяет права пользователя, показывает кнопку проверки сервера и отправляет собранные метрики в чат.
  • metrics.py — модуль для получения показателей сервера. Собирает аптайм, число активных сессий, загрузку CPU и RAM, скорость сети, а также скорость чтения и записи на диск.
  • config.py — файл для чтения настроек из .env. Получает токен бота и разрешённые Telegram ID, а также проверяет, что значения заполнены корректно.
  • pyproject.toml — основной файл настроек Python-проекта. В нём указаны название проекта, требуемая версия Python и используемые библиотеки: psutil, pyTelegramBotAPI и python-dotenv.
  • uv.lock — файл с точными версиями всех установленных зависимостей. Нужен, чтобы у всех разработчиков и на сервере устанавливался одинаковый набор библиотек.
  • .venv/ — виртуальное окружение Python. Здесь хранятся установленные библиотеки и служебные файлы, необходимые только для локальной работы проекта.
  • __pycache__/ — автоматически созданная папка Python с скомпилированными файлами (.pyc) для ускорения запуска программы.

Настройка переменных окружения

Создайте файл .env.example без настоящих секретов:

BOT_TOKEN=replace_with_bot_token
ALLOWED_USER_IDS=

Скопируйте его в .env и вставьте токен, полученный от BotFather:

BOT_TOKEN=1234567890:AAExampleTokenThatMustRemainSecret
ALLOWED_USER_IDS=

ALLOWED_USER_IDS — список числовых Telegram ID через запятую. Сначала его можно оставить пустым: бот не покажет метрики, но в ответ на /start сообщит ID отправителя. После этого добавьте свой ID в .env, например:

BOT_TOKEN=1234567890:AAExampleTokenThatMustRemainSecret
ALLOWED_USER_IDS=123456789,987654321

Дополните .gitignore, добавив туда .env:

# Python-generated files
__pycache__/
*.py[oc]
build/
dist/
wheels/
*.egg-info

# Virtual environments
.venv

.env

Файл .env.example можно хранить в репозитории, а .env — нельзя, это действие нужно, чтобы конфиденциальные данные не утекали в публичную сеть.  

Чтение настроек: config.py

Создайте config.py:

import os
from dotenv import load_dotenv
load_dotenv()
BOT_TOKEN = (os.getenv("BOT_TOKEN") or "").strip()
if not BOT_TOKEN:
   raise RuntimeError("Переменная окружения BOT_TOKEN не задана")
raw_user_ids = os.getenv("ALLOWED_USER_IDS", "")
try:
   ALLOWED_USER_IDS = {
       int(value.strip())
       for value in raw_user_ids.split(",")
       if value.strip()
   }
except ValueError as error:
   raise RuntimeError(
       "ALLOWED_USER_IDS должен содержать числовые Telegram ID через запятую"
   ) from error

load_dotenv() загружает значения из локального файла .env. На сервере systemd также передаст эти переменные процессу через директиву EnvironmentFile.

Сбор метрик: metrics.py

Теперь нам нужно написать код, который позволит получать информацию о нашем сервере. В IDE создадим файл с названием metrics.py и напишем код, который и будет собирать необходимые нам данные. А именно: 

  • количество активных пользователей, 
  • загрузку процессора (CPU), 
  • использование оперативной памяти (RAM), 
  • нагрузку на дисковую подсистему (I/O), 
  • скорость интернет-соединения, 
  • аптайм (время непрерывной работы сервера). 

Для этого используем популярные библиотеки: psutil, os.

import time
from typing import Any
import psutil

BYTES_IN_MIB = 1024**2
BITS_IN_MEGABIT = 1_000_000

def collect_metrics(sample_seconds: float = 1.0) -> dict[str, Any]:
   """Собрать системные показатели за один интервал измерения."""
   if sample_seconds <= 0:
       raise ValueError("sample_seconds должен быть больше нуля")
   net_before = psutil.net_io_counters()
   disk_before = psutil.disk_io_counters()
   started_at = time.monotonic()
   # Вызов блокируется на sample_seconds и возвращает загрузку CPU за интервал.
   cpu_percent = psutil.cpu_percent(interval=sample_seconds)
   elapsed = time.monotonic() - started_at
   net_after = psutil.net_io_counters()
   disk_after = psutil.disk_io_counters()
   received_bytes = max(0, net_after.bytes_recv - net_before.bytes_recv)
   sent_bytes = max(0, net_after.bytes_sent - net_before.bytes_sent)
   download_mbit_s = received_bytes * 8 / elapsed / BITS_IN_MEGABIT
   upload_mbit_s = sent_bytes * 8 / elapsed / BITS_IN_MEGABIT
   read_mib_s = 0.0
   write_mib_s = 0.0
   if disk_before is not None and disk_after is not None:
       read_bytes = max(0, disk_after.read_bytes - disk_before.read_bytes)
       write_bytes = max(0, disk_after.write_bytes - disk_before.write_bytes)
       read_mib_s = read_bytes / elapsed / BYTES_IN_MIB
       write_mib_s = write_bytes / elapsed / BYTES_IN_MIB
   uptime_seconds = max(0, int(time.time() - psutil.boot_time()))
   return {
       "uptime_seconds": uptime_seconds,
       "active_sessions": len(psutil.users()),
       "cpu_percent": round(cpu_percent, 1),
       "ram_percent": round(psutil.virtual_memory().percent, 1),
       "download_mbit_s": round(download_mbit_s, 2),
       "upload_mbit_s": round(upload_mbit_s, 2),
       "disk_read_mib_s": round(read_mib_s, 2),
       "disk_write_mib_s": round(write_mib_s, 2),
   }

Логика бота: main.py

Все необходимые файлы с функциями и переменными написаны, перейдём теперь к написанию самого бота. Для этого создадим ещё один файл в IDE и оставим название по умолчанию main.py. Импортируем необходимые функции из файла metrics.py и переменную с нашим API-токеном из config.py.

Есть несколько библиотек на Python для создания Telegram-ботов, воспользуемся уже знакомой библиотекой telebot, она же pyTelegramBotAPI.

Для тех, кто желает более подробно ознакомиться с возможностями библиотеки, на странице GitHub telebot имеются наглядные примеры кода.

Файл main.py будет иметь следующее содержимое:

import logging
import telebot
from telebot import types
from config import ALLOWED_USER_IDS, BOT_TOKEN
from metrics import collect_metrics
logging.basicConfig(
   level=logging.INFO,
   format="%(asctime)s %(levelname)s %(name)s: %(message)s",
)
logger = logging.getLogger(__name__)
bot = telebot.TeleBot(BOT_TOKEN)

def is_allowed(user_id: int) -> bool:
   return user_id in ALLOWED_USER_IDS

def format_uptime(total_seconds: int) -> str:
   days, remainder = divmod(total_seconds, 86_400)
   hours, remainder = divmod(remainder, 3_600)
   minutes, _ = divmod(remainder, 60)
   return f"{days} д. {hours} ч. {minutes} мин."

@bot.message_handler(commands=["start"])
def handle_start(message: telebot.types.Message) -> None:
   user_id = message.from_user.id
   if not is_allowed(user_id):
       bot.send_message(
           message.chat.id,
           "Доступ к метрикам закрыт. "
           f"Ваш Telegram ID: {user_id}. "
           "Добавьте его в ALLOWED_USER_IDS и перезапустите бота.",
       )
       return
   keyboard = types.InlineKeyboardMarkup()
   keyboard.add(
       types.InlineKeyboardButton(
           "Проверить сервер",
           callback_data="check_server",
       )
   )
   bot.send_message(
       message.chat.id,
       "Получить текущие показатели сервера?",
       reply_markup=keyboard,
   )

@bot.callback_query_handler(func=lambda call: call.data == "check_server")
def handle_server_info(call: telebot.types.CallbackQuery) -> None:
   user_id = call.from_user.id
   if not is_allowed(user_id):
       bot.answer_callback_query(call.id, "Доступ запрещен", show_alert=True)
       return
   bot.answer_callback_query(call.id, "Собираю показатели...")
   try:
       metrics = collect_metrics(sample_seconds=1.0)
   except Exception:
       logger.exception("Не удалось собрать метрики сервера")
       bot.send_message(call.message.chat.id, "Не удалось получить показатели сервера")
       return
   text = (
       f"Аптайм: {format_uptime(metrics['uptime_seconds'])}\n"
       f"Активные сессии: {metrics['active_sessions']}\n"
       f"CPU: {metrics['cpu_percent']}%\n"
       f"RAM: {metrics['ram_percent']}%\n"
       f"Сеть: прием {metrics['download_mbit_s']} Мбит/с, "
       f"передача {metrics['upload_mbit_s']} Мбит/с\n"
       f"Диск: чтение {metrics['disk_read_mib_s']} МиБ/с, "
       f"запись {metrics['disk_write_mib_s']} МиБ/с"
   )
   bot.send_message(call.message.chat.id, text)

if __name__ == "__main__":
   logger.info("Бот запущен")
   bot.infinity_polling(
       skip_pending=True,
       timeout=30,
       long_polling_timeout=30,
   )

Чтобы понять принцип работы бота, разберем его ключевые элементы: от запуска и настройки интерфейса до обработки команд и формирования итогового отчёта о состоянии сервера. Далее каждый из этих элементов рассмотрим отдельно.

1. Обработчик команды /start

@bot.message_handler(commands=["start"])
def handle_start(message: telebot.types.Message) -> None:

Декоратор @bot.message_handler(commands=["start"]) указывает, что функция handle_start будет вызвана, когда пользователь отправит боту команду /start. Обычно Telegram отправляет её автоматически, когда пользователь впервые открывает чат с ботом и нажимает кнопку Старт.

Сначала бот получает Telegram ID пользователя:

user_id = message.from_user.id

Далее выполняется проверка доступа с помощью функции is_allowed(user_id). Она сравнивает ID пользователя со списком ALLOWED_USER_IDS, который задан в файле .env.

Если пользователь не добавлен в список разрешённых, бот сообщает об отказе в доступе и показывает его ID, чтобы его можно было добавить в настройки:

bot.send_message(
   message.chat.id,
   "Доступ к метрикам закрыт. "
   f"Ваш Telegram ID: {user_id}. "
   "Добавьте его в ALLOWED_USER_IDS и перезапустите бота.",
)

Если доступ разрешён, создаётся объект InlineKeyboardMarkup — встроенная клавиатура, которая отображается прямо под сообщением бота:

keyboard = types.InlineKeyboardMarkup()
Затем в клавиатуру добавляется кнопка:
types.InlineKeyboardButton(
   "Проверить сервер",
   callback_data="check_server",
)

Здесь:

  • "Проверить сервер" — текст, который видит пользователь на кнопке;
  • callback_data="check_server" — служебное значение, которое бот получит после нажатия кнопки.

После этого бот отправляет пользователю сообщение с кнопкой:

bot.send_message(
   message.chat.id,
   "Получить текущие показатели сервера?",
   reply_markup=keyboard,
)

Параметр reply_markup=keyboard прикрепляет созданную кнопку к сообщению.

2. Обработчик нажатия на кнопку

@bot.callback_query_handler(func=lambda call: call.data == "check_server")
def handle_server_info(call: telebot.types.CallbackQuery) -> None:

Декоратор @bot.callback_query_handler(...) указывает, что функция handle_server_info будет вызвана после нажатия на встроенную кнопку.

Условие:

lambda call: call.data == "check_server"

проверяет значение callback_data. Поэтому обработчик сработает только для кнопки, у которой указано:

callback_data="check_server"

В начале функции бот снова проверяет права пользователя. Это необходимо, потому что пользователь теоретически может попытаться отправить запрос к обработчику без использования команды /start.

if not is_allowed(user_id):
   bot.answer_callback_query(call.id, "Доступ запрещен", show_alert=True)
   return

Если доступ есть, бот показывает пользователю уведомление:

bot.answer_callback_query(call.id, "Собираю показатели...")

После этого вызывается функция:

metrics = collect_metrics(sample_seconds=1.0)

Она находится в файле metrics.py и собирает показатели сервера за одну секунду: загрузку процессора, использование оперативной памяти, скорость сети и диска, время работы системы и число активных сессий.

Если при получении данных возникает ошибка, она записывается в логи, а пользователю отправляется сообщение о том, что метрики получить не удалось.

3. Формирование и отправка показателей сервера

Полученные данные сохраняются в переменной metrics. Затем бот формирует понятное текстовое сообщение:

text = (
   f"Аптайм: {format_uptime(metrics['uptime_seconds'])}\n"
   f"Активные сессии: {metrics['active_sessions']}\n"
   f"CPU: {metrics['cpu_percent']}%\n"
   f"RAM: {metrics['ram_percent']}%\n"
   f"Сеть: прием {metrics['download_mbit_s']} Мбит/с, "
   f"передача {metrics['upload_mbit_s']} Мбит/с\n"
   f"Диск: чтение {metrics['disk_read_mib_s']} МиБ/с, "
   f"запись {metrics['disk_write_mib_s']} МиБ/с"
)

В сообщении выводятся:

  • аптайм — сколько времени сервер работает без перезагрузки;
  • активные сессии — количество пользователей, подключённых к серверу;
  • CPU — текущая загрузка процессора;
  • RAM — процент использования оперативной памяти;
  • сеть — скорость приёма и передачи данных;
  • диск — скорость чтения и записи данных на накопитель.

Функция format_uptime() преобразует аптайм из секунд в более удобный формат: дни, часы и минуты.

В конце сформированный текст отправляется в тот же чат, из которого пользователь нажал кнопку:

bot.send_message(call.message.chat.id, text)

call.message.chat.id определяет идентификатор текущего чата, а text содержит подготовленную информацию о состоянии сервера.

Локальный запуск и проверка

Проверьте, что .env находится в корне проекта, и запустите бота:

uv run python main.py

Откройте чат с ботом и отправьте /start.

Если ALLOWED_USER_IDS пока пуст, бот сообщит ваш Telegram ID. Добавьте его в .env, остановите процесс сочетанием Ctrl+C и запустите команду еще раз.

После этого команда /start покажет кнопку. Нажмите на неё, чтобы получить информацию о сервере.

Если бот не отвечает, проверьте:

  • Нет ли ошибки в терминале.
  • Верно ли скопирован BOT_TOKEN.
  • Не запущен ли второй экземпляр бота с тем же токеном и long polling.
  • Есть ли доступ к api.telegram.org из вашей сети.

Как развернуть telegram-бота на сервере

Существует несколько подходов к развертыванию telegram-бота на сервере: можно создать отдельный процесс, службу, Docker-контейнер и т. д. Каждый из способов имеет преимущества и недостатки.

Создание службы

Преимущества: автоматически запускается и перезапускается, логи доступны через journalctl, можно запускать от имени другого пользователя.

Недостатки: подойдет более опытным пользователям. Потребуется создать файл службы.

Создание процесса

Преимущества: простая настройка и использование.

Недостатки: запускать, перезапускать и отслеживать логи придется вручную, запуск от текущего пользователя.

Docker-контейнер

Преимущества: можно настроить автозапуск и перезапуск, легко отслеживать и читать логи.

Недостатки: потребует создания Dockerfile — подойдет тем, кто уже немного знаком с Docker, а также в нашем случае потребует более глубокой настройки Dockerfile. 

Docker-контейнер — это изолированная среда, а наш бот должен получать информацию о хосте и выводить информацию о сервере. Для тех, кто желает ознакомиться поближе с Docker, информация доступна в нашей базе знаний.

Мы рассмотрим первый вариант — создание службы. Разместим бота на виртуальном сервере под управлением Ubuntu 20.04.

1. Установите системные пакеты и uv

Подключитесь к серверу по SSH под обычным пользователем с правом sudo:

ssh deploy@SERVER_IP

Установите Python, curl и сертификаты:

sudo apt update
sudo apt install -y python3 curl ca-certificates

Установите uv в /usr/local/bin, чтобы команда была доступна для системного развертывания:

curl -LsSf https://astral.sh/uv/install.sh | sudo env UV_INSTALL_DIR=/usr/local/bin UV_NO_MODIFY_PATH=1 sh

Проверьте установку:

uv --version
python3 --version

2. Создайте отдельного пользователя

sudo useradd --system  --no-create-home --home-dir /opt/firstvds-bot  --shell /usr/sbin/nologin firstvds-bot

Это системный пользователь без пароля и без возможности войти в систему как обычный пользователь — например, открыть терминал и выполнять команды. Он предназначен только для запуска службы.

Создайте каталог приложения:

sudo install -d -o root -g firstvds-bot -m 750 /opt/firstvds-bot

И сделайте временную папку для кода бота:

mkdir firstvds-bot

3. Скопируйте проект на сервер

С локального компьютера выполните команду из родительского каталога проекта:

scp \
 firstvds-bot/main.py \
 firstvds-bot/metrics.py \
 firstvds-bot/config.py \
 firstvds-bot/pyproject.toml \
 firstvds-bot/uv.lock \
 firstvds-bot/.env \
 firstvds-bot/.gitignore \
 firstvds-bot/.python-version \
 root@ВашIP:~/firstvds-bot/

На сервере скопируйте файлы приложения в /opt:

sudo cp -a ~/firstvds-bot/. /opt/firstvds-bot/
sudo chown -R root:firstvds-bot /opt/firstvds-bot
sudo chmod 750 /opt/firstvds-bot

4. Защитите .env и установите зависимости

Оставьте владельцем .env пользователя root, разрешите группе службы только чтение и закройте доступ для остальных:

sudo chown root:firstvds-bot /opt/firstvds-bot/.env
sudo chmod 640 /opt/firstvds-bot/.env

Так служба сможет прочитать токен, но не сможет изменить .env. Остальные файлы также оставьте под владельцем root, чтобы процесс бота не мог менять собственный код.

Создайте окружение из зафиксированных зависимостей:

cd /opt/firstvds-bot
sudo uv sync --frozen --no-dev --python /usr/bin/python3

Флаг --frozen запрещает незаметно менять uv.lock на сервере. Сервер получит те версии зависимостей, которые были зафиксированы при разработке.

Проверьте запуск от имени отдельного пользователя:

sudo   /opt/firstvds-bot/.venv/bin/python  /opt/firstvds-bot/main.py

Если бот отвечает, остановите тест сочетанием Ctrl+C.

5. Создайте службу systemd

Откройте файл службы:

sudo nano /etc/systemd/system/firstvds-bot.service

Добавьте конфигурацию:

[Unit]
Description=Telegram server monitoring bot
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=firstvds-bot
Group=firstvds-bot
WorkingDirectory=/opt/firstvds-bot
EnvironmentFile=/opt/firstvds-bot/.env
Environment=PYTHONUNBUFFERED=1
Environment=PYTHONDONTWRITEBYTECODE=1
ExecStart=/opt/firstvds-bot/.venv/bin/python /opt/firstvds-bot/main.py
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true
ProtectHome=true
ProtectSystem=strict
[Install]
WantedBy=multi-user.target

Основные параметры:

  • User и Group запускают процесс от имени firstvds-bot, а не root;
  • EnvironmentFile передает токен и список разрешенных пользователей без записи секрета в unit-файл;
  • ExecStart использует Python из окружения, созданного uv;
  • Restart=on-failure перезапускает приложение после ошибки, но не после штатной остановки;
  • параметры NoNewPrivileges, PrivateTmp, ProtectHome и ProtectSystem ограничивают доступ процесса к системе.

Примените конфигурацию и запустите службу:

sudo systemctl daemon-reload
sudo systemctl enable --now firstvds-bot.service

Проверьте состояние:

sudo systemctl status firstvds-bot.service

Посмотрите последние журнальные записи:

sudo journalctl -u firstvds-bot.service

Для просмотра журнала в реальном времени:

sudo journalctl -u firstvds-bot.service -f

Обновление приложения

После изменения кода или зависимостей скопируйте новые файлы на сервер, затем выполните:

cd /opt/firstvds-bot
sudo chown -R root:firstvds-bot /opt/firstvds-bot
sudo chown firstvds-bot:firstvds-bot /opt/firstvds-bot/.env
sudo chmod 600 /opt/firstvds-bot/.env
sudo uv sync --frozen --no-dev --python /usr/bin/python3
sudo systemctl restart firstvds-bot.service
sudo systemctl status firstvds-bot.service

Не заменяйте рабочий .env файлом из репозитория или локального архива.

Остановка и отключение службы

Остановить бота до следующей загрузки сервера:

sudo systemctl stop firstvds-bot.service

Отключить автозапуск и сразу остановить службу:

sudo systemctl disable --now firstvds-bot.service

Ограничения примера

  • Показатели снимаются только по запросу и не сохраняются в базу данных.
  • Сетевая скорость — текущий трафик сервера за интервал измерения, а не результат теста пропускной способности до внешнего сервера.
  • Суммарные сетевые счетчики могут включать loopback, VPN, Docker и другие виртуальные интерфейсы.
  • Long polling подходит для небольшого бота. При росте нагрузки можно перейти на webhook.
  • Не добавляйте выполнение произвольных shell-команд из Telegram. Если такая функция действительно нужна, используйте фиксированный список операций, отдельные права и строгую проверку отправителя.

Что можно добавить

Следующим шагом можно реализовать:

  • автоматические уведомления при высокой загрузке CPU или RAM;
  • пороги для сетевой и дисковой активности;
  • хранение истории метрик;
  • графики за выбранный период;
  • оповещения о входе по SSH;
  • более подробное журналирование и мониторинг самой службы.

Возможно, вам будет интересно

Было интересно?

Назад к списку
Скидка новым клиентам
Закажите сервер сегодня и получите скидку на первый месяц аренды!
Наш сайт использует cookies Вы можете отключить их в настройках браузера, но это может ограничить функционал. Оставаясь на сайте, вы соглашаетесь с использованием cookies.