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.
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ó:
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
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.
De forma que ens quedarà un arxiu:
# 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']
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.
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.