====== 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. \\