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