Как сделать так чтобы heroku не засыпал

Добавил пользователь Валентин П.
Обновлено: 04.10.2024

Существуют многочисленные бесплатные услуги хостинга для публичного запуска приложений Node.js. Одним из таких сервисов является Heroku, который позволяет развертывать, управлять и масштабировать свои приложения в Интернете.

В этой статье мы создадим простое приложение Node и Express.js, которое сокращает данные ссылки, и развернем его в Heroku.

Создание Node.js URL Shortener

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

Создание каталога проекта

Для начала давайте сделаем папку для нашего проекта:

Инициализация npm

Далее давайте инициализируем npm и вместе с ним запускаем наш проект:

npm init задаст ряд вопросов (название пакета, версия, описание и т. д.). Для простоты давайте пропустим все это, нажав Enter для каждой подсказки. Затем Node сгенерирует файл package.json и распечатает его в терминал:

Поля в package.json (имя пакета, описание, автор и т.д.) могут быть обновлены в любое время, поэтому вам не нужно слишком беспокоиться об этом.

То, что мы добавили здесь вручную, это команда "start": "node app.js" . Она будет чрезвычайно важна позже, когда мы развернем приложение в Heroku.

Heroku нужно знать, как запустить наше приложение, и обычно это делается через Procfile. Поскольку наше приложение очень простое, Procfile будет излишним, и достаточно просто определить, что наше приложение должно запускаться простым выполнением команды node app.js .

Установка Экспресс

После этого мы готовы установить Express:

Построение Node сервера

С установленным Express я создам очень простое приложение в файле под названием app.js :

Приложение на данный момент является только образцом Express, необходимым для его настройки, с одним обработчиком маршрута, который возвращает HTML-страницу через порт 3000 .

Давайте продолжим и определим страницу, которая будет принимать URL, который мы хотим сократить. Он будет состоять только из заголовка и простой формы, которая принимает URL:

Мы можем проверить, нормально ли работает приложение, выполнив:

Поскольку мы добавили команду "start" : "node app.js" в наш package.json, мы также можем запустить ее с помощью команды NPM:


Обработка формы отправки

Хотя страница отображается правильно, нет логики для обработки POST запроса, отправленного через форму по адресу /url .

Чтобы извлечь URL из запроса, отправленного через форму, мы будем использовать модуль body-parser и извлекать его из тела запроса, поэтому давайте продолжим, выполним require а также настроим его для использования:

После этого мы можем извлечь тело запроса через req.body , поэтому давайте продолжим и создадим другой обработчик запроса, который упаковывает URL-адрес из тела и отправляет его обратно:

Это все еще не то, что мы хотим, поскольку мы получаем полный URL-адрес, а не сокращенную версию.

Сокращение URL

Единственное, что осталось сделать для того, чтобы наше приложение Node было завершено - это укоротить URL-адрес перед отправкой. Для этого мы можем использовать модуль node-url-shorttener. Давайте установим его через npm:

Затем получим пакет в приложении:

И, наконец, давайте добавим еще один блок кода, который сокращает URL-адрес перед отправкой обратно:

urlShortner имеет метод short() , который принимает два параметра: исходный URL и функцию обратного вызова. Сокращенный URL-адрес передается в функцию обратного вызова, а затем в res.send() .

Давайте запустим приложение и протестируем его:


После ввода URL мы встречаем:


Развертывание в Heroku

После того, как у вас есть учетная запись, вам необходимо установить инструменты CLI Heroku, которые используются для развертывания. Heroku предоставляет инструкции по установке в центре разработки.

Отправка в Heroku

Развертывание в Heroku работает через Git. Это очень просто, когда вы понимаете, как это работает. По сути, вы можете выполнить развертывание в Heroku, используя удаленное хранилище, точно так же, как на GitHub.

Поскольку это новый проект, Git необходимо инициализировать:

Теперь мы готовы добавить и зафиксировать все файлы проекта. Однако, прежде чем сделать это, мы добавим файл .gitignore , потому что мы не хотим, чтобы каталог node_modules был зафиксирован. Он должен генерироваться npm при развертывании, а не фиксироваться для контроля версий

В вашем файле . gitignore просто добавьте:

Благодаря этому мы можем добавить и зафиксировать наш проект:

После того, как проект будет принят, нам нужно создать приложение Heroku, которое будет соответствовать нашему приложению Node:

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

