Outils pour utilisateurs

Outils du site


admin:infrastructure:backup

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
Prochaine révisionLes deux révisions suivantes
admin:infrastructure:backup [2019/01/06 11:51] fpoulainadmin:infrastructure:backup [2021/01/02 17:49] – [Log rotate] fpoulain
Ligne 1: Ligne 1:
 ====== Paquet Debian ====== ====== Paquet Debian ======
  
-Le backup de chapril est déployé via un paquet Debian sur un repo privé. On décrit ici les points essentiels du paquet à défaut de publier le repo, ainsi que la configuration du contrôle d'intégrité des archives.+Le backup de Chapril est déployé via un paquet Debian sur un repo privé. On décrit ici les points essentiels du paquet à défaut de publier le repo, ainsi que la configuration du contrôle d'intégrité des archives.
  
 ===== Aspects backup ===== ===== Aspects backup =====
Ligne 7: Ligne 7:
 ==== Script de backup ==== ==== Script de backup ====
  
-<code bash src/backup.sh> +C'est fournis par [[https://torsion.org/borgmatic| borgmatic]].
-#! /bin/bash+
  
-sleep $[$RANDOM % 30]m+On y adjoint une configuration dans ''/etc'' :
  
-logger="/var/log/backup.log" +<code yaml /etc/borgmatic.d/root.yaml> 
-borg_bin="/usr/bin/borg" +location: 
-backup_name=`date +%Y-%m-%d` +  source_directories: 
-backup_dest="backup@backup.chapril.org:/srv/backups/`hostname --fqdn`"+    - / 
 +  exclude_patterns: 
 +    - '/dev' 
 +    - '/media/*' 
 +    '/mnt/*' 
 +    '/proc' 
 +    - '/run/*' 
 +    - '/srv/backups/*.chapril.org' 
 +    - '/sys' 
 +    - '/var/cache/*' 
 +    - '/var/lib/backuppc/*' 
 +    - '/var/lib/libvirt/coon' 
 +    - '/var/lib/libvirt/images/' 
 +    - '/var/lib/libvirt/maine' 
 +  repositories: 
 +    - 'backup@backup.chapril.org:/srv/backups/{fqdn}'
  
-export BORG_RSH="ssh -p 2242 -A"+storage: 
 +  ssh_command: ssh -p 2242 -A 
 +  archive_name_format: '{now:%Y-%m-%dT%H:%M:%S}' 
 +  # pour bullseye : borg_cache_directory: /var/cache/borg
  
-echo ======================================================================== >> $logger +consistency: 
-echo "                              New backup" >> $logger +  check_last: 2 
-echo ======================================================================== >> $logger +  prefix: '20'
-date >> $logger +
-echo "" >> $logger+
  
-echo "== Executing package selection" >> $logger +retention
-date >> $logger +  keep_daily: 7 
-echo "" >> $logger +  keep_weekly: 4 
-dpkg --get-selections > /root/package-selections+  prefix: '20'
  
