Despliegue básico de proyecto Django en un servidor remoto.

in #utopian-io7 years ago (edited)

Intro: English
Title: Basic deployment of Django project on a remote server.
Language: Spanish / Español


I'm Working now in a Django deployment, then, I decided to write a tutorial about this topic. In this tutorial we are going to deploy a Django project on a remote server; for this reason, this tutorial is for experienced users using Django, however I will be solving all the doubts from beginner users. We will use the project repository django_base (I have created previously a tutorial about a django project starting), which will be configured using following technologies:

nginx - Web/proxy server
gunicorn - Python applications server
PostgreSQL - Database engine
Ubuntu 16.04 server instance.

At the starting point of the tutorial we assume that you already have an Ubuntu server 16.04 virtual instance (1) with a user with administrative privileges and git configured. In this tutorial, this previous created user is called admin.



Ahora me encuentro trabajando en el despliegue de un proyecto Django, por lo que decidí aprovechar el momento para documentar el proceso. En este tutorial vamos vamos a desplegar en proyecto Django en un servidor remoto, por lo que este tutorial está dirigido a usuarios ya familiarizados con el uso de Django, aunque igual estaré brindando toda la asesoria necesaria para las dudas que los usuarios puedan tener. Usarémos el repositorio del proyecto django_base (anteirormente he creado un tutorial sobre como iniciar un proyecto Django), el cual configurarémos utilizando las siguientes tecnologías:

nginx - Servidor web/proxy
gunicorn - Servidor de aplicaciones Python
PostgreSQL - Motor de base de datos.
Instancia de un servidor Ubuntu 16.04.

En el punto de inicio del tutorial asumimos que ya tienes una instancia virtual (1) de un servidor Ubuntu 16.04 con un usuario con privilegios de administración sudo y git configardo. En este tutorial, este usuario previamente creado es llamado admin.


En caso de no tener un usuario creado con permisos sudo, lo creamos con el siguiente comando, donde admin es el nombre del usuario:

$ adduser admin

Después se nos preguntará por una contraseña segura. El resto de datos solicitados tras introducir la contraseña no son requeridos. Después, asignamos privilegios sudo al usuario con el siguiente comando:

$ usermod -aG sudo admin

1. Instalar software requeridos en el servidor

El primer paso es instalar las siguientes librerías (pip, nginx y postgreSQL), teniendo en cuenta que nuestro proyecto Django está hecho en Python 3.6.0.

$ sudo apt-get update
$ sudo apt-get install python3-pip python3-dev libpq-dev nginx postgresql postgresql-contrib

2. Clonar proyecto Django

Clonamos el proyecto Django que deseamos desplegar con el siguiente comando (mi proyecto en github se llama django_base):

git clone https://github.com/roadhousestudio/django_base

3. Crear base de datos


Ahora vamos a crear la base de datos para nuestro proyecto. Ya después de instalar postgreSQL en el paso anterior, podemos iniciar la sesión interactiva mediante el siguiente comando:

$ sudo -u postgres psql

Creamos la base de datos; en este caso, voy a nombrarla django_base_db, y posteriormente, creamos un usuario para acceder a nuestra base de datos y le damos privilegios de administración mediante los siguientes comandos:

postgres=# CREATE DATABASE django_base_db;
postgres=# CREATE USER djangouser WITH PASSWORD 'password';
postgres=# GRANT ALL PRIVILEGES ON DATABASE django_base_db TO djangouser;
postgres=# \q

4. Crear entorno virtual

Usarémos virtualenv para correr el proyecto. para instalarlo, debemos instalar antes pip:

$ sudo -H pip3 install --upgrade pip
$ sudo -H pip3 install virtualenv

Ahora, nos movemos a la raiz del proyecto (cd django_base/) y ejecutamos el siguiente comando, donde creamos un nuevo entorno virutal de nombre djangoenv:

$ virtualenv djangoenv

Activamos el entorno virtual:

$ source djangoenv/bin/activate

5. Instalar liberias Python del proyecto

Ahora procedemos a instalar en el entorno virutal las librerías Python requeridas para levantar nuestro proyecto, entre las que se encuentra Django, psycopg2, gunicorn.

(djangoenv)$ pip install django psycopg2 gunicorn

6. Configurar settings del proyecto (DATABASES)

Ahora vamos al archivo settings.py de nuestro proyecto django y editamos la información de la base de datos que utilizarémos:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'django_base_db',
        'USER': 'djangouser',
        'PASSWORD': 'password,
        'HOST': 'localhost',
        'PORT': '',
    }
}

También configuramos el setting ALLOWED_HOSTS:

ALLOWED_HOSTS = ['nombre de dominio o ip de instancia']