После завершения, Heroku возвращает имя и URL вновь созданного приложения (имя вашего приложения будет отличаться от моего). Если вы перейдете по URL, вы увидите страницу приветствия Heroku.

Это по-прежнему не наше приложение для сокращения URL-адресов, а просто общедоступное приложение Heroku, в которое мы будем развертывать свое собственное.

Развертывание приложения

В предыдущей команде heroku create новый удаленный сервер был добавлен в ваш репозиторий Git, что позволит вам выполнить развертывание в Heroku с помощью простой команды, подобной этой:

Поскольку приложение успешно развернуто, мы можем запустить его:


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

Чтобы приложение работало как локально, так и в Heroku, мы изменим порт, и добавим process.env.PORT :

Повторно развернув приложение и обновив страницу, все работает просто отлично!

Как развернуть проект на Heroku.

Сегодня мы будем деплоить проект, написанный на Svelte, в облачную PaaS-платформу – Heroku. Будем называть её просто “хостинг”.

Начнем с создания базовой структуры, то есть с чистого листа.

За основу возьмем этот бойлерплейт: svelte-boilerplate

Склонируем проект в нужную папку.

Перейдем в директорию svelte и запустим команду для установки зависимостей

Если всё прошло успешно, сайт будет доступен по ссылке, откроем её в браузере.

Стартовая страница бойлерплейта Pankod.

Теперь попробуем собрать проект. По идее у нас должна создаться папка public, в которой будут html, css и js файлы, они будут сжаты и оптимизированы, их мы и будем использовать на продакшне.

Команда для сборки проекта

Итог должен быть таким:

Папка с файлами html, css и js.

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

Скажу сразу: запускать проект на хостинге через команду npm run start:dev плохая идея. Вот почему:

  1. Файлы и картинки не будут оптимизированы и сжаты
  2. Сервер для разработки не стабилен и не предназначен для больших нагрузок
  3. Нет возможности добавить настройки для сервера
  4. И куча других проблем.

Мы же сделаем всё как надо и запустим наш проект на простеньком Express.js сервере.

В корне проекта создадим файл server.js, в него поместим код ниже

Главное – указать переменную с портом, чтобы Heroku мог подставить нужный порт при старте.

А так сервер очень простой, при запуске он всего лишь будет рендерить index.html из папки public. Проверим

И если перейти по ссылке, мы увидим стартовую страницу сайта.

Стартовая страница бойлерплейта Pankod.

С файлами для продакшна разобрались, сервер подготовили, далее займемся настройкой Heroku CLI.

Установка и настройка Heroku CLI

Heroku CLI – это консольная утилита для удаленной работы с Heroku.

Начнем с установки. У них на сайте есть подробная инструкция . Идём читать.

Обычно раздела “Download and install” достаточно

Установка heroku на локальную машину.

Пробуем установить. Если всё нормально, наберём в консоли команду heroku. Результат должен быть примерно таким

Это говорит нам о том, что Heroku доступен и готов к работе. Попробуем с помощью него запустить наш сервер. Так же в корне проекта, где находится файл server.js, запустим команду

У меня результат такой. Сайт работает

Далее в корне проекта нужно создать Procfile. Он поможет определить, как запустить приложение. Heroku в первую очередь будет искать именно его. Если в проекте отсутствует этот файл, heroku попытается запустить веб-сервер с помощью стартового скрипта (npm start) в вашем package.json.

Вставим кусок кода в Procfile

И попытаемся снова запустить сайт

На этот раз никаких ошибок в консоли нет.

Ну и последним шагом добавим в package.json команду для сборки проекта на стороне heroku

Команда для сборки проекта.

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

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

Для этого есть два способа:

  1. Залить проект в репозиторий heroku, и он уже сам добавит нужные настройки
  2. Залить на github и в настройках heroku указать ссылку

Мы пойдем по второму пути.

Надеюсь, рассказывать, как заливать проект на github, не нужно?
Я залил сюда.

Если вам всё же интересно почитать про первый способ, вот ссылка. Он особо ничем не отличается, разве что тем, что код будет храниться на стороне heroku.

Возможно, у вас нет аккаунта на github, и этот способ окажется даже проще. Пробуйте.

Настройка хостинга

Когда залили проект на github, переходим в дашборду heroku , чтобы создать новый проект.

Список всех проектов на Heroku.

На этой странице будут находиться все ваши проекты. Чтобы создать новый, сверху справа нажмите на кнопку New, далее на Create new app. Откроется новая страница, на которой нужно ввести данные о новом проекте.

