Instalación de un CMS Python usando Django

Índice

En este post se instala el CMS CMS-Django usando un entorno virtual.

Para ello, en primer lugar, se crea un entorno virtual en el que se instala la aplicación.

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

Para crear un proyecto se usa el comando djangocms.

❯ djangocms javiblog

Clone template using django-admin
django-admin startproject "javiblog" --template https://github.com/django-cms/cms-template/archive/4.1.tar.gz
cd "/home/debian/javiblog"

Install requirements in /home/debian/javiblog/requirements.in
python -m pip install -r "/home/debian/javiblog/requirements.in"

Run migrations
python -m manage migrate

Create superuser
python -m manage createsuperuser
Username (leave blank to use 'debian'): admin
Email address: admin@javiblog.org
Password: 
Password (again): 
The password is too similar to the username.
This password is too short. It must contain at least 8 characters.
This password is too common.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

Check installation
python -m manage cms check

***************************************
django CMS 4.1.4 installed successfully
***************************************

Congrat

Para probar la instalación se puede ejecutar un servidor de pruebas con python3 manage.py runserver 0.0.0.0:8080.

Configuración del servidor Apache2

Para poder servir el CMS en Apache2 hay que configurar el VirtualHost indicando el ServerName, DocumentRoot y también aportando la información necesaria para que funcione el módulo wsgi de Apache2.

<VirtualHost *:80>
	ServerName portal.javi.org

	ServerAdmin webmaster@localhost

	DocumentRoot /home/debian/javiblog

	WSGIDaemonProcess javiblog python-path=/home/debian/javiblog:/home/debian/venv/cms/lib/python3.11/site-packages
	WSGIProcessGroup javiblog
	WSGIScriptAlias / /home/debian/javiblog/javiblog/wsgi.py process-group=javiblog

	<Directory /home/debian/javiblog>
		Require all granted
	</Directory>

	Alias /static/ /home/debian/javiblog/static/
	<Directory /home/debian/javiblog/static/>
		Require all granted
	</Directory>

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Después se activa el VirtualHost.

❯ sudo a2ensite djangocms.conf 
Enabling site djangocms.
To activate the new configuration, you need to run:
  systemctl reload apache2
❯ sudo systemctl reload apache2.service 

A continuación se usa el comando collectstatic para generar un directorio de ficheros estáticos en el directorio del proyecto con todos los ficheros estáticos. Para que este comando funcione, se debe indicar la URL base de los ficheros estáticos en el fichero settings.py

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

Y después se puede ejecutar el comando collectstatic.

❯ python3 manage.py collectstatic
Found another file with the destination path 'admin/img/search.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.

1159 static files copied to '/home/debian/javiblog/static'.

Accediendo al servidor se puede usar el CMS instalado.

Migración del CMS

Volcado del proyecto

En este caso, la aplicación django no está en un repositorio de GitHub, sino que se ha instalado localmente en el entorno de desarrollo. Para llevar el CMS al entorno de producción se puede crear un repositorio en GitHub y clonarlo o, directamente, sucar scp para copiar el directorio en el servidor en producción.

Antes de llevar el directorio al entorno de producción conviene crear todos los ficheros necesarios como el fichero de respaldo del contenido de la base de datos.

❯ python3 manage.py dumpdata > cms.json

Para copiar el directorio al entorno de producción se puede usar el comando scp.

❯ scp -r javiblog/ debian@pignite.javihuete.site:/home/debian

En el entorno de desarrollo también se crea un entorno virtual y se instala el CMS y sus dependencias.

cd venv/
python3 -m venv cms
source venv/cms/bin/activate
cd
pip install django-cms
cd javiblog
pip install -r requirements.in
pip install mysqlclient

Para poder hacer la migración se crea la base de datos para la aplicación.

MariaDB [(none)]> create database cms;
Query OK, 1 row affected (0,002 sec)

MariaDB [(none)]> create user 'cms'@'localhost' identified by '*****';
Query OK, 0 rows affected (0,002 sec)

