Очень часто возникающий вопрос: где можно разместить скрипты на 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-сервера
Запуск Flask-сервера

После запуска в верхнем правом углу появилась ссылка (она потребуется чуть позже) по которой можно увидеть результат работы Flask-сервера (в нашем случае сообщение I'm alive).

На этом этапе у нас работает эхо-телеграм-бот и веб-сервер, доступный из вне по адресу вида: YOUR_REPL.your_nickname.repl.co
Однако, спустя 10-30 минут после закрытия вкладки браузера скрипт будет остановлен. Вся хитрость в том, что если "кто-то" будет периодически открывать ссылку, ведущую на страницу нашего веб сервера скрипты будут продолжать работать бесконечно долго.

Шаг 4 - настраиваем службу мониторинга

Для того, чтобы скрипт работал постоянно, воспользуемся сервисом UpTimerRobot. Он будет раз в 5 минут создавать запрос к нашему web-серверу и продлевать время его работы. Регистрация не представляет трудности, поэтому перейдем к следующему этапу.

После входа в личный кабинет, создаем новый монитор

Создание монитора в UpTimerRobot
Создание монитора в UpTimerRobot

В настройках нового монитора нужно указать название и ссылку, которую мы получили при запуске скрипта выше. Время опросы указываем - каждые 5 минут.

Сохраняем монитор и возвращаемся в ReplIt. В консоле сервера видим входящие обращения от службы мониторинга

Это значит, что все получилось и наш скрипт будет работать 24/7. Можно работать над ним и развивать проект!

Такие дела! Успехов!

Комментарии (27)


  1. stuzer
    07.01.2023 20:38

    видел такие туторы на ютубе, и как оно реально работает? есть ли какие то ограничения?


    1. Stepan_Burmistrov Автор
      07.01.2023 20:38

      Работает прекрасно! Не раз проверено!


      1. TheRealMaN
        08.01.2023 21:07

        У меня почему-то через пару часов начались даунтаймы, сервер правда на fastapi, скрипт уходит в сон и очень не охотно просыпается(


        1. Stepan_Burmistrov Автор
          08.01.2023 21:23

          Это странно, т.к это свойство описано в документации, но именно для flask

          https://docs.replit.com/hosting/deploying-http-servers

          Once deployed, the server will continue to run in the background, even after you close the browser tab. The server will stay awake and active until an hour after its last request, after which it will enter a sleeping stage. A sleeping repl will wake as soon as it receives another request; there is no need to re-run the repl. However, if you make changes to your server, you will need to restart the repl to see those changes reflected in the live version.


          1. TheRealMaN
            09.01.2023 09:31

            Видимо, в часы пик нагрузка на их серверы возрастает, и появляются перебои


            1. Stepan_Burmistrov Автор
              09.01.2023 13:59

              Интересно, почему так происходит?
              Попробуйте сделать по образцу из статьи и проверить


  1. nagafonov
    07.01.2023 20:59

    На replit в бесплатном аккаунте все проекты публичные. Так что идея хранить там реализацию бота - плохая.

    P.S. Стоит все таки убрать токен из кода, потому что сейчас твой токен могут все посмотреть.


    1. Stepan_Burmistrov Автор
      07.01.2023 21:04
      +1

      Спасибо за замечания! Безопасность, действительно важна!

      У меня есть два комментария:

      1. Если реализация бота представляет коммерческую тайну, наверное стоит воспользоваться платными решениями, а не изобретать велосипед

      2. На Replit есть возможность хранить токены в секрете https://docs.replit.com/programming-ide/storing-sensitive-information-environment-variables


  1. 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-сервер ноутбука.

    Загадка Жака Фреско - как? На ответ даётся первая страница любого поисковика, полностью забитая рекламами реверсивного прокси, которым я не очень и доверяю и не понимаю, как их готовить


    1. Stepan_Burmistrov Автор
      07.01.2023 21:24

      Для телеграм-бота наличие доступа из вне не актуально же?

      А для других скриптов костылей много можно придумать:)

      Один из них ngrok- позволяет пробрасывать порты не имея внешнего ip адреса.

      Для питона есть библиотека. Ну а дальше, получив ссылку кладем ее в текстовый файл на внешний фтп-сервер, откуда забираем скриптом, который должен подключаться


    1. kmm777
      07.01.2023 21:40

      Можно с помощью ddns

      https://en.m.wikipedia.org/wiki/Dynamic_DNS


      1. thealfest
        08.01.2023 21:19
        +1

        как ddns поможет пробросить порты через нат?


        1. tocha4
          09.01.2023 15:56

          ddns дает тебе dns имя, которое решает проблему динамического IP. (он сам будет обновлять на твои новые ip). Проброс портов делается на самом примитивном роутере (local server, port forwarding ,etc...)


          1. thealfest
            09.01.2023 18:20

            При чем здесь примитивный роутер, если выше речь шла про нат провайдера?


    1. vasyapypkin
      07.01.2023 21:40
      +1

      Можно организовать сеть между VPS и ноутом объединив их одной впн'кой, тогда ноуту динамический адрес будет пофиг и внутри сети можно будет обращаться по локальнм ип'кам


    1. web3_Venture
      07.01.2023 21:41

      hosting render , карты не нужны , фри тир на 750часов в месяц , есть докер.

      После 15 мин простоя делает суспенк скрипта пока к нему не постучаться , если не хотите задержек после 1 запроса после простоя - то воспользуйтесь uprobot из статьи


    1. mentin
      08.01.2023 06:36

      ноутбук находится в домашней сети за NAT'ом провайдера

      А это действительно NAT провайдера? Я чаще видел NAT личного WiFi раутера. В них обычно можно открыть несколько портов и отправить их на одно из локальных устройств (по MAC адресу, чтобы не менялся).


      1. me21
        08.01.2023 14:06

        Ну у меня провайдер выдаёт IP из диапазона 10.0.0.0/8, так что NAT где-то там должен быть.


    1. Dmitry27
      08.01.2023 06:50

      Я думаю, что сможете найти реализацию на Яндекс облаке.


    1. centralhardware2
      08.01.2023 08:35

      Aws/azure дают бесплатные VPS, которых вчерашнему студенту будет за глаза


      1. PaveTranquil
        08.01.2023 10:01
        +1

        Как жаль только, что оформить их сейчас из России не представляется возможным.


    1. ruraic
      08.01.2023 10:26

      Максимально простое решение кмк — ZeroTier (или аналогичный сервис). Устанавливаете на ноуте и на своих vps. Получаете общую сеть на все ваши устройства.


    1. remzalp
      08.01.2023 20:02

      Для HTTP использую обычно Nginx - все докеры экспозят на локалхост, Nginx их разруливает, плюс заворачивает в HTTPS, в соответствии с именем хоста еще и разный контент отдаёт с одного и того же порта.

      Для более сложных протоколов имеет смысл посмотреть haproxy.

      Возможно я не прав, но я предпочитаю между сервисами и интернетом держать контролируемую прослойку.


  1. iantoshkai
    08.01.2023 20:45

    есть еще крутая штука, deta.sh. Для ботов топ, и бесплатная.


    1. igor6130
      08.01.2023 21:07

      Есть инструкции по запуску телеграмм-ботов?


    1. web3_Venture
      09.01.2023 00:34

      ага только нужно менять код так как они хотят )


  1. ComRSMaster
    09.01.2023 18:19

    Есть замечательный бесплатный хостинг alwaysdata, ОЧЕНЬ низкий пинг на сервере Paris1, ещё можно настроить бота на вебхуки, тогда без UptimeRobot, бот будет работать 24/7