WebCampZg 2012

Kako pretjerati sa jednostavnom idejom?

...

Aljoša Mohorović

github.com/aljosa / twitter.com/maljosa
aljosa@revolucija.hr

Python

...

Heroku

...

jednostavna ideja?

ideja!


Github repo ➔ AWS S3

# shell
                        
    $ git clone repo
    $ tar -cjf repo.tar.bz2 repo
    $ s3put [...]
                        
                    

servis

Python/Django projekt

  • servis ➔ Github API (user/repo info)
  • servis ➔ async. kopiraj github repo
  • servis ➔ async. spremi na AWS S3
# Python setup

www.python.org

                        
    $ virtualenv env
    $ source env/bin/activate
    $ pip install Django ...
                        
                    
# Django setup

www.djangoproject.com

                        
    $ django-admin.py startproject gh_archive
    $ django-admin.py startapp accounts

    ... settings ...

    $ django-admin.py syncdb
    $ django-admin.py runserver
                        
                    
# Github / requests

python-requests.org

                        
    $ pip install requests 

    # code:
    def get_token(code):
        ...
        resp = requests.post(url, data=payload, headers=...)
        data = json.loads(resp.text)
        ...
        token = data['access_token']
        return token

    def get_repos(token):
        ...
        resp = requests.get(repos_url, headers=headers)
        data = json.loads(resp.text)
        ...
        return data
                        
                    
# AWS S3 / boto

boto.cloudhackers.com

                        
    $ pip install boto

    # code:
    def create_bucket():
        ...
        s3 = boto.connect_s3()
        bucket = s3.create_bucket(bucket_name)
        return bucket_name
                        
                    
# (Async) repo ➔ AWS S3

www.celeryproject.org

                        
    $ pip install celery 

    # code:
    from celery import Celery
    from django.conf import settings

    celery = Celery("tasks", broker=settings.BROKER_URL)

    @celery.task
    def clone_repo(clone_url, token):
        ...

    def backup_repo(request, owner, repo):
        ...
        clone_repo.delay(clone_url, token)
        ...
                        
                    
# code ➔ github
                        
    $ pip freeze > requirements.txt

    $ git init

    $ git add ...

    $ git commit -m "initial files"

    $ git remote add origin git@github.com:...

    $ git push origin master
                        
                    
# hosting? deployment?

www.heroku.com

                        
    $ cat Procfile 
    web: gunicorn wsgi:application [...]
    celery: celery -A accounts.tasks worker [...]

    $ heroku create

    $ git push heroku master
                        
                    
# db? async? ...?

addons.heroku.com

                        
    # http://www.postgresql.org
    $ heroku addons:add heroku-postgresql:PLAN

    # http://www.rabbitmq.com
    $ heroku addons:add cloudamqp:PLAN

    # code:
    ... settings ...

    $ git push heroku master
                        
                    

heroku dyno

https://devcenter.heroku.com/articles/dynos

LXC (Linux Container)

non persistent filesystem

512MB ram / 1G swap

heroku slug

https://devcenter.heroku.com/articles/slug-compiler

kod bez nepotrebnih stvari i sve
iz requirements.txt strpano u
jednu arhivu

# git push, dyno, slug, ...?

https://devcenter.heroku.com/articles/scaling

jednostavno i brzo scale-anje

                        
    $ heroku ps:scale web=2 celery=5
    Scaling web processes... done, now running 2
    Scaling celery processes... done, now running 5
                        
                    
# heroku runtime

https://devcenter.heroku.com/articles/buildpacks

                        
    # default python buildpack
    $ heroku config:add BUILDPACK_URL=\
        git://github.com/heroku/heroku-buildpack-python.git

    # custom buildpack, npr. PyPy
    $ heroku config:add BUILDPACK_URL=\
        git://github.com/mtigas/heroku-buildpack-pypy.git
                        
                    
# heroku run

https://devcenter.heroku.com/articles/oneoff-admin-ps

                        
    $ heroku run bash

    $ heroku run django-admin.py syncdb

    $ heroku run django-admin.py shell
                        
                    
# heroku logs

https://devcenter.heroku.com/articles/logging

                        
    $ heroku logs

    $ heroku logs --tail

    $ heroku logs -t -p web

    $ heroku logs -t -p celery

    $ heroku logs --help
                        
                    
# heroku releases

https://devcenter.heroku.com/articles/releases

                        
     $ heroku releases
     === app-name Releases
     v168  Deploy dd0953b  aljosa[...] 2012/11/09 16:01:56
     v167  Deploy 9623355  aljosa[...] 2012/11/09 15:55:16
     v166  Deploy 46b63cf  aljosa[...] 2012/11/08 16:29:55
     v165  Deploy 3923bbf  aljosa[...] 2012/11/08 16:25:28
     v164  Deploy 804393c  aljosa[...] 2012/11/08 16:15:12
     v163  Deploy e386d5b  aljosa[...] 2012/11/08 15:54:42
     v162  Deploy ca05c71  aljosa[...] 2012/11/08 14:30:04
     v161  Deploy 3139f43  aljosa[...] 2012/11/08 13:57:57
     v160  Deploy 069ac6a  aljosa[...] 2012/11/08 13:44:08

     $ heroku rollback v165
     Rolled back to v165
                        
                    
# heroku plugins

https://devcenter.heroku.com/articles/using-cli-plugins

                        
    $ heroku plugins:install \
        git://github.com/ddollar/heroku-accounts.git

    $ heroku accounts:set work
    $ heroku accounts:set personal

    $ heroku plugins:install \
        git://github.com/heroku/heroku-pg-extras.git

    $ heroku pg:locks 
                        
                    

problemi!

heroku je skup (min. $50/m)

heroku koristi AWS (upitno?)

cilj je proizvod

ne razvoj procesa

ne razvoj servisa potrebnih za razvoj proizvoda

ne kompromisi pri odabiru tehnologija

WebCampZg 2012

Kako pretjerati sa jednostavnom idejom?

...

Aljoša Mohorović

github.com/aljosa / twitter.com/maljosa
aljosa@revolucija.hr