MariaDB [(none)]> grant all privileges on cms.* to 'cms'@'localhost' identified by '*****';
Query OK, 0 rows affected (0,001 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0,001 sec)

Y en el fichero settings.py del proyecto se deben indicar los datos de la nueva base de datos.

# Database
# https://docs.djangoproject.com/en/5.1/ref/settings/#databases

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

Finalmente, se puede migrar la estructura de la base de datos.

python3 manage.py migrate

Y, por último, el contenido.

python3 manage.py loaddata cms.json 

Antes de terminar con la configuración de la aplicación en el entorno de producción hay que permitir el acceso a través de la URL en el fichero settings.py.

ALLOWED_HOSTS = ["portal.javihuete.site"]

Configuración del servidor de aplicaciones

Para poder usar el servidor de aplicaciones uwsgi desde el entorno virtual del CMS hay que instalarlo dentro de este entorno virtual.

pip install uwsgi

Para configurar el servidor de aplciaciones, en primer lugar, se genera el fichero .ini en el directorio del entorno virtual.

[uwsgi]
http = :8083
chdir = /home/debian/javiblog/javiblog
wsgi-file = wsgi.py
processes = 4
threads = 2

A partir de este fichero se puede configurar la unidad de systemd que controla este servicio en el directorio /etc/systemd/system/uwsgi-cms.

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

[Install]
WantedBy=multi-user.target

[Service]
User=debian
Group=debian
Restart=always

ExecStart=/home/debian/venv/cms/bin/uwsgi /home/debian/venv/cms/cms.ini
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

WorkingDirectory=/home/debian/javiblog            
Environment=PYTHONPATH='/home/debian/javiblog:/home/debian/venv/cms/lib/python3.11/s>

PrivateTmp=true

Para habilitar y arrancar el servicio se usa systemctl.

sudo systemctl enable uswgi-cms.service
sudo systemctl start uswgi-cms.service

Configuración de Nginx como proxy inverso

Para que Nginx dirija el tráfico al servidor de aplicaciones uwsgi se crea un VirtualHost con la siguiente configuración:

server {
	#listen 80;
	#server_name  python.javihuete.site;
	#server_tokens off;
	#return 301 https://$server_name$request_uri;

        listen 443 ssl;
        
	server_name portal.javihuete.site;
        
	ssl_certificate /etc/letsencrypt/live/javihuete.site/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/javihuete.site/privkey.pem;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_ciphers         HIGH:!aNULL:!MD5;

	root /home/debian/javiblog;

	location / {
		proxy_pass http://localhost:8083;
		#include proxy_params;
	}	

	location /static/ {
		alias /home/debian/javiblog/static/;
	}

	error_log /var/log/nginx/cms_error.log;
	access_log /var/log/nginx/cms_access.log;   

}

Por último, para habilitar el sitio se crea el enlace simbólico y se reinicia el servidor web.

sudo ln -s ../sites-available/cms
sudo systemctl restart nginx.service

Al poner en producción el CMS, se usa el protocolo HTTPS para el acceso a la página web. Esto hace que sea necesario añadir la siguiente línea al fichero settings.py de la aplicación:

CSRF_TRUSTED_ORIGINS = ["https://portal.javihuete.site",]
comments powered by Disqus

Relacionados

Migración de aplicaciones web PHP al entorno de producción

Este supuesto parte de un servidor Apache2 en un entorno de pruebas con dos aplicaciones PHP instaladas: Moodle y NextCloud. En este post se document la migración de estas aplicaciones a un servidor Nginx en producción.

Leer

Trabajo con el kernel de Linux

En esta entrada se aborda la actualización del kernel de Linux y su instalación desde el código fuente.

Leer

Cómo simular un servidor MariaDB en GNS3

MariaDB es uno conocido y reputado servidor de bases de datos. Es similar a MySQL y permite almacenar y gestionar una gran cantidad de información. En este post se explica cómo simularlo en un escenario de GNS3.

Leer