Instalación de Pretix

Hola, dejo por aquí el proceso de instalación de pretix. Básicamente he seguido esta guia.

Instalación de requerimientos en el servidor

Ubuntu server ya tiene instalada la versión 3.10.12 de Python, así que el primer requerimiento está cubierto.

Instalación del servidor SMTP Postfix:

$ sudo apt update

$ sudo apt install mailutils

Aparece la ventana de configuración:

Paso 1:
Seleccionamos “Internet Site”
Paso 2:
El valor de “System mail name” es el nombre del servidor (tiquets.anartist.org)

Si no ha aparecido la ventana de configuración después del paso anterior, introducimos el siguiente comando (a mi no me ha aparecido):

$ sudo dpkg-reconfigure postfix

Volvemos ver la ventana de configuración, repetimos los 2 primeros pasos.

Paso 3:
Dejamos el campo “Recipient” vacío.
Paso 4:
Dejamos los valor por defecto
Paso 5:
Ponemos el valor NO en “Force synchronous updates”
Paso 6:
Dejamos el valor por defecto de “Local networks”
Paso 7:
Dejamos el valor de “Mailbox size limit” a 0
Paso 8:
Dejamos el valor por defecto de “Local address extension character” que es el símbolo +
Paso 9:
Seleccionamos “all” para activar tanto el protocolo IPv6 como el IPv4

Al acabar la configuración recargamos el servicio Postfix:

$ sudo systemctl reload postfix

Ahora comprobamos que podemos enviar correos desde nuestro servidor con el siguiente comando:

$ echo “Este es el cuerpo del correo” | mail -s “Asunto del correo” direccion_correo

Instalación de Nginx:

$ sudo apt update
$ sudo apt install nginx

Ahora al acceder a http://tiquets.anartist.org/ vemos la páginade bienvenida de Nginx`

Instalación de PostgreSQL

$ sudo apt update

$ sudo apt install postgresql postgresql-contrib

Ponemos en marcha el servicio:

$ sudo systemctl start postgresql.service

Instalación de Redis

$ sudo apt-get update

$ sudo apt-get install redis-server -y

Instalación de NodeJS

$ sudo apt update

$ sudo apt install nodejs

Creación del usuario pretix:

$ adduser pretix --disabled-password --home /var/pretix

Solo he añadido el nombre del usuario:
Full Name : pretix

Configuración de la base de datos postreSQL:

Nos aseguramos de que nuestra base de datos usa el encoding UTF8

$ sudo -u postgres psql -c ‘SHOW SERVER_ENCODING’

Obtenemos el resultado:
server_encoding
-----------------
UTF8
(1 row)

Todo ok, seguimos creando el usuario pretix en postgres:

$ sudo -u postgres createuser pretix

Creamos la base de datos:

$ sudo -u postgres createdb -O pretix pretix

Instalamos dependencias de paquetes:

$ sudo apt-get install git build-essential python3-dev python3-venv python3 python3-pip \
                  python3-dev libxml2-dev libxslt1-dev libffi-dev zlib1g-dev libssl-dev \
                  gettext libpq-dev libjpeg-dev libopenjp2-7-dev

Creamos carpeta y archivo de configuración para pretix:

Creación de carpeta:

$ sudo mkdir /etc/pretix

Creación del archivo de configuración:

$ sudo touch /etc/pretix/pretix.cfg

Damos permisos y cambiamos el owner del archivo:

$ sudo chown -R pretix:pretix /etc/pretix/
$ sudo chmod 0600 /etc/pretix/pretix.cfg

Editamos el archivo de configuración:

$ sudo nano /etc/pretix/pretix.cfg

y añadimos las siguientes lineas:

[pretix]
instanc_name=Anartist pretix installation
url=https://tiquets.anartist.org
currency=EUR
datadir=/var/pretix/data
trust_x_forwarded_for=on
trust_x_forwarded_proto=on
registration=on
[database]
backend=postgresql
name=pretix
user=pretix
; For PostgreSQL on the same host, we don't need a password because we can use
; peer authentication if our PostgreSQL user matches our unix user.
password=
; For local postgres authentication, you can leave it empty
host=
[mail]
; See config file documentation for more options
from=tickets@tiquets.anartist.com
host=127.0.0.1
[redis]
location=redis://127.0.0.1/0
sessions=true
[celery]
backend=redis://127.0.0.1/1
broker=redis://127.0.0.1/2

Para cerrar el registro de usuarios desde la página de inicio hay que comentar o borrar la línea

registration=on

Instalación de pretix desde PyPI:

Los siguientes pasos se deben ejecutar con el usuario pretix:

$ sudo -u pretix -s

Creamos un entorno virtual para aislar los paquetes de Python de la instalación global de Python:

$ python3 -m venv /var/pretix/venv

Activamos el entorno virtual:

$ source /var/pretix/venv/bin/activate

Instalamos pip setuptools:

(venv)$ pip3 install -U pip setuptools wheel

Instalamos pretix:

(venv)$ pip3 install pretix gunicorn

Creamos carpeta para los datos y damos permisos:

(venv)$ mkdir -p /var/pretix/data/media
(venv)$ chmod +x /var/pretix

Compilamos y creamos la estructura de la base de datos:

(venv)$ python -m pretix migrate
(venv)$ python -m pretix rebuild

Arrancar pretix como servicio

Creamos el archivo pretix-web.service:

