En este post vamos agenerar un proyecto local en django, posteriormente lo subiremos a github y lo clonaremos en un servidor vps de amazon ec2.

Despues haremos uso de uwsgi y nginx para publicar el servicio en el servidor y por ultimo instalaremos un certificado ssl.

1.- Proyecto local

instalamos herramientas para generar entorno virtual

apt-get instala python3-venv

creamos la carpeta del proyecto

mkdir proyectodjango

instalamos el entorno virtual

python3 -m venv proyectodjango/env

activamos el entorno virtual

source proyectodjango/env/bin/activate

Ya dentro de nuestro entorno virtual instalamos django

pip install Django

Creamos nuestro proyecto con django-admin y elejimos el nombre de nuestro proyecto

django-admin startproject proy .

python manage.py migrate

Probamos el proyecto activando el servidor

python manage.py runserver

Creamos un superusuario para poder acceder al panel de control

python manage.py createsuperuser

Como paso extra vamos a instalar un tema del panel admin de django para hacer unos cambios

pip install django-admin-soft-dashboard

Modificamos los settings del proyecto para agregar la aplicacion recien instalada

vim proy/settings.py

Agregamos el siguiente codigo en installed aps

‘admin_soft.apps.AdminSoftDashboardConfig’,

2.- Subimos nuestro proyecto a git

Iniciamos el repositprio

git init

Agregamos los archivos

git add .

Agregamos el mensaje

git commit -m «primer commit»

Configuramos user

git config –global user.email «admin@rodisoft.site»

git config –global user.name «tomy laptop»

Agregamos los origenes

git remote add origin https://github.com/tomym87/proydjan.git

git branch -M main

Empujamos los cambios

git push -u origin main

Generamos el archivo requirements

pip freeze > requirements.txt

git add .

git commit -m «agregando requirements»

Subimos los cambios

git push -u origin main

3.- Nos conectamos anuestra vps

ssh -i «apdjandeb.pem» admin@ec2-18-116-189-71.us-east-2.compute.amazonaws.com

Actualizamos nuestro servidor

sudo apt update

sudo apt upgrade

Instalamos git en nuestro servidor

sudo apt install git

clonamos nuestro repositorio

git clone https://github.com/linutopix/proyectodjango.git

entramos a nuestro proyecto

cd proyectodjango

Borramos el entorno virtual para generar uno nuevo

rn -rf env

Instalamos herramientas del entorno virtual y activamos un nuvo entorno virtual

sudo apt install python3-venv

python3 -m venv env

source env/bin/activate

Instalamos los requirements

pip install -r requirements.txt

probamos nuestro proyecto

python3 manage.py runserver 0.0.0.0:8000

En mi caso ec2 no tiene abierto el puerto 8000 por defecto asi que entramos al panel de ec2 para abrirlo

4.- Publicamos nuestro proyecto con uwsgi y nginx

Vemos que version de python tenemos instalada

python3 -V

instalamos herramientas de desarrollo de nustra version de python

sudo apt-get install python3.11-dev gcc

Accedemos a nuestro proyecto activamos nuestro entorno virtual y corremos el servidor django

cd proyectodjango

source env/bin/activate

python3 manage.py runserver 0.0.0.0:8000

Instalamos uwsgi

pip install uwsgi

Creamos un archivo de prueba en python para probar que podemos servir desde uwsgi

vim test.py

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Prueba correcta"]

Probamos que podamos servir el archivo con uwsgi

uwsgi –http :8000 –wsgi-file test.py

Ahora vamos a levantar el proyecto django con uwsgi con el siguiente comando. buscar el archivo wsgi.py para saber la ubicacion del modulo.

uwsgi –http :8000 –module proydjan.wsgi

vmoa a configurar ahora nginx, comenzamos instalandolo

sudo apt-get install nginx

Creamos el archivo de configuracion de nuestro sitio en /etc/nginx/sites-available/, en nuestro caso lo llamaremos proydjan.conf

sudo vim /etc/nginx/sites-available/proydjan.conf

# the upstream component nginx needs to connect to
upstream django {
    server unix:///home/admin/proydjango/proydjango.sock;
}
# configuration of the server
server {
    listen      80;
    server_name proydjango.linutopix.site;
    charset     utf-8;
    # max upload size
    client_max_body_size 75M;
    # Django media and static files
    location /media  {
        alias /home/admin/proydjango/media;
    }
    location /static {
        alias /home/admin/proydjango/static;
    }
    # Send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     /home/admin/proydjango/uwsgi_params;
    }
}

Creamos el archivo de configuracion de parametros en /home/admin/proydjan/uwsgi_params con el siguiente contenido

uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;
uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;
uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

vim /home/admin/proydjan/uwsgi_params

Creamos el enlace simbolico de nuetsro archivo de configuracion

sudo ln -s /etc/nginx/sites-available/proydjango.conf /etc/nginx/sites-enabled/

Modificamos la configuracion del proyecto para agregar rutas estaticas

vim proydjan/settings.py

import os
STATIC_ROOT = os.path.join(BASE_DIR, "static/")

Geneamos la carpeta de archivos estaticos

python manage.py collectstatic

Agregamos la carpeta media

mkdir media

Descargamos una imagen de prueba

wget https://media.tenor.com/iKwvDRl3cvAAAAAM/homer-simpson-whoo-hoo.gif -O media/media.gif

borramos el sitio por default y reiniciamos el servicio de nginx

sudo rm -rf /etc/nginx/sites-enabled/default

sudo /etc/init.d/nginx restart

Ahora creamos el socket de conexion

uwsgi –socket proydjan.sock –module proydjan.wsgi –chmod-socket=666

Configuramos uwsgi para pduccion cresmos el archivo de configuracion .ini

vim djangoproy_uwsgi.ini

[uwsgi]
# full path to Django project's root directory
chdir            = /home/admin/proydjan/
# Django's wsgi file
module           = proydjan.wsgi
# full path to python virtual env
home             = /home/admin/proydjan/env
# enable uwsgi master process
master          = true
# maximum number of worker processes
processes       = 10
# the socket (use the full path to be safe
socket          = /home/admin/proydjan/proydjan.sock
# socket permissions
chmod-socket    = 666
# clear environment on exit
vacuum          = true
# daemonize uwsgi and write messages into given log
daemonize       = /home/admin/uwsgi-emperor.log

corremos el proceso

uwsgi –ini djangoproy_uwsgi.ini

Reiniciamos para mater procesos

sudo reboot

Vamos a crear un servicio que monitoree que este activo siempre, entramos a nuestro entorno virtual y creamos la carpeta vassals

cd /home/admin/proydjan/env

mkdir vassals

sudo ln -s /home/admin/proydjan/djangoproy_uwsgi.ini /home/admin/proydjan/env/vassals/

corremos uwsgi en modo emperador para hacer una prueba

uwsgi –emperor /home/admin/proydjan/env/vassals –uid www-data –gid www-data

Ahora vamos a que esto arranque al iniciar el sistema, hay varias formas, nosotros lo haremos con systemd lo llamaremos djangoemperor.uwsgi

sudo vim /etc/systemd/system/djangoemperor.uwsgi.service

[Unit]
Description=Emperor de proydjan
After=network.target
[Service]
User=admin
Restart=always
ExecStart=/home/admin/proydjan/env/bin/uwsgi --emperor /home/admin/proydjan/env/vassals --uid www-data --gid www-data
[Install]
WantedBy=multi-user.target

Habilitamos y arrancamos el servicio con systemd

sudo systemctl enable djangoemperor.uwsgi.service

sudo systemctl start djangoemperor.uwsgi.service

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *