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