$ sudo nano /etc/systemd/system/pretix-web.service

Con el siguiente contenido:

[Unit]
Description=pretix web service
After=network.target
[Service]
User=pretix
Group=pretix
Environment="VIRTUAL_ENV=/var/pretix/venv"
Environment="PATH=/var/pretix/venv/bin:/usr/local/bin:/usr/bin:/bin"
ExecStart=/var/pretix/venv/bin/gunicorn pretix.wsgi \
                      --name pretix --workers 5 \
                      --max-requests 1200  --max-requests-jitter 50 \
                      --log-level=info --bind=127.0.0.1:8345
WorkingDirectory=/var/pretix
Restart=on-failure
[Install]
WantedBy=multi-user.target

Creamos el archivo pretix-worker.service:

$ sudo nano /etc/systemd/system/pretix-worker.service

Con el siguiente contenido:

[Unit]
Description=pretix background worker
After=network.target
[Service]
User=pretix
Group=pretix
Environment="VIRTUAL_ENV=/var/pretix/venv"
Environment="PATH=/var/pretix/venv/bin:/usr/local/bin:/usr/bin:/bin"
ExecStart=/var/pretix/venv/bin/celery -A pretix.celery_app worker -l info
WorkingDirectory=/var/pretix
Restart=on-failure
[Install]
WantedBy=multi-user.target

Habilitamos y ponemos en marcha los servicios:

$ sudo systemctl daemon-reload
$ sudo systemctl enable pretix-web pretix-worker
$ sudo systemctl start pretix-web pretix-worker

Creación de cronjob

El job tiene que ejecutarse con el usuario pretix, ejecutamos el siguiente comando:

$ crontab -e -u pretix

Añadimos la siguiente linea al archivo:

15,45 * * * * export PATH=/var/pretix/venv/bin:$PATH && cd /var/pretix && python -m pretix runperiodic

Instalación de certificado SSL con certbot

Nos aseguramos de no tener certbot instalado previamente:

$ sudo apt-get remove certbot

Instalamos certbot:

$ sudo snap install --classic certbot

Nos aseguramos de que cerbot se puede ejecutar:

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

El siguiente comando instala el certificado y modifica nuestro nginx.conf:

$ sudo certbot --nginx

La instalación falla con el siguiente error:

No se ha podido modificar el archivo nginx.conf, procedo a modificarlo manualmente. Añado el certificado y la llave en las líneas 76 y 77 respectivamente.

Resultado final de nginx.conf:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
	worker_connections 768;
	multi_accept on;
    use epoll;
}
http {
	##
	# Basic Settings
	##
	sendfile on;
	tcp_nopush on;
	types_hash_max_size 2048;
	server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# SSL Settings
	##

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

	gzip on;

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

	##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;

    server {
        listen 80 default_server;
        listen [::]:80 ipv6only=on default_server;
        server_name tiquets.anartist.org;
        location / {
            return 301 https://$host$request_uri;
        }
    }
    server {
        listen 443 default_server;
        listen [::]:443 ipv6only=on default_server;
        server_name tiquets.anartist.org;

	    #ssl on;
	    ssl_certificate /etc/letsencrypt/live/tiquets.anartist.org/fullchain.pem;
	    ssl_certificate_key /etc/letsencrypt/live/tiquets.anartist.org/privkey.pem;

        add_header Referrer-Policy same-origin;
        add_header X-Content-Type-Options nosniff;

        location / {
            proxy_pass http://localhost:8345;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto https;
            proxy_set_header Host $http_host;
        }

        location /media/ {
            alias /var/pretix/data/media/;
            expires 7d;
            access_log off;
        }

        location ^~ /media/cachedfiles {
            deny all;
            return 404;
        }
        location ^~ /media/invoices {
            deny all;
            return 404;
        }

        location /static/ {
            alias /var/pretix/venv/lib/python3.10/site-packages/pretix/static.dist/;
            access_log off;
            expires 365d;
            add_header Cache-Control "public";
        }
    }
}

Comprobamos que la renovación automática funcione con el comando:

$ sudo certbot renew –dry-run

Podemos ver el job introducioendo el comando:

$ systemctl list-timers

Iniciamos nginx:

$ sudo sytemctl start nginx

Ahora ya podemos a nuestra instalación desde el navegador.

Después de cambiar la configuración o instalar algún plugin hay que lanzar los siguientes comandos:

$ sudo -u pretix -s
$ source /var/pretix/venv/bin/activate
(venv)$ python -m pretix migrate
(venv)$ python -m pretix rebuild
(venv)$ python -m pretix updatestyles

Este último comando hay que lanzarlo como usuario root:

$ sudo systemctl restart pretix-web pretix-worker

3 Me gusta

Uau!

@RickyAKA, muchas gracias por la guía tan detallada :heart_eyes_cat:.

Me será especialmente útil la parte del correo. Siempre que me toca hacerlo tengo que bucear un poco porque no me acuerdo.

Un abrazo!

PD: edito tu publicación para corregir algún error de formato, espero que no te moleste.

1 me gusta

Puedes corregir lo que te parezca, sin problema!

1 me gusta

Vaya crack @RickyAKA, muchas gracias! :smiley:

Solo tengo un apunte:

Volver a crear el entorno virtual de Python cada vez no sería necesario, no?

3 Me gusta

Tienes razón, con el activate para acceder al entorno basta.
Lo edito. Gracias!

3 Me gusta