-echo "== Backup pre-hook" >> $logger +hooks: 
-date  >> $logger +  before_backup: 
-echo ""  >> $logger+    - echo "Launching root backup at $(date -Iseconds)" 
 +    - for file in /etc/borg/scripts/pre-hooks/ ; do test -e "$file" || continue; echo "Executing $file..."; $file; done 
 +  after_backup: 
 +    - for file in /etc/borg/scripts/post-hooks/* ; do test -e "$file" || continue; echo "Executing $file..."; $file; done 
 +    - echo "Succeeded root backup at $(date -Iseconds)" 
 +  on_error: 
 +    - echo "Failed root backup at $(date -Iseconds)" 
 +# pour bullseye : 
 +#  after_check: 
 +#    - echo "Succeeded root checks at $(date -Iseconds)" 
 +#  after_prune: 
 +#    - echo "Succeeded root prune at $(date -Iseconds)" 
 +</code>
  
-for file in /etc/borg/scripts/pre-hooks/*; do +==== Entrée Systemd ====
- echo "Executing $file... " >> $logger +
- $file +
-done+
  
-echo "== Backup launch" >> $logger +On déclenche avec un timer systemd qui retarde le démarrage avec un timing aléatoire pour éviter le ddos de [[admin:machines_virtuelles:felicette|Félicette]].
-date >> $logger +
-echo "" >> $logger+
  
-$borg_bin create --stats $backup_dest::$backup_name +<code conf /etc/systemd/system/borgmatic.timer> 
- --exclude /proc \ +[Unit] 
- --exclude /dev  \ +Description=Run borgmatic backup
- --exclude /sys  \ +
- --exclude /var/lib/libvirt/coon \ +
- --exclude /var/lib/libvirt/maine \ +
- --exclude /var/lib/libvirt/images/ +
-        --exclude '/srv/backups/*.chapril.org'+
-    2>&1 >> $logger+
  
-rc=$? +[Timer] 
-if [[ $rc !0 ]]; then exit $rc; fi+# Will trigger at 01:00 each day 
 +# + 0-60 random minutes 
 +# + 30 minutes delay from borgmatic.service 
 +OnCalendar=*-*-* 01:00:00 
 +Persistent=true 
 +RandomizedDelaySec=60 minutes
  
-echo "== Backup info" >> $logger +[Install] 
-date >> $logger +WantedBy=timers.target 
-echo "" >$logger+</code>
  
-$borg_bin info $backup_dest::$backup_name 2>&1 >> $logger+<code conf /etc/systemd/system/borgmatic.service> 
 +[Unit] 
 +Description=borgmatic backup 
 +Wants=network-online.target 
 +After=network-online.target 
 +ConditionACPower=true
  
-echo "== Backup pruning" >> $logger +[Service] 
-date >> $logger +Type=oneshot
-echo "" >> $logger+
  
-$borg_bin prune -v --keep-daily=7 --keep-weekly=5 $backup_dest 2>&1 >> $logger+## Lower CPU and I/O priority. 
 +Nice=19 
 +CPUSchedulingPolicy=batch 
 +IOSchedulingClass=best-effort 
 +IOSchedulingPriority=7 
 +IOWeight=100
  
-echo "== Backup post-hook" >> $logger +## Logs 
-date >> $logger +StandardOutput=syslog 
-echo "" >> $logger +StandardError=syslog 
- +SyslogIdentifier=borgmatic 
-for file in /etc/borg/scripts/post-hooks/*; do +# Prevent rate limiting of borgmatic log events
-    [[ -f "$file" ]] || continue +LogRateLimitIntervalSec=0
- echo "Executing $file... " >> $logger +
- $file +
-done +
- +
-echo "" >> $logger +
-date >> $logger +
-echo Returned $rc >> $logger +
-echo ======================================================================== >> $logger +
- +
-exit $rc +
-</code> +
- +
-==== Entrée Cron ====+
  
-<code cron src/backup> +## Launcher 
-00 2 * * * root bash /srv/bin/backup.sh+# Delay start to prevent backups immediately upon system startup 
 +ExecStartPre=sleep 30m 
 +ExecStart=borgmatic -v1 
 +Restart=no
 </code> </code>
  
Ligne 126: Ligne 146:
     su - postgres -c "pg_dump $db" | bzip2 - > $backup_dir/$db.sql.bz2     su - postgres -c "pg_dump $db" | bzip2 - > $backup_dir/$db.sql.bz2
 done done
 +</code>
 +
 +<code bash scripts/pre-hooks/dump-influxdb>
 +#!/bin/bash
 +
 +if test -x /usr/bin/influxd ; then
 +    backup_dir=/var/backups/influxdb
 +    db=icinga2
 +
 +    # Prepare.
 +    mkdir -p $backup_dir
 +    chmod 700 $backup_dir
 +
 +    # Backup.
 +    influxd backup -portable -database $db -host localhost:8088 $backup_dir/$db
 +
 +    # Prune.
 +    find $backup_dir/$db -type f -mtime +2 -delete
 +fi
 </code> </code>
  
Ligne 227: Ligne 266:
 ==== Log rotate ==== ==== Log rotate ====
  
-<code conf debian/logrotate+<code conf debian/borgmatic
-/var/log/backup.log { +/var/log/borgmatic.log 
-        weekly +
-        rotate 52 +  rotate 6 
-        compress +  weekly 
-        delaycompress +  compress 
-        missingok +  missingok 
-        notifempty +  notifempty
-        create 644 root root+
 } }
 </code> </code>
Ligne 242: Ligne 280:
  
 C'est surtout du ssh. C'est surtout du ssh.
-<code ssh /etc/ssh/authorized_keys/backup>+<code ssh __felicette__/etc/ssh/authorized_keys/backup>
 command="borg serve --restrict-to-path /srv/backups/dns.cluster.chapril.org",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc ssh-ed25519 ... root@dns.cluster.chapril.org command="borg serve --restrict-to-path /srv/backups/dns.cluster.chapril.org",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc ssh-ed25519 ... root@dns.cluster.chapril.org
 command="borg serve --restrict-to-path /srv/backups/admin.cluster.chapril.org",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc ssh-ed25519 ... root@admin.cluster.chapril.org command="borg serve --restrict-to-path /srv/backups/admin.cluster.chapril.org",no-pty,no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc ssh-ed25519 ... root@admin.cluster.chapril.org
Ligne 283: Ligne 321:
  
 Et la conf icinga2 : Et la conf icinga2 :
-<code conf /etc/icinga2/zones.d/global-templates/services/base.conf>+<code conf __admin__/etc/icinga2/zones.d/global-templates/services/backups.conf>
 object CheckCommand "backup" { object CheckCommand "backup" {
  command = [ PluginDir + "/check_backup" ]  command = [ PluginDir + "/check_backup" ]
Ligne 295: Ligne 333:
  
   assign where host.address && !host.vars.external   assign where host.address && !host.vars.external
 +}
 +</code>
 +
 +===== Aspects contrôle d'intégrité =====
 +
 +On contrôle directement chaque nuit sur la machine où les backups sont stockés ([[admin:machines_virtuelles:felicette|Félicette]]).
 +
 +==== Script de contrôle ====
 +
 +<code bash __felicette__/srv/bin/check_backup.sh>
 +#! /bin/bash
 +
 +logger="/var/log/check_backup.log"
 +borg_bin="/usr/bin/borg"
 +backup_dest="/srv/backups/"
 +
 +
 +echo ======================================================================== >> $logger
 +echo "                           New backup check"                 >> $logger
 +echo ======================================================================== >> $logger
 +date >> $logger
 +echo "" >> $logger
 +
 +cd $backup_dest
 +
 +for repository in $(ls -d $backup_dest/*$(hostname -d))
 +do
 +
 +    echo "==  Checking $repository" >> $logger
 +    date         >> $logger
 +    echo ""         >> $logger
 +
 +    $borg_bin check $repository    2>&1 >> $logger
 +    rc=$?
 +    if [[ $rc != 0 ]]; then exit $rc; fi
 +done
 +
 +echo "" >> $logger
 +date >> $logger
 +echo Returned $rc >> $logger
 +echo ========================================================================   >> $logger
 +
 +exit $rc
 +</code>
 +
 +==== Entrée Cron ====
 +
 +<code cron __felicette__/etc/cron.d/check_backup>
 +00 4 * * * root bash /srv/bin/check_backup.sh
 +</code>
 +
 +==== Log rotate ====
 +
 +<code conf __felicette__/etc/logrotate.d/check-backup>
 +/var/log/check_backup.log {
 +        weekly
 +        rotate 52
 +        compress
 +        delaycompress
 +        missingok
 +        notifempty
 +        create 644 backup backup
 +}
 +</code>
 +
 +==== Configuration du monitoring ====
 +
 +On a un script qui parse sur la machine le log de check_backup :
 +<code python __felicette__/usr/local/lib/nagios/plugins/check_check_backup>
 +#!/usr/bin/env python
 +# -*- encoding:utf8 -*-
 +
 +import datetime, os, re, locale
 +
 +today= datetime.datetime.now ()
 +max_backup_delay = datetime.timedelta (1, 7200)
 +
 +def last_backup (log_file):
 +    with open(log_file) as s:
 +        logs_ok = re.findall (r'^([ a-zéûA-Z:,0-9]*)( \(UTC\+0[12]00\))?\nReturned 0\n={30}', s.read (), re.MULTILINE)[-1][0]
 +        print "Last backup check : " + logs_ok
 +        try:
 +            return datetime.datetime.strptime (logs_ok, '%a %b %d %X %Z %Y')
 +        except:
 +            locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8')
 +            return datetime.datetime.strptime (logs_ok, '%A %d %B %Y, %X')
 +
 +try:
 +    last_backup_date= last_backup ("/var/log/check_backup.log")
 +except:
 +    last_backup_date= last_backup ("/var/log/check_backup.log.1")
 +
 +if today - last_backup_date < max_backup_delay:
 +    exit (0)
 +else:
 +    exit (1)
 +</code>
 +
 +Et la conf icinga2 :
 +<code conf __admin__/etc/icinga2/zones.d/global-templates/services/backups.conf>
 +object CheckCommand "check_backup" {
 +    command = [ "/usr/local/lib/nagios/plugins/check_check_backup" ]
 +}
 +</code>
 +<code conf __admin__/etc/icinga2/zones.d/master/galanga/icinga2.conf>
 +/* Backup checks */
 +apply Service "Check Backup " {
 +  import "generic-service"
 +
 +  check_command = "check_backup"
 +  command_endpoint = host.vars.client_endpoint
 +
 +  assign where host.name == "felicette.cluster.chapril.org"
 } }
 </code> </code>
admin/infrastructure/backup.txt · Dernière modification : 2021/01/02 17:53 de fpoulain