logo cosasdedevs

Deploy de proyecto Django en un vps con Ubuntu

Deploy de proyecto Django en un vps con Ubuntu

My Profile
May 01, 2020

¡Hola compis developers! Para el tuto de hoy os he preparado una de las cosas que me más quebraderos que cabeza me dieron cuando lo hice por primera vez, que es como desplegar una aplicación en un servidor web 🚀. Ahora que ya lo tengo dominado es hora de pasar el conocimiento a quien lo pueda necesitar, así que ¡ahí vamos!

Para este tutorial quiero realizar todos los pasos por lo que yo he pillado un vps de ovh porque para pruebas están muy bien y los hay desde 3€. Hay varias páginas que ofrecen el servicio de vps así que cogedlo de donde queráis, lo importante es que tenga una distribución de Ubuntu y permita el control absoluto.

Una vez tengamos el server y las credenciales entramos en él.

ssh root@<ip-de-mi-server>

Lo primero que haremos será actualizarlo.

sudo apt update
sudo apt upgrade

Una vez hecho esto y para no estar trabajando con root, nos crearemos un usuario y lo añadiremos al grupo de administradores.

sudo useradd -m <nombre-de-usuario>
sudo passwd <nombre-de-usuario>
usermod -aG sudo <nombre-de-usuario>

Salimos del server y volvemos a entrar con nuestro usuario.

ssh <nombre-de-usuario>@<ip-de-mi-server>

Ahora que estamos dentro con nuestro usuario empezaremos a instalar los paquetes de Python, pip, git y apache

sudo apt install python3.8
sudo apt install build-essential libssl-dev libffi-dev python-dev libpq-dev
apt install python3-pip
sudo apt install git
sudo apt install apache2

Para verificar que ya tenemos nuestro server corriendo, en nuestro navegador introducimos la IP de nuestro server y nos debería llevar a una página similar a esta:

Lo siguiente que haremos será instalar PostgreSQL.

sudo apt install postgresql postgresql-contrib

Al instalar PostgreSQL, nos crea un usuario de administración que es el que usaremos para crear nuestro propio usuario, así que lanzamos el siguiente comando para crearlo:

sudo -u postgres createuser --interactive

Nos preguntará si queremos que el nuevo usuario sea super usuario y le decimos que si.

Ahora vamos a añadir un password a nuestro usuario, para ello entraremos en la consola de PostgreSQL:

sudo -u postgres psql

Y con la siguiente línea añadiremos el password:

alter user <mi-usuario> with password '<mi-contraseña>';

Si todo ha salido bien nos retornará ALTER ROLE.

Una vez hecho esto y sin salir de la consola de PostgreSQL, crearemos la base de datos con el comando createdb.

createdb <nombre-bbdd>

Y le damos todos los privilegios a nuestro usuario para tener control de la base de datos.

GRANT ALL PRIVILEGES ON DATABASE <nombre-bbdd> TO <mi-usuario>;

Y listo, ya tenemos configurada la base de datos, así que solo nos queda salir de la consola de PostgreSQL con el comando \q

Antes de llevar el proyecto a nuestro servidor lo que tenemos que hacer es realizar algunas configuraciones de permisos para que más adelante no tengamos problemas a la hora de desplegarlo.

La parte que viene a continuación, que es la parte de la configuración de la carpeta donde alojaremos nuestro proyecto, la he podido realizar gracias al tutorial de Andrés Hierro en su blog así que todo el crédito a él e infinitas gracias 😀

Lo primero es asegurarnos de que la carpeta /var/www/html pertenezca al grupo de usuarios www-data, este es el grupo que crea apache al instalarlo y la carpeta /var/www/html es el directorio por defecto para desplegar un proyecto con apache.

sudo chgrp www-data /var/www/html

Después añadiremos a nuestro usuario al grupo de www-data

sudo usermod -a -G www-data <mi-usuario>

Después modificamos los permisos para poder trabajar con el directorio html:

sudo chmod -R 775 /var/www/html
sudo chmod -R g+s /var/www/html

Por último nos aseguramos de que nuestro usuario sea el dueño del directorio, esto lo haremos con el siguiente comando:

sudo chown -R <mi-usuario> /var/www/html

Ahora empieza lo bueno, para este ejemplo voy a usar el proyecto que realicé hace unos meses en el que explicaba como desarrollar un blog con Django, si lo queréis ver, aquí os dejo el enlace.

Bueno bueno, ¡manos a la obra!, antes de nada deberás tener una cuenta en GitHub y haber subido tu proyecto ahí, después asignaremos nuestro nombre y email a la configuración global de git:

git config --global user.name "<tu-nombre>"
git config --global user.email <tu-email>

Ahora, si estáis habéis creado un proyecto público solo necesitaremos hacer git clone dentro de la carpeta en la que vamos a alojar nuestro proyecto que en nuestro caso será /var/www/html, pero si es privado tendremos que crear una llave ssh para poder descargarlo.

Aquí vamos a realizar el caso del proyecto privado para que veáis como hacerlo aunque básicamente es lo mismo que cuando lo configuráis en vuestra máquina local.

Lo primero, para crear la llave lanzamos el siguiente comando:

ssh-keygen -t rsa -b 4096 -C "<tu_email@example.com>"

Le damos a enter hasta que la cree y listo.

Ahora para ver nuestra clave lanzamos el comando cat que nos muestra el contenido de un fichero:

cat /home/<mi-usuario>/.ssh/id_rsa.pub

La copiamos y la añadimos en nuestras settings de GitHub.

Por último, vamos a nuestro directorio /var/www/html y lanzamos el siguiente comando para clonar nuestro proyecto.

git clone git@github.com:albertorc87/simple_blog.git

