]> git.somenet.org - root/pub/somesible.git/blob - roles/base/backup/files/default/backup.sh
[rules/base/backup] setup backups
[root/pub/somesible.git] / roles / base / backup / files / default / backup.sh
1 #!/bin/bash
2 ################################################
3 ### Managed by someone's ansible provisioner ###
4 ################################################
5 # Part of: https://git.somenet.org/root/pub/somesible.git
6 # 2017-2026 by someone <someone@somenet.org>
7 #
8
9 umask 0077
10 cd /tmp
11 export ERRCODE=0
12
13 export BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK="yes"
14 export BORG_RELOCATED_REPO_ACCESS_IS_OK="yes"
15
16 function backup {
17     export BKPREPO=${1} # backup repo (should be: "/bkp/storage-local/$host/$path" or for ssh: "user@server:$path")
18     export BKPHOST=${2} # src-host
19     export BKPPATH=${3} # abs-path on src-host
20     export BKPKEEP=${4} # pruning-settings
21     export BORG_PASSPHRASE=${5} # borg key passphrase
22
23     BKPPATH_ESCAPED=$(echo -n "$BKPPATH"|sed -e 's#/#-#g') # contains first "/"
24
25     if [[ -z "$BORG_PASSPHRASE" ]]; then
26         borg info "$BKPREPO" >/dev/null 2>&1 || borg init --umask 0077 -e none --make-parent-dirs "$BKPREPO"
27     else
28         borg info "$BKPREPO" >/dev/null 2>&1 || borg init --umask 0077 -e repokey-blake2 --make-parent-dirs "$BKPREPO"
29     fi
30
31     echo "# Merged on: $(date -Isec)" > "/bkp/local/exclude.conf.d/.merged.$BKPHOST-$BKPPATH_ESCAPED"
32     for file in /bkp/local/exclude.conf.d/$BKPHOST-$BKPPATH_ESCAPED*; do
33         echo -e "\n\n# $file" >> "/bkp/local/exclude.conf.d/.merged.$BKPHOST-$BKPPATH_ESCAPED"
34         cat "$file" >> "/bkp/local/exclude.conf.d/.merged.$BKPHOST-$BKPPATH_ESCAPED"
35     done
36
37     borg create --umask 0077 --info --list --stats --noctime --nobirthtime --exclude-caches --exclude-from "/bkp/local/exclude.conf.d/.merged.$BKPHOST-$BKPPATH_ESCAPED" "$BKPREPO::$BKPHOST-$BKPPATH_ESCAPED--{now}" "$BKPPATH"
38         exit_status=$?;
39         if [ $exit_status -ne 0 ]; then
40             export ERRCODE="$exit_status";
41             echo "** backup.sh (backup:create): non-zero exitcode: $exit_status"
42         fi
43
44     backup_prune "$BKPREPO" "$BKPKEEP" "$BORG_PASSPHRASE"
45 }
46
47 function backup2 {
48     export BKPREPO=${1} # backup repo (should be: "/bkp/storage-local/$host/$path" or for ssh: "user@server:$path")
49     export BKPHOST=${2} # src-host
50     export BKPPATH=${3} # abs-path on src-host
51     export BKPKEEP=${4} # pruning-settings
52     export BORG_PASSPHRASE=${5} # borg key passphrase
53
54     BKPPATH_ESCAPED=$(echo -n "$BKPPATH"|sed -e 's#/#-#g') # contains first "/"
55
56     if [[ -z "$BORG_PASSPHRASE" ]]; then
57         borg2 repo-info --repo "$BKPREPO" >/dev/null 2>&1 || borg2 repo-create --umask 0077 -e none --repo "$BKPREPO"
58     else
59         borg2 repo-info --repo "$BKPREPO" >/dev/null 2>&1 || borg2 repo-create --umask 0077 -e repokey-blake2-chacha20-poly1305 --repo "$BKPREPO"
60     fi
61
62     echo "# Merged on: $(date -Isec)" > "/bkp/local/exclude.conf.d/.merged.$BKPHOST-$BKPPATH_ESCAPED"
63     for file in /bkp/local/exclude.conf.d/$BKPHOST-$BKPPATH_ESCAPED*; do
64         echo -e "\n\n# $file" >> "/bkp/local/exclude.conf.d/.merged.$BKPHOST-$BKPPATH_ESCAPED"
65         cat "$file" >> "/bkp/local/exclude.conf.d/.merged.$BKPHOST-$BKPPATH_ESCAPED"
66     done
67
68     echo "** backup.sh(backup2:create) ********************************************************************************************************************************"
69     borg2 create --umask 0077 --info --list --stats --nobirthtime --compression zstd --exclude-caches --exclude-from "/bkp/local/exclude.conf.d/.merged.$BKPHOST-$BKPPATH_ESCAPED" --repo "$BKPREPO" "$BKPHOST-$BKPPATH_ESCAPED" "$BKPPATH"
70         exit_status=$?;
71         if [ $exit_status -ne 0 ]; then
72             export ERRCODE="$exit_status";
73             echo "** backup.sh (backup2:create): non-zero exitcode: $exit_status"
74         fi
75
76     backup_prune2 "$BKPREPO" "$BKPKEEP" "$BORG_PASSPHRASE"
77 }
78
79 function backup_cmd {
80     export BKPREPO=${1} # backup repo (should be: "/bkp/storage-local/$host/$path" or for ssh: "user@server:$path")
81     export BKPNAME=${2} # backup name
82     export BKPCMD=${3}  # command to run
83     export BKPKEEP=${4} # pruning-settings
84     export BORG_PASSPHRASE=${5} # borg key passphrase
85
86     if [[ -z "$BORG_PASSPHRASE" ]]; then
87         borg info "$BKPREPO" >/dev/null 2>&1 || borg init --umask 0077 -e none --make-parent-dirs "$BKPREPO"
88     else
89         borg info "$BKPREPO" >/dev/null 2>&1 || borg init --umask 0077 -e repokey-blake2 --make-parent-dirs "$BKPREPO"
90     fi
91
92     borg create --umask 0077 --info --stats --noctime --nobirthtime --compression zstd --files-cache disabled --content-from-command -- "$BKPREPO::$BKPNAME--{now}" $BKPCMD
93         exit_status=$?;
94         if [ $exit_status -ne 0 ]; then
95             export ERRCODE="$exit_status";
96             echo "** backup.sh (backup_cmd:create): non-zero exitcode: $exit_status"
97         fi
98
99     backup_prune "$BKPREPO" "$BKPKEEP" "$BORG_PASSPHRASE"
100 }
101
102 function backup_cmd2 {
103     export BKPREPO=${1} # backup repo (should be: "/bkp/storage-local/$host/$path" or for ssh: "user@server:$path")
104     export BKPNAME=${2} # backup name
105     export BKPCMD=${3}  # command to run
106     export BKPKEEP=${4} # pruning-settings
107     export BORG_PASSPHRASE=${5} # borg key passphrase
108
109     if [[ -z "$BORG_PASSPHRASE" ]]; then
110         borg2 repo-info --repo "$BKPREPO" >/dev/null 2>&1 || borg2 repo-create --umask 0077 -e none --repo "$BKPREPO"
111     else
112         borg2 repo-info --repo "$BKPREPO" >/dev/null 2>&1 || borg2 repo-create --umask 0077 -e repokey-blake2-chacha20-poly1305 --repo "$BKPREPO"
113     fi
114
115     echo "** backup.sh(backup_cmd2:create) ********************************************************************************************************************************"
116     borg2 create --umask 0077 --info --stats --nobirthtime --compression zstd --files-cache disabled --content-from-command --repo "$BKPREPO" "$BKPNAME--{now}" -- $BKPCMD
117         exit_status=$?;
118         if [ $exit_status -ne 0 ]; then
119             export ERRCODE="$exit_status";
120             echo "** backup.sh (backup_cmd2:create): non-zero exitcode: $exit_status"
121         fi
122
123     backup_prune2 "$BKPREPO" "$BKPKEEP" "$BORG_PASSPHRASE"
124 }
125
126 function backup_prune {
127     export BKPREPO=${1} # backup repo (should be: "/bkp/storage-local/$host/$path" or for ssh: "user@server:$path")
128     export BKPKEEP=${2} # pruning-settings
129     export BORG_PASSPHRASE=${3} # borg key passphrase
130
131     if [[ -z "$BKPKEEP" ]]; then
132         echo "** backup.sh(backup_prune): No prune settings, skipping"
133     else
134         borg prune --umask 0077 --list --stats --save-space --keep-last 1 $BKPKEEP "$BKPREPO"
135             exit_status=$?;
136             if [ $exit_status -ne 0 ]; then
137                 export ERRCODE="$exit_status";
138                 echo "** backup.sh (backup_prune:prune): non-zero exitcode: $exit_status"
139             fi
140        borg compact -v --cleanup-commits "$BKPREPO"
141             exit_status=$?;
142             if [ $exit_status -ne 0 ]; then
143                 export ERRCODE="$exit_status";
144                 echo "** backup.sh (backup_prune:compact): non-zero exitcode: $exit_status"
145             fi
146     fi
147 }
148
149 function backup_prune2 {
150     export BKPREPO=${1} # backup repo (should be: "/bkp/storage-local/$host/$path" or for ssh: "user@server:$path")
151     export BKPKEEP=${2} # pruning-settings
152     export BORG_PASSPHRASE=${3} # borg key passphrase
153
154     if [[ -z "$BKPKEEP" ]]; then
155         echo "** backup.sh(backup_prune2): No prune settings, skipping"
156     else
157         echo "** backup.sh(backup_prune2:prune) ********************************************************************************************************************************"
158         time borg2 prune --umask 0077 --list --keep-last 1 $BKPKEEP --repo "$BKPREPO"
159             exit_status=$?;
160             if [ $exit_status -ne 0 ]; then
161                 export ERRCODE="$exit_status";
162                 echo "** backup.sh (backup_prune2:prune): non-zero exitcode: $exit_status"
163             fi
164         echo "** backup.sh(backup_prune2:compact) ********************************************************************************************************************************"
165         time borg2 compact --umask 0077 --stats -v --repo "$BKPREPO"
166             exit_status=$?;
167             if [ $exit_status -ne 0 ]; then
168                 export ERRCODE="$exit_status";
169                 echo "** backup.sh (backup_prune2:compact): non-zero exitcode: $exit_status"
170             fi
171     fi
172 }
173
174 # run managed
175 echo "** backup.sh: running /bkp/local/backup.conf.managed"
176 source /bkp/local/backup.conf.managed
177
178 # run local additions
179 if [ -e "/bkp/local/backup.conf.local" ]; then
180     echo "** backup.sh: running /bkp/local/backup.conf.local"
181     source /bkp/local/backup.conf.local
182 fi
183
184 echo "** backup.sh: DONE"
185
186 unset BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK
187 unset BORG_RELOCATED_REPO_ACCESS_IS_OK
188
189 exit $ERRCODE