|
| 1 | +# Heroku |
| 2 | + |
| 3 | +## PaaS |
| 4 | + |
| 5 | +Мы с вами научились выкладывать наши сайты и ботов на Pythonanywhere, но это не единственный вариант. Существуют другие подобные сервисы - [Heroku](https://www.heroku.com/), [Scalingo](https://scalingo.com/), [Openshift](https://www.openshift.com/). |
| 6 | + |
| 7 | +Все они являются PaaS - Platform-as-a-Service, которые позволяют вам очень просто пользоваться облачным хостингом и быстро выкладывать свои приложения вместо того, чтобы самостоятельно настраивать сервер. |
| 8 | + |
| 9 | +## Почему еще и Heroku? |
| 10 | + |
| 11 | +У бесплатных аккаунтов Heroku есть некоторое количество преимуществ перед аналогичными аккаунтами Pythonanywhere: |
| 12 | + |
| 13 | +|Pythonanywhere | Heroku | |
| 14 | +| --- | --- | |
| 15 | +|только одно приложение | несколько приложений | |
| 16 | +| свой домен - платная функция | позволяет использовать собственное доменое имя | |
| 17 | +| ограниченный доступ к внешним ресурсам | доступ к внешним ресурсам не ограничен | |
| 18 | + |
| 19 | +__Подробнее про ограниченный доступ__: на Pythonanywhere можно обращаться лишь к тем сайтам, которые входят в белый список разрешенных ресурсов. Т.е. например, наш сайт, который регулярно скачивает новости с hse.ru не будет работать на Pythonanywhere, потому что hse.ru не включен в белый список. На Heroku таких ограничений нет. |
| 20 | + |
| 21 | +__Подробнее про количество бесплатных приложений__: на Heroku можно создавать несколько приложений бесплатно лишь до тех пор, пока у вас есть свободные Dyno (про это будет ниже). |
| 22 | + |
| 23 | + |
| 24 | +## Подготовка к выкладыванию |
| 25 | + |
| 26 | +1) Чтобы наш фласк-сайт или фласк-бот заработал на Heroku, нужно убедиться, что в конце основной программы написан вот такой код: |
| 27 | + |
| 28 | +```python |
| 29 | +if __name__ == '__main__': |
| 30 | + import os |
| 31 | + app.debug = True |
| 32 | + port = int(os.environ.get("PORT", 5000)) |
| 33 | + app.run(host='0.0.0.0', port=port) |
| 34 | +``` |
| 35 | + |
| 36 | + |
| 37 | +2) В директории с вашим фласк-приложением обязательно должны быть следующие три файла: |
| 38 | + * __`requirements.txt`__ - в этом файле нужно перечислить все не стандартные питоновские модули, которые необходимы для вашей программы. В списке нужно указать не только название модуля, но и нужную вам версию. Выглядеть это будет примерно так: |
| 39 | + |
| 40 | + ``` |
| 41 | + Flask==0.12.1 |
| 42 | + pymorphy2==0.8 |
| 43 | + pymystem3==0.1.5 |
| 44 | + requests==2.13.0 |
| 45 | + ``` |
| 46 | + |
| 47 | + Обратите внимание, что в этот список НЕ НУЖНО писать setuptools и pip! |
| 48 | + |
| 49 | + Когда вы будете выкладывать приложение, Heroku прочитает файл `requirements.txt` и установит все перечисленные модули командой `pip install -r requirements.txt`. |
| 50 | + |
| 51 | + * __`runtime.txt`__ - в этом файле нужно написать одну строчку: |
| 52 | + |
| 53 | + python-3.6.1 |
| 54 | + |
| 55 | + Если в директории нет `runtime.txt`, то Heroku будет по умолчанию думать, что ваше приложение написано на Python 2.7. |
| 56 | + |
| 57 | + * __`Procfile`__ - обратите внимание, что у файла нет расширения. В этом файле нужно написать одну строчку: |
| 58 | + |
| 59 | + web: python flask_app.py |
| 60 | + |
| 61 | + Вместо `flask_app.py` нужно написать название вашего файла с фласк-приложением. `Procfile` - это специальный файл, в котором нужно объяснить Heroku, как именно нужно запускать ваше приложение. `web` значит, что мы написали приложение, которое отвечает на http-запросы, `python flask_app.py` обозначает команду, с помощью которой приложение запускается. |
| 62 | + |
| 63 | + |
| 64 | +3) Для выкладывания приложений на Heroku используется git. Поэтому если в вашей директории с проектом еще нет git-репозитория, его нужно создать. Открываем терминал (Mac, Linux) или командную строку (Windows) и пишем: |
| 65 | + * `cd путь-к-директории` - переходим в директорию с нашим фласк-проектом, |
| 66 | + * `git init` - создаем в текущей директории репозиторий, |
| 67 | + * `git add .` - говорим гиту следить за всеми файлами в репозитории, |
| 68 | + * `git commit -m 'Initial commit'` - делаем первый коммит. |
| 69 | + |
| 70 | + |
| 71 | +## Как выложить сайт на Heroku? |
| 72 | + |
| 73 | +1) Зарегистрироваться на сайте [Heroku](https://www.heroku.com/), ваш email будет логином. Когда вы зарегистрировались, вы попадаете в Dashboard. Сейчас у вас там ничего нет - вам предлагают создать приложение (an app) или пройти туториал по работе с Heroku и выбранного вами языка программирования. Туториал по питону там ориентирован на джанго, мы работаем с фласком, так что наши действия будут слегка отличаться. |
| 74 | + |
| 75 | +2) Скачать установщик для вашей ОС и установить Heroku CLI - Command Line Interface - https://devcenter.heroku.com/articles/heroku-cli |
| 76 | + |
| 77 | +3) Открыть терминал (Mac, Linux) или командную строку (Windows) и выполнить команды: |
| 78 | + |
| 79 | + * __`cd путь-к-директории`__ - переходим в директорию с нашим фласк-проектом, |
| 80 | + * __`heroku login`__ - логинимся в наш аккаунт Heroku, |
| 81 | + * ввести свой емейл и пароль, с которыми мы зарегистрировались, |
| 82 | + * __`heroku create`__ - создаем приложение, которое поможет Heroku получить наш код и запустить его. В этот момент Heroku делает сразу несколько вещей. |
| 83 | + |
| 84 | + Во-первых, он генерирует случайное название для нашего приложения, но можно передать ваше собственное название, например, `heroku create my-app-04062017`. Ваш сайт будет доступен по адресу `имя-приложения.herokuapp.com`. |
| 85 | + |
| 86 | + Во-вторых, к вашему репозиторию добавляется удаленный репозиторий (git remote), который называется `heroku`. У одного локального репозитория на вашем компьютере может быть несколько удаленных (например, у вас может быть `origin` - это ваш удаленный репозиторий на GitHub, и `heroku` - удаленный репозиторий на Heroku.) |
| 87 | + |
| 88 | + * __`git push heroku master`__ - эта команда отправляет наш код на облачный хостринг, и Heroku устанавливает нужные модули. |
| 89 | + * __`heroku ps:scale web=1`__ - эта команда говорит запустить наш фласк-сайт на одном dyno. |
| 90 | + |
| 91 | + > A dyno is a lightweight Linux container that runs a single user-specified command. |
| 92 | + |
| 93 | + То есть ваш сайт или бот будет работать на маленьком виртуальном Линукс-"сервере". Бесплатно вам доступно 550 или 1000 таких dyno. |
| 94 | + |
| 95 | + * __`heroku open`__ - эта команда открывает ваш сайт в браузере. Ура! Все готово! |
| 96 | + * Если по какой-то причине сайт не заработал, то нужно посмотреть логи: |
| 97 | + |
| 98 | + - __`heroku logs`__ - эта команда распечатает 100 последних строчек логов, т.е. если произошла какая-то ошибка, то информацию об этой ошибке вы увидите в конце логов. |
| 99 | + - или __`heroku logs --tail`__ - эта команда показывает логи в реальном времени, т.е. если ваша программа что-то печатает в консоль с помощью `print(...)` или питон печатает сообщение об ошибке, то вы будете в реальном времени видеть, что именно происходит. |
| 100 | + - подробнее - https://devcenter.heroku.com/articles/logging |
| 101 | + |
| 102 | +Когда вы меняете что-то в вашей программе\директории, то изменения нужно отправить на Heroku: |
| 103 | + |
| 104 | + git add . |
| 105 | + git commit -m "Demo" |
| 106 | + git push heroku master |
| 107 | + heroku ps:scale web=1 |
| 108 | + |
| 109 | + |
| 110 | +## Секретные ключи |
| 111 | + |
| 112 | +Поскольку мы отправляем все файлы на Heroku через git, возникает небольшая проблема: |
| 113 | + |
| 114 | +Что если у нас есть секретные файлы (например, API-токены или пароли), которые включены в `.gitignore`? Получается, мы никак не сможем отправить эти секретные файлы на облачный хостинг через git. |
| 115 | + |
| 116 | +### Переменные среды |
| 117 | +Для работы с секретами рекомендуется использовать [переменные среды](https://en.wikipedia.org/wiki/Environment_variable): ваши ключи будут храниться в текстовых переменных вашей системы и в вашем Heroku-приложении, но при этом они никогда не попадут в открытый git-репозиторий. |
| 118 | + |
| 119 | +Раньше мы с вами писали секретные ключи в игнорируемый файл (например, `TOKEN = "......"` внутри `conf.py`) и импортировали секретные переменные с помощью `from conf import *`. |
| 120 | + |
| 121 | +Вместо этого, можно установить переменную среды прямо в терминале\командной строке: |
| 122 | + |
| 123 | +* Mac, Linux - `export SOME_SECRET_KEY=1c3-cr3am-15-yummy` |
| 124 | +* Windows - `set SOME_SECRET_KEY 1c3-cr3am-15-yummy` |
| 125 | +* Heroku - `heroku config:set SOME_SECRET_KEY=1c3-cr3am-15-yummy` |
| 126 | + |
| 127 | +После этого и на вашем компьютере, и в облачном хостинге Heroku переменную среды можно прочитать с помощью питона: |
| 128 | + |
| 129 | +```python |
| 130 | +>>> import os |
| 131 | +>>> os.environ["SOME_SECRET_KEY"] |
| 132 | +"1c3-cr3am-15-yummy" |
| 133 | +``` |
| 134 | + |
| 135 | + |
| 136 | +То есть строчку `from conf import *` вам придется заменить на строчки вида: |
| 137 | + |
| 138 | +```python |
| 139 | +import os |
| 140 | +SOME_SECRET_KEY = os.environ["SOME_SECRET_KEY"] |
| 141 | +``` |
| 142 | + |
| 143 | + |
0 commit comments