После завершения проект будет создан и нас перенаправит во вкладку Deploy. Там сразу перейдем в настройки github

Настройка github.

Находим нужный нам репозиторий и коннектим

Подключение проекта.

Далее выберем ветку, за которой будет наблюдать heroku, и нажмём на большую тёмную кнопку.

Выбор ветки, за которой будет наблюдать heroku.

Теперь, когда вы зальёте что-то в ветку master, heroku будет подтягивать изменения и обновлять сайт.

На данный момент heroku не успел еще ничего стянуть, поэтому воспользуемся кнопкой ручного обновления

Ручной деплой на Heroku.

После того как сборка завершится (процесс можно отслеживать во вкладке Activity), нажимаем на кнопку Open app

Кнопка запуска проекта на Heroku.

Откроется новая вкладка, и мы снова увидим стартовую страницу нашего сайта, но уже на хостинге heroku. Сайт готов к продакшну, осталось только купить домен. Купить можно тут.
Поменять во вкладке Settings, в секции Domains

Смена тестового домена на Heroku.

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

Я считаю, что цель статьи была выполнена и можно заканчивать. По всем остальным вопросам обращайтесь в официальную документацию.

В качестве хостинга выбран heroku, т.к это отличная площадка для микро проектов. Здесь есть масса современных инструментов, которые можно попробовать совершенно бесплатно. А вообще heroku это облачная PaaS платформа (платформа как услуга) с поддержкой популярных языков программирования. Когда-то давно был только Ruby, сейчас к нему добавились: Java, Node.js, Scala, Clojure, Python и конечно же PHP. На серверах Heroku используются Debian и Ubuntu.

Для загрузки проекта heroku предоставляет удобные инструменты, на данный момент их 3 и это более чем достаточно. С двумя из трех многие давно знакомы, это GitHub и Dropbox. Третий инструмент Heroku Toolbelt, пожалуй, самый необходимый инструмент для тесной работы с платформой, позволяет создавать проекты, загружать исходный код, смотреть и настраивать конфиг, отдает логии и многое другое.

GitHub и Dropbox являются больше менеджерами загрузки проектов, с их помощью можно загружать проект на heroku, но инструментов для управления они не предоставляют. Если плотно работаете с GitHub, то можете настроить автоматический деплой проекта на heroku. Загрузку из Dropbox можно сделать только из веб интерфейса (dashboard) проекта на вкладке Deploy.

Инструмент Heroku Toolbelt, устанавливается в систему и позволяет из командной строки управлять приложениями, размещенными на платформе. После установки необходимо ввести свои учетные данные и пользоваться. Когда heroku предложить сгенерировать SSH ключ, надо согласиться.

Приведу наиболее часто употребимые команды с комментариями

инциализация репозитория в папке разрабатываемого проекта и привязка файлов к репозиторию some-project на сервере

для проверки, что репозиторий привязан

создает приложение и привязывает текущую папку к репозиторию проекта

Выводит конфигурации для проекта

Выводит логи проекта, все ошибки и обращения. Если проект вдруг не завелся, то это первая команда, которую стоит выполнить

Загрузка проекта на сервер через git выполняется комндами

Теперь проект загружен на сервер и его можно открыть по адресу some-project.herokuapp.com, заменив some-project на имя которое сгенерировал heroku или какое вы придумали сами. Во время загрузки heroku проверить наличие фалов composer.lock и Procfile. Все зависимости прописанные в composer буду установлены сами кроме ветки "require-dev". Сразу хочу сказать, что если требуется включить некоторые расширения PHP то их проще всего прописать в composer, например для расширений intl и mbstring прописать

Помимо расширений есть возможность выбрать версию PHP или HHVM, более подробно можно почитать здесь.

Файл Procfile позволяет настроить типы процессов, например тип web может быть запущен с командами heroku-php-apache2 (for PHP & Apache2) или heroku-php-nginx (for PHP & Nginx), аналогично для hhvm.

Стоит сказать и об ограничениях платформы heroku

Проект погружается в "сон", если в течении часа к нему не было обращений. После обращения проект просыпается. Репозиторий не может превышать 1 Гб. Есть еще масса различных ограничен, которые не сильно чувствительны к микропроектам, можно ознакомиться здесь.

Мы с вами научились выкладывать наши сайты и ботов на Pythonanywhere, но это не единственный вариант. Существуют другие подобные сервисы - Heroku, Scalingo, Openshift.

