
Telegram-боты уже нашли широкое применение в самых разных сферах нашей жизни. Они эффективно автоматизируют рутину, упрощают коммуникацию и решают широкий спектр задач — от учёта финансов до клиентской поддержки. Популярность Telegram-ботов растет, потому что их просто использовать, можно гибко настраивать и интегрировать с другими сервисами.
В статье расскажем, как создать простого telegram-бота на Python, который будет сообщать нужные данные о сервере. Вы познакомитесь с разработкой тг-ботов с нуля и узнаете, как разместить их на сервере, чтобы они работали круглосуточно.
Что такое telegram-бот и зачем он нужен
Telegram-бот — это небольшая программа, которая работает внутри мессенджера Telegram и взаимодействует с пользователями через чат в формате «Вопрос — Ответ». Вы пишете сообщение в чат с ботом, бот его обрабатывает и сразу же делает то, что вы попросили.
Telegram-бота можно создать для выполнения различных задач: от простых ответов по команде до более сложных операций, таких как проверка погоды, управление сервером или даже продажа товаров.
Подготовка к созданию бота
Перед созданием бота необходимо продумать его концепцию: определить ключевые задачи и выбрать технологический стек (язык программирования и сервер для размещения). Это сделает процесс разработки более эффективным.
В нашем случае мы создаём telegram-бота для мониторинга состояния сервера. Бот будет размещаться на этом же сервере. В качестве языка программирования выбран Python благодаря его популярности и обширным библиотекам для работы с Telegram.
Что будет уметь наш бот
По запросу пользователя бот будет предоставлять следующие данные о сервере:
- количество активных пользователей;
- загрузку процессора (CPU);
- использование оперативной памяти (RAM);
- нагрузку на дисковую подсистему (I/O);
- скорость интернет-соединения;
- аптайм (время непрерывной работы сервера).
Где будет находиться
Бота разместим на виртуальном сервере, так он будет доступен в любое время — простое решение для удаленного мониторинга. Если кратко, то чтобы реализовать задуманное, нам предстоит выполнить несколько шагов: сначала, по правилам Телеграма, мы должны зарегистрировать бота и получить API-токен, после — написать код на Python с нужной функциональностью, запустить нашего бота в Telegram и протестировать код, а затем разместить telegram-бот на нашем сервере. Далее разберем каждый шаг подробнее.
Регистрация бота через BotFather
Перед тем, как писать код, нам нужно получить уникальный API-токен нашего бота. Это делается через официального бота Telegram — BotFather.
- В списке чатов нужно найти BotFather и кликнуть Start.

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

Для справки:
- Имя, или название (name) — это то, что видят другие пользователи в списке контактов и чатов, и оно может быть не уникальным.
- Имя пользователя (username), или ник — уникальный идентификатор в формате @username, который используется для поиска и упоминания в сообщениях.
В нашем случае имя бота — bot_for_firstvds. Именно так он будет отображаться в списке чатов у пользователей этого бота, а ник — @test_firstvds_bot предназначен для поиска и упоминаний.
- В ответ BotFather пришлёт 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 --versionLinux и 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-dotenvuv запишет зависимости в 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 errorload_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-bot3. Скопируйте проект на сервер
С локального компьютера выполните команду из родительского каталога проекта:
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-bot4. Защитите .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;
- более подробное журналирование и мониторинг самой службы.