931 palabras
5 minutos
Despliegue de aplicaciones python sobre django

Tarea 1 Entorno de desarrollo#

He elegido como entorno de desarrollo la m谩quina bravo.

Primero creamos un entorno virtual de python3 e instalamos las dependencias necesarias para que funcione el proyecto.

python3 -m venv django 
source django/bin/activate
pip install django

Ahora descargamos el proyecto de github:

git clone https://github.com/robertorodriguez98/django_tutorial

Configuraci贸n de django#

Comprobamos que vamos a trabajar con una base de datos sqlite. Para ello tenemos que consultar el fichero settings.py. En este caso la base de datos se llama db.sqlite3.

(django)$ cd django_tutorial
(django)$ cat django_tutorial/settings.py | egrep -A 5 'DATABASES';
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

Para poder acceder desde la direcci贸n www.roberto.gonzalonazareno.org, tenemos que modificar el fichero django_tutorial/settings.py y a帽adir la direcci贸n a la lista de hosts permitidos de la siguiente manera:.

ALLOWED_HOSTS = ['www.roberto.gonzalonazareno.org']

Ahora creamos la base de datos:

(django)$ python manage.py migrate

Y el usuario administrador:

(django)$ python3 manage.py createsuperuser

Ahora ejecutamos el servidor web de desarrollo:

(django)$ python3 manage.py runserver 0.0.0.0:8000

Y accedemos a la zona de administraci贸n, en este caso en la direcci贸n www.roberto.gonzalonazareno.org:8000/admin y a帽adimos dos preguntas con sus posibles respuestas.

Zona de administraci贸n

  • Comprueba en el navegador que la aplicaci贸n est谩 funcionando, accede a la url /polls.

P谩gina principal

P谩gina de votaci贸n1

P谩gina de votaci贸n2

Configuraci贸n del servidor web#

En bravo, el servidor web apache2 ya est谩 instalado y configurado para servir p谩ginas web est谩ticas. Para servir p谩ginas web din谩micas, tenemos que instalar el m贸dulo wsgi.

sudo dnf install python3-mod_wsgi

Ahora, para que el entorno sea similar al de producci贸n, movemos el proyecto y el entorno virtual a la ruta /var/www/html/django_tutorial y /var/www/html/django respectivamente.

sudo mv django_tutorial /var/www/html/
sudo mv django /var/www/html/

Creamos el contenido est谩tico de la aplicaci贸n:

sudo python3 manage.py collectstatic

Editamos el fichero /var/www/html/django_tutorial/django_tutorial/settings.py y modificamos las siguientes l铆neas:

ALLOWED_HOSTS = ['*']
STATIC_ROOT = '/var/www/html/django_tutorial/static/'

Ahora configuraremos el servidor apache para que sirva la aplicaci贸n django. Para ello, tenemos que crear un fichero de configuraci贸n en la ruta /etc/httpd/sites-available/django.conf con el siguiente contenido:

<VirtualHost python.roberto.gonzalonazareno.org:80>
    ServerName python.roberto.gonzalonazareno.org
    DocumentRoot /var/www/html/django_tutorial

    Alias /static/ /var/www/html/django_tutorial/static/

    WSGIDaemonProcess django_tutorial python-path=/var/www/html/django_tutorial:/var/www/html/django/lib/python3.9/site-packages
    WSGIProcessGroup django_tutorial
    WSGIScriptAlias / /var/www/html/django_tutorial/django_tutorial/wsgi.py

    ErrorLog /var/log/httpd/django_tutorial_error.log
    CustomLog /var/log/httpd/django_tutorial_access.log combined
</VirtualHost>

Para que funcione la configuraci贸n tenemos que activar el sitio web y reiniciar el servidor web:

sudo ln -s /etc/httpd/sites-available/django.conf /etc/httpd/sites-enabled/django.conf
sudo systemctl restart httpd

Ahora podemos acceder a la aplicaci贸n desde la direcci贸n python.roberto.gonzalonazareno.org.

Tarea 2: Entorno de producci贸n#

Vamos a realizar el despliegue de nuestra aplicaci贸n en un entorno de producci贸n, para ello vamos a utilizar nuestro VPS, sigue los siguientes pasos:

Instalaci贸n de django y base de datos#

Clonamos el repositorio:

git clone https://github.com/robertorodriguez98/django_tutorial

Creamos el entorno virtual:

python3 -m venv django 
source django/bin/activate
cd django_tutorial
pip install -r requirements.txt

Instalamos el m贸dulo que permite que python trabaje con mysql:

sudo apt install libmariadb-dev
pip install mysqlclient

Tras crear un usuario y la base de datos, configuramos la aplicaci贸n para trabajar con mysql, para ello modifica la configuraci贸n de la base de datos en el archivo settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',
        'USER': 'djadmin',
        'PASSWORD': 'djadmin',
        'HOST': 'localhost',
        'PORT': '',
    }
}

Creamos la copia de seguridad de la aplicaci贸n en bravo:

sudo python manage.py dumpdata > /home/roberto/basedatos.json

y la restauramos en el VPS:

(django)$ python manage.py migrate
(django)$ python manage.py loaddata basedatos.json
Installed 57 object(s) from 1 fixture(s)

Finalmente generamos el contenido est谩tico:

(django)$ python manage.py collectstatic

Configuraci贸n de nginx#

Instalamos uwsgi:

pip install uwsgi

Podemos comprobar que funciona correctamente:

uwsgi --http :8080 --chdir /home/calcetines/django_tutorial --wsgi-file django_tutorial/wsgi.py --process 4 --threads 2 --master 

Creamos el fichero de configuraci贸n de uwsgi en /home/calcetines/django/servidor.ini:

[uwsgi]
http = :8080
chdir = /home/calcetines/django_tutorial 
wsgi-file = django_tutorial/wsgi.py
processes = 4
threads = 2

Ahora crearemos la unidad de systemd para que se ejecute uwsgi como servicio en el fichero /etc/systemd/system/uwsgi-django.service:

[Unit]
Description=uwsgi-django
After=network.target

[Install]
WantedBy=multi-user.target

[Service]
User=www-data
Group=www-data
Restart=always

ExecStart=/home/calcetines/django/bin/uwsgi /home/calcetines/django/servidor.ini
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

WorkingDirectory=/home/calcetines/django_tutorial
Environment=PYTHONPATH='/home/calcetines/django_tutorial:/home/calcetines/django/lib/python3.9/site-packages'

PrivateTmp=true

activamos el servicio:

systemctl enable uwsgi-django.service
systemctl start uwsgi-django.service

Ahora configuramos nginx como proxy inverso a帽adiendo la siguiente configuraci贸n en el fichero /etc/nginx/sites-available/django:

server {
    listen          80;
    server_name     python.admichin.es;
    
    if ($host ~ ^[^.]+\.admichin\.es$) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

}

server {
    listen          443 ssl;
    server_name     python.admichin.es;
    access_log      /var/log/nginx/example.com_access.log combined;
    error_log       /var/log/nginx/example.com_error.log error;

        ssl_certificate /etc/letsencrypt/live/admichin.es-0001/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/admichin.es-0001/privkey.pem; # managed by Certbot

    location /static/ {
        root /home/calcetines/django_tutorial;
    }

    location / {
        proxy_pass         http://localhost:8080/;
        include proxy_params;
        proxy_redirect     off;

        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
    }
}

Desactivamos el modo debug en el fichero settings.py:

DEBUG = False

Finalmente accedemos a la p谩gina web en python.admichin.es y comprobamos que funciona correctamente.

base

admin

polls

Tarea 3: Modificaci贸n de nuestra aplicaci贸n#

En el entorno de desarrollo#

Vamos a hacer las siguientes modificaciones:

  • Modificamos el fichero django_tutorial/polls/templates/polls/index.html para que aparezca nuestro nombre.
  • Modificamos la imagen de fondo que se ve la aplicaci贸n. Para hacerlo debemos modificar el fichero django_tutorial/polls/static/polls/css/style.css y cambiar la siguiente l铆nea, estando la imagen en la carpeta django_tutorial/polls/static/polls/images:
    background: white url("images/gundam.jpg");

Ahora vamos a crear una nueva tabla en la base de datos para almacenar las categor铆as de las preguntas. Para ello sigue los siguientes pasos:

  • Se A帽ade un nuevo modelo al fichero django_tutorial/polls/models.py:
class Categoria(models.Model):	
    Abr = models.CharField(max_length=4)
    Nombre = models.CharField(max_length=50)

    def __str__(self):
        return self.Abr+" - "+self.Nombre
  • Se crea una nueva migraci贸n.
(django)$ sudo python manage.py makemigrations --name tabla_categoria

Migrations for 'polls':
  polls/migrations/0002_tabla_categoria.py
    - Create model Categoria
  • Se realiza la migraci贸n.
(django)$ sudo python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  Applying polls.0002_tabla_categoria... OK
  • Se a帽ade el nuevo modelo al sitio de administraci贸n de django modificando el fichero django_tutorial/polls/admin.py:
from .models import Choice, Question, Categoria

[...]

admin.site.register(Categoria)  

Para que los cambios se trasladen al entorno de producci贸n debemos realizar los siguientes pasos:

(django)$ sudo python manage.py
(django)$ sudo python manage.py dumpdata > basedatos2.json
(django)$ sudo python manage.py collectstatic # este no hace falta para el entorno de producci贸n
(django)$ git push

En el entorno de producci贸n#

  • Se realiza la migraci贸n.
(django)$ git pull
(django)$ sudo python manage.py migrate
(django)$ sudo python manage.py loaddata basedatos2.json
(django)$ sudo python manage.py collectstatic

Podemos comprobar que se han producido los cambios:

base

admin

polls

Despliegue de aplicaciones python sobre django
https://www.robertops.com/posts/2023-01-23_despliegue_django/
Autor
Roberto Rodr铆guez
Publicado el
2023-01-23