Nettoyer les sessions Gitlab < 7.3 dans la base Redis

Prior to GitLab 7.3, user sessions did not automatically expire from Redis. If you have been running a large GitLab server (thousands of users) since before GitLab 7.3 we recommend cleaning up stale sessions to compact the Redis database after you upgrade to GitLab 7.3.

Les versions de Gitlab entre la 6.2 et la 7.2 stockent leurs sessions dans une base Redis sans définir de date d’expiration. Conséquence : celles-ci vont s’accumuler au fil du temps sans aucun intérêt.

La documentation de Gitlab donne deux commandes :

# Voir toutes les sessions stockées dans Redis
redis-cli keys '*' | grep '^[a-f0-9]\{32\}$' | wc -l

# Faire expirer toutes les sessions dans dix minutes
redis-cli keys '*' | grep '^[a-f0-9]\{32\}$' | awk '{ print "expire", $0, 600 }' | redis-cli

La commande ci-dessus pose un problème : à chaque exécution, il repositionne la date d’expiration à 600 secondes. Et ce, même si la session allait expirée avant ! Impossible donc de l’exécuter telle quelle via une tâche cron.

Voici un script shell conçu pour être exécuté via cron. Il s’inspire de celui la documentation mais ignore toutes les sessions qui ont déjà une date d’expiration et définit pour les autres une échéance à +1 heure :

#!/bin/sh
#
# Avant Gitlab 7.3, les sessions ne possèdent pas de date d'expiration.
#
# Cela a pour conséquence une augmentation progressive de la base Redis
# sans aucune plus-value.
#
# Ce script se charge de définir une date d'expiration pour toutes les sessions
# dont le nom est formaté sous la forme de 32 caractères hexadécimales
#
# Le script fournit sur la documentation de Gitlab propose une expiration d'un quart
# d'heure, ce qui me semble trop court, le délai ici est donc d'une heure.
#
# Source :
# https://docs.gitlab.com/ce/administration/operations/cleaning_up_redis_sessions.sh
#

# Durée d'une session en secondes
SESSION_EXPIRE="3600"

rcli="$(command -v redis-cli)"

# Pour voir le nombre de sessions dans la base
# $rcli keys '*' | grep '^[a-f0-9]\{32\}$' | wc -l

# Expiration au bout d'une heure - 3600 secondes
$rcli keys '*' | grep '^[a-f0-9]\{32\}$' | while read LINE
do
  # Identifiant de la session
  key_id="$(echo $LINE | awk '{ print $0 }')"

  # Récupération de la date d'échéance correspondante
  key_ttl="$($rcli ttl $key_id)"

  # On ne prend que les sessions dont le TTL est -1 (= pas d'expiration)
  test "${key_ttl}" = -1 || continue

  echo "$key_id = $key_ttl"

  # Définit une date d'expiration
  $rcli expire "${key_id}" "${SESSION_EXPIRE}"
done

L’idéal étant évidemment de passer à une version plus récente de Gitlab 🙂

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s