Stratégie de backup pour ne pas perdre vos données

Introduction

Après avoir finalisé l'installation et la configuration de Gitea, il est temps de mettre en place un système de backup qui incluera :

  • Les dépots git
  • Les clés SSH ajoutées dans Gitea
  • Un dump de la base de données
  • Les fichiers médias uploadés (avatars, images...)

Pourquoi utiliser son propre système de sauvegarde

Gitea dispose déjà nativement d'une commande permettant de faire une sauvegarde des données dans un fichier zip (incluant un dump SQL).

Ca peut sembler très attrayant sur le papier ! Mais pour avoir déjà tenté de restaurer un dump SQL généré avec Gitea sans succès même après de multiples tentatives, il me paraît bien plus fiable d'en faire un vous-même.

Ma petite mésaventure avec le dump natif de Gitea

Pour la petite anecdote, j'ai voulu rétablir mes données quand j'ai changé de fournisseur VPS, j'ai donc essayé de restaurer le dump généré par Gitea.

Ca avait l'air d'avoir bien fonctionné jusqu'à ce qu'à ce que je tente de me connecter : des erreurs 500 de partout et je m'aperçois que les données non pas été entièrement restaurées...

Heuresement, j'avais un backup manuel de la base de données (un vrai dump PostgreSQL) ! Si je n'avais pas pris cette précaution : j'aurais du reconstruire l'organisation de mes dépôts git dans l'interface web de Gitea à la main...

Pas très fun !

C'est recommandé dans la doc officielle

C'est cette raison qui m'a poussé à écrire cette partie afin que vous puissiez utiliser pleinement Gitea sans vous soucier d'une potentielle perte de vos données en cas de problèmes.

Dans tous les cas vos données git ne seront jamais réellement perdues en cas de problème de restauration d'un dump SQL, c'est le principe de git : les dépots seront toujours sur le serveur et vous avez (à priori) une copie en locale.

Mais ce qui est plus embettant, ca serait de perdre l'organisation de vos dépots dans Gitea, la liste des groupes et utilisateurs, pages wiki, configuration, etc.

La documentation officielle raconte qu'il n'y a pas de commande pour restaurer un dump généré avec Gitea (le comble), c'est pour ça qu'il faut faire son propre système de sauvegarde :

There is currently no support for a recovery command. It is a manual process that mostly involves moving files to their correct locations and restoring a database dump

https://docs.gitea.io/en-us/backup-and-restore/

Sauvegarder ses données : avant de commencer

Comme expliqué précédemment, nous allons sauvegarder un ensemble de dossiers et effectuer un dump SQL de la base de données, puis nous allons zipper tout cet ensemble.

Pour ce faire, je vous conseille de créer un script bash qui sera executé quotidiennement à l'aide du tâche cron et qui enverra les sauvegardes dans le Cloud.

Localiser l'emplacement de ses dépôts git

Avant de commencer la sauvegarde de vos données, vous devez connaître l'emplacement de vos dépôts git.

Vous pouvez trouver l'emplacement dans le fichier de config utilisé par gitea : /etc/gitea/app.ini

Si vous avez utilisé un autre emplacement et que vous ne vous en souvenez plus, ouvrez le fichier /etc/systemd/system/gitea.service vous devriez voir quelque chose comme : ExecStart=/usr/local/bin/gitea web -c /etc/gitea/app.ini

Le chemin après le -c correspond au fichier de config utilisé.

# /etc/gitea/app.ini
[repository]  
ROOT = /home/git/gitea-repositories

Connaître la valeur de GITEA_WORK_DIR

En plus de l'emplacement des dépôts git gérés par Gitea, vous devez également connaître la valeur de la variable d'environnement GITEA_WORK_DIR

Si vous avez suivi le tutoriel d'installation, la valeur est /var/lib/gitea

C'est important de le connaître, car le dossier des données (data) de Gitea est relatif à GITEA_WORK_DIR (dans notre cas, le dossier des données est donc : /var/lib/gitea/data)

Connaître l'utilisateur dédié à Gitea (pour les clés SSH enregistrées dans Gitea)

Vous devez connaître l'utilisateur Linux qui execute Gitea, pour cela vous pouvez regarder dans le fichier /etc/systemd/system/gitea.service

Si vous avez suivi le tutoriel d'installation, c'est l'utilisateur git.

les clés SSH sont donc dans : /home/git/.ssh/authorized_keys

Sauvegarder ses données

Maintenant que nous savons où sont situés les dossiers des données, nous pouvons désormais entammer la partie sauvegarde du tutoriel.

C'est relativement simple, il suffit de créer un zip qui va contenir les données suivantes :

  1. Le dossier des données (dans notre cas : /var/lib/gitea/data)
  2. Un dump SQL
  3. Les clés SSH enregistrées dans Gitea (/home/git/.ssh/authorized_keys).

Inspiration pour votre script de backup

Vous pouvez faire un script bash executé à l'une tâche cron, voici une piste d'inspiration :

# datetime actuelle
TIMESTAMP=$(date +%F_%T | tr ':' '-')
OUTPUT_FILE="/home/$USER/gitea_dump_$TIMESTAMP.zip"

GITEA_DUMP_REPO_PATH="/home/$USER/gitea-dump-repositories"
GITEA_DUMP_DATA_PATH="/home/$USER/gitea-dump-data/"
GITEA_DUMP_AUTHORIZED_KEYS_PATH="/home/$USER/gitea-dump-authorized-keys"
GITEA_DUMP_SQL_PATH="/home/$USER/gitea-dump-sql"

# je prefère zipper les repo gitea
sudo zip -r "$GITEA_DUMP_REPO_PATH" /home/git/gitea-repositories/

sudo cp -r /var/lib/gitea/data/ $GITEA_DUMP_DATA_PATH
sudo cp /home/git/.ssh/authorized_keys $GITEA_DUMP_AUTHORIZED_KEYS_PATH

sudo -u postgres pg_dump gitea > "$GITEA_DUMP_SQL_PATH"

sudo zip -r "$OUTPUT_FILE" "$GITEA_DUMP_REPO_PATH" "$GITEA_DUMP_DATA_PATH" "$GITEA_DUMP_AUTHORIZED_KEYS_PATH" "$GITEA_DUMP_SQL_PATH" 

# @todo ici vous pouvez ensuite sauvegarder le fichier $OUTPUT_FILE dans le cloud

# puis supprimer les dossiers/fichiers temporaires une fois le transfert terminé

sudo rm "$OUTPUT_FILE"
sudo rm "$GITEA_DUMP_SQL_PATH"
sudo rm "$GITEA_DUMP_REPO_PATH"

sudo rm -rf $GITEA_DUMP_DATA_PATH
sudo rm $GITEA_DUMP_AUTHORIZED_KEYS_PATH