Taula de continguts

Desplegament de Django en Heroku

Heroku és un sistema de PaaS o Platform as a Service que ens permet posar en producció aplicacions sense necessitat de mantenir la virtualització, el sistema operatiu o la instal·lació de la base de dades.

, , , , , , , , , , ,

Preparant el nostre projecte Django per a deplegament a Heroku

Referències:

Per treballar amb Django a Heroku ens caldrà alguns ajustos extra a part del què ens diu el tutorial oficial.

Instal·lar en local llibreries de client per a PostgreSQL:

$ sudo apt install libpq-dev python3-dev gcc
(env) $ pip install gunicorn psycopg2-binary django-heroku 
(env) $ pip freeze > requirements.txt

Crearem un Procfile a l'arrel del projecte, un arxiu propi de Heroku (d'una sola línia) que li diu com ha de posar en producció la nostra aplicació:

Procfile
web: gunicorn mysite.wsgi

No és imprescindible, però podeu provar si us funciona el projecte en local amb:

(env) $ gunicorn mysite.wsgi

Si ho teniu tot a punt a la branca main, podeu posar en producció fent:

$ git add .
$ git commit -am "heroku deploy"
$ git push heroku main


Troubleshooting

De vegades ens apareix un error de SSL al fer el push a producció. Segons aquesta issue del mòdul dj-database-url la solució és afegir aquesta línia a final del tot del projecte settings.py:

del DATABASES['default']['OPTIONS']['sslmode']

Si no esteu a la branca main potser no funciona adequadament. Mireu de moure els arxius de producció a la branca main.


Ajustant settings.py

De forma que ens quedarà un arxiu:

settings.py
# importem django_heroku a l'inici de l'arxiu
import django_heroku
 
# ...resta del config.py...
 
# activem Django-Heroku al final de l'arxiu
django_heroku.settings(locals())
 
# si dona error ssl https://devcenter.heroku.com/articles/getting-started-with-python#set-up
#del DATABASES['default']['OPTIONS']['sslmode']


Utilitzant SQLite

Per defecte podem provar a arrencar amb SQLite:

$ git push heroku master
(...es posa en producció...)
$ heroku run bash
~ $ python3 manage.py migrate
~ $ python3 manage.py createsuperuser

Això crearà la BD, un superuser, i ens permetrà accedir a la nostra aplicació en producció. Entreu i afegiu alguna enquesta.


Afegint una BD PostgreSQL

Si posem una DB sqlite com ve per defecte en Django tindrem el problema de que al tenir Heroku un sistema d'arxius efímer, i que es destrueix cíclicament, sabem que la BD es destruiria en menys en 24 hores. Per evitar aquest problema ens cal una BD externa a Heroku on poder emmagatzemar dades.

Hem vist en el tutorial de Heroku que si podem afegir una BD PostgreSQL així:

$ heroku addons:create heroku-postgresql:hobby-dev

la nostra aplicació disposarà de les credencials a la variable d'entorn DATABASE_URL del tipus:

DATABASE_URL=postgres://usuari:password@servidor:port/dbname

En versions anteriors calia configurar expressament DATABASE_URL en settings.py amb alguns packages extra de pip com dj-database-url o django-environ.

A partir de cert moment ja no cal fer cap modificació per carregar DATABASE_URL. Simplement, fem un export:

$ export DATABASE_URL=postgres://usuari:password@servidor:port/dbname
(env) $ ./manage.py migrate
(env) $ ./manage.py runserver

i arrencar Django. Quan trobi la variable farà un override del què digui DATABASES i agafarà DATABASE_URL com la BD primària.