Installation de Glitchtip
Cet article est une procédure détaillée pour installer un serveur Glitchtip de zéro, sans passer par des conteneurs Docker
GlitchTip est une alternative Open Source à Sentry. La partie frontend est en nodejs
, le backend en python
basé sur le gestionnaire de dépendance poetry
et il est exécuté avec le serveur HTTP gunicorn
. Quand à la gestion des tâches, elle est déléguée à celery
.
La version de Glitchtip choisie est la 2.0.7
, au delà des erreurs de dépendances NodeJS sont présentes
NB : les valeurs suivantes sont à remplacer :
<DOMAIN>
/<PGSQL_PASSWORD>
/<SECRET_KEY>
Prérequis
- Debian 11 Bullseye
- 4 CPU
- 4 Go de RAM
- Disque : très léger pour Glitchtip (
/opt
). Prévoir de l’espace pour la base postgresql sur le long terme (/var/lib/postgresql/13/main
) - Accès root
- Serveur de mail en send-only, exemple de configuration : https://www.cloudsigma.com/installing-and-configuring-postfix-as-a-send-only-smtp-server-on-ubuntu-20-04/
Installation
Ajout du repo : nodejs (LTS)
CF : https://github.com/nodesource/distributions/blob/master/README.md
curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
Installation des paquets systèmes
apt update
apt install -y acl build-essential libpq-dev libsasl2-dev libssl-dev nginx nodejs postgresql python3-pip python3-venv python3.9 python3.9-dev redis-server
Configuration de la base de données postgresql
root@:~# su - postgres
postgres@:~$ psql
postgres=# CREATE DATABASE glitchtip;
postgres=# CREATE USER glitchtip WITH ENCRYPTED PASSWORD '<PGSQL_PASSWORD>';
postgres=# GRANT ALL PRIVILEGES ON DATABASE glitchtip TO glitchtip;
Installation de glitchtip
Création d’un utilisateur & d’un dossier dédié
useradd -m -s /bin/bash glitchtip
mkdir /opt/glitchtip
chown glitchtip:glitchtip /opt/glitchtip
NB : toutes les commandes suivantes sont exécutées avec l’utilisateur
glitchtip
, i.e. :su - glitchtip
Définition de l’environnement
cat << EOF >> ${HOME}/.bashrc
export DATABASE_URL="postgres://glitchtip:<PGSQL_PASSWORD>@127.0.0.1:5432/glitchtip"
export SECRET_KEY="<SECRET_KEY>"
export REDIS_HOST="127.0.0.1"
export DEFAULT_FROM_EMAIL="glitchtip@<DOMAIN>"
export GLITCHTIP_DOMAIN="http://<DOMAIN>"
## Utilisation d'un serveur mail sortant local
export EMAIL_HOST="127.0.0.1"
export EMAIL_PORT=25
EOF
. ${HOME}/.bashrc
Création d’un virtualenv python
python3.9 -m venv ${HOME}/venv_gt
${HOME}/venv_gt/bin/pip install --upgrade setuptools pip wheel cython poetry
Installation : frontend (nodejs)
cd /opt/glitchtip
wget https://gitlab.com/glitchtip/glitchtip-frontend/-/archive/v2.0.7/glitchtip-frontend-v2.0.7.tar.gz
tar xzvf glitchtip-frontend-v2.0.7.tar.gz
ln -sfn /opt/glitchtip/glitchtip-frontend-v2.0.7 /opt/glitchtip/glitchtip-frontend
cd /opt/glitchtip/glitchtip-frontend
npm install
npm run build-prod
Installation : backend (python)
cd /opt/glitchtip
wget https://gitlab.com/glitchtip/glitchtip-backend/-/archive/v2.0.7/glitchtip-backend-v2.0.7.tar.gz
tar xzvf glitchtip-backend-v2.0.7.tar.gz
ln -sfn /opt/glitchtip/glitchtip-backend-v2.0.7 /opt/glitchtip/glitchtip-backend
cd /opt/glitchtip/glitchtip-backend
ln -sfn /opt/glitchtip/glitchtip-frontend/dist/glitchtip-frontend dist
VIRTUAL_ENV=${HOME}/venv_gt ${HOME}/venv_gt/bin/poetry install
VIRTUAL_ENV=${HOME}/venv_gt ${HOME}/venv_gt/bin/poetry remove uWSGI
VIRTUAL_ENV=${HOME}/venv_gt ${HOME}/venv_gt/bin/poetry add gunicorn
${HOME}/venv_gt/bin/python /opt/glitchtip/glitchtip-backend/manage.py migrate
mkdir /opt/glitchtip/glitchtip-backend/{static,media}
${HOME}/venv_gt/bin/python /opt/glitchtip/glitchtip-backend/manage.py collectstatic
Création du compte admin
NB : La commande suivante va demander d’entrer le mot de passe administrateur
${HOME}/venv_gt/bin/python /opt/glitchtip/glitchtip-backend/manage.py createsuperuser --email "${DEFAULT_FROM_EMAIL}"
Création des démons systèmes
NB : toutes les commandes suivantes sont exécutées en
root
Création des dossiers de logs & runs
mkdir /var/log/glitchtip /var/lib/glitchtip
setfacl -m user:glitchtip:rwx /var/log/glitchtip /var/lib/glitchtip
Ficher d’environnement pour les démons systèmes
cat << EOF > /etc/default/glitchtip
PYTHONUNBUFFERED=TRUE
DATABASE_URL="postgres://glitchtip:<PGSQL_PASSWORD>@127.0.0.1:5432/glitchtip"
SECRET_KEY="<SECRET_KEY>"
REDIS_HOST="127.0.0.1"
DEFAULT_FROM_EMAIL="glitchtip@<DOMAIN>"
GLITCHTIP_DOMAIN="http://<DOMAIN>"
EMAIL_HOST="127.0.0.1"
EMAIL_PORT=25
ENABLE_USER_REGISTRATION=False ## Optionnel. Force la création de compte via l'interface d'administration
EOF
Démon web (gunicorn)
# Socket web
cat << EOF > /lib/systemd/system/glitchtip.socket
[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/var/lib/glitchtip/glitchtip.sock
SocketUser=www-data
[Install]
WantedBy=sockets.target
EOF
# Démon gunicorn
cat << EOF > /lib/systemd/system/glitchtip.service
[Unit]
Description=Gunicorn daemon to glitchtip
Requires=glitchtip.socket
After=network.target
[Service]
EnvironmentFile=/etc/default/glitchtip
Type=notify
User=glitchtip
Group=glitchtip
RuntimeDirectory=gunicorn
WorkingDirectory=/opt/glitchtip/glitchtip-backend
ExecStart=/home/glitchtip/venv_gt/bin/gunicorn "glitchtip.wsgi" --workers 4 --capture-output
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=mixed
TimeoutStopSec=5
PrivateTmp=true
StandardOutput=append:/var/log/glitchtip/gunicorn-access.log
StandardError=append:/var/log/glitchtip/gunicorn-error.log
[Install]
WantedBy=multi-user.target
EOF
Celery executor
# Beat
cat << EOF > /lib/systemd/system/glitchtip-celery-beat.service
[Unit]
Description=glitchtip celery beat
After=network.target
[Service]
EnvironmentFile=/etc/default/glitchtip
User=glitchtip
Group=glitchtip
RuntimeDirectory=glitchtip
WorkingDirectory=/opt/glitchtip/glitchtip-backend
ExecStart=/home/glitchtip/venv_gt/bin/celery --app "glitchtip" beat --loglevel info --pidfile=/var/lib/glitchtip/celery-beat.pid --logfile=/var/log/glitchtip/celery-beat.log --schedule /var/lib/glitchtip/celerybeat-schedule
PrivateTmp=true
Restart=always
[Install]
WantedBy=multi-user.target
EOF
# Worker
cat << EOF > /lib/systemd/system/glitchtip-celery-worker.service
[Unit]
Description=glitchtip celery worker
After=network.target
[Service]
EnvironmentFile=/etc/default/glitchtip
User=glitchtip
Group=glitchtip
RuntimeDirectory=glitchtip
WorkingDirectory=/opt/glitchtip/glitchtip-backend
ExecStart=/home/glitchtip/venv_gt/bin/celery --app "glitchtip" worker --loglevel info --pidfile=/var/lib/glitchtip/celery-worker.pid --logfile=/var/log/glitchtip/celery-worker.log
PrivateTmp=true
Restart=always
[Install]
WantedBy=multi-user.target
EOF
Lancement des démons systèmes
systemctl daemon-reload
systemctl enable glitchtip-celery-beat.service glitchtip-celery-worker.service glitchtip.service glitchtip.socket
systemctl start glitchtip-celery-beat.service glitchtip-celery-worker.service glitchtip.service glitchtip.socket
Création de la configuration logrotate
cat << EOF > /etc/logrotate.d/glitchtip
/var/log/glitchtip/gunicorn-*.log {
daily
rotate 14
compress
delaycompress
notifempty
copytruncate
create 644 root root
}
/var/log/glitchtip/celery-*.log {
daily
rotate 14
compress
delaycompress
notifempty
copytruncate
create 644 glitchtip glitchtip
}
EOF
Configuration de nginx
en reverse proxy
Création de la configuration
# Suppression de la configuration de base
unlink /etc/nginx/sites-enabled/default
# Création de la configuration nginx
cat << EOF > /etc/nginx/sites-available/reverse-proxy.conf
server {
listen 80;
listen [::]:80;
server_name <DOMAIN>;
access_log /var/log/nginx/reverse-access.log;
error_log /var/log/nginx/reverse-error.log;
add_header Strict-Transport-Security max-age=15768000;
location ~ /\.git {
deny all;
}
location / {
proxy_pass http://unix:/var/lib/glitchtip/glitchtip.sock;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
}
}
EOF
ln -s /etc/nginx/sites-available/reverse-proxy.conf /etc/nginx/sites-enabled/reverse-proxy.conf
# Validation de la configuration et relance du démon
nginx -t && systemctl restart nginx.service
Ajout d’un SSL
Optionnel. CF : https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/
Accessibilité
Le site sera ainsi disponible sous l’url : http://<DOMAIN>
, ou https://<DOMAIN>
si un certificat SSL a été déployé
De même les logs applicatifs seront disponibles aux chemins suivants :
/var/log/glitchtip/celery-beat.log
/var/log/glitchtip/celery-worker.log
/var/log/glitchtip/gunicorn-access.log
/var/log/glitchtip/gunicorn-error.log
/var/log/nginx/reverse-access.log
/var/log/nginx/reverse-error.log