Top Banner
DJANGO + HEROKU OR HOW TO BE SMART ABOUT BEING STUPID
41
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Djanjo + heroku

DJANGO + HEROKUOR HOW TO BE SMART ABOUT BEING STUPID

Page 2: Djanjo + heroku

THIS IS MESSFOUNDED IN 2007

4 DESIGNERS + 4 DEVELOPERS

WEB, MOBILE, SOCIAL, DESKTOP, IOS, ANDROID

1.25 ADMINS (ME + DAN)

64.2% DJANGO

4 SITES A MONTH

WAY MORE IN “MAINTENANCE”

http://www.thisismess.com

Page 3: Djanjo + heroku

I DO NOT WORK FOR HEROKU…and kinda hate their support guys.

I OWN MESS.

Page 4: Djanjo + heroku

WHAT WE NEED…besides money and Scotch

Page 5: Djanjo + heroku

SERVERS SHOULD BESAME(ish)

PREDICTABLE TO SCALE WITH

CHEAP TO DEVELOP WITH

EASY(ish) TO ADMINISTER

RELIABLE(ish)

FLEXIBLE(ish)

BILLABLE!

Page 6: Djanjo + heroku

DEPLOYMENT MUST BETHE SAME ACROSS AS MANY PROJECTS AS POSSIBLE

DOCUMENTED

N00B-PROOF’D

FORGIVING

Page 7: Djanjo + heroku

WHAT WE’VE TRIED…and decided sucks

Page 8: Djanjo + heroku

1IN HOUSE

Page 9: Djanjo + heroku

1996 CALLED AND IT HATES YOU…BUT IT’S CHEAP

…AND PREDICTABLE!

…AND FLEXIBLE!

…AND ABSOLUTELY NOTHING ELSE

Page 10: Djanjo + heroku

1CO-LOCATED

AT RACKSPACE

Page 11: Djanjo + heroku

2002 ISN’T MUCH HAPPIER…BUT IT’S CHEAP

…AND PREDICTABLE!

…AND FLEXIBLE!

…AND (more) RELIABLE!

…AND ABSOLUTELY NOTHING ELSE

Page 12: Djanjo + heroku

(n)VPS (es?)

AT RACKSPACE

USING FABRICAND RELEASES

AND SFTP

AND NEW RELIC

AND SENTRY

AND GIT

AND PUPPETMASTER

Page 13: Djanjo + heroku

LIVING THE DREAM…CHEAP(ish)

…AND PREDICTABLE!

…AND FLEXIBLE!

…AND RELIABLE!

…AND (sort of) STANDARDIZED!

…AND BILLABLE!

Page 14: Djanjo + heroku

IF YOUR DREAM IS…PAINFUL TO SETUP

…AND UPDATE

…AND SECURE

…AND SCALE

…AND TRAIN ON

…AND CHANGE

…AND BILL

…AND TRANSFER

Page 15: Djanjo + heroku

AND BEFORE YOU ASK…AWS IS AWESOME

…BUT IT SUCKS

…AND EC2 IS GREAT

Page 16: Djanjo + heroku

SO, HEROKU.…it sucks less

Page 17: Djanjo + heroku

(h)+

Page 18: Djanjo + heroku

HEROKU (and S3 and EC2 and RACKSPACE)

100% STANDARD (unless it’s non-standard)

BILLABLE

N00B PROOF

RELIABLE(ish)

FLEXIBLE(ish)

DOCUMENTED

ADMINISTRATABLE (because you don’t)

CHEAPER THAN CHEAP. FREE!

Page 19: Djanjo + heroku

AND YEAHIT’S JUST EC2

…UNTIL YOU NEED BULLSHIT

…BUT IT HIDES THE BULLSHIT

Page 20: Djanjo + heroku

WHY NOT HEROKU…everything sucks in its own way

Page 21: Djanjo + heroku

IT’S KINDA, WELL…DUMBIT’S JUST EC2

…AND WITHOUT IT

…SO IT GOES DOWN WITH EC2

…AND YOU CAN’T DO NATIVE WEBSOCKETS

…AND IT GETS PRICEY

…AND MYSQL SUCKS ON IT (so?)

…AND UWSGI HAS PROBLEMS

…AND THERE’S NO PERMANENT STORAGE

…AND IT USES MICROS ON EC2

…AND LOGGING IS…LESS THAN AWESOME

…AND PSQL IS KINDA SLOW

…AND THEIR SUPPORT SUCKS

…AND YOU DEPLOY WITH GIT

turns out they use linux containers or something.

Page 22: Djanjo + heroku

MAKE IT SUCK LESS…as best you can

Page 23: Djanjo + heroku

1. GET GOING

DOWNLOAD THE TOOLBELT

INSTALL BREW

https://toolbelt.heroku.com

http://mxcl.github.com/homebrew/

INSTALL GIT brew install git;

CREATE AN ACCOUNT https://heroku.com

INSTALL VIRTUALENV sudo easy_install virtualenv; INSTALL PIP sudo easy_install pip; INSTALL PSQL http://postgresapp.com

GENERATE SSH IDENTITY http://google.com

ADD PUBLIC KEY TO HEROKU https://dashboard.heroku.com/account

Page 24: Djanjo + heroku

2. MAKE AN APP

DO THE VENV

INSTALL THINGS INTO THE VENV

