132 lines
6.7 KiB
Plaintext
Executable File
132 lines
6.7 KiB
Plaintext
Executable File
#!/usr/bin/nu
|
|
|
|
# slug pattern:
|
|
# {thing}-{location}-{kopia|zfs}
|
|
|
|
# TODO:
|
|
# add the rest of the jobs
|
|
# run-all command
|
|
# create checks implementation to use management API to create each one
|
|
|
|
let b2Repo = "/home/jbrechtel/kopia/leonard-brechtel-backup/repository.config"
|
|
let observeURL = "https://observe.roo.lol"
|
|
let secrets = open ~/backups.nuon
|
|
|
|
let jobs = [{ statusSlug: "photos-content-b2-kopia", type: "kopia", source: "/nas1/photos.roo.lol", target: $b2Repo, }
|
|
,{ statusSlug: "photos-service-b2-kopia", type: "kopia", source: "/services/photos.roo.lol", target: $b2Repo, }
|
|
,{ statusSlug: "network-fileshare-b2-kopia", type: "kopia", source: "/nas/files", target: $b2Repo, }
|
|
,{ statusSlug: "vaultwarden-b2-kopia", type: "kopia", source: "/services/passwords.roo.lol", target: $b2Repo, }
|
|
,{ statusSlug: "paperless-b2-kopia", type: "kopia", source: "/services/paperless.roo.lol", target: $b2Repo, }
|
|
,{ statusSlug: "caddy-b2-kopia", type: "kopia", source: "/services/caddy", target: $b2Repo, }
|
|
,{ statusSlug: "kitchen-b2-kopia", type: "kopia", source: "/services/kitchen.roo.lol", target: $b2Repo, }
|
|
,{ statusSlug: "ha-backups-b2-kopia", type: "kopia", source: "/services/ha.roo.lol/config/backups", target: $b2Repo, }
|
|
,{ statusSlug: "zendo-home-azul-zfs", type: "zfs", source: "backups@zendo.brechtel:rpool/home", target: "backups@azul:dune/backups/zendo/home"}
|
|
,{ statusSlug: "zendo-flipstone-azul-zfs", type: "zfs", source:"backups@zendo.brechtel:rpool/work/flipstone", target:"backups@azul:dune/backups/zendo/flipstone" }
|
|
,{ statusSlug: "zendo-root-azul-zfs", type: "zfs", source:"backups@zendo.brechtel:rpool/root", target:"backups@azul:dune/backups/zendo/root" }
|
|
# ,{ statusSlug: "splendor-home-azul-zfs", type: "zfs", source:"backups@splendor.brechtel:zpcachyos/ROOT/cos/home", target:"backups@azul:dune/backups/splendor/home" }
|
|
# ,{ statusSlug: "splendor-root-azul-zfs", type: "zfs", source:"backups@splendor.brechtel:zpcachyos/ROOT/cos/root", target:"backups@azul:dune/backups/splendor/root" }
|
|
,{ statusSlug: "pandemic-services-azul-zfs", type: "zfs", source:"backups@pandemic.brechtel:primary/services", target:"backups@azul:dune/backups/pandemic/services" }
|
|
,{ statusSlug: "photos-content-azul-zfs", type: "zfs", source:"backups@pandemic:nas1/photos.roo.lol", target:"backups@azul:dune/backups/photos.roo.lol" }
|
|
,{ statusSlug: "network-fileshare-azul-zfs", type: "zfs", source:"backups@pandemic:nas1/files", target:"backups@azul:dune/backups/files" }
|
|
,{ statusSlug: "pandemic-maggie-kopia-azul-zfs", type: "zfs", source:"backups@pandemic:nas1/maggie-kopia", target:"backups@azul:dune/backups/maggie-kopia" }
|
|
,{ statusSlug: "pandemic-maggie-azul-zfs", type: "zfs", source:"backups@pandemic:nas1/maggie", target:"backups@azul:dune/backups/files/maggie" }
|
|
]
|
|
|
|
def backup [job] {
|
|
if $job.type == "kopia" {
|
|
kopiaBackup $job
|
|
} else if $job.type == "zfs" {
|
|
zfsBackup $job
|
|
} else {
|
|
print $"Invalid job type: " + $job.type
|
|
}
|
|
}
|
|
|
|
def zfsBackup [job] {
|
|
pingStartJob $job.statusSlug
|
|
try {
|
|
let output = syncoid --no-sync-snap --create-bookmark --no-privilege-elevation --recursive ($job.source) ($job.target) | complete
|
|
logJob { slug: $job.statusSlug, output: $output, success: true }
|
|
pingFinishedJob $job.statusSlug
|
|
} catch { |err|
|
|
logJob { slug: $job.statusSlug, output: $err, success: false }
|
|
pingFailedJob $job.statusSlug $err.debug
|
|
}
|
|
}
|
|
|
|
def kopiaBackup [job] {
|
|
#using sudo is annoying but since this is backing up docker containers
|
|
#the permissions are often wrong. I should be using podman + rootless
|
|
pingStartJob $job.statusSlug
|
|
try {
|
|
let output = sudo kopia --config-file=($job.target) snapshot create ($job.source) | complete
|
|
logJob { slug: $job.statusSlug, output: $output, success: true }
|
|
pingFinishedJob $job.statusSlug
|
|
} catch { |err|
|
|
logJob { slug: $job.statusSlug, output: $err, success: false }
|
|
pingFailedJob $job.statusSlug $err.debug
|
|
}
|
|
}
|
|
|
|
def pingStartJob [slug] {
|
|
print $"starting job: ($slug)"
|
|
print $"($secrets.hcURL)/ping/($secrets.hcPingKey)/($slug)/start"
|
|
curl -s $"($secrets.hcURL)/ping/($secrets.hcPingKey)/($slug)/start" | save -f /dev/null
|
|
}
|
|
|
|
def pingFailedJob [slug, err] {
|
|
print $"failed to run job: ($slug) with error: ($err)"
|
|
curl -s $"($secrets.hcURL)/ping/($secrets.hcPingKey)/($slug)/fail" | save -f /dev/null
|
|
}
|
|
|
|
def pingFinishedJob [slug] {
|
|
print $"finished job: ($slug)"
|
|
curl -s $"($secrets.hcURL)/ping/($secrets.hcPingKey)/($slug)" | save -f /dev/null
|
|
}
|
|
|
|
def logJob [details] {
|
|
http post -u $secrets.observeUser -p $secrets.observePassword $"($secrets.observeURL)/api/default/backups/_json" ($details | to json)
|
|
}
|
|
|
|
def createJob [job] {
|
|
let jobDetails = { name: $job.statusSlug, slug: $job.statusSlug, timeout: 86400 }
|
|
http post --full --headers {"X-API-Key": $secrets.hcAPIKey } --content-type "application/json" $"($secrets.hcURL)/api/v3/checks/" ($jobDetails | to json)
|
|
}
|
|
|
|
def "main log" [msg] {
|
|
logJob { slug: "testing", data: $msg }
|
|
}
|
|
def "main list" [] {
|
|
print "Known jobs:"
|
|
print $"($jobs | get statusSlug | to text)"
|
|
}
|
|
|
|
def "main create-missing" [] {
|
|
let existingSlugs = (curl -H $"X-API-Key: ($secrets.hcAPIKey)" $"($secrets.hcURL)/api/v3/checks/" | from json | get checks.slug | to nuon)
|
|
let missingJobs = $jobs | filter { |job| not ($job.statusSlug in $existingSlugs) }
|
|
$missingJobs | each { createJob $in }
|
|
}
|
|
|
|
def "main run-all" [] {
|
|
$jobs | each { backup $in }
|
|
}
|
|
|
|
def main [statusSlug] {
|
|
let matches = $jobs | where statusSlug == $statusSlug
|
|
if ($matches | length) == 1 {
|
|
backup ($matches | first)
|
|
} else {
|
|
print $"Did not find exactly one match for ($statusSlug)"
|
|
exit 1
|
|
}
|
|
}
|
|
|
|
#sudo kopia --config-file=/home/jbrechtel/kopia/leonard-brechtel-backup/repository.config snapshot create /nas1/photos.roo.lol
|
|
#sudo kopia --config-file=/home/jbrechtel/kopia/leonard-brechtel-backup/repository.config snapshot create /services/photos.roo.lol
|
|
#sudo kopia --config-file=/home/jbrechtel/kopia/leonard-brechtel-backup/repository.config snapshot create /nas/files
|
|
#sudo kopia --config-file=/home/jbrechtel/kopia/leonard-brechtel-backup/repository.config snapshot create /services/passwords.roo.lol
|
|
#sudo kopia --config-file=/home/jbrechtel/kopia/leonard-brechtel-backup/repository.config snapshot create /services/paperless.roo.lol
|
|
#sudo kopia --config-file=/home/jbrechtel/kopia/leonard-brechtel-backup/repository.config snapshot create /services/caddy
|
|
#sudo kopia --config-file=/home/jbrechtel/kopia/leonard-brechtel-backup/repository.config snapshot create /services/kitchen.roo.lol
|
|
#sudo kopia --config-file=/home/jbrechtel/kopia/leonard-brechtel-backup/repository.config snapshot create /services/ha.roo.lol/config/backups
|