djanjo + heroku

41
DJANGO + HEROKU OR HOW TO BE SMART ABOUT BEING STUPID

Upload: jack-shedd

Post on 16-Jul-2015

911 views

Category:

Documents


3 download

TRANSCRIPT

DJANGO + HEROKUOR HOW TO BE SMART ABOUT BEING STUPID

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

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

I OWN MESS.

WHAT WE NEED…besides money and Scotch

SERVERS SHOULD BESAME(ish)

PREDICTABLE TO SCALE WITH

CHEAP TO DEVELOP WITH

EASY(ish) TO ADMINISTER

RELIABLE(ish)

FLEXIBLE(ish)

BILLABLE!

DEPLOYMENT MUST BETHE SAME ACROSS AS MANY PROJECTS AS POSSIBLE

DOCUMENTED

N00B-PROOF’D

FORGIVING

WHAT WE’VE TRIED…and decided sucks

1IN HOUSE

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

…AND PREDICTABLE!

…AND FLEXIBLE!

…AND ABSOLUTELY NOTHING ELSE

1CO-LOCATED

AT RACKSPACE

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

…AND PREDICTABLE!

…AND FLEXIBLE!

…AND (more) RELIABLE!

…AND ABSOLUTELY NOTHING ELSE

(n)VPS (es?)

AT RACKSPACE

USING FABRICAND RELEASES

AND SFTP

AND NEW RELIC

AND SENTRY

AND GIT

AND PUPPETMASTER

LIVING THE DREAM…CHEAP(ish)

…AND PREDICTABLE!

…AND FLEXIBLE!

…AND RELIABLE!

…AND (sort of) STANDARDIZED!

…AND BILLABLE!

IF YOUR DREAM IS…PAINFUL TO SETUP

…AND UPDATE

…AND SECURE

…AND SCALE

…AND TRAIN ON

…AND CHANGE

…AND BILL

…AND TRANSFER

AND BEFORE YOU ASK…AWS IS AWESOME

…BUT IT SUCKS

…AND EC2 IS GREAT

SO, HEROKU.…it sucks less

(h)+

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!

AND YEAHIT’S JUST EC2

…UNTIL YOU NEED BULLSHIT

…BUT IT HIDES THE BULLSHIT

WHY NOT HEROKU…everything sucks in its own way

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.

MAKE IT SUCK LESS…as best you can

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

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 .

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

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

INIT & COMMIT

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

APPIFY

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

THERE IS NO DOWNTIME FIX…99.99999999999999 UPTIME IS NOT POSSIBLE

…IT’S PROBABLY OK.

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

INSTANCES SPIN DOWN!

CRON A CURL http://google.com

STOP USING MYSQL…IT’S AWFUL.

(heroku addons:add cleardb:ignite)

…SERIOUSLY. IT’S AWFUL.

WEBSOCKETS, WEBSPROCKETS…IT’S NGINX’S FAULT

(heroku addons:add pusher:sandbox)

SOCKET.IO + TORNADO

JUST USE EC2

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

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

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

WHATEVER WEIRD CONTAINER THING THEY USE

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',)

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

EMBRACE GIT DEPLOYSUSE PROCFILE FOR STUFF

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

THEIR SUPPORT SUCKSBUT AT LEAST THEY HAVE SOME.

QUESTIONS?…warning, I tend to ramble.