START A PROJECT mkdir heroku-app; cd heroku-app; git init;

virtualenv .env --distribute;source .env/bin/activate;

pip install Django psycopg2 dj-database-url;pip install boto django-storages South;

DJANGO! DJANGO!

django-admin.py startproject herokuapp .

Page 25: Djanjo + heroku

3. PREPARE

SPEC REQS

SETUP PSQL

SETTINGS.PYimport dj_database_urlDATABASES['default'] = dj_database_url.config(default='postgres://foo@localhost/heroku')

RUNSERVER python manage.py runserver;pip freeze > requirements.txtcreatedb -h localhost heroku;

GUNICORN (they refuse to support UWSGI correctly)

pip install gunicorn;“web: gunicorn herokuapp.wsgi” >> Profile

.gitignore

*.pyc.env.DS_Storelocal_settings.py

Page 26: Djanjo + heroku

4. GIT IT?git init; git add .; git commit -a -m “I love squirrels.”;

INIT & COMMIT

Page 27: Djanjo + heroku

5. HEROKUEN!heroku create;heroku addons:add heroku-postgresql:devgit push heroku master;heroku run python manage.py syncdb;heroku open;

APPIFY

Page 28: Djanjo + heroku

IT WORKS!…but here be dragons (and not the fluffy ones)

Page 29: Djanjo + heroku

THERE IS NO DOWNTIME FIX…99.99999999999999 UPTIME IS NOT POSSIBLE

…IT’S PROBABLY OK.

Page 30: Djanjo + heroku

IT’S FREE TO DEVELOP WITH100% FREE DURING DEV/STAGING (PRODUCTION!)

INSTANCES SPIN DOWN!

CRON A CURL http://google.com

Page 31: Djanjo + heroku

STOP USING MYSQL…IT’S AWFUL.

(heroku addons:add cleardb:ignite)

…SERIOUSLY. IT’S AWFUL.

Page 32: Djanjo + heroku

WEBSOCKETS, WEBSPROCKETS…IT’S NGINX’S FAULT

(heroku addons:add pusher:sandbox)

SOCKET.IO + TORNADO

JUST USE EC2

Page 33: Djanjo + heroku

UWSGI IS WAY BETTER THAN GUNICORNUSE PYTHON 2.7.2

pip install uwsgi; pip freeze > requirements.txt;“python-2.7.2” >> runtime.txt“web: uwsgi --http-socket :$PORT --wsgi-file wsgi.py” >> Profile

Page 34: Djanjo + heroku

STORING FILES? USE FILE STORAGES.S3 IS BUILT FOR THIS

pip install boto django-storages; pip freeze > requirements.txt;

CUSTOM STORAGES (utils.py)

from storages.backends.s3boto import S3BotoStorage

class StaticRootS3BotoStorage(S3BotoStorage): def __init__(self, *args, **kwargs): super(StaticRootS3BotoStorage, self).__init__(*args, **kwargs) self.location = 'static'

class MediaRootS3BotoStorage(S3BotoStorage): def __init__(self, *args, **kwargs): super(MediaRootS3BotoStorage, self).__init__(*args, **kwargs) self.location = 'uploads'

#### ASSETS URLS ####BASE_URL = '//bucket-name.s3.amazonaws.com/'STATIC_URL = '%sstatic/' % BASE_URLMEDIA_URL = '%suploads/' % BASE_URL

#### Amazon AWS / StorageAWS_ACCESS_KEY_ID = "AKXXXXX"AWS_SECRET_ACCESS_KEY = "HZZXXX/XXXX"AWS_STORAGE_BUCKET_NAME = 'bucket-name'

#### File StorageDEFAULT_FILE_STORAGE = 'herokuapp.utils.MediaRootS3BotoStorage'STATICFILES_STORAGE = 'herokuapp.StaticRootS3BotoStorage'

SETTINGS.PY

Page 35: Djanjo + heroku

MICROS ARE FINEIF YOU NEED MORE PERFORMANCE heroku ps:scale web=2;

WHATEVER WEIRD CONTAINER THING THEY USE

Page 36: Djanjo + heroku

http://getsentry.com/

YOU’RE A LOGWHY AREN’T YOU USING SENTRY?

INSTALL RAVEN

pip install raven; pip freeze > requirements.txt;

SETTINGS.PY

# Set your DSN valueSENTRY_DSN = 'https://XXXXX:[email protected]/1111'

# Add raven to the list of installed appsINSTALLED_APPS = INSTALLED_APPS + ( # ... 'raven.contrib.django.raven_compat',)

Page 37: Djanjo + heroku

PSQL? EC2!MAKE A HIGH-MEMORY INSTANCE ON EC2 http://google.com

SET DATABASE_URL ENV

heroku config:set DATABASE_URL=postgres://xxx.aws.com:xxx/xxxx

THIS WORKS FOR ANYTHING

HEROKU’S PSQL IS ACTUALLY PRETTY GREAT

Page 38: Djanjo + heroku

EMBRACE GIT DEPLOYSUSE PROCFILE FOR STUFF

“web: python manage.py collectstatic --noinput; uwsgi --http-socket :$PORT --wsgi-file wsgi.py” >> Profile

Page 39: Djanjo + heroku

THEIR SUPPORT SUCKSBUT AT LEAST THEY HAVE SOME.

Page 41: Djanjo + heroku

QUESTIONS?…warning, I tend to ramble.