Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. ·...
Transcript of Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. ·...
Сравнение трендовых способов деплоя Python-проектов
Igor Davydenko2012 Kyiv.py#6
http://bit.ly/kyiv-py-6-djangonaut
1
Про что это я?
‣ Heroku
‣ ep.io
‣ DotCloud
‣ Amazon EC2
‣ Others?
http://www.heroku.com/
http://www.ep.io/
http://www.dotcloud.com/
http://aws.amazon.com/ec2/
2
Тестовый проект
‣ Flask
‣ Redis
‣ Чуть-чуть статики
‣ Код в git
#!/usr/bin/env python
import os
from flask import Flaskfrom flask.ext.redis import Redis
from watracest import settingsfrom watracest.utils import add_url
# Initialize Flask appapp = Flask(__name__)app.config.from_object(settings)
# Initialize Redis connectionredis = Redis(app)
# Route all viewsadd_url(app, '/', 'views.home')add_url(app, '/find-out', 'views.find_out')add_url(app, '/reset', 'views.reset')add_url(app, '/secret', 'views.parse_it')add_url(app, '/show-me-the-truth', 'views.show_me')
if __name__ == '__main__': app.debug = os.environ.get('DEBUG', False) app.run(host=os.environ.get('HOST', '0.0.0.0'), port=int(os.environ.get('PORT', 4352)))
3
Heroku. 10 шагов1. Регистрируемся, https://api.heroku.com/signup2. Устанавливаем клиент, https://toolbelt.heroku.com/3. $ heroku login4. $ echo ‘web: gunicorn -b 0.0.0.0:$PORT -w 2 project.app:app’ > Procfile && \
echo ‘gunicorn==0.14.2’ >> requirements.txt5. $ git add . && git commit -m ‘Add Heroku support for the project.’6. $ heroku create --stack cedar7. $ git push heroku master8. $ heroku scale web=1
9. ???10. PROFIT!
4
Heroku. Добавляем Redis
‣ Heroku Add-Ons https://addons.heroku.com/‣ $ heroku addons:add redistogo:nano
‣ Правим settings.py:import os
REDIS_URL = os.environ.get(‘REDISTOGO_URL’, ‘redis://localhost:6379/0’)
‣ $ git add . && git commit -m ‘Redis support for Heroku.’
‣ $ git push heroku master
‣ $ heroku scale web=1
5
Heroku. Получаем результат
‣ Идем ко всем приложениям https://api.heroku.com/myapps
‣ Изменяем имя приложения на newname
‣ Обновляем remote:$ git remote remove heroku$ git remote add heroku [email protected]:newname.git
‣ Набираем в браузере http://newname.herokuapp.com/
‣ ???
‣ PROFIT 100%!
6
ep.io. 9 шагов1. Регистрируемся, https://www.ep.io/signup/ (по инвайту :( )2. Устанавливаем клиент,
$ pip install epio3. $ epio upload_ssh_key4. $ echo ‘[wsgi]
entrypoint = project.app:apprequirements = requirements.txt’ > epio.ini
5. $ git add . && git commit -m ‘Add ep.io support for the project.’6. $ epio create appname7. $ epio upload
8. ???9. PROFIT!
8
ep.io. Добавляем Redis
‣ Добавляем в epio.ini:[services]redis = true
‣ Правим settings.py:try: from bundle_config import configexcept ImportError: # old redis url definitionelse: REDIS_HOST = config['redis']['host'] REDIS_PORT = config['redis']['port'] REDIS_PASSWORD = config['redis']['password']
‣ $ git add . && git commit -m ‘Redis support for ep.io.’‣ $ epio upload
9
DotCloud. 9 шагов1. Регистрируемся, https://www.dotcloud.com/accounts/register/2. Устанавливаем клиент,
$ pip install dotcloud3. $ dotcloud4. $ echo ‘www:
type: python’ > dotcloud.yml5. $ echo ‘import sys
sys.path.append(‘/home/dotcloud/current’)from project.app import app as application’ > wsgi.py
6. $ git add . && git commit -m ‘Add DotCloud support for the project.’7. $ dotcloud push appname .
8. ???9. PROFIT!
11
DotCloud. Добавляем Redis
‣ Добавляем в dotcloud.yml:data: type: redis
‣ Правим settings.py:from flask import json
if os.path.isfile(‘/home/dotcloud/environment.json’): data = json.loads(open(‘/home/dotcloud/environment.json’).read()) REDIS_URL = data[‘DOTCLOUD_DATA_REDIS_URL’]else: # old redis url definition
‣ $ git add . && git commit -m ‘Redis support for DotCloud.’‣ $ dotcloud push appname .
12
DotCloud. Добавляем статику
‣ Создаем nginx.conf:location /static { root /home/dotcloud/current/project ; }
‣ $ git add . && git commit -m ‘Setup static files for DotCloud.’‣ $ dotcloud push appname .
13
http://watracest-playpauseandstop.dotcloud.com/
14
Amazon EC2. 3 шага
1. Создаем тикет DevOps’у, с описанием необходимой конфигурации и типа инстанса.
2. ???3. PROFIT!
15
Amazon EC2. Серьезно :)‣ Это явно не первый проект на Амазоне‣ Есть рецепты для поднятия инстансов‣ DevOps’ы рулят :)
‣ Окей!‣ Регистрируем micro-instance‣ $ ssh micro-instance‣ $ sudo -s‣ # add-apt-repository ppa:nginx/stable‣ # add-apt-repository ppa:rwky/redis‣ # apt-get install aptitude && aptitude update
16
Amazon EC2. Продолжение...‣ # aptitude install git-core python-{,dev,pip,virtualenv} nginx redis‣ # pip install uwsgi‣ $ cd /srv‣ $ git clone repo‣ $ cd repo‣ $ virtualenv env --distribute‣ (env)$ pip install -r requirements‣ # # edit nginx.conf‣ # # edit uwsgi.conf‣ # # add uwsgi to /etc/init.d‣ # service nginx restart‣ # service uwsgi restart‣ ...‣ ...‣ ...‣ fuck that shit, i want be a stripper!
17
Что осталось за кадром?
‣ Gondor.ioНет возможности поиграться, сразу плати за 1 wsgi воркер 10 баксов в месяц. Ориентация на Django.
‣ AppHosted.comПереезжают на новую инфраструктуру. Регистрация на старой инфраструктуре закрыта. Обещали дать аккаунт на тест.
‣ Google App Engine :)Скажем дружно, нафиг нужно :) GAE сам по себе. Если необходимы флюшки GAE, то все другие способы деплоя отпадают сразу.
19
$ python
Heroku $ heroku run python
ep.io $ epio run python
DotCloud$ dotcloud run appname.service python# need to import sys; sys.path.append(‘/home/dotcloud/current’) before# importing some code from project
Amazon EC2$ ssh micro-instance$ cd /path/to/project$ . env/bin/activate$ python
20
$ pip install PIL
Heroku OK
ep.io OK (predefined list of Python libraries)
DotCloud OK
Amazon EC2 OK
21
Цены
Heroku ep.io DotCloudAmazon
EC2
Instance750 hours free
$0.05/hour dyno$0.05/hour worker
$0.03/hour2 services free$99/month for
4 services
http://aws.amazon.com/ec2/
pricing/
Other
up to $15/monthShared databases to 20GB $0.15/GB over
5GB bandwidthhttps://www.dotcloud.com/
pricing/pricing-faq/
http://aws.amazon.com/ec2/
pricing/
Other up to over 9000/monthDedicated database to 1TB
$0.15/GB over 5GB bandwidth
https://www.dotcloud.com/pricing/pricing-faq/
http://aws.amazon.com/ec2/
pricing/
Other up to over 9000/monthDedicated database to 1TB
$0.50/GB over 2GB disk space
https://www.dotcloud.com/pricing/pricing-faq/
http://aws.amazon.com/ec2/
pricing/
Other
Addons!!!$0.50/GB over 2GB disk space
https://www.dotcloud.com/pricing/pricing-faq/
http://aws.amazon.com/ec2/
pricing/
22
Тесты. Парсинг
Heroku ~9.074s
ep.io ~15.981s (first run: 56.4s)
DotCloud ~8.081s
Amazon EC2 ~7.943s
$ time http GET URL/secret
23
Тесты. Главная страница$ ab -c 4 -n 1000 URLDocument length: 1289 bytes
Server Total time C/F/ERequests per
secondTime per request
Heroku gunicorn/0.14.2 66.494s 1000/1/0 15.04 265.974ms
ep.io nginx/0.8.54 30.340s 1000/0/0 32.96 121.359ms
DotCloud 87.487s 1000/0/0 11.43 349.948ms
Amazon EC2 nginx/1.0.14 64.672s 1000/0/0 15.46 258.686ms
24
Тесты. Рандомайзинг$ ab -c 4 -n 1000 URL/find-outDocument length: 1565 bytes
Server Total time C/F/ERequests per
secondTime per request
Heroku gunicorn/0.14.2 66.582 1000/0/0 15.02 266.328ms
ep.io nginx/0.8.54 32.364 1000/0/0 30.9 129.456ms
DotCloud 83.106s 1000/0/0 12.03 332.45ms
Amazon EC2 nginx/1.0.14 65.802s 1000/0/0 15.2 263.207ms
25
Тесты. Статика$ ab -c 4 -n 1000 URL/static/css/style.cssDocument length: 194 bytes
Server Total time C/F/ERequests per
secondTime per request
Heroku gunicorn/0.14.2 65.700s 1000/0/0 15.22 262.800ms
ep.io nginx/0.8.54 30.029s 1000/0/0 33.30 120.115ms
DotCloud 74.530s 1000/0/0 13.42 298.122ms
Amazon EC2 nginx/1.0.14 63.693s 1000/0/0 15.7 254.771ms
26
Всякое разное
‣ settings_local.pyНадо разбираться с каждым сервисом отдельно :(
‣ HerokuВ документации возможны недочеты (упоминается про REDIS_TO_GO, надо использовать REDISTOGO_URL и тп).Procfile выглядит инородно в проекте, foreman - та еще херня :)Объявили поддержку Sentry, для моего проекта не удалось поставить аддон :(
‣ ep.ioДля бесплатного инстанса всегда надо долго дожидаться поднятия из сна.
‣ DotCloudВ итоге получилось медленней всего.Есть замечания к инициализации проекта, потратил больше всего времени, чтоб в итоге все заработало.
‣ Amazon EC2Необходим определенный порог знаний или DevOps.
27
В сухом остатке
28
В сухом остатке
29
В сухом остатке
30
Вопросы?
Код проекта: https://github.com/playpauseandstop/watracestЯ: Игорь Давыденко (oDesk PS)
31