Очень часто возникающий вопрос: где можно разместить скрипты на Python, Flask-приложение, телеграм или дискорд ботов?
Один из вариантов — на своем компьютере при наличии внешнего IP-адреса и опыта в настройке проброса портов на роутере. Или другие сервисы, как правило, требующие платной подписки.
Цель этот статьи - подробная инструкция, как сделать хостинг Python-скриптов бесплатно и доступным 24/7 на примере телеграм-бота
Шаг 0 - регистрация бота
Существует огромное количество туториалов, как получить токен, поэтому все по-простому. Находим в телеграм BotFather, регистрируем нового бота, выбираем ему имя, получаем токен вида: 127466748171:HJfwijfw88jf32lc9FHjwpfkfgwerhjf
Он нам понадобится в дальнейшем
Шаг 1 - регистрируемся на Repl.it
Создаем новый проект на Python
Шаг 2 - Пишем код бота
В проекте будет создан файл main.py. В нем размещаем код бота:
Тут стоит обратить на установку модуля pytelegrambotapi: импортируем сначала pip
и потом выполняем его через: pip.main(['install', 'pytelegrambotapi']).
В этом случае при запуске никаких дополнительных действий для установки не потребуется
import os
from background import keep_alive #импорт функции для поддержки работоспособности
import pip
pip.main(['install', 'pytelegrambotapi'])
import telebot
import time
bot = telebot.TeleBot('СЮДА ВСТАВЬТЕ ВАШ ТОКЕН')
@bot.message_handler(content_types=['text'])
def get_text_message(message):
bot.send_message(message.from_user.id,message.text)
# echo-функция, которая отвечает на любое текстовое сообщение таким же текстом
keep_alive()#запускаем flask-сервер в отдельном потоке. Подробнее ниже...
bot.polling(non_stop=True, interval=0) #запуск бота
Шаг 3 - Создаем Flask-сервер
Создаем в проекте еще один файл background.py
В нем будет запущен Flask-сервер, который будет принимать запросы от сервиса мониторинга и использоваться для поддержания работоспособности скрипта на ReplIt.
Flask - модуль на python для разработки веб-приложений. Мы создадим "шаблон" сервера, в котором только одна страница, необходимая для нашей задачи.
Все дело в том, что в бесплатном режиме запущенный скрипт на Replit будет остановлен спустя некоторое время (10-30 мин) после закрытия вкладки браузера.
Однако, если к веб-серверу был сделан запрос, таймер сбрасывается и скрипт продолжает работать.
from flask import Flask
from flask import request
from threading import Thread
import time
import requests
app = Flask('')
@app.route('/')
def home():
return "I'm alive"
def run():
app.run(host='0.0.0.0', port=80)
def keep_alive():
t = Thread(target=run)
t.start()
Важно, что сервер запускается в файле не напрямую, а в отдельном потоке t = Thread(target=run).
Это обеспечит возможность одновременной работы Flask-сервера и телеграм-бота.
После запуска в верхнем правом углу появилась ссылка (она потребуется чуть позже) по которой можно увидеть результат работы Flask-сервера (в нашем случае сообщение I'm alive).
На этом этапе у нас работает эхо-телеграм-бот и веб-сервер, доступный из вне по адресу вида: YOUR_REPL.your_nickname.repl.co
Однако, спустя 10-30 минут после закрытия вкладки браузера скрипт будет остановлен. Вся хитрость в том, что если "кто-то" будет периодически открывать ссылку, ведущую на страницу нашего веб сервера скрипты будут продолжать работать бесконечно долго.
Шаг 4 - настраиваем службу мониторинга
Для того, чтобы скрипт работал постоянно, воспользуемся сервисом UpTimerRobot. Он будет раз в 5 минут создавать запрос к нашему web-серверу и продлевать время его работы. Регистрация не представляет трудности, поэтому перейдем к следующему этапу.
После входа в личный кабинет, создаем новый монитор
В настройках нового монитора нужно указать название и ссылку, которую мы получили при запуске скрипта выше. Время опросы указываем - каждые 5 минут.
Сохраняем монитор и возвращаемся в ReplIt. В консоле сервера видим входящие обращения от службы мониторинга
Это значит, что все получилось и наш скрипт будет работать 24/7. Можно работать над ним и развивать проект!
Такие дела! Успехов!
Комментарии (27)
nagafonov
07.01.2023 20:59На replit в бесплатном аккаунте все проекты публичные. Так что идея хранить там реализацию бота - плохая.
P.S. Стоит все таки убрать токен из кода, потому что сейчас твой токен могут все посмотреть.
Stepan_Burmistrov Автор
07.01.2023 21:04+1Спасибо за замечания! Безопасность, действительно важна!
У меня есть два комментария:
Если реализация бота представляет коммерческую тайну, наверное стоит воспользоваться платными решениями, а не изобретать велосипед
На Replit есть возможность хранить токены в секрете https://docs.replit.com/programming-ide/storing-sensitive-information-environment-variables
Kenya-West
07.01.2023 21:17Сорри, что пишу вопрос здесь, но именно сейчас я также в раздумии, как хостить с десяток простецких Телеграм без базы
и кринжаи прочую скриптовую живность, обернутую в контейнеры.Платить за несколько VPS уровня "самый бомжатский" мне надоело. А нормальный виртуальный сервер с сотней ГБ постоянного хранилища и приемлемым 2-4 ГБ ОЗУ ударит по карману вчерашнему студенту (в этом году закончил аспирантуру). Так как я - студент вчерашний, то и Heroku как возможность бесплатно хостить бекенд отпадает.
В отличие от автора статьи, я выбрал способ - хранить на самом дешёвом работающем ноутбуке. Нашёл какой-то задрипанный со свежеустановленным 4 года назад SSD, купил за 2.5К рублей. Буду крутить контейнеры или даже оркестр на нем. SLA будет уровня "мамой клянусь, будет работать!"
Проблема: ноутбук находится в домашней сети за NAT'ом провайдера, айпишник как правило динамический. Есть несколько VPS с белыми статическими адресами.
Вопрос: я вот ни разу не сетевик. Подскажите максимально простейшие решение для организации какого-то прокси или чего-то подобного, чтобы: а) контейнер на ноуте, заэкспозивший порт, к примеру, 35590 для HTTP, был доступен по HTTP GET <статический белый IP от VPS:35590>, то есть как на родную VPS'ку шлёшь запросы; б) чтобы я написал `ssh ip:port`, указав тот же самый расово белый статический айпишник - и попал в SSH-сервер ноутбука.
Загадка Жака Фреско - как? На ответ даётся первая страница любого поисковика, полностью забитая рекламами реверсивного прокси, которым я не очень и доверяю и не понимаю, как их готовить
Stepan_Burmistrov Автор
07.01.2023 21:24Для телеграм-бота наличие доступа из вне не актуально же?
А для других скриптов костылей много можно придумать:)
Один из них ngrok- позволяет пробрасывать порты не имея внешнего ip адреса.
Для питона есть библиотека. Ну а дальше, получив ссылку кладем ее в текстовый файл на внешний фтп-сервер, откуда забираем скриптом, который должен подключаться
vasyapypkin
07.01.2023 21:40+1Можно организовать сеть между VPS и ноутом объединив их одной впн'кой, тогда ноуту динамический адрес будет пофиг и внутри сети можно будет обращаться по локальнм ип'кам
web3_Venture
07.01.2023 21:41hosting render , карты не нужны , фри тир на 750часов в месяц , есть докер.
После 15 мин простоя делает суспенк скрипта пока к нему не постучаться , если не хотите задержек после 1 запроса после простоя - то воспользуйтесь uprobot из статьи
mentin
08.01.2023 06:36ноутбук находится в домашней сети за NAT'ом провайдера
А это действительно NAT провайдера? Я чаще видел NAT личного WiFi раутера. В них обычно можно открыть несколько портов и отправить их на одно из локальных устройств (по MAC адресу, чтобы не менялся).
me21
08.01.2023 14:06Ну у меня провайдер выдаёт IP из диапазона 10.0.0.0/8, так что NAT где-то там должен быть.
centralhardware2
08.01.2023 08:35Aws/azure дают бесплатные VPS, которых вчерашнему студенту будет за глаза
PaveTranquil
08.01.2023 10:01+1Как жаль только, что оформить их сейчас из России не представляется возможным.
ruraic
08.01.2023 10:26Максимально простое решение кмк — ZeroTier (или аналогичный сервис). Устанавливаете на ноуте и на своих vps. Получаете общую сеть на все ваши устройства.
remzalp
08.01.2023 20:02Для HTTP использую обычно Nginx - все докеры экспозят на локалхост, Nginx их разруливает, плюс заворачивает в HTTPS, в соответствии с именем хоста еще и разный контент отдаёт с одного и того же порта.
Для более сложных протоколов имеет смысл посмотреть haproxy.
Возможно я не прав, но я предпочитаю между сервисами и интернетом держать контролируемую прослойку.
ComRSMaster
09.01.2023 18:19Есть замечательный бесплатный хостинг alwaysdata, ОЧЕНЬ низкий пинг на сервере Paris1, ещё можно настроить бота на вебхуки, тогда без UptimeRobot, бот будет работать 24/7
stuzer
видел такие туторы на ютубе, и как оно реально работает? есть ли какие то ограничения?
Stepan_Burmistrov Автор
Работает прекрасно! Не раз проверено!
TheRealMaN
У меня почему-то через пару часов начались даунтаймы, сервер правда на fastapi, скрипт уходит в сон и очень не охотно просыпается(
Stepan_Burmistrov Автор
Это странно, т.к это свойство описано в документации, но именно для flask
https://docs.replit.com/hosting/deploying-http-servers
TheRealMaN
Видимо, в часы пик нагрузка на их серверы возрастает, и появляются перебои
Stepan_Burmistrov Автор
Интересно, почему так происходит?
Попробуйте сделать по образцу из статьи и проверить