bolt Valebyte VPS от $4/мес — NVMe, запуск за 60 секунд.

Получить VPS arrow_forward
eco Начальный Туториал

Развёртывание Production Telegram-бота на VPS: aiogram, systemd и Nginx

calendar_month Aug 27, 2026 schedule 18 мин. чтения visibility 15 просмотров
Развёртывание Production Telegram-бота на VPS: aiogram, systemd и Nginx
info

Нужен сервер для этого гайда? Мы предлагаем выделенные серверы и VPS в 50+ странах с мгновенной настройкой.

Нужен сервер для этого гайда?

Разверните VPS или выделенный сервер за минуты.

Развёртывание Production Telegram-бота на VPS: aiogram, systemd и Nginx

TL;DR

В этом подробном гайде мы шаг за шагом настроим и развернём Telegram-бота на фреймворке aiogram 3.x на виртуальном приватном сервере (VPS), используя systemd для управления процессом и Nginx в качестве обратного прокси для обеспечения безопасности и стабильности, а также настроим автоматические бэкапы и мониторинг, чтобы ваш бот работал надёжно 24/7.

  • Вы узнаете, как выбрать подходящий VPS и подготовить его к работе.
  • Мы установим Python 3.12, aiogram 3.x, Gunicorn и Nginx.
  • Настроим systemd-сервис для автоматического запуска и перезапуска бота.
  • Обеспечим HTTPS-соединение для вебхуков Nginx с помощью Let's Encrypt.
  • Внедрение лучших практик для бэкапов, обслуживания и устранения неполадок.
  • Ваш Telegram-бот будет работать стабильно, безопасно и автоматически.

Что мы настраиваем и зачем

Схема: Что мы настраиваем и зачем
Схема: Что мы настраиваем и зачем

Мы будем развёртывать Telegram-бота, написанного на Python с использованием фреймворка aiogram 3.x, в production-окружении на VPS. Основная задача — обеспечить его стабильную, безопасную и автоматизированную работу без необходимости ручного вмешательства после первоначальной настройки. В итоге вы получите надёжного Telegram-бота, который будет обрабатывать запросы пользователей 24/7, используя вебхуки для мгновенного получения обновлений от Telegram API.

Использование вебхуков (вместо long polling) является предпочтительным методом для production-ботов, так как он значительно снижает нагрузку на сервер, исключая необходимость постоянно опрашивать API Telegram. Когда происходит событие (например, новое сообщение), Telegram сам отправляет HTTP-запрос на ваш сервер. Для приёма этих запросов нам понадобится веб-сервер Nginx, который будет выступать в роли обратного прокси, перенаправляя запросы к нашему боту, а также обеспечивать TLS/SSL-шифрование, что является обязательным требованием Telegram для вебхуков.

Альтернативы: Cloud-Managed vs. Self-Hosted

Существует несколько подходов к развёртыванию Telegram-ботов:

  • Cloud-Managed (Serverless/PaaS): Такие решения, как AWS Lambda, Google Cloud Functions, Heroku, Vercel или PythonAnywhere, позволяют быстро развернуть бота без глубоких знаний администрирования сервера. Они предлагают автоматическое масштабирование и управление инфраструктурой.
    • Преимущества: Простота развёртывания, отсутствие необходимости управлять сервером, автоматическое масштабирование.
    • Недостатки: Ограниченная гибкость, потенциально более высокая стоимость при больших нагрузках, привязка к конкретному провайдеру, иногда сложности с persistent storage.
  • Self-Hosted на VPS/Dedicated: Размещение бота на собственном VPS или выделенном сервере даёт полный контроль над окружением.
    • Преимущества: Полный контроль над конфигурацией, большая гибкость, потенциально более низкая стоимость в долгосрочной перспективе, конфиденциальность данных, возможность размещать несколько сервисов на одном сервере.
    • Недостатки: Требуются знания Linux-администрирования, ручная настройка и поддержка, ответственность за безопасность и стабильность.

Для тех, кто ценит полный контроль, гибкость и хочет глубоко понимать процесс, self-hosted подход на VPS является оптимальным выбором. Он позволяет получить ценный опыт работы с Linux, веб-серверами и системными службами, что критически важно для любого разработчика или фаундера.

Какой VPS-конфиг нужен под эту задачу

Схема: Какой VPS-конфиг нужен под эту задачу
Схема: Какой VPS-конфиг нужен под эту задачу

Требования к VPS для Telegram-бота могут сильно варьироваться в зависимости от его функционала, количества пользователей и интенсивности использования. Для большинства ботов, особенно на начальном этапе, не требуется мощное железо.

Минимальные требования (для небольшого бота до 1000 активных пользователей):

  • CPU: 1 ядро (x86-64). Современные процессоры достаточно производительны.
  • RAM: 1-2 GB. Python-приложения и Nginx с systemd занимают около 300-500 MB RAM, остальное для кэширования и пиковых нагрузок.
  • Диск: 25-50 GB SSD. SSD значительно ускоряет работу системы и дисковые операции. Объём нужен для ОС, логов, кода бота и возможных данных (например, SQLite базы).
  • Сеть: 100 Mbps, желательно 1 Gbps. Для вебхуков важен стабильный и быстрый канал, но для большинства ботов не требуется огромная пропускная способность.

Рекомендуемый VPS-план для среднего бота (до 10 000 активных пользователей, с базой данных):

  • CPU: 2 ядра.
  • RAM: 4 GB.
  • Диск: 100-150 GB SSD. Если планируется использовать PostgreSQL/MongoDB на том же сервере, то лучше 200 GB.
  • Сеть: 1 Gbps порт с достаточным объёмом трафика (1-2 TB в месяц).

Для таких характеристик можно рассмотреть VPS с указанными характеристиками. Выбирайте провайдера с хорошей репутацией и поддержкой.

Когда нужен Dedicated Server, а не VPS

Выделенный сервер (dedicated server) обычно требуется для очень крупных проектов:

  • Очень высокая нагрузка: Десятки и сотни тысяч активных пользователей, интенсивные вычисления, обработка больших объёмов данных.
  • Специфические требования к железу: Например, GPU для AI-моделей, очень большой объём RAM (64 GB+), RAID-массивы для отказоустойчивости дисков.
  • Максимальная производительность и изоляция: Когда VPS может быть подвержен "noisy neighbor" эффекту (снижение производительности из-за других пользователей на том же физическом сервере).

Для большинства Telegram-ботов VPS более чем достаточно. Если ваш бот вырастет до масштабов, требующих dedicated server, вы это поймёте по мониторингу ресурсов.

Локация: на что влияет

Выбор локации VPS важен по нескольким причинам:

  • Задержка (latency): Чем ближе сервер к вашей целевой аудитории (и к серверам Telegram API), тем меньше задержка. Для Telegram-ботов это не так критично, как для онлайн-игр, но более низкая задержка всегда лучше.
  • Законодательство: В некоторых странах могут быть строгие законы о хранении данных или ограничения на определённый контент. Убедитесь, что выбранная локация соответствует вашим юридическим требованиям.
  • Стоимость: Цены на VPS могут варьироваться в зависимости от локации.

Для русскоязычной аудитории и большинства европейских стран хороший выбор — это VPS в Германии, Нидерландах или Финляндии. Если ваша аудитория в США, выбирайте локацию на восточном или западном побережье США.

Подготовка сервера

Схема: Подготовка сервера
Схема: Подготовка сервера

После получения доступа к свежему VPS (предполагается, что это Debian 12/13 или Ubuntu 24.04 LTS), необходимо выполнить ряд базовых настроек для повышения безопасности и удобства работы.

1. Обновление системы

Первым делом всегда обновляем список пакетов и установленные пакеты до актуальных версий.


sudo apt update             # Обновляем список доступных пакетов
sudo apt upgrade -y         # Обновляем установленные пакеты, -y для автоматического подтверждения
sudo apt autoremove -y      # Удаляем ненужные пакеты, которые остались после обновлений

2. Создание нового пользователя и настройка sudo

Работа под учётной записью root небезопасна. Создайте нового пользователя и предоставьте ему права sudo.


sudo adduser botuser            # Создаём нового пользователя с именем botuser
sudo usermod -aG sudo botuser   # Добавляем пользователя botuser в группу sudo

Теперь выйдите из сессии root (если вы в ней) и зайдите под новым пользователем:


exit                       # Выходим из текущей сессии
ssh botuser@ВАШ_IP_СЕРВЕРА # Заходим под новым пользователем

3. Настройка SSH-ключей (рекомендуется)

Для более безопасного доступа к серверу используйте SSH-ключи вместо паролей. Если у вас ещё нет SSH-ключа, сгенерируйте его на своём локальном компьютере:


ssh-keygen -t ed25519 -C "[email protected]" # Генерируем новый SSH-ключ (на локальной машине)

Затем скопируйте публичный ключ на сервер:


ssh-copy-id botuser@ВАШ_IP_СЕРВЕРА # Копируем публичный ключ на сервер (на локальной машине)

После этого можно отключить аутентификацию по паролю в файле /etc/ssh/sshd_config для пользователя root и в целом. Найдите и измените следующие строки:


sudo nano /etc/ssh/sshd_config # Открываем конфигурационный файл SSH-сервера

Измените или добавьте:


# PermitRootLogin prohibit-password (или no)
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no

Перезапустите SSH-сервис:


sudo systemctl restart sshd # Перезапускаем SSH-сервис

4. Настройка файрвола (UFW)

Uncomplicated Firewall (UFW) — это удобная утилита для управления iptables. Разрешим только необходимые порты: SSH (22), HTTP (80) и HTTPS (443).


sudo apt install ufw -y     # Устанавливаем UFW
sudo ufw default deny incoming # Запрещаем все входящие соединения по умолчанию
sudo ufw default allow outgoing # Разрешаем все исходящие соединения по умолчанию
sudo ufw allow OpenSSH      # Разрешаем SSH-соединения (порт 22)
sudo ufw allow http         # Разрешаем HTTP-соединения (порт 80)
sudo ufw allow https        # Разрешаем HTTPS-соединения (порт 443)
sudo ufw enable             # Включаем файрвол. Подтвердите 'y'
sudo ufw status verbose     # Проверяем статус файрвола

5. Установка Fail2Ban

Fail2Ban сканирует логи сервисов (SSH, Nginx и т.д.) и блокирует IP-адреса, с которых происходят попытки подбора паролей или другие злонамеренные действия.


sudo apt install fail2ban -y    # Устанавливаем Fail2Ban
sudo systemctl enable fail2ban  # Включаем автозапуск сервиса при загрузке
sudo systemctl start fail2ban   # Запускаем Fail2Ban
sudo systemctl status fail2ban  # Проверяем статус сервиса

Базовая настройка Fail2Ban уже достаточно хороша, но вы можете создать файл /etc/fail2ban/jail.local для кастомизации:


sudo nano /etc/fail2ban/jail.local

Пример содержимого для jail.local:


[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 1h

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


sudo systemctl restart fail2ban

Установка ПО — пошагово

Схема: Установка ПО — пошагово
Схема: Установка ПО — пошагово

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

1. Установка Python и виртуального окружения

Для 2026 года актуальной версией Python будет, скорее всего, Python 3.12 или 3.13. Мы установим Python 3.12 и создадим для бота изолированное виртуальное окружение.


sudo apt install python3.12 python3.12-venv python3.12-dev -y # Устанавливаем Python 3.12, venv и dev-файлы

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


mkdir ~/my_telegram_bot                     # Создаём директорию для проекта
cd ~/my_telegram_bot                        # Переходим в директорию проекта
python3.12 -m venv .venv                    # Создаём виртуальное окружение с Python 3.12
source .venv/bin/activate                   # Активируем виртуальное окружение

После активации виртуального окружения (вы увидите (.venv) в начале строки терминала), все устанавливаемые Python-пакеты будут изолированы в этой директории.

2. Установка зависимостей Python

Установим aiogram, gunicorn (ASGI-сервер для запуска нашего приложения) и python-dotenv для работы с переменными окружения.


pip install aiogram==3. gunicorn python-dotenv # Устанавливаем aiogram 3.x, Gunicorn и python-dotenv

3. Установка Nginx

Nginx будет выступать в роли обратного прокси для нашего бота, принимая запросы от Telegram API и перенаправляя их на Gunicorn, который запускает бота. Nginx также будет обрабатывать SSL-сертификаты.


sudo apt install nginx -y # Устанавливаем Nginx
sudo systemctl enable nginx # Включаем автозапуск Nginx при загрузке
sudo systemctl start nginx # Запускаем Nginx
sudo systemctl status nginx # Проверяем статус Nginx

4. Установка Certbot (для Let's Encrypt)

Certbot — это утилита для автоматического получения и обновления SSL/TLS-сертификатов от Let's Encrypt, которые необходимы для HTTPS-соединения.


sudo apt install certbot python3-certbot-nginx -y # Устанавливаем Certbot и плагин для Nginx

Конфигурация

Схема: Конфигурация
Схема: Конфигурация

Теперь, когда все компоненты установлены, приступим к их настройке.

1. Код Telegram-бота

Создадим простой файл bot.py в директории ~/my_telegram_bot. Этот файл будет содержать логику нашего бота.


nano ~/my_telegram_bot/bot.py

Содержимое bot.py:


import os
from dotenv import load_dotenv
from aiogram import Bot, Dispatcher, types
from aiogram.enums import ParseMode
from aiogram.webhook.aiohttp_server import Simple
from aiohttp import web

# Загружаем переменные окружения из .env файла
load_dotenv()

# Получаем токен бота из переменных окружения
BOT_TOKEN = os.getenv("BOT_TOKEN")
WEBHOOK_HOST = os.getenv("WEBHOOK_HOST")
WEBHOOK_PATH = os.getenv("WEBHOOK_PATH")
WEB_SERVER_HOST = os.getenv("WEB_SERVER_HOST", "127.0.0.1")
WEB_SERVER_PORT = int(os.getenv("WEB_SERVER_PORT", 8000))

if not BOT_TOKEN:
    raise ValueError("BOT_TOKEN environment variable not set.")
if not WEBHOOK_HOST:
    raise ValueError("WEBHOOK_HOST environment variable not set.")
if not WEBHOOK_PATH:
    raise ValueError("WEBHOOK_PATH environment variable not set.")

WEBHOOK_URL = f"https://{WEBHOOK_HOST}{WEBHOOK_PATH}"

# Инициализация бота и диспетчера
bot = Bot(token=BOT_TOKEN, parse_mode=ParseMode.HTML)
dp = Dispatcher()

# Обработчик команды /start
@dp.message(commands=["start"])
async def handle_start(message: types.Message):
    await message.reply(f"Привет, {message.from_user.full_name}! Я твой новый бот.")

# Обработчик текстовых сообщений
@dp.message()
async def handle_message(message: types.Message):
    await message.reply(f"Вы сказали: {message.text}")

async def on_startup(dispatcher: Dispatcher, bot: Bot):
    # Устанавливаем вебхук при запуске
    await bot.set_webhook(WEBHOOK_URL)
    print(f"Webhook установлен на: {WEBHOOK_URL}")

async def on_shutdown(dispatcher: Dispatcher, bot: Bot):
    # Удаляем вебхук при завершении работы
    await bot.delete_webhook()
    print("Webhook удалён.")

def main():
    # Создаём AioHTTP веб-приложение для вебхуков
    app = web.Application()
    webhook_requests_handler = Simple(dispatcher=dp, bot=bot, path=WEBHOOK_PATH)
    webhook_requests_handler.register(app, path=WEBHOOK_PATH)

    # Регистрируем функции запуска и остановки
    app.on_startup.append(lambda app: on_startup(dp, bot))
    app.on_shutdown.append(lambda app: on_shutdown(dp, bot))

    # Запускаем веб-сервер
    web.run_app(app, host=WEB_SERVER_HOST, port=WEB_SERVER_PORT)

if __name__ == "__main__":
    main()

2. Настройка переменных окружения (.env)

Никогда не храните конфиденциальные данные (токены, пароли) непосредственно в коде. Используйте переменные окружения. Создайте файл .env в корневой директории проекта.


nano ~/my_telegram_bot/.env

Содержимое .env:


BOT_TOKEN="ВАШ_ТОКЕН_БОТА" # Получите его у @BotFather
WEBHOOK_HOST="ВАШ_ДОМЕН_ИЛИ_IP" # Например, example.com
WEBHOOK_PATH="/webhook/bot" # Уникальный путь для вебхука
WEB_SERVER_HOST="127.0.0.1" # Gunicorn будет слушать только локально
WEB_SERVER_PORT=8000 # Порт, на котором будет работать Gunicorn

Замените ВАШ_ТОКЕН_БОТА на реальный токен, полученный от @BotFather, и ВАШ_ДОМЕН_ИЛИ_IP на ваш домен или публичный IP-адрес VPS.

3. Настройка Systemd-сервиса для бота

Systemd позволит нам запускать бота как системную службу, автоматически перезапускать его в случае сбоев и управлять им.


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

Содержимое telegram-bot.service:


[Unit]
Description=Telegram Bot Service
After=network.target

[Service]
User=botuser # Пользователь, под которым будет запускаться бот
Group=www-data # Группа, если нужна для доступа к файлам Nginx
WorkingDirectory=/home/botuser/my_telegram_bot # Рабочая директория проекта
EnvironmentFile=/home/botuser/my_telegram_bot/.env # Путь к файлу с переменными окружения
ExecStart=/home/botuser/my_telegram_bot/.venv/bin/gunicorn --workers 1 --bind 127.0.0.1:8000 bot:app # Запуск Gunicorn
Restart=always
RestartSec=5 # Перезапускать через 5 секунд после сбоя
StandardOutput=journal
StandardError=journal
SyslogIdentifier=telegram-bot

[Install]
WantedBy=multi-user.target

Важное примечание: В aiogram 3.x вебхуки настраиваются через aiohttp.web.Application. Gunicorn может запускать aiohttp приложения. Строка ExecStart указывает Gunicorn, что нужно запустить приложение app из модуля bot. В нашем bot.py мы запускаем web.run_app внутри main(). Для Gunicorn нам нужно экспортировать app из bot.py. Изменим bot.py так, чтобы app был доступен для Gunicorn:


# ... (начало файла bot.py) ...

# Создаём AioHTTP веб-приложение для вебхуков
app = web.Application()
webhook_requests_handler = Simple(dispatcher=dp, bot=bot, path=WEBHOOK_PATH)
webhook_requests_handler.register(app, path=WEBHOOK_PATH)

# Регистрируем функции запуска и остановки
app.on_startup.append(lambda app_instance: on_startup(dp, bot))
app.on_shutdown.append(lambda app_instance: on_shutdown(dp, bot))

# ... (конец файла bot.py) ...

# Удалите или закомментируйте блок if __name__ == "__main__":
# if __name__ == "__main__":
#     main()

Теперь Gunicorn сможет найти и запустить app. После редактирования файла сервиса, перезагрузите systemd и запустите бота:


sudo systemctl daemon-reload # Перезагружаем systemd, чтобы он увидел новый сервис
sudo systemctl enable telegram-bot # Включаем автозапуск бота при загрузке
sudo systemctl start telegram-bot # Запускаем сервис бота
sudo systemctl status telegram-bot # Проверяем статус бота

Убедитесь, что сервис запущен и не содержит ошибок. Логи можно посмотреть командой: sudo journalctl -u telegram-bot -f.

4. Настройка Nginx как обратного прокси

Создадим конфигурационный файл Nginx для нашего бота. Замените example.com на ваш домен.


sudo nano /etc/nginx/sites-available/telegram-bot

Содержимое telegram-bot:


server {
    listen 80;
    server_name ВАШ_ДОМЕН_ИЛИ_IP; # Например, example.com

    location / {
        return 301 https://$host$request_uri; # Перенаправляем весь HTTP-трафик на HTTPS
    }
}

server {
    listen 443 ssl;
    server_name ВАШ_ДОМЕН_ИЛИ_IP; # Например, example.com

    ssl_certificate /etc/letsencrypt/live/ВАШ_ДОМЕН_ИЛИ_IP/fullchain.pem; # Будет создан Certbot
    ssl_certificate_key /etc/letsencrypt/live/ВАШ_ДОМЕН_ИЛИ_IP/privkey.pem; # Будет создан Certbot
    ssl_protocols TLSv1.2 TLSv1.3; # Рекомендуемые протоколы
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    location /webhook/bot { # Должен совпадать с WEBHOOK_PATH в .env
        proxy_pass http://127.0.0.1:8000; # Проксируем запросы на Gunicorn
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;
        proxy_buffering off; # Отключаем буферизацию для вебхуков
    }

    # Если бот будет отдавать статику или иметь другие HTTP-эндпоинты
    # location / {
    #    root /var/www/html;
    #    index index.html;
    # }
}

Создайте символическую ссылку на этот файл из sites-enabled и проверьте конфигурацию Nginx:


sudo ln -s /etc/nginx/sites-available/telegram-bot /etc/nginx/sites-enabled/ # Создаём симлинк
sudo nginx -t # Проверяем синтаксис конфигурации Nginx
sudo systemctl restart nginx # Перезапускаем Nginx

5. Получение SSL-сертификата с помощью Certbot

Теперь, когда Nginx настроен, получим SSL-сертификат. Убедитесь, что ваш домен уже указывает на IP-адрес вашего VPS.


sudo certbot --nginx -d ВАШ_ДОМЕН_ИЛИ_IP # Запустите Certbot, заменив на ваш домен

Certbot задаст несколько вопросов (email, согласие с условиями). Он автоматически изменит конфигурацию Nginx, добавив ssl_certificate и ssl_certificate_key. После успешного получения сертификата, Nginx автоматически перезапустится.

Проверьте, что Certbot настроил автоматическое продление сертификата:


sudo systemctl status certbot.timer # Проверяем статус таймера для автопродления

Certbot обычно создаёт cron-задачу или systemd-таймер для автоматического продления сертификатов. Это происходит дважды в день, и сертификат продлевается, если срок его действия истекает в течение 30 дней.

6. Проверка работоспособности

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

  • Проверка Nginx: Откройте в браузере https://ВАШ_ДОМЕН_ИЛИ_IP/. Если вы видите страницу приветствия Nginx или перенаправление, значит Nginx работает.
  • Проверка вебхука: Попробуйте отправить сообщение вашему боту в Telegram. Он должен ответить.
  • Проверка systemd-сервиса:
    
    sudo systemctl status telegram-bot
    sudo journalctl -u telegram-bot -f # Просмотр логов бота в реальном времени
                

    Вы должны увидеть сообщения о запуске бота и установке вебхука.

  • Проверка порта Gunicorn: С сервера можно проверить, слушает ли Gunicorn на локальном порту:
    
    ss -ltn | grep 8000
                

    Вы должны увидеть строку, указывающую, что 127.0.0.1:8000 находится в состоянии LISTEN.

Бэкапы и обслуживание

Схема: Бэкапы и обслуживание
Схема: Бэкапы и обслуживание

Надёжная стратегия бэкапов и регулярное обслуживание критически важны для любого production-сервиса.

1. Что бэкапить

  • Код бота: Директория ~/my_telegram_bot/ (без .venv).
  • Конфигурационные файлы: .env, /etc/systemd/system/telegram-bot.service, /etc/nginx/sites-available/telegram-bot, /etc/nginx/sites-enabled/telegram-bot.
  • Данные бота: Если бот использует базу данных (SQLite, PostgreSQL, MongoDB), то необходимо регулярно бэкапить данные этой базы. Для SQLite это просто файл, для PostgreSQL/MongoDB — дамп базы.
  • SSH-ключи: (необязательно, но полезно) ~/.ssh/.

2. Простой скрипт автобэкапа

Используем rsync для создания копий файлов и pg_dump (если у вас PostgreSQL) для базы данных.


nano ~/backup_script.sh

Содержимое backup_script.sh:


#!/bin/bash

# Директория для бэкапов
BACKUP_DIR="/var/backups/telegram_bot"
# Директория с кодом бота
BOT_CODE_DIR="/home/botuser/my_telegram_bot"
# Имя файла базы данных SQLite (если используется)
SQLITE_DB_NAME="bot_database.db"
# Имя базы данных PostgreSQL (если используется)
POSTGRES_DB_NAME="telegram_bot_db"
# Пользователь PostgreSQL
POSTGRES_USER="botuser"

# Создаём директорию для бэкапов, если её нет
mkdir -p "$BACKUP_DIR"

# 1. Бэкап кода бота и .env
echo "Starting code and .env backup..."
rsync -avz --exclude '.venv/' "$BOT_CODE_DIR/" "$BACKUP_DIR/code_$(date +%Y%m%d_%H%M%S)/"
cp "$BOT_CODE_DIR/.env" "$BACKUP_DIR/config_$(date +%Y%m%d_%H%M%S)/.env"

# 2. Бэкап конфигурационных файлов Nginx и Systemd
echo "Starting config files backup..."
cp /etc/systemd/system/telegram-bot.service "$BACKUP_DIR/config_$(date +%Y%m%d_%H%M%S)/telegram-bot.service"
cp /etc/nginx/sites-available/telegram-bot "$BACKUP_DIR/config_$(date +%Y%m%d_%H%M%S)/nginx_telegram-bot"

# 3. Бэкап базы данных (выберите подходящий вариант)
# Для SQLite:
if [ -f "$BOT_CODE_DIR/$SQLITE_DB_NAME" ]; then
    echo "Starting SQLite database backup..."
    cp "$BOT_CODE_DIR/$SQLITE_DB_NAME" "$BACKUP_DIR/db_sqlite_$(date +%Y%m%d_%H%M%S).db"
fi

# Для PostgreSQL (раскомментировать, если используется)
# echo "Starting PostgreSQL database backup..."
# PGPASSWORD="ВАШ_ПАРОЛЬ_POSTGRES" pg_dump -U "$POSTGRES_USER" -Fc "$POSTGRES_DB_NAME" > "$BACKUP_DIR/db_pg_$(date +%Y%m%d_%H%M%S).dump"

echo "Backup finished."

# Очистка старых бэкапов (храним последние 7 дней)
find "$BACKUP_DIR" -type d -name "code_" -mtime +7 -exec rm -rf {} \;
find "$BACKUP_DIR" -type d -name "config_" -mtime +7 -exec rm -rf {} \;
find "$BACKUP_DIR" -type f -name "db_sqlite_.db" -mtime +7 -delete
find "$BACKUP_DIR" -type f -name "db_pg_.dump" -mtime +7 -delete

Сделайте скрипт исполняемым:


chmod +x ~/backup_script.sh

Добавьте скрипт в cron для ежедневного запуска. Откройте crontab для пользователя botuser:


crontab -e

Добавьте строку в конце файла для запуска скрипта, например, каждый день в 3:00 ночи:


0 3    /home/botuser/backup_script.sh >> /var/log/telegram_bot_backup.log 2>&1

3. Куда складывать бэкапы

Хранить бэкапы на том же сервере, что и основной сервис, небезопасно. В случае выхода из строя сервера или диска вы потеряете и сервис, и бэкапы. Рекомендуется:

  • Внешний S3-совместимый объектный сторадж: AWS S3, DigitalOcean Spaces, Backblaze B2, MinIO. Это надёжное и масштабируемое решение. Для автоматической отправки можно использовать rclone.
  • Отдельный VPS: Недорогой VPS в другом дата-центре, куда вы будете копировать бэкапы по SSH/rsync.
  • Локальное хранилище с синхронизацией: Например, Google Drive/Dropbox через rclone.

Для более продвинутых бэкапов рассмотрите borgbackup или restic, которые поддерживают дедупликацию, шифрование и инкрементальные бэкапы.

4. Обновления: Rolling vs. Maintenance Window

Регулярно обновляйте ОС и ПО для безопасности и стабильности. Есть два основных подхода:

  • Maintenance Window (Окно обслуживания): Запланированное время, когда вы останавливаете сервис, обновляете ОС и ПО, тестируете и снова запускаете.
    • Преимущества: Контролируемый процесс, меньше риск неожиданных проблем.
    • Недостатки: Сервис будет недоступен во время обновления.
    
    sudo systemctl stop telegram-bot  # Останавливаем бота
    sudo apt update && sudo apt upgrade -y # Обновляем систему
    # ... (обновляем зависимости Python, если нужно)
    sudo systemctl start telegram-bot # Запускаем бота
                
  • Rolling Updates (Постепенные обновления): Применимо для кластеров или систем с несколькими экземплярами сервиса, когда вы обновляете по одному экземпляру, не прерывая работу всего сервиса. Для одного VPS это неактуально, но концептуально важно.

Для большинства Telegram-ботов достаточно окна обслуживания раз в 1-2 месяца. Важно всегда проверять логи после обновлений.

Troubleshooting + FAQ

Здесь собраны типичные проблемы и вопросы, которые могут возникнуть при развёртывании и эксплуатации бота.

Nginx выдаёт 502 Bad Gateway

Это означает, что Nginx не может связаться с вашим Gunicorn-сервером.
Что проверить:

  1. Убедитесь, что сервис бота (telegram-bot.service) запущен: sudo systemctl status telegram-bot.
  2. Проверьте логи бота: sudo journalctl -u telegram-bot -f. Возможно, бот не смог запуститься из-за ошибки в коде или отсутствии переменных окружения.
  3. Убедитесь, что Gunicorn слушает на правильном порту (127.0.0.1:8000 в нашем случае): ss -ltn | grep 8000.
  4. Проверьте файл конфигурации Nginx (/etc/nginx/sites-available/telegram-bot) на предмет ошибок в proxy_pass.

Бот не отвечает на сообщения в Telegram

Если бот не отвечает, но Nginx работает (нет 502), проблема может быть в вебхуке или в логике бота.
Что проверить:

  1. Проверьте логи бота (sudo journalctl -u telegram-bot -f). Возможно, есть ошибки в обработчиках сообщений.
  2. Убедитесь, что Telegram API смог установить вебхук: в логах бота при запуске должна быть строка Webhook установлен на: https://ВАШ_ДОМЕН/webhook/bot.
  3. Проверьте, что ваш домен корректно резолвится в IP-адрес вашего VPS (используйте dig ВАШ_ДОМЕН).
  4. Убедитесь, что файрвол (UFW) разрешает входящие соединения на порты 80 и 443 (sudo ufw status verbose).
  5. Используйте Telegram Bot API метод getWebhookInfo, чтобы проверить статус вебхука: https://api.telegram.org/botВАШ_ТОКЕН_БОТА/getWebhookInfo. Убедитесь, что url правильный и last_error_message пуст.

Certbot не может получить сертификат

Это обычно связано с проблемами доступности вашего домена.
Что проверить:

  1. Убедитесь, что ваш домен (или поддомен) корректно указывает на IP-адрес вашего VPS в DNS-записях. Используйте dig ВАШ_ДОМЕН.
  2. Проверьте, что Nginx запущен и корректно слушает на порту 80 (sudo systemctl status nginx).
  3. Убедитесь, что файрвол (UFW) разрешает входящие соединения на порт 80 (sudo ufw status verbose). Certbot использует порт 80 для HTTP-01 challenge.
  4. Временно отключите Nginx-конфигурацию бота, если она мешает Certbot.

Какой VPS-конфиг минимально подойдёт?

Для простого Telegram-бота с небольшой аудиторией (до 1000 активных пользователей) минимально подойдёт VPS с 1 CPU-ядром, 1-2 GB RAM и 25-50 GB SSD. Этого будет достаточно для операционной системы, Python-окружения, бота, Nginx и небольшого объёма логов. Для более сложных ботов с активной базой данных или интенсивными вычислениями потребуется больше ресурсов.

Что выбрать — VPS или dedicated для этой задачи?

Для подавляющего большинства Telegram-ботов VPS является оптимальным выбором. Он предлагает достаточную производительность, гибкость и экономичность. Dedicated server нужен только для очень масштабных проектов с десятками тысяч одновременных пользователей, специфическими аппаратными требованиями (например, GPU) или при необходимости максимальной изоляции и гарантированной производительности. Начните с VPS и масштабируйтесь до dedicated, если возникнет реальная необходимость.

Как обновить зависимости Python (aiogram, gunicorn)?

Для обновления Python-зависимостей активируйте виртуальное окружение и используйте pip.
Шаги:

  1. Перейдите в директорию проекта: cd ~/my_telegram_bot
  2. Активируйте виртуальное окружение: source .venv/bin/activate
  3. Обновите пакеты: pip install --upgrade aiogram gunicorn python-dotenv
  4. Деактивируйте окружение: deactivate
  5. Перезапустите сервис бота: sudo systemctl restart telegram-bot

Выводы и следующие шаги

Схема: Выводы и следующие шаги
Схема: Выводы и следующие шаги

Мы успешно развернули production-готовую инфраструктуру для Telegram-бота на VPS, используя aiogram, systemd и Nginx. Ваш бот теперь работает как надёжный системный сервис, автоматически запускается при перезагрузке сервера, обрабатывает запросы через защищённое HTTPS-соединение и имеет базовую систему бэкапов.

Для дальнейшего развития и оптимизации вашего проекта рассмотрите следующие шаги:

  • Мониторинг: Внедрите систему мониторинга (например, Prometheus + Grafana или Datadog) для отслеживания загрузки CPU, RAM, диска, сетевого трафика и состояния самого бота.
  • База данных: Если бот будет хранить много данных, перенесите их из SQLite в полноценную СУБД, такую как PostgreSQL или MongoDB, возможно, на отдельном сервере или в управляемом облачном сервисе.
  • CI/CD: Настройте пайплайн непрерывной интеграции и доставки (CI/CD) с помощью GitHub Actions, GitLab CI или Jenkins для автоматизации развёртывания новых версий кода бота.

Был ли этот гайд полезен?

Ваш отзыв помогает нам улучшать гайды.

Поделиться записью:

Отправьте гайд тому, кому он может пригодиться.

Telegram VKVK WhatsApp Facebook LinkedIn XX

развёртывание production telegram-бота на vps: aiogram, systemd и nginx
support_agent
Valebyte Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.