Instalar entorno de producción de python

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.

3 Comments

  1. 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

    Respon
  2. Pingback: Django runserver sobre https - Blackhold

  3. Pingback: Django: peticiones wsgi y asgi simultaneas (htmx y websockets) - Blackhold

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.