Всем привет! На связи Игорь из PQ.Hosting.
Хочу поделиться с вами одним наблюдением. Я довольно часто попадаю в такую ситуацию, когда ищу какую-нибудь базовую инструкцию и натыкаюсь на такие гайды, в которых явно чего-то не хватает. Один шаг пропущен, другой описан слишком вскользь, как будто это и так всем должно быть понятно. В итоге попытки следовать такой инструкции превращаются в сплошные боли и страдания.
Мы с командой решили исправить это хотя бы в нашей сфере хостинга и серверов. С сегодняшнего дня запускаем рубрику «База», в которой будем максимально понятно и подробно объяснять то, о чём вы, возможно, стеснялись спросить.
Первый выпуск посвятим очень прикладной теме: размещению Telegram-бота на виртуальном сервере. Для примера я задеплою самый простой бот, который умеет только здороваться. Однако по этому гайду вы сможете развернуть и более сложные проекты.
Поехали!
Этап 1: подготовка сервера
Для начала нужно будет немного подготовить нашу VPS к установке бота. Кстати, для этого я по традиции буду использовать сервер от PQ.Hosting. Если захотите арендовать производительную и надежную машину, то обязательно переходите на сайт и выбирайте подходящий тариф. И не забудьте использовать промокод HABR — по нему вы получите скидку 15% на заказ виртуальногго сервера.
Шаг 1. Обновление системы. Лучше, чтобы перед установкой все пакеты были свежими. Поэтому подключаемся к VPS по SSH и обновляемся:
sudo apt update && sudo apt upgrade
Шаг 2. Создание пользователя для бота. Это нужно для безопасности — сидеть из под рута не самая лучшая затея. А с отдельным юзером мы сможем работать более изолировано. Не будем лишний раз креативить и для понятности назовем его botuser:
sudo adduser botuser
После выполнения команды вам предложит создать отдельный пароль для пользователя, а также внести дополнительную информацию. Ее можно оставить пустой — просто нажимаете Enter.
Шаг 3. Установка Python 3 и pip. Свежая версия Ubuntu поставляется с Python 3. Вы можете проверить установленную версию «питона» с помощью команды:
python3 --version.

Но есть важный момент: в Ubuntu 24.04 (а также и в некоторых других дистрах с Python 3.12 и новее) не получится устанавливать необходимые библиотеки через менеджер pip в системный Python. Все этого сделано для того, чтобы не было конфликтов с пакетами из apt. Но ничего страшного: все это решается установкой через виртуальное окружение:
sudo apt install -y python3 python3-pip python3-venv
Шаг 4. Заходим под пользователем — в моем случае это botuser. Но если вы использовали другое имя, то вставьте его:
sudo -iu botuser
Шаг 5. Создание и активация виртуального окружения. Для этого потребуется выполнить две команды:
python3 -m venv ~/telegram-bot-venv
source ~/telegram-bot-venv/bin/activate
Шаг 6. Установка библиотеки. Здесь я использую самую популярную либу python-telegram-bot, но вы также можете установить Aiogram — на шаги деплоя этот выбор не повлияет.
pip install python-telegram-bot

На этом этапе система готова. Поэтому немного отвлечемся от терминала и перейдем в Telegram.
Этап 2: создание и деплой бота
Шаг 1. Получение токена Bot API. Для этого нам понадобится официальный бот BotFather — его можно найти по этой ссылке. Перейдите по ней, нажмите Start, выберите команду /newbot и следуйте дальнейшим инструкциям.

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

Шаг 2. Размещение бота на сервере. Снова возвращаемся в терминал и создаем отдельную папку для бота — так удобнее будет работать.
mkdir -p /home/botuser/telegram-bot
После переходим в нее
cd /home/botuser/telegram-bot
Далее создаем файл bot.py. Я использую для таких задач nano — люблю минимализм :) Но вы можете использовать любой консольный текстовый редактор
nano bot.py
После скопируйте код бота и вставьте его в текстовый файл — он будет выводить «Привет, мир!»
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes
BOT_TOKEN = "ВСТАВЬ_СЮДА_СВОЙ_ТОКЕН"
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("Привет, мир! Я бот :)")
async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text(update.message.text)
def main():
app = Application.builder().token(BOT_TOKEN).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))
app.run_polling(stop_signals=None)
if name == "__main__":
main()

Важно, чтобы токен был именно в кавычках — без них бот не будет работать. Сохраняем файл и выходим — в Nano это делается сочетанием клавиш Ctrl+O и Ctrl+X.
Шаг 3. Запуск бота. Осталось совсем немного! Запускаем файл, который мы ранее создали:
python bot.py
После остается только найти бот в Telegram по названию и отправить /start — бот должен с вами поздороваться.

Вот так выглядит самый минимальный деплой бота на виртуальный сервер. Я намеренно тут избегал темы установки UFW и настройки автозапуска с помощью systemd, чтобы не перегружать инструкцию и сохранить ее максимально легкой.
А вы уже пробовали размещать своих ботов на сервере? Или, может, есть идея для бота, которую давно хотите реализовать — но не знали, с чего начать? Делитесь в комментариях!
Andrey4ik
Подскажите что за приложение терминала? Очень красивое, мне надо.