Backup Setup when we don't have root » History » Version 4
Jon Goldberg, 09/07/2021 04:56 PM
| 1 | 1 | Jon Goldberg | # Backup Setup when we don't have root |
|---|---|---|---|
| 2 | |||
| 3 | We normally rely on a modified version `backupninja` for backup, which requires root access. When we don't have root access but we do have `borgbackup`, we have a modified procedure for backing up to rsync.net using borgbackup. |
||
| 4 | |||
| 5 | In the example below, `1234` should be your rsync.net user number, `yourrsyncserver.rsync.net` should be your rsync.net server (e.g. `usw-s008.rsync.net`). `clientname` and `servershortname` can be anything you want as long as they're consistent between `borg init` and the shell script. `server.longname.org` should be the name of the server as Icinga knows it. `/path/to/back/up` should be the path you want to back up. You can have more than one, separated by spaces. |
||
| 6 | |||
| 7 | Run all the following on a local computer that has its public key on the rsync.net server. |
||
| 8 | |||
| 9 | ```shell |
||
| 10 | #!/bin/bash |
||
| 11 | 4 | Jon Goldberg | # This script requires jq. Bail if not found. You can download a static binary from the jq homepage. |
| 12 | if ! command -v ./jq &> /dev/null |
||
| 13 | then |
||
| 14 | echo "jq could not be found. Please install and try again" |
||
| 15 | exit |
||
| 16 | fi |
||
| 17 | |||
| 18 | 1 | Jon Goldberg | # borg backupninja backup script |
| 19 | REPOSITORY="1234@yourrsyncserver.rsync.net:clientname-servershortname" |
||
| 20 | export BORG_PASSPHRASE='StrongPassphrase' |
||
| 21 | # On rsync.net: Specify /usr/local/bin/borg/borg for borg 0.29; /usr/local/bin/borg1 for 1.x |
||
| 22 | REMOTE_PATH=/usr/local/bin/borg1/borg1 |
||
| 23 | |||
| 24 | ICINGA2_API_USER=backupninja |
||
| 25 | ICINGA2_SERVER_ADDRESS=icinga.megaphonetech.com |
||
| 26 | ICINGA2_API_PORT=5665 |
||
| 27 | ICINGA2_API_PASSWORD=<Icinga2 API password> |
||
| 28 | ICINGA2_HOSTNAME=server.longname.org |
||
| 29 | # Set level to 0, "OK", and we'll change it if anything goes wrong. |
||
| 30 | LEVEL=0 |
||
| 31 | # Run the backup. |
||
| 32 | OUTPUT=$( ( |
||
| 33 | 4 | Jon Goldberg | /usr/bin/borg create --warning --filter=AME --stats --compression lz4 \ |
| 34 | 1 | Jon Goldberg | --remote-path $REMOTE_PATH \ |
| 35 | $REPOSITORY::'{hostname}-{now:%Y-%m-%d}' \ |
||
| 36 | /path/to/back/up \ |
||
| 37 | 3 | Jon Goldberg | --exclude '*/templates_c' \ |
| 38 | --exclude '*/Maildir' \ |
||
| 39 | --exclude '.config/borg' \ |
||
| 40 | 1 | Jon Goldberg | --exclude '*/civicrm/upload/cache' |
| 41 | ) 2>&1) |
||
| 42 | if [ $? -ne 0 ] |
||
| 43 | then |
||
| 44 | LEVEL=2 |
||
| 45 | fi |
||
| 46 | # Remove old backups. |
||
| 47 | 3 | Jon Goldberg | OUTPUT=${OUTPUT}\\n$( ( |
| 48 | 1 | Jon Goldberg | /usr/bin/borg prune -v $REPOSITORY --prefix '{hostname}-' --keep-daily=15 --keep-weekly=9 --keep-monthly=6 --remote-path $REMOTE_PATH |
| 49 | ) 2>&1) |
||
| 50 | if [ $? -ne 0 ] |
||
| 51 | then |
||
| 52 | LEVEL=2 |
||
| 53 | fi |
||
| 54 | |||
| 55 | # Check the integrity of the backup. |
||
| 56 | OUTPUT=${OUTPUT}\\n$( ( |
||
| 57 | /usr/bin/borg check $REPOSITORY --remote-path $REMOTE_PATH |
||
| 58 | ) 2>&1) |
||
| 59 | if [ $? -ne 0 ] |
||
| 60 | then |
||
| 61 | 3 | Jon Goldberg | LEVEL=2 |
| 62 | 1 | Jon Goldberg | fi |
| 63 | unset BORG_PASSPHRASE |
||
| 64 | 4 | Jon Goldberg | # Escape JSON characters |
| 65 | echo $OUTPUT |
||
| 66 | OUTPUT=$( echo $OUTPUT | ./jq --raw-input --slurp --ascii-output . ) |
||
| 67 | echo "after jq" |
||
| 68 | echo $OUTPUT |
||
| 69 | 1 | Jon Goldberg | # Send to Icinga |
| 70 | 4 | Jon Goldberg | DATA="{ \"exit_status\": $LEVEL, \"plugin_output\": ${OUTPUT} }" |
| 71 | 1 | Jon Goldberg | /usr/bin/curl -k -s -u $ICINGA2_API_USER:$ICINGA2_API_PASSWORD -H 'Accept: application/json' -X POST "https://$ICINGA2_SERVER_ADDRESS:$ICINGA2_API_PORT/v1/actions/process-check-result?service=${ICINGA2_HOSTNAME}!backupninja" --data "${DATA}" > /dev/null |
| 72 | # Reschedule the next dummy backupninja check |
||
| 73 | RESCHEDULE_TIME=$(/bin/date -d "tomorrow 6am" "+%s") |
||
| 74 | 3 | Jon Goldberg | RESCHEDULE_JSON="{ \"next_check\": \"${RESCHEDULE_TIME}\" }" |
| 75 | /usr/bin/curl -k -s -u $ICINGA2_API_USER:$ICINGA2_API_PASSWORD -H 'Accept: application/json' -X POST "https://$ICINGA2_SERVER_ADDRESS:$ICINGA2_API_PORT/v1/actions/reschedule-check?service=${ICINGA2_HOSTNAME}!backupninja" --data "${RESCHEDULE_JSON}" > /dev/null |
||
| 76 | 1 | Jon Goldberg | ``` |
| 77 | |||
| 78 | 4 | Jon Goldberg | `chmod +x` this file, then add it to the user's `crontab` looking something like this: |
| 79 | ``` |
||
| 80 | 0 2 * * * cd /home/members/example/sites/crm.example.org/users/example/bin && /home/members/example/sites/crm.example.org/users/example/bin/borgbackup.sh |
||
| 81 | ``` |
||
| 82 | |||
| 83 | 1 | Jon Goldberg | Add `vars.has_backupninja = true` to the server's Icinga config and restart Icinga. |