admin:infrastructure:backup
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| admin:infrastructure:backup [2020/11/28 14:35] – [Entrée Cron] fpoulain | admin:infrastructure:backup [2024/12/29 09:19] (Version actuelle) – [Script de backup] correction d'une typo dans l'URL du remote (suppression ":") pilou | ||
|---|---|---|---|
| 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 ''/ |
| - | logger=" | + | <code yaml /etc/borgmatic.d/root.yaml> |
| - | borg_bin=" | + | location: |
| - | backup_name=`date +%Y-%m-%d` | + | source_directories: |
| - | backup_dest=" | + | - / |
| + | exclude_patterns: | ||
| + | - '/dev' | ||
| + | - '/ | ||
| + | - '/ | ||
| + | | ||
| + | - '/ | ||
| + | - '/ | ||
| + | - '/ | ||
| + | - '/ | ||
| + | - '/ | ||
| + | - '/ | ||
| + | repositories: | ||
| + | - ' | ||
| - | export BORG_RSH=" | + | storage: |
| + | ssh_command: | ||
| + | archive_name_format: | ||
| + | # pour bullseye : borg_cache_directory: | ||
| - | echo ======================================================================== >> $logger | + | consistency: |
| - | echo " | + | |
| - | echo ======================================================================== >> $logger | + | |
| - | date >> | + | |
| - | echo "" | + | |
| - | echo "== Executing package selection: " >> $logger | + | retention: |
| - | date >> | + | |
| - | echo "" | + | |
| - | dpkg --get-selections > / | + | |
| - | echo "== Backup | + | hooks: |
| - | date >> | + | before_backup: |
| - | echo "" | + | - echo "Launching root backup at $(date -Iseconds)" |
| + | - for file in / | ||
| + | | ||
| + | - for file in / | ||
| + | - echo " | ||
| + | - borgmatic info --archive latest --json | ||
| + | on_error: | ||
| + | - echo " | ||
| + | # pour bullseye : | ||
| + | # after_check: | ||
| + | # - echo "Succeeded root checks at $(date -Iseconds)" | ||
| + | # after_prune: | ||
| + | # - echo " | ||
| + | </ | ||
| - | for file in / | + | ==== Entrée Systemd ==== |
| - | echo " | + | |
| - | $file | + | |
| - | done | + | |
| - | echo "== Backup launch" | + | On déclenche avec un timer systemd qui retarde le démarrage avec un timing aléatoire pour éviter le ddos de [[admin: |
| - | date >> | + | |
| - | echo "" | + | |
| - | $borg_bin create --stats $backup_dest:: | + | <code conf /etc/systemd/system/borgmatic.timer> |
| - | --exclude | + | [Unit] |
| - | --exclude | + | Description=Run borgmatic backup |
| - | --exclude | + | |
| - | --exclude / | + | |
| - | --exclude / | + | |
| - | --exclude / | + | |
| - | --exclude '/ | + | |
| - | | + | |
| - | 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" | + | [Install] |
| - | date >> | + | WantedBy=timers.target |
| - | echo "" | + | </code> |
| - | $borg_bin info $backup_dest:: | + | <code conf / |
| + | [Unit] | ||
| + | Description=borgmatic backup | ||
| + | Wants=network-online.target | ||
| + | After=network-online.target | ||
| + | ConditionACPower=true | ||
| - | echo "== Backup pruning" | + | [Service] |
| - | date >> | + | Type=oneshot |
| - | echo "" | + | |
| - | $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" | + | ## Logs |
| - | date >> | + | StandardOutput=syslog |
| - | echo "" | + | StandardError=syslog |
| - | + | SyslogIdentifier=borgmatic | |
| - | for file in / | + | # Prevent rate limiting of borgmatic log events. |
| - | [[ -f " | + | LogRateLimitIntervalSec=0 |
| - | echo " | + | |
| - | $file | + | |
| - | done | + | |
| - | + | ||
| - | echo "" | + | |
| - | date >> | + | |
| - | echo Returned $rc >> | + | |
| - | echo ======================================================================== >> $logger | + | |
| - | + | ||
| - | exit $rc | + | |
| - | </ | + | |
| - | + | ||
| - | ==== Entrée Cron ==== | + | |
| - | <code cron src/ | + | ## Launcher |
| - | 00 2 * * * root bash / | + | # Delay start to prevent backups immediately upon system startup |
| + | ExecStartPre=sleep 30m | ||
| + | ExecStart=borgmatic -v1 | ||
| + | Restart=no | ||
| </ | </ | ||
| Ligne 126: | Ligne 145: | ||
| su - postgres -c " | su - postgres -c " | ||
| done | done | ||
| + | </ | ||
| + | |||
| + | <code bash scripts/ | ||
| + | #!/bin/bash | ||
| + | |||
| + | if test -x / | ||
| + | backup_dir=/ | ||
| + | db=icinga2 | ||
| + | |||
| + | # Prepare. | ||
| + | mkdir -p $backup_dir | ||
| + | chmod 700 $backup_dir | ||
| + | |||
| + | # Backup. | ||
| + | influxd backup -portable -database $db -host localhost: | ||
| + | |||
| + | # Prune. | ||
| + | find $backup_dir/ | ||
| + | fi | ||
| </ | </ | ||
| Ligne 223: | Ligne 261: | ||
| exit 0 | exit 0 | ||
| + | </ | ||
| + | |||
| + | ==== Rsyslog ==== | ||
| + | |||
| + | <code conf / | ||
| + | if $programname == ' | ||
| + | & stop | ||
| </ | </ | ||
| ==== Log rotate ==== | ==== Log rotate ==== | ||
| - | <code conf debian/logrotate> | + | <code conf debian/borgmatic> |
| - | /var/log/backup.log { | + | /var/log/borgmatic.log |
| - | weekly | + | { |
| - | | + | |
| - | | + | |
| - | | + | compress |
| - | | + | missingok |
| - | notifempty | + | notifempty |
| - | create 644 root root | + | |
| } | } | ||
| </ | </ | ||
| Ligne 252: | Ligne 296: | ||
| On a un script qui parse sur chaque machine le log de backup et qui est déployé par le paquet monitoring-plugins-chapril : | On a un script qui parse sur chaque machine le log de backup et qui est déployé par le paquet monitoring-plugins-chapril : | ||
| - | <code python / | + | <code python / |
| - | # | + | # |
| - | # -*- encoding: | + | |
| - | import datetime, os, re, locale | + | import datetime, itertools, os, re |
| - | today= datetime.datetime.now () | + | now = datetime.datetime.now(datetime.timezone.utc) |
| - | max_backup_delay = datetime.timedelta (1, 7200) | + | max_backup_delay = datetime.timedelta(1, |
| - | def last_backup | + | def get_name(match): |
| - | | + | return |
| - | logs_ok = re.findall (r'^([ a-zéûA-Z:, | + | |
| - | print "Last backup : " + logs_ok | + | |
| - | try: | + | |
| - | | + | |
| - | except: | + | |
| - | locale.setlocale(locale.LC_ALL, | + | |
| - | return datetime.datetime.strptime | + | |
| + | def check_backup(filename): | ||
| + | with open(filename) as f: | ||
| + | logs = f.read() | ||
| + | mixed_statuses = list(re.finditer(r' | ||
| + | for name, statuses in itertools.groupby(sorted(mixed_statuses, | ||
| + | last = sorted(statuses, | ||
| + | print(' | ||
| + | last_date = datetime.datetime.fromisoformat(last.group(' | ||
| + | last_status = last.group(' | ||
| + | if last_status != ' | ||
| + | failure.append(name) | ||
| + | |||
| + | failure = [] | ||
| try: | try: | ||
| - | | + | |
| - | except: | + | except |
| - | | + | |
| - | if today - last_backup_date < max_backup_delay: | + | if failure: |
| + | exit (1) | ||
| + | else: | ||
| exit (0) | exit (0) | ||
| - | else: | ||
| - | exit (1) | ||
| </ | </ | ||
| Ligne 285: | Ligne 334: | ||
| <code conf __admin__/ | <code conf __admin__/ | ||
| object CheckCommand " | object CheckCommand " | ||
| - | command = [ PluginDir + "/check_backup" ] | + | command = [ " |
| } | } | ||
| Ligne 297: | Ligne 346: | ||
| } | } | ||
| </ | </ | ||
| - | |||
| ===== Aspects contrôle d' | ===== Aspects contrôle d' | ||
| Ligne 348: | Ligne 396: | ||
| ==== Log rotate ==== | ==== Log rotate ==== | ||
| - | <code conf __icinga2__/ | + | <code conf __felicette__/ |
| / | / | ||
| weekly | weekly | ||
| Ligne 363: | Ligne 411: | ||
| On a un script qui parse sur la machine le log de check_backup : | On a un script qui parse sur la machine le log de check_backup : | ||
| - | <code python | + | <code python |
| # | # | ||
| # -*- encoding: | # -*- encoding: | ||
| Ligne 407: | Ligne 455: | ||
| command_endpoint = host.vars.client_endpoint | command_endpoint = host.vars.client_endpoint | ||
| - | assign where host.name == "icinga2.cluster.chapril.org" | + | assign where host.name == "felicette.cluster.chapril.org" |
| } | } | ||
| </ | </ | ||
admin/infrastructure/backup.1606574117.txt.gz · Dernière modification : 2020/11/28 14:35 de fpoulain