Ejecutamos el siguiente comando para crear las tablas de la base de datos y finalmente desactivamos el entorno virtual:

(djangoenv)$ manage.py migrate
(djangoenv)$ deactivate

7. Configurar servicio gunicorn

Crearémos un archivo systemd para levantar el servicio gunircorn que interactuará con nuestra aplicación Django. Nos ubicamos en la carpeta /etc/systemd/system/ y creamos el archivo django_base.service. Lo llamo django_base para que tenga el mismo nombre del proyecto Django:

cd /etc/systemd/system/
sudo vim django_base.service

Dentro del archivo django_base.service agregamos el siguiente contenido:

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=deploy
Group=www-data
WorkingDirectory=/home/admin/django_base
ExecStart=/home/admin/django_base/django_env/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/admin/django_base/django.sock app.wsgi:application
[Install]
WantedBy=multi-user.target




Guardamos el archivo y activamos el servicio mediante los siguientes comandos:

$ sudo systemctl start django_base.service
$ sudo systemctl enable django_base.service

8. Configurar nginx

Ahora nos movemos a la carpeta /etc/nginx/sites-available/ y creamos el archivo django_base (yo lo creo con el mismo nombre del repositorio):

$ cd /etc/nginx/sites-available/
$ sudo vim django_base

En el archivo agregamos el siguiente contenido (admin es el nombre del usuario administrador):

server {
    listen       80;
    server_name   nombre-de-dominio-o-IP;
    charset      utf-8;

    client_max_body_size       10m;
    client_body_buffer_size    128k;

    # serve static files
    location /static/ {
        alias /home/admin/django_base/app/static/;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/admin/django_base/django.sock;
    }
}

Guardamos los cambios hechos al archivo y agregamos un link simbólico dentro de la carpeta /etc/nginx/sites-enabled/

$ ln -s /etc/nginx/sites-available/django_base /etc/nginx/sites-enabled/

Y finalmente reiniciamos el servicio nginx:

$ sudo systemctl restart nginx

Ahora al ir a un navegador y visitar el nombre de dominio y la ip de la instancia remota que indicamos en el archivo de configuracón de nginx podrémos ver nuestra aplicación Django funcionando.


Esto es todo. La verdad a mi me costó un poco al principio determinar el procedimiento necesario para desplegar una aplicación Django en un servidor remoto de forma correcta, pero ahora el despliegue básico se compone de los pasos que acabamos de revisar y se hace de forma muy eficiente.

Pronto estaré compartiendo más información sobre contribución a desarollo de proyectos de código abierto.

Feliz semana para todos.


(1) - Algunos de los servicios de instancias remotas son heroku, EC2, Linode, etc.



Posted on Utopian.io - Rewarding Open Source Contributors

Sort:  

Hey @kit.andres I am @utopian-io. I have just upvoted you!

Achievements

  • You have less than 500 followers. Just gave you a gift to help you succeed!
  • Seems like you contribute quite often. AMAZING!

Community-Driven Witness!

I am the first and only Steem Community-Driven Witness. Participate on Discord. Lets GROW TOGETHER!

mooncryption-utopian-witness-gif

Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x

Thank you for the contribution. It has been approved.

You can contact us on Discord.
[utopian-moderator]

Este post tendrá continuación ?

Hola @jquispe03. Seguirémos teniendo mas tutoriales sobre Django, si tienes una sugerencia sobre algún tutorial que quieras ver, házmelo saber. Aquí he incluido solo el proceso para levantar una aplicación Django en un servidor remoto; después de configurar nginx y gunicorn, ya podrás acceder a la aplicación django en el navegador por medio de la ip del servidor que usamos en el archivo de configuración nginx en el paso 8. Si tienes un nombre de dominio, en el panel de administración de este en la página de tu proveedor de dominios debes configurarlo para que el dominio apunte a la ip de tu servidor. Si tienes alguna duda con algún paso específico, por favor házmelo saber, y estaré atento a ayudarte a resolverlo. Muchas gracias por leer el tutorial.

¿Que es lo que hace Gunicorn? Gracias

Hola @ecoinstant. Gunicorn es un servidor WSGI-HTTP para aplicaciones hechas con Python. WSGI es una especificación para una interfaz simple de comunicacion entre servidores para aplicaciones web hechas con Python. Gunicorn utiliza esta especificación para crear una interfaz para nuestra aplicación que traduce las solicitudes HTTP de los cliente a llamadas de Python que nuestra aplicación Django puede procesar, es decir, toma la solicitud http de los usuarios y la redirige a la sección específica de nuestro código python que debe procesas tal solicitud.

Coin Marketplace

STEEM 0.19
TRX 0.19
JST 0.034
BTC 91725.63
ETH 3093.11
USDT 1.00
SBD 2.83