Montando un proyecto django en Ubuntu con nginx
Montando un proyecto django en Ubuntu con nginx
Digitalocean es un proveedor de sevicios en la nube para desarrolladores de software. Un aspecto positivo de Digitalocean es que tiene una excellente documentación y tutoriales desde cómo iniciar un servidor hasta cómo instalar todo tipo de software. Las otras opciones para despliegue de aplicaciones son Linode, AWS Heroku, entre otras. El presente artículo está basado precisamente en un tutorial de Digitalocean que se puede leer aquí.
Crear droplet e implementar las claves SSH
Lo primero que hay que hacer es crear una cuenta en Digitalocean con datos de
pago con tarjeta de crédito. Se pueden escoger Droplets de Ubuntu, CentOS,
Fedora, Debian FreeBSD y CoreOS que cuestan mínimo 5 dólares mensuales.Toma un minuto crear un droplet. Digitalocean envia un correo con la dirección IP y una clave para acceder por primera vez:
Droplet Name: ubuntu-512mb-nyc3-01
IP Address: 159.34.67.123
Username: root
Password: 80089747ca9ee0c7
Hay que generar en el computador local las claves ssh. En Windows se puede usar
la aplicación Cygwin, en Mac y Linux la línea de comandos.
$ ssh-keygen -t rsa
Se escoge donde guardarlo y luego se copia el archivo pub y se pega en el campo
ssh key de Digitalocean. O también, y mejor, se puede usar el comando ssh-copy-id:
$ ssh-copy-id root@159.34.67.123
$ ssh-copy-id root@159.34.67.123 (usar la dirección IP asignada)
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@159.34.67.75's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@159.34.67.123'"
and check to make sure that only the key(s) you wanted were added.
Conectarse al servidor desde el computador local
Se usa ssh y ya no es necesario ingresar la clave:
$ ssh root@159.34.67.123
Siempre recomiendan por seguridad crear un usuario con privilegios administrativos y no hacer logging como root.
# adduser usuario
# passwd usuario (agregar contraseña)
# adduser -aG sudo usuario
# exit
$ ssh-copy-id usuario@159.34.67.123
$ ssh usuario@159.34.67.123
Instalar nginx, postgres y demás dependencias
$ sudo apt-get install python-pip python-dev postgresql postgresql-contrib nginx
sudo su - postgres
psql
CREATE DATABASE proyecto;
CREATE USER usuario WITH PASSWORD 'password';
GRANT ALL PRIVILEGES ON DATABASE proyecto TO usuario;
\q
exit
Crear entorno virtual y el proyecto django
Vamos a crear un entorno virtual con virtualenv, la carpeta del proyecto y luego descargamos los programas que faltan con python pip:
$ sudo pip install virtualenv
$ mkdir ~/proyecto
$ cd ~/proyecto
$ virtualenv mientorno
$ source mientorno/bin/activate
$ pip install django gunicorn psycopg2
Gunicorn (green unicorn) es un servidor wsgi que funciona bien en ambientes linux y psycopg2 permite la comunicación entre python y postgresql. Lo que sigue es crear el proyecto django en directorio actual y modificar el archivo settings:
$ djando-admin startproject proyecto .
$ cd proyecto
$ vim settings.py
Modificamos los valores de la base de datos y la ubicación de los archivos estáticos:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'proyecto',
'USER': 'usuario',
'PASSWORD': 'HTGsaMwsg54',
'HOST': 'localhost',
'PORT': '',
}
}
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
Luego hacemos las migraciones de la base de datos, creamos un superusuario y agrupamos los archivos estáticos en un solo lugar:
$ cd ~/proyecto
$ python manage.py makemigrations
$ python manage.py migrate
$ pythom manage.py createsuperuser
$ python manage.py collectstatic
Configurar Gunicorn y Nginx
La última parte del despliegue django es configurar gunicorn para que mantenga la aplicación corriendo. Modificamos el archivo /etc/init/gunicorn.conf para que quede de la siguiente forma:
description "Gunicorn application server handling proyecto"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
setuid usuario
setgid www-data
chdir /home/usuario/proyecto
exec mienv/bin/gunicorn --workers 3 --bind unix:/home/usuario/proyecto/proyecto.sock proyecto.wsgi:application
Iniciamos gunicorn:
$ sudo service gunicorn start
Finalmente se crea el archivo /etc/nginx/sites-available/proyecto:
server {
listen 80;
server_name .example.com;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/usuario/proyecto;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/usuario/proyecto/proyecto.sock;
}
}
Creamos un enlace simbólico y revisamos que la configuración de nginx es correcta:
$ sudo ln -s /etc/nginx/sites-available/proyecto /etc/nginx/sites-enabled
$ sudo nginx -t
Iniciamos nginx y ya podemos ir a la dirección IP a revisar el sitio django.
$ sudo service nginx start
$ curl 159.34.67.123