Все они являются PaaS - Platform-as-a-Service, которые позволяют вам очень просто пользоваться облачным хостингом и быстро выкладывать свои приложения вместо того, чтобы самостоятельно настраивать сервер.

От Pythonanywhere они отличаются тем, что для них разработчиками не всегда предоставлен такой же удобный веб-интерфейс, в котором многое делается кнопочками в панели управления, и нужный функционал мы получем через командную строку Unix. Но ощее с Pythonanywhere у них то, что там есть возможность делать хотя бы что-то из того, что вам нужно, бесплатно.

Дело в том, что вслед за компанией Amazon многие другие IT-компании стали предоставлять пользователям (в числе которых и частные лица, и компании поменьше) облачные сервисы, то есть возможность не содержать на свои средства большой парк серверов (это часто неудобно, потому что бесперебойную работу серверов обеспечить не так просто), а покупать место на мощных серверах, которые содержит хозяин облака. Основные конкурирующие на этом поле сервисы -- это Amazon Web Services, Google Cloud и Microsoft Azure. Все они платные (Google предоставляет на своей платформе условно-бесплатный тестовый период в один месяц), но мощные и надёжные.

Почему еще и Heroku?

Pythonanywhere Heroku
только одно приложение несколько приложений
свой домен - платная функция позволяет использовать собственное доменое имя
ограниченный доступ к внешним ресурсам доступ к внешним ресурсам не ограничен

Подробнее про количество бесплатных приложений: на Heroku можно создавать несколько приложений бесплатно лишь до тех пор, пока у вас есть свободные Dyno (про это будет ниже).

Подготовка к выкладыванию

  1. Чтобы наш фласк-сайт или фласк-бот заработал на Heroku, нужно убедиться, что в конце основной программы написан вот такой код:

В директории с вашим фласк-приложением обязательно должны быть следующие три файла:

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

Обратите внимание, что в этот список НЕ НУЖНО писать setuptools и pip!

Когда вы будете выкладывать приложение, Heroku прочитает файл requirements.txt и установит все перечисленные модули командой pip install -r requirements.txt .

runtime.txt - в этом файле нужно написать одну строчку:

Если в директории нет runtime.txt , то Heroku будет по умолчанию думать, что ваше приложение написано на Python 2.7.

Procfile - обратите внимание, что у файла нет расширения, иначе heroku не сможет прочитать его содержимое. В этом файле нужно написать одну строчку:

Для выкладывания приложений на Heroku используется git. Поэтому если в вашей директории с проектом еще нет git-репозитория, его нужно создать. Открываем терминал (Mac, Linux) или командную строку (Windows) и пишем:

  • cd путь-к-директории - переходим в директорию с нашим фласк-проектом,
  • git init - создаем в текущей директории репозиторий,
  • git add * - говорим гиту следить за всеми файлами в репозитории,
  • git commit -m 'Initial commit' - делаем первый коммит.

Как выложить сайт на Heroku?

Зарегистрироваться на сайте Heroku, ваш email будет логином. Когда вы зарегистрировались, вы попадаете в Dashboard. Сейчас у вас там ничего нет - вам предлагают создать приложение (an app) или пройти туториал по работе с Heroku и выбранного вами языка программирования. Туториал по питону там ориентирован на джанго, мы работаем с фласком, так что наши действия будут слегка отличаться.

Открыть терминал (Mac, Linux) или командную строку (Windows) и выполнить команды:

  • cd путь-к-директории - переходим в директорию с нашим фласк-проектом,
  • heroku login - логинимся в наш аккаунт Heroku,
  • ввести свой емейл и пароль, с которыми мы зарегистрировались,
  • heroku create - создаем приложение, которое поможет Heroku получить наш код и запустить его. В этот момент Heroku делает сразу несколько вещей.

Во-вторых, к вашему репозиторию добавляется удаленный репозиторий (git remote), который называется heroku . У одного локального репозитория на вашем компьютере может быть несколько удаленных (например, у вас может быть origin - это ваш удаленный репозиторий на GitHub, и heroku - удаленный репозиторий на Heroku.)

git push heroku master - эта команда отправляет наш код на облачный хостринг, и Heroku устанавливает нужные модули.

heroku ps:scale web=1 - эта команда говорит запустить наш фласк-сайт на одном dyno.

A dyno is a lightweight Linux container that runs a single user-specified command.

То есть ваш сайт или бот будет работать на маленьком виртуальном Линукс-"сервере". Бесплатно вам доступно 550 или 1000 таких dyno.

