- Ya tenés tu proyecto django, que funciona localmente (o sea, hacés un
runservery podés usarlo en tu máquina). - Estás usando django 3.0 (o posiblemente versiones más nuevas)
- Estás usando python 3
- Tu proyecto django está en un repositorio git.
- Tenés un
requirements.txten la raiz de tu repo, con las dependencias python de tu proyecto, donde figura django y cualquier otra cosa que haga falta instalar con pip para que funcione, y que se puede usar con unpip install -r requirements.txt. (Recordá que es posible especificar las versiones de tus dependencias en elrequirements.txt. Por ejemplo,Django==3.0. Conpip freezepodés consultar las versiones que tenés instaladas actualmente). - Te hiciste una cuenta en Heroku y recordás tu usuario y contraseña.
Primero que nada se necesitan las herramientas de heroku. En un ubuntu, basta con hacer:
sudo snap install --classic herokuSi esto se instaló bien deberías poder ejecutar lo siguiente, que te pida tus credenciales, y loguearte:
heroku loginY ahora las cosas que vamos a usar desde dentro de django para "engancharlo" con heroku (si estás usando virtualenv, esto se corre sin sudo):
pip3 install django-heroku gunicorn --userO si estás usando un virtualenv, lo mismo pero sin "3" y sin "--user".
Además de instalarlos, agreguá django-heroku y gunicorn al requirements.txt.
Este archivo es el que le dice a heroku cómo ejecutar nuestro servidor web.
Crea un archivo que se llame Procfile (respetá el nombre, exactamente como dice ahí) en la raiz de tu repositorio, y rellenalo con esto:
web: gunicorn miproyecto.wsgi --log-file -
Modificá ese archivo, y donde dice miproyecto, poné el nombre de tu proyecto django (es el nombre de la carpeta donde está el settings.py).
Si tu proyecto django no está en la raiz de tu repositorio, modificá ese archivo, agregando el directorio de tu proyecto dentro del repo de esta forma:
web: cd directorio/del/proyecto && gunicorn miproyecto.wsgi --log-file -
Además creá un segundo archivo llamado runtime.txt en la misma ubicación que Procfile, con este contenido:
python-3.8.11
Para probar si tu Procfile (y runtime.txt) funciona correctamente, ubicate en la raiz de tu repositorio y ejecutá esto:
heroku local webNo debería mostrar ningún error, y la última linea del resultado debería decir algo como esto:
[INFO] Booting worker with pid: 25416
No hace falta entrar al link que nos muestra ni chequear nada en el sitio, solo validar que el comando anduvo. Si anduvo y sigue corriendo, cerralo con Ctrl+c.
Es necesario configurar algunas settings de nuestro proyecto (settings.py) para que corra bien dentro de heroku.
Por suerte el paquete django-heroku hace esto de forma automágica. Solo tenemos que hacer dos cosas:
Agregar esto al inicio de nuestro settings.py (después de los imports ya existentes):
import django_herokuY agregar esto al final del settings:
django_heroku.settings(locals())Tu proyecto ya está listo, solo queda decirle a heroku que lo levante.
Simplemente creamos una aplicación en heroku (y esto lo hacemos solo una vez). Para eso, ubicate en la raiz de tu repo, y ejecutá:
heroku create nombre-de-tu-proyectoReemplazando nombre-de-tu-proyecto por el nombre que quieras que tu app tenga en Heroku.
Y luego, le pedimos a heroku poder usar una base de datos dentro de ese mismo proyecto:
heroku addons:create heroku-postgresql:hobby-dev(hobby-dev es el nombre del plan gratuito de postgresql en heroku. Si queremos, podemos elegir otro que estemos dispuestos a pagar)
Y ahora podemos mandar el código de nuestro sitio, y heroku lo va a levantar de forma automática:
git push heroku mainSi mirás bien toda la salida de eso (y no falló nada), vas a ver que en un punto dice algo como esto:
remote: -----> Launching... done, v7 remote: https://lit-ridge-5779.herokuapp.com/ deployed to Heroku
(En tu proyecto seguramente van a cambiar algunos números y nombres) Entrando a esa url, si todo funcionó bien, deberias ver tu sitio andando :)
Cada vez que modifiques tu código, simplemente commitealo y después ejecutá ese mismo push para que heroku tome los cambios y reinicie el servidor.
Un último detalle: seguramente tu aplicación falló por no tener la base de datos creada y actualizada. Para correr las migrations de django en el server, simplemente hacelo con:
heroku run "python manage.py migrate"Si tu proyecto no está en la raiz del repo, agregá un cd al directorio de tu proyecto, así:
heroku run "cd directorio/del/proyecto && python manage.py migrate"Recordá que siempre que hagas cambios a la db, vas a tener que correr las migrations en el servidor después de pushear tus cambios.
Podés ver los logs de la aplicación corriendo:
heroku logsTambién podés probar la aplicación antes de mandarla al sitio con:
heroku local webCon el comando heroku run podés correr comandos arbitrarios en tu server, y ver la salida, e incluso interactuar (por ejemplo, probablemente lo necesites para correr tu creación del superuser).
Y desde el panel de heroku podés ver mucha más info y administrar tu aplicación.