Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. ·...

32
Сравнение трендовых способов деплоя Python-проектов Igor Davydenko 2012 Kyiv.py#6 http://bit.ly/kyiv-py-6-djangonaut 1

Transcript of Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. ·...

Page 1: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

Сравнение трендовых способов деплоя Python-проектов

Igor Davydenko2012 Kyiv.py#6

http://bit.ly/kyiv-py-6-djangonaut

1

Page 2: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

Про что это я?

‣ 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

Page 3: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

Тестовый проект

‣ 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

Page 4: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

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

Page 5: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

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

Page 6: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

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

Page 7: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

http://watracest.herokuapp.com/

7

Page 8: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

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

Page 9: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

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

Page 10: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

http://watracest.ep.io/

10

Page 11: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

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

Page 12: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

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

Page 13: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

DotCloud. Добавляем статику

‣ Создаем nginx.conf:location /static { root /home/dotcloud/current/project ; }

‣ $ git add . && git commit -m ‘Setup static files for DotCloud.’‣ $ dotcloud push appname .

13

Page 15: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

Amazon EC2. 3 шага

1. Создаем тикет DevOps’у, с описанием необходимой конфигурации и типа инстанса.

2. ???3. PROFIT!

15

Page 16: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

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

Page 17: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

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

Page 18: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

http://watracest.odeskps.com/

18

Page 19: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

Что осталось за кадром?

‣ Gondor.ioНет возможности поиграться, сразу плати за 1 wsgi воркер 10 баксов в месяц. Ориентация на Django.

‣ AppHosted.comПереезжают на новую инфраструктуру. Регистрация на старой инфраструктуре закрыта. Обещали дать аккаунт на тест.

‣ Google App Engine :)Скажем дружно, нафиг нужно :) GAE сам по себе. Если необходимы флюшки GAE, то все другие способы деплоя отпадают сразу.

19

Page 20: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

$ 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

Page 21: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

$ pip install PIL

Heroku OK

ep.io OK (predefined list of Python libraries)

DotCloud OK

Amazon EC2 OK

21

Page 22: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

Цены

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

Page 23: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

Тесты. Парсинг

Heroku ~9.074s

ep.io ~15.981s (first run: 56.4s)

DotCloud ~8.081s

Amazon EC2 ~7.943s

$ time http GET URL/secret

23

Page 24: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

Тесты. Главная страница$ 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

Page 25: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

Тесты. Рандомайзинг$ 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

Page 26: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

Тесты. Статика$ 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

Page 27: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

Всякое разное

‣ settings_local.pyНадо разбираться с каждым сервисом отдельно :(

‣ HerokuВ документации возможны недочеты (упоминается про REDIS_TO_GO, надо использовать REDISTOGO_URL и тп).Procfile выглядит инородно в проекте, foreman - та еще херня :)Объявили поддержку Sentry, для моего проекта не удалось поставить аддон :(

‣ ep.ioДля бесплатного инстанса всегда надо долго дожидаться поднятия из сна.

‣ DotCloudВ итоге получилось медленней всего.Есть замечания к инициализации проекта, потратил больше всего времени, чтоб в итоге все заработало.

‣ Amazon EC2Необходим определенный порог знаний или DevOps.

27

Page 28: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

В сухом остатке

28

Page 29: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

В сухом остатке

29

Page 30: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

В сухом остатке

30

Page 31: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

Вопросы?

Код проекта: https://github.com/playpauseandstop/watracestЯ: Игорь Давыденко (oDesk PS)

31

Page 32: Сравнение трендовых способов деплоя Python ... · 2020. 1. 26. · ‣ DotCloud В итоге получилось медленней всего. Есть

зы. На EuroPython 2012 есть кто?

[email protected]: playpauseandstop

32