====== 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.
{{ https://upload.wikimedia.org/wikipedia/commons/e/ec/Heroku_logo.svg?300 }}
{{tag> #FpInfor #Daw #DawMp08 #DawMp08Uf2 #DawMp08Uf02 heroku IaaS PaaS SaaS django web framework }}
{{ responsibilities.png?direct }}
===== Preparant el nostre projecte Django per a deplegament a Heroku =====
Referències:
* Tutorial per configurar una app Django existent:
* https://devcenter.heroku.com/articles/django-app-configuration
* Tutorial per iniciar una app Django amb una plantilla:
* https://devcenter.heroku.com/articles/getting-started-with-python
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
\\
==== Troubleshooting ====
De vegades ens apareix un error de SSL al fer el //push// a producció. [[https://github.com/jacobian/dj-database-url/issues/107|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:
# 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 [[https://devcenter.heroku.com/articles/sqlite3|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 [[https://github.com/kennethreitz/dj-database-url|dj-database-url]] o [[https://django-environ.readthedocs.io/en/latest/|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.
\\