Integrate restic backup system
parent
c38bda8dfd
commit
a6e4beefb3
|
@ -0,0 +1,12 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
data_dir='/mnt/data1/lander'
|
||||||
|
snapshot_dir="${data_dir}.snapshot"
|
||||||
|
|
||||||
|
# Read-only snapshot for atomic backup
|
||||||
|
btrfs subvolume snapshot -r "$data_dir" "$snapshot_dir" || exit $?
|
||||||
|
|
||||||
|
restic backup "$snapshot_dir"
|
||||||
|
|
||||||
|
# Always remove snapshot subvolume, even if restic fails
|
||||||
|
btrfs subvolume delete "$snapshot_dir"
|
|
@ -23,7 +23,12 @@
|
||||||
system: true
|
system: true
|
||||||
create_home: false
|
create_home: false
|
||||||
|
|
||||||
- name: Ensure data directory is present
|
# Only one BTRFS file system should be mounted, so this will match that one
|
||||||
|
- name: Ensure data subvolume is present
|
||||||
|
community.general.btrfs_subvolume:
|
||||||
|
name: '/lander'
|
||||||
|
|
||||||
|
- name: Ensure data subvolume permissions are correct
|
||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
path: '/mnt/data1/lander'
|
path: '/mnt/data1/lander'
|
||||||
state: directory
|
state: directory
|
||||||
|
@ -48,6 +53,14 @@
|
||||||
mode: '0644'
|
mode: '0644'
|
||||||
notify: lander-restart
|
notify: lander-restart
|
||||||
|
|
||||||
|
- name: Ensure backup script is present
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: 'lander.backup.sh'
|
||||||
|
dest: '/etc/backups/lander.backup.sh'
|
||||||
|
owner: 'root'
|
||||||
|
group: 'root'
|
||||||
|
mode: '0644'
|
||||||
|
|
||||||
- name: Ensure service file is present
|
- name: Ensure service file is present
|
||||||
ansible.builtin.copy:
|
ansible.builtin.copy:
|
||||||
src: 'lander.service'
|
src: 'lander.service'
|
||||||
|
|
|
@ -40,7 +40,11 @@
|
||||||
system: true
|
system: true
|
||||||
create_home: false
|
create_home: false
|
||||||
|
|
||||||
- name: Ensure data directory is present
|
- name: Ensure data subvolume is present
|
||||||
|
community.general.btrfs_subvolume:
|
||||||
|
name: '/restic-rest'
|
||||||
|
|
||||||
|
- name: Ensure data subvolume permissions are correct
|
||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
path: '/mnt/data1/restic-rest'
|
path: '/mnt/data1/restic-rest'
|
||||||
state: directory
|
state: directory
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
$ANSIBLE_VAULT;1.1;AES256
|
||||||
|
33666438313237356564363136333933633035303531653464643766373434623834663736386463
|
||||||
|
3464643731366237633334616536613864396162353264360a316130333032316437393333396466
|
||||||
|
34356638393834316235633062646330336438376135346666663064303831666632353834663465
|
||||||
|
6636663930356138640a323433613263393939303833616637336436366630386133386338613736
|
||||||
|
34353433643539306238663638656539373731616238656635353561356632366332623532396465
|
||||||
|
3936373534643966616131616161633234663430633233653435
|
|
@ -25,3 +25,32 @@
|
||||||
group: 'root'
|
group: 'root'
|
||||||
mode: '0755'
|
mode: '0755'
|
||||||
when: 'res.changed'
|
when: 'res.changed'
|
||||||
|
|
||||||
|
- name: Ensure backup scripts directory is present
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: '/etc/backups'
|
||||||
|
state: directory
|
||||||
|
mode: '0755'
|
||||||
|
|
||||||
|
- name: Ensure Restic backups password file is present
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: 'restic_backups_passwd'
|
||||||
|
dest: '/etc/backups/restic_backups_passwd'
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '0600'
|
||||||
|
|
||||||
|
- name: Ensure backup-all script is present
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: "backup-all.sh.j2"
|
||||||
|
dest: '/etc/backups/backup-all.sh'
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '0644'
|
||||||
|
|
||||||
|
- name: Ensure backup cronjob is enabled
|
||||||
|
ansible.builtin.cron:
|
||||||
|
name: 'Perform nightly backups'
|
||||||
|
minute: '0'
|
||||||
|
hour: '2'
|
||||||
|
job: 'bash /etc/backups/backup-all.sh'
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# This script sequentially executes all shell scripts matching
|
||||||
|
# /etc/backups/*.backup.sh, with environment variables configured to publish
|
||||||
|
# backups to the local Restic REST server.
|
||||||
|
|
||||||
|
# Get passed along to subcalls to bash
|
||||||
|
export RESTIC_REPOSITORY='rest:http://{{ groups['nas'][0] }}:8000/backups'
|
||||||
|
export RESTIC_PASSWORD_FILE='/etc/backups/restic_backups_passwd'
|
||||||
|
|
||||||
|
for script in $(find /etc/backups -name '*.backup.sh'); do
|
||||||
|
bash "$script"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Prune older backups
|
||||||
|
restic forget --keep-last 7 && \
|
||||||
|
restic prune
|
Loading…
Reference in New Issue