Gitea Stratégie Backup
L'application Gitea
utilise une base de données et des espaces de stockage, dont une sauvegarde est nécessaire. Cet article présente la mise en place d'une stratégie de backup, sous Ubuntu, permettant de réaliser:
- 1 sauvegarde quotidienne de la base de données.
- Export des sauvegardes vers un serveur "externe" via FTP.
- Conservation des trois dernières sauvegardes complètes, et des incrémentales.
La synchronisation des sauvegardes s'effectue à l'aide de l'outil de backup Duplicity. Le fait d'externaliser les sauvegardes apporte une garantie supplémentaire. En effet, si le serveur venait à être en panne, les sauvegardes de Gitea
resteront disponibles.
La base de données PostgreSql
est sauvegardée selon le principe mis en place pour PostgreSql.
Sommaire
Votre avis
Nobody voted on this yet
|
|
Objectif
L'installation faite sous Ubuntu met en place différents répertoires / fichiers:
- Répertoire
/var/opt/gitea
: Contient les binaires et les extensions. - Répertoire
/usr/share/gitea
: Contient les dépôts et autres fichiers. - Fichiers / Liens sous
/etc/apache2/sites-available
et/etc/apache2/sites-enabled
: Contient la déclaration de la publication sous Apache.
Sous Ubuntu, il existe le répertoire /var/backups
, utilisé par aptitude, dpkg, OpenLDAP ... Cependant, il ne sera pas utilisé dans le cadre de cet article, pour ne pas engendrer d'éventuels effets de bord.
Tous les scripts et données seront stockés dans un nouveau répertoire /var/opt/backups
(pour l'ensemble des stratégies) et plus particulièrement dans le répertoire /var/opt/backups/gitea
pour Gitea
.
Concernant les logs, elles seront toutes placées dans le répertoire /var/log/backups
.
#sudo mkdir -p /var/opt/backups/gitea #sudo chmod 750 /var/opt/backups/gitea #sudo chown root:backup /var/opt/backups/gitea #sudo mkdir /var/log/backups
Sauvegardes
Sauvegarde PostgreSQL
Répertoire
Les sauvegardes sont placées dans le répertoire /var/opt/backups/gitea/db
qu'il faut créer. Seul le compte root doit pouvoir y accéder.
#sudo mkdir /var/opt/backups/gitea/db #sudo chown root:root /var/opt/backups/gitea/db #sudo chmod 700 /var/opt/backups/gitea/db #sudo setfacl -Rdm g::0,o::0 /var/opt/backups/gitea/db
La dernière commande va permettre de forcer les permissions sur le répertoires et les éléments qui y seront créés.
Utilisateur
Dans la cadre de la procédure de backup, le compte backup
, ayant le rôle viewers
, est utilisé au niveau de PostgreSql
comme mentionné au niveau du principe de backup. Il est donc nécessaire de modifier les droits par défaut. L'application se connectant avec le compte gitea
, il est donc nécessaire de se connecter à la base gitea
avec celui-ci.
# psql -d gitea -U gitea -h 127.0.0.1
gitea=> ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO viewers; ALTER DEFAULT PRIVILEGES gitea=> ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON SEQUENCES TO viewers; ALTER DEFAULT PRIVILEGES
Scripts backup database
Le script, fichier /var/opt/backups/gitea/gitea_autopostgresqlbackup.sh
, mis en place permet d'exécuter les outils de sauvegarde d'une base de données PostgreSql
en spécifiant l'emplacement du fichier de configuration, à l'emplacement /var/opt/backups/gitea/gitea_autopostgresqlbackup.conf
en redirigeant les messages d'exécution dans le fichier /var/log/backups/gitea_backup_db.log
. En fin d'exécution, le script sh /var/opt/backups/gitea/gitea_backup.sh
est exécuté pour déclencher la sauvegarde des fichiers avec Duplicity
.
#!/bin/bash
/var/opt/autopostgresqlbackup/pg_backup_rotated.sh -c /var/opt/backups/gitea/gitea_autopostgresqlbackup.conf >> /var/log/backups/gitea_backup_db.log
sh /var/opt/backups/gitea/gitea_backup.sh
Configuration
La configuration de l'outil de sauvegarde est mis en place dans le fichier /var/opt/backups/gitea/gitea_autopostgresqlbackup.conf
.
##############################
## POSTGRESQL BACKUP CONFIG ##
##############################
# Optional system user to run backups as. If the user the script is running as doesn't match this
# the script terminates. Leave blank to skip check.
BACKUP_USER=
# Optional hostname to adhere to pg_hba policies. Will default to "localhost" if none specified.
HOSTNAME=
# Optional username to connect to database as. Will default to "postgres" if none specified.
USERNAME=backup
# This dir will be created if it doesn't exist. This must be writable by the user the script is
# running as.
BACKUP_DIR=/var/opt/backups/gitea/db/
# List of strings to match against in database name, separated by space or comma, for which we
# perform backup of the schema.
SCHEMA_FILTER="gitea"
# List of strings to match against in database name, separated by space or comma, for which we only
# wish to keep a backup of the schema, not the data. Any database names which contain any of these
# values will be considered candidates. (e.g. "system_log" will match "dev_system_log_2010-01")
SCHEMA_ONLY_LIST=""
# Will produce a custom-format backup if set to "yes"
ENABLE_CUSTOM_BACKUPS=yes
# Will produce a gzipped plain-format backup if set to "yes"
#ENABLE_PLAIN_BACKUPS=yes
ENABLE_PLAIN_BACKUPS=no
# Will produce gzipped sql file containing the cluster globals, like users and passwords, if set to "yes"
#ENABLE_GLOBALS_BACKUPS=yes
ENABLE_GLOBALS_BACKUPS=no
#### SETTINGS FOR ROTATED BACKUPS ####
# Which day to take the weekly backup from (1-7 = Monday-Sunday)
DAY_OF_WEEK_TO_KEEP=7
# Number of days to keep daily backups
DAYS_TO_KEEP=7
# How many weeks to keep weekly backups
WEEKS_TO_KEEP=1
######################################
Les éléments de configuration sont les suivants.
Paramètre | Valeur |
---|---|
BACKUP_USER | |
HOSTNAME | |
USERNAME | backup
Utilisation du compte backup dans la base PostgreSql. |
BACKUP_DIR | /var/opt/backups/gitea/db/
Emplacement des fichiers produits par la sauvegarde de la base de données. |
SCHEMA_FILTER | "gitea"
Filtre sur uniquement le schéma gitea. |
SCHEMA_ONLY_LIST | |
ENABLE_CUSTOM_BACKUPS | yes
Demande de sauvegarde au format custom. |
ENABLE_PLAIN_BACKUPS | no
Pas de sauvegarde au format texte. |
ENABLE_GLOBALS_BACKUPS | no
Pa de sauvegarde des paramètres globaux. Identifiant du jour lors duquel la rotation hebdomadaire est réalisée. |
DAY_OF_WEEK_TO_KEEP | 7
Rotation hebdomadaire le dimanche. |
DAYS_TO_KEEP | 7
Conservation de 7 jours de sauvegardes journalières. |
WEEKS_TO_KEEP | 1
Conservation d'une seule semaine de sauvegarde hebdomadaire. |
Droits d'accès
Les droits mis en place permettent de modifier et exécuter le script pour le propriétaire. Le groupe ne doit pas pouvoir modifier les fichiers
#sudo chmod 750 /var/opt/backups/gitea/gitea_autopostgresqlbackup.sh #sudo chmod 640 /var/opt/backups/gitea/gitea_autopostgresqlbackup.conf
Scripts export sauvegardes
Le script gitea_backup.sh
est mis en place, avec des sécurités autorisant uniquement le compte root
à le modifier, dans le répertoire /var/opt/backups/gitea
avec le code suivant:
#!/bin/bash
PRGDIR="/var/opt/backups";
if [ -r "$PRGDIR/_common_start.sh" ]; then
. "$PRGDIR/_common_start.sh"
fi
dateLogFormat="+%Y-%m-%d %H:%M";
# Backup log
pathLog="/var/log/backups/gitea_backup.log";
echo "[$(date "$dateLogFormat")] Start backup" >> $pathLog;
echo "[$(date "$dateLogFormat")] Start upload with duplicity" >> $pathLog;
duplicity remove-all-but-n-full 3 --force $FTP_ROOT/gitea >> $pathLog;
duplicity --include '/usr/share/gitea' --include '/var/opt/gitea' --include '/var/opt/backups/gitea/db' --include '/etc/apache2/sites-enabled/*-git*.conf' --include '/etc/apache2/sites-available/git*' --exclude '**' --full-if-older-than 7D / $FTP_ROOT/gitea >> $pathLog;
if [ -r "$PRGDIR/_common_end.sh" ]; then
. "$PRGDIR/_common_end.sh"
fi
echo "[$(date "$dateLogFormat")] End upload with duplicity" >> $pathLog;
echo "[$(date "$dateLogFormat")] End backup" >> $pathLog;
Attention à l'utilisation de l'instruction export
, surtout pour la PASSPHRASE. En effet, si celle-ci contient des espaces, il est impératif de la placer entre le caractère "
.
Il n'est pas nécessaire de positionne le droit d'exécution sur ce fichier.
#sudo chmod 660 /var/opt/backups/gitea/gitea_backup.sh #sudo chown root:backup /var/opt/backups/gitea/gitea_backup.sh
Le fonctionnement de ce script est assez simple. Puis deux variables d'environnement sont mises en place:
- PASSPHRASE: Phrase pour le cryptage des données par duplicity.
- FTP_PASSWORD: Le mot de passe FTP utilisé pour se connecté via duplicity.
La première instruction, avec l'argument remove-all-but-n-full 3
, va conserver les trois dernières sauvegardes complètes. Puis la seconde instruction, avec l'argument --full-if-older-than 7D
effectue une sauvegarde incrémentale uniquement si la précédente complète est plus ancienne de sept jours.
Le résultat de l'export est ensuite envoyé sur un serveur FTP, configuré par la value HOST
, en utilisant le login FTP_LOGIN
et le mot de passe USER_PASSWORD
placé dans la variable FTP_PASSWORD
. Les sauvegardes sont stockées à l'emplacement backup/gitea
à la racine du compte après connexion sur FTP.
Enfin, les exécutions sont tracées dans la log /var/log/backups/gitea_backup.log
.
Planification
Une fois que le script de sauvegarde est mis en place, il est possible de l'exécuter manuellement. Mais l'objectif est de l'exécuter automatiquement et régulièrement sans s'en préoccuper. Dans le cadre de cette implémentation, la planification est réalisée à l'aide de l'outil Crontab disponible sur les systèmes Linux. L'outil Anacron n'a pas été utilisé car les planifications souhaitées doivent se faire à des heures et des jours particuliers.
La mise en place s'effectue en modifiant le fichier /etc/crontab
pour y ajouter une ligne.
Le script /var/opt/backups/gitea/gitea_autopostgresqlbackup.sh
est planifié.
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
40 5 * * * root cd / && /var/opt/backups/gitea/gitea_autopostgresqlbackup.sh
#
Les sauvegardes sont planifiées à 5h40 AM, tous les jours de la semaine, par l'exécution de la commande cd / && /var/opt/backups/gitea/gitea_autopostgresqlbackup.sh
.
Gestions des logs
Des fichiers de log sont créés par le script mis en place. Comme pour l'ensemble des produits, une rotation de ces logs est mise en place, à l'aide de l'outil Logrotate.
L'ensemble des logs se trouvent donc dans le répertoire /var/log/backups
avec les noms gitea_backup_db.log
et gitea_backup.log
. La configuration permet une rotation hebdomadaire, en conservant 3 rotations. Les rotations sont compressées, en asynchrone, et créées avec un accès en modification au compte root.
Cette configuration est mise en place dans le fichier gitea_backup
, sous le répertoire /etc/logrotate.d
/var/log/backups/gitea*.log {
weekly
missingok
rotate 3
compress
delaycompress
notifempty
create 640 root root
}