Y con esto ya tendríamos nuestro proyecto en nuestra web :), vamos que ya nos queda poquito 💪

Ahora entramos en nuestro proyecto y necesitaremos crear nuestro entorno virtual así que lo primero que haremos será instalar la librería para crear los entornos virtuales si no dispone de ella nuestra máquina:

sudo pip3 install virtualenv 

Después vamos al directorio de nuestro proyecto, en mi caso sería /var/www/html/simple_blog, creamos el entorno virtual y lo activamos:

virtualenv -p python3 env
source env/bin/activate

Por último, muy recomendable crear un archivo requirements.txt con todas nuestras librerías, si no, nos tocará una a una. Si lo hemos hecho así, instalamos las librerías que requiera nuestro proyecto.

pip install -r requirements.txt

Con pip freeze podremos confirmar que se han instalado nuestras librerías:

pip freeze

Y listo, ya tenemos descargadas las librerías que necesitaremos para que nuestro proyecto funcione en producción.

En este proyecto, creamos un archivo de configuración alojado en simple_blog/simple_blog/ que no se guarda en GitHub así que lo tendremos que crear aquí de nuevo y añadir la configuración que necesitemos, que en nuestro caso son las conexiones a la base de datos, el valor de la constante DEBUG y el valor de la constante SECRET_KEY. Si quieres más información sobre como crear un archivo de configuración te recomiendo que mires mi tutorial sobre cómo conectar una base de datos PostgreSQL con Django.

nano .env

E insertamos nuestra configuración:

SECRET_KEY=<mi-llave-secreta>

POSTGRESQL_NAME=<nombre-bbdd>
POSTGRESQL_USER=<usuario-bbdd>
POSTGRESQL_PASS=<password-usuario-bbdd>
POSTGRESQL_HOST=localhost
POSTGRESQL_PORT=5432
DEBUG=False

Ahora lanzamos el comando migrate para crear las tablas en la base de datos.

python manage.py migrate

Y después creamos el super usuario para administrarla createsuperuser

python manage.py createsuperuser

También necesitaremos descargar los archivos estáticos para que se muestre correctamente el panel de administrador, para ello debemos tener configurado las constantes de static, en el archivo settings.py de la siguiente forma.

STATIC_ROOT = os.path.join(BASE_DIR, 'static/tmp/')
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)
STATICFILES_FINDERS = [
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]

Y lanzamos el comando collectstatic que nos las descargará en el directorio static/tmp/ dentro de nuestro proyecto.

python manage.py collectstatic

El problema de esto es que si están en un directorio que no es el raíz de static no se muestran y si ya tienes contenido en esa carpeta, como yo que tengo todos los archivos estáticos, los elimina si dices que sí, así que yo hice este apaño del tmp. Lo que haremos después del static es mover el contenido de tmp a static y listo.

cp -r tmp/* /var/www/html/simple_blog/static/
rm -R tmp/

Por fin llegamos a la fase final de este tutorial, solo nos falta configurar el virtual host, para ello vamos a la siguiente ruta /etc/apache2/sites-available/ y creamos el archivo simple_blog.conf (podeís llamarlo como queráis).

sudo nano simple_blog.conf

Y añadimos el siguiente código que ahora os explicaré que es lo que hace:

<VirtualHost *:80>
    ServerAdmin simple_blog@blog.com
    DocumentRoot /var/www/html/simple_blog
    Alias /static/ /var/www/html/simple_blog/static/
    Alias /media/  /var/www/html/simple_blog/media/
    WSGIPassAuthorization On
    WSGIScriptAlias / /var/www/html/simple_blog/simple_blog/wsgi.py
    WSGIDaemonProcess simple_blog python-path=/var/www/html/simple_blog:/var/www/html/simple_blog/env/lib/python3.6/site-packages
    WSGIProcessGroup simple_blog
</VirtualHost>

ServerAdmin, es el email que aparecerá cuando nuestra web muestre algún error.
DocumentRoot, ruta de nuestro proyecto.
Alias /static/ y /media/, cuando se intente acceder a esa ruta el servidor tomará la ruta absoluta dada.

Antes de explicar los siguientes líneas os paso un enlace donde explican que es el estándar WSGI.

WSGIPassAuthorization On, Activa el módulo WSGI.
WSGIScriptAlias / /var/www/html/simple_blog/simple_blog/wsgi.py, alias del archivo de configuración wsgi.py, todos los proyectos de Django lo tienen.
WSGIDaemonProcess simple_blog python-path=/var/www/html/simple_blog:/var/www/html/simple_blog/env/lib/python3.6/site-packages, las librerías del proyecto.
WSGIProcessGroup simple_blog, el nombre que le daremos al proceso.

Antes de continuar tenemos que instalar el módulo WSGIpara Python3 en apache y lo activamos.

sudo apt-get install libapache2-mod-wsgi-py3
sudo a2enmod wsgi

Después habilitamos nuestro site recién creado:

sudo a2ensite simple_blog.conf

Y reiniciamos apache.

sudo service apache2 restart

Ahora recargamos y ya tenemos nuestro proyecto funcionando en un servidor 🎉

Si tienes algún problema, ve a /var/log/apache2/errors.log y ahí encontrarás el problema. También puedes escribirme en los comentarios y te ayudaré en lo que pueda 😁 ¡Nos leemos!

468 vistas

Nos tomamos en serio tu privacidad

Utilizamos cookies propias y de terceros para mejorar la experiencia del usuario a través de su navegación. Si pulsas entendido aceptas su uso. Ver política de cookies.

🐍 Sígueme en Twitter

Si te gusta el contenido que subo y no quieres perderte nada, sígueme en Twitter y te avisaré cada vez que cree contenido nuevo 💪
Luego ¡Te sigo!