heroku open - эта команда открывает ваш сайт в браузере. Ура! Все готово!

Если по какой-то причине сайт не заработал, то нужно посмотреть логи:

Поскольку мы отправляем все файлы на Heroku через git, возникает небольшая проблема:

Для работы с секретами рекомендуется использовать переменные среды: ваши ключи будут храниться в текстовых переменных вашей системы и в вашем Heroku-приложении, но при этом они никогда не попадут в открытый git-репозиторий.

Раньше мы с вами писали секретные ключи в игнорируемый файл (например, TOKEN = ". " внутри conf.py ) и импортировали секретные переменные с помощью from conf import * .

Вместо этого, можно установить переменную среды прямо в терминале\командной строке:

  • Mac, Linux - export SOME_SECRET_KEY=1c3-cr3am-15-yummy
  • Windows - set SOME_SECRET_KEY 1c3-cr3am-15-yummy (если у вас Windows 10, то setx )
  • Heroku - heroku config:set SOME_SECRET_KEY=1c3-cr3am-15-yummy

После этого и на вашем компьютере, и в облачном хостинге Heroku переменную среды можно прочитать с помощью питона:

То есть строчку from conf import * вам придется заменить на строчки вида:

Кроме того, старые вебхуки с адресом на pythonanywhere уже не действительны, и их надо заменить на адрес вашего приложения. В целом, код очень простого бота из первого конспекта по телеграму, адаптированный под Heroku, будет выглядеть вот так:

Как запустить что-то по расписанию?

Если вы делаете какой-то веб-сервис, который должен обновлять какие-то данные через определённые промежутки времени (например, каждый день в 12:00 или каждый четверг в 17:25), то вы можете настроить стандартную Unix-утилиту cron, которая умеет запускать на сервере какой-то нужный пользователю процесс в тот момент, когда это ему необходимо.

Есть и другой консольный редактор, nano, он проще и все команды, которые вы должны выполнить для тех или иных действий, постоянно показываются внизу экрана ("крышечка" означает "Ctrl"):

nano

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

Создать или отредактировать расписание можно вызовом команды crontab -e . В открывшемся окне нужно будет описать в формате cron, что вы хотите, чтобы было сделано, и когда это должно быть сделано. Формат cron подразумевает, что вы напишете минута час день_месяца месяц день_недели команда , а потом -- то, что должно будет запуститься, в том виде, в котором бы вы сами это запускали вручную в командной строке.

Примеры расписания в cron:

Обратите внимание, что к программам нужно писать полный путь, потому что cron ничего не знает про то, какую директорию вы считаете рабочей.

Рано или поздно в разработке ботов вы столкнетесь с проблемой хостинга бота. Скорее всего, у вас нет своего собственного сервера, а платить за виртуальный не каждый хочет, да и настройка виртуального сервера может казаться чем-то непосильным для начинающих разработчиков. К счастью, есть много сервисов, предоставляющих хостинг приложений бесплатно. Одним из таких есть Heroku. Сегодня я расскажу, как легко и быстро развернуть простенького бота на данной платформе.

heroku logo

Почему именно Heroku? Она была одной из первых платформ, предоставляющих услуги типа PaaS (Platform as a Service) и есть лидером в этой сфере. Используя такие облачные сервисы, разработчик должен предоставить только приложение. Обо всем остальном — серверное железо, операционная система, интерпретатор языка и база данных, позаботится сервис.

PaaS

По умолчанию, Heroku предлагает до 5 приложений на аккаунт и дает 550 бесплатных дино-часов в месяц. Если же подключить к аккаунту банковскую карту, их к-во расширится до 1000. Подробнее о фри дино-часах можно почитать здесь.

Прежде всего, для использования Heroku, нужно авторизироваться. Если у вас нет аккаунта, создайте его, перейдя по этой ссылке. Затем нужно установить Heroku Toolbelt. Эта утилита на данный момент поддерживает основные ОС: Windows, macOS и Linux.

После установки, чтобы убедиться, что все установилось, откройте консоль и введите heroku :

code

Если все работает, логинимся, используя данные, введенные при регистрации:

Создание приложения

Сегодня мы будем деплоить бота, написанного во второй части. Для начала создадим наше приложение под названием momentumbots :

code

code

Имя momentumbots уже занято мной, так что придумайте свое 🙂

Если же не указывать название приложения, то будет сгенерировано рандомное название:

code

Ставим Вебхуки

Читайте также: