Una vez hemos desarrollado una aplicación con django nos interesará ponerla en producción. La forma correcta de hacerlo es usando uwsgi + nginx. Así que vamos a ello.
Mi aplicación corre sobre postgresql así que instalaremos los siguientes paquetes
# apt -y install nginx uwsgi uwsgi-plugin-python3 postgresql python3-psycopg2 libpq-dev git virtualenv memcached
Creamos el usuario y la base de datos postgresql
# su - postgres $ createuser colibri_user $ createdb -O colibri_user colibri_db $ psql colibri_db colibri_db=# alter user colibri_user with encrypted password 'XXXXXXXX'; colibri_db=# grant all privileges on database colibri_db to colibri_user;
Ahora clonamos el código del programa en /var/www
# cd /var/www/ # git clone git@git.capa8.net:blackhold/colibri.git
Creo el entorno virtual
# cd colibri # virtualenv -p python3 venv
Entro en el entorno virtual y ejecuto los comandos necesarios para iniciar la aplicación
# source venv/bin/activate # pip install -r requirements.txt # ./clean.sh # python manage.py runserver 0.0.0.0:5001
Ahora configuramos uwsgi para que apunte donde está nuestra aplicación de django
# cd /etc/uwsgi/apps-available # vi colibri.ini [uwsgi] master = true processes = 10 socket = /tmp/uwsgi-colibri.sock uid = www-data gid = www-data ;# with appropriate permissions - *may* be needed ;chmod-socket = 664 chdir = /var/www/colibri module = colibri.wsgi home = /var/www/colibri/venv/ vacuum = true env = DJANGO_SETTINGS_MODULE=colibri.settings safe-pidfile = /tmp/uwsgi-colibri.pid ;harakiri = 20 # respawn processes taking more than 20 seconds ;limit-as = 128 # limit the project to 128 MB max-requests = 5000 daemonize = /var/log/uwsgi/colibri.log ;callable = application plugin = python37
Guardamos y lo activamos en apps-enabled
# cd .. # cd /etc/uwsgi/apps-enabled # ln -s ../apps-available/colibri.ini . # service uwsgi restart
Ahora configuramos nginx
# cd /etc/nginx/sites-available/ # vi colibri server { listen 80; server_name colibri.capa8.net; include snippets/certbot.conf; return 301 https://colibri.capa8.net$request_uri; } # Responem les consultes de https://colibri.capa8.net server { server_name colibri.capa8.net; location / { include uwsgi_params; uwsgi_pass unix:/tmp/uwsgi-colibri.sock; } # /static location /static/ { autoindex off; root /var/www/colibri/web/; } location /static/admin { autoindex off; root /var/www/colibri/venv/lib/python3.7/site-packages/django/contrib/admin/; } listen 443 ssl http2; ssl_certificate /etc/letsencrypt/live/colibri.capa8.net/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/colibri.capa8.net/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_trusted_certificate /etc/letsencrypt/live/colibri.capa8.net/chain.pem; }
Lo activamos en nginx
# cd /etc/nginx/sites-enabled/ # ln -s ../sites-available/colibri . # nginx -t # service nginx restart
Y ahora ya tendríamos que poder acceder por http a nuestra aplicación. En /var/log/uwsgi/colibri.log tenemos los logs de uwsgi para si nginx nos suelta algún error 503.
cat 0_run_cleaned_db.sh
#!/bin/bash
rm -R wbox/__pycache__
rm -R web/__pycache__
rm -R web/migrations/__pycache__
rm -R web/migrations/0*
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
$ cat 1_update.sh
#!/bin/bash
python manage.py makemigrations
python manage.py migrate
$ cat 2_execute_db_imported.sh
#!/bin/bash
rm -R wbox/__pycache__
rm -R web/__pycache__
rm -R web/migrations/__pycache__
rm -R web/migrations/0*
python manage.py makemigrations
python manage.py migrate
Pingback: Django runserver sobre https - Blackhold
Pingback: Django: peticiones wsgi y asgi simultaneas (htmx y websockets) - Blackhold