Розмістити телеграм-бота на віртуальному хостингу з cPanel можна, якщо він створений на Python. Для цього в панелі є спеціальний додаток, який дозволяє створювати віртуальні оточення для ваших проектів. Докладніше про всі необхідні налаштування, які вам доведеться зробити, читайте в статті.
Віртуальний хостинг з тестовим періодом та підтримкою 24/7
Крок 1: Підготувати Telegram-бота
Якщо ви раптом ще не створили бота у Telegram, ось як це зробити:
- Відкрийте Telegram і знайдіть @BotFather.
- Створіть нового бота, надіславши команду /newbot.
- Дотримуйтесь інструкцій і отримаєте токен для свого бота, який буде виглядати приблизно так: 123456789:ABCdefGhIJklMNOpqrStuVWxyz.

Крок 2. Завантажити файли бота на сервер
На віртуальному хостингу це можна зробити або в панелі керування хостингом у браузері (інструкції залежатимуть від конкретної панелі), або у спеціальній програмі за протоколом FTP (універсальний варіант для будь-якого хостингу).
Як завантажити файли за допомогою cPanel
Як завантажити файли по FTP у FileZilla
Для зручності можете створити для бота окрему папку в середині кореневої папки сайту. У нашому прикладі python-telegram-bot.

Альтернативний варіант (якщо бот викладений у публічному репозиторії на Гітхабі) — завантажити файли напряму з Гітхабу. Для цього підключіться до сервера за протоколом SSH або відкрийте додаток «Terminal» у cPanel, перейдіть у потрібний каталог за допомогою команди cd, а потім використайте git clone https://url для завантаження.

Якщо у вас приватний репозиторій, можете додати його до cPanel у додатку «Git Version Control». Це непогана ідея навіть для публічного репозиторія, оскільки це дасть можливість швидко підтягувати зміни з Github на хостинг. Ось інструкція, де описано принцип роботи цього додатку:
Як підключити Git репозиторій до cPanel
Крок 3: Додати деталі бота у конфігураційний файл
Мова про токен бота, а також інші потенційно необхідні деталі, такі як Telegram API Key/Hash, Telegram Chat ID, ключі API сторонніх сервісів.
Якщо розробник бота — ви, тоді ви самі знаєте, що і куди треба додати. Якщо ні, можете або перевірити файл readme.md (розробники ботів часто додають в цей файл інструкції по встановленню), або перевірити файли бота вручну (якщо розбираєтеся): наприклад, файл оточення .env, будь-який файл зі словом config у назві, основний файл бота bot.py / app.py / main.py. Шукайте там команду зі словом TOKEN.

Крок 4: Встановити SSL-сертифікат
У документації Telegram API написано, що усі запити мають надходити за протоколом HTTPS. Отже обов’язково встановіть SSL-сертифікат на ваш домен/піддомен. У нас є інструкції, як зробити це на хостингу з панеллю керування cPanel:
Як встановити платний SSL-сертифікат у cPanel
Як встановити безкоштовний SSL-сертифікат Let’s Encrypt у cPanel
Крок 5: Створити Webhook для Telegram
Нюанс: Це потрібно робити, тільки якщо ваш бот працює за допомогою Webhook. Якщо він працює за допомогою Long Polling, переходьте до наступного кроку.
Щоби створити Webhook, виконайте таку команду в браузері (треба підставити власні значення замість тих, що вказані великими літерами):
https://api.telegram.org/botBOT_TOKEN/setWebhook?url=https://YOUR_DOMAIN
Щоб переконатися, що вебхук працює, використайте таку команду:
https://api.telegram.org/botBOT_TOKEN/getWebhookInfo
Відповідь має містити інформацію про поточний вебхук і його статус:
{"ok":true,"result":{"url":"https://YOUR_DOMAIN","has_custom_certificate":false,"pending_update_count":0,"max_connections":40,"ip_address":"123.45.76.89"}}
Крок 6: Підготувати віртуальне середовище у cPanel
На цьому етапі спочатку треба створити віртуальне середовище, потім встановити всі необхідні бібліотеки, а в кінці — змінити файл запуску додатка.
Створити віртуальне середовище
Зайдіть у cPanel, знайдіть на головній сторінці секцію «Програмне забезпечення» та відкрийте додаток «Налаштування Python додатків».

Натисніть праворуч синю кнопку «Create Application». На наступній сторінці заповніть такі поля:
- Python version — оберіть з випадного списку потрібну версію Python.
- Application root — введіть шлях до кореневої папки вашого проекту.
- Application URL — оберіть з випадного списку потрібне доменне ім’я.
Решту полів обов’язково залиште порожніми і натисніть вгорі кнопку «Create».

У результаті в директорії з поля Application root з’являться службові каталоги віртуального середовища та файл запуску додатка — passenger_wsgi.py. Якщо ви введете домен у браузері, маєте отримати текст «It works!» та версію Python.

Встановити необхідні бібліотеки
Це можна зробити у два способи: 1) в інтерфейсі cPanel; 2) у терміналі.
В інтерфейсі cPanel це можна зробити тільки за допомогою файлу requirements.txt, який зазвичай знаходиться у корені проекту та в якому зазначають всі необхідні бібліотеки (якщо треба, з їх версіями) по одній в кожному рядку.

Знайдіть на сторінці додатка в cPanel опцію «Configuration files», впишіть у порожньому полі requirements.txt та натисніть «Add».

Після цього кнопка «Run Pip Install» має стати активною. Натисніть її та оберіть з випадного списку «requirements.txt». Це запустить процесс установки зазначених у файлі бібліотек.

Дочекайтеся закінчення процесу. Якщо все успішно, в правому верхньому куті екрану з’явиться зелене повідомлення.

Якщо щось раптом пішло не так, з’явиться червоне повідомлення із коротким текстом помилки. На жаль, з цього повідомлення не завжди зрозуміло, в чому саме проблема. В такому випадку краще спробувати встановити бібліотеки в терміналі, де помилку можна буде прочитати у повному обсязі.

У терміналі. Підключіться до сервера за протоколом SSH або відкрийте додаток «Terminal» у cPanel. У верхній частині додатка «Налаштування Python додатків» буде команда для швидкого переходу до віртуального оточення. Натисніть на неї, щоб скопіювати, потім виконайте у терміналі.
Далі можете встановлювати необхідні бібліотеки за допомогою команди pip install -r requirements.txt або ж просто pip install [назва-бібліотеки].

Змінити файл запуску додатка
Це потрібно зробити, щоб у файлі passenger_wsgi.py, за допомогою якого cPanel запускає Python додатки, з’явилася інформація, де шукати ваш додаток.
Для цього на сторінці вашого проекту в «Setup Python App» змініть значення у полях:
- Application startup file — Шлях до головного файлу додатка відносно кореневої директорії, що вказана в опції «Application root». Наприклад, app.py, якщо файл лежить в кореневій директорії або bot/app.py, якщо файл лежить в директорії bot.
- Application Entry point — Точка входу в додаток. А саме назва змінної, яка містить WSGI-додаток. Для фреймворку Flask це буде «app» замість «application», для Django має бути «application», для FastAPI може бути і те і інше (залежить від імплементації).

В результаті цієї дії зміниться структура стандартного файлу passenger_wsgi.py для взаємодії зі вказаним файлом. На скриншоті нижче ліворуч зазначений стандартний вміст файлу passenger, праворуч — його вміст після зміни даних у полях «Application startup file» та «Application Entry point».

Крок 7: Запустити і протестувати бота
Коли все буде налаштовано, натисніть «Restart» на сторінці проекту в «Налаштування Python додатків» у cPanel, щоб перезапустити додаток.

Далі надішліть повідомлення до бота у Telegram та перевірте, чи отримуєте відповідь. Наприклад, відправте команду /start і переконайтеся, що бот реагує.
Можливі проблеми та їх вирішення
Кожен бот вимагає індивідуального підходу для вирішення помилок. Якщо при звертанні до бота за URL-адресою вискакує 500 помилка, шукайте її причину в логах. Файл з логами називається stderr.log і знаходиться у кореневому каталозі проекту.

Також може виникнути така ситуація, коли бот не виходить запустити через додаток «Налаштування Python додатків» у cPanel, але все працює, якщо зайти до віртуального оточення у терміналі та напряму запустити скрипт за допомогою команди python файл.py (замість файл.ру має бути назва головного файлу бота).
Таке може бути, якщо ваш бот не відповідає WSGI-формату, якого вимагає додаток «Налаштування Python додатків» у cPanel. Цей додаток працює на основі Passenger, і щоби бот запускався, він має працювати як веб-застосунок, який обробляє HTTP-запити (наприклад, через Flask, Django або FastAPI).
В принципі запускати бота через консоль (в обхід Passenger) — теж робочій спосіб. Для цього навіть не треба кожен раз заходити в термінал. Скрипт можна виконати в інтерфейсі «Налаштування Python додатків» за допомогою опції «Execute python script» в самому низу. Просто впишіть туди шлях до файлу, який треба запустити.

Ви навіть можете створити крон у cPanel, який буде запускати скрипт раз на одну або декілька годин, щоби періодично «будити» бота, тому що на віртуальному хостингу неактивні процеси будуть припинятися.
Коли віртуальний хостинг не підійде
Ось основні характеристики Telegram-бота, які можуть завадити його нормальній роботі на віртуальному хостингу:
- Боту потрібен постійний фоновий процес. Наприклад, він працює через Long Polling, або виконує фонові завдання, такі як парсинг, моніторинг, обробка черг. Такі процеси можуть сильно навантажувати сервер, їх будуть вбивати.
- Бот виконує ресурсоємні завдання. Наприклад, займається машинним навчанням або криптографією, обробляє великі файли. Для таких завдань не вистачить скромних ресурсів віртуального хостингу.
- Для налаштування бота потрібен root-доступ. Наприклад, для встановлення Docker, нестандартних залежностей або керування процесами. На віртуальному хостингу такий доступ буде тільки в адміністраторів серверу.
- Боту потрібно багато одночасних з’єднань. Якщо до бота буде багато запитів одночасно, це може перевищити обмеження на кількість одночасних з’єднань на віртуальному хостингу. Тоді для деяких користувачів бот не буде працювати.
Нюанс: Цей список не є вичерпним. Оскільки всі боти дуже різні, врахувати всі ситуації неможливо. Проте ми все одно хотіли перелічити хоча б деякі моменти, щоб принаймні частина людей одразу могла шукати інший варіант.
Інший варіант — це VPS. Там немає більшості обмежень, тому що на одному сервері менше клієнтів і вони більш ізольовані один від одного.
Що далі
Якщо раптом у вас не вийде розібратися або виникнуть додаткові питання по тому, як розмістити Telegram-бота на віртуальному хостингу, залиште коментар до статті. Спробуємо всім допомогти.