54 lines
1.4 KiB
Bash
54 lines
1.4 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
timestamp=$(date -u +"%Y%m%dT%H%M%SZ")
|
|
workdir="/tmp/backup-${timestamp}"
|
|
stagedir="${workdir}/backup-${timestamp}"
|
|
data_tar="${stagedir}/data.tar.zst"
|
|
db_path="${SQLITE_DB_PATH:-/var/lib/webui/app.db}"
|
|
remote_path="${BACKUP_REMOTE_PATH:-/remote}"
|
|
compression="${BACKUP_COMPRESSION:-zstd}"
|
|
|
|
mkdir -p "${stagedir}"
|
|
|
|
tar --xattrs --acls --numeric-owner -cpf - /data | zstd -19 -o "${data_tar}"
|
|
|
|
sqlite3 "${db_path}" ".backup '${stagedir}/app.db'"
|
|
|
|
data_size=$(stat -c %s "${stagedir}/data.tar.zst")
|
|
data_sha=$(sha256sum "${stagedir}/data.tar.zst" | awk '{print $1}')
|
|
db_size=$(stat -c %s "${stagedir}/app.db")
|
|
db_sha=$(sha256sum "${stagedir}/app.db" | awk '{print $1}')
|
|
|
|
cat > "${stagedir}/manifest.json" <<EOF
|
|
{
|
|
"timestamp": "${timestamp}",
|
|
"data_tar": "data.tar.zst",
|
|
"database": "app.db",
|
|
"sizes": {
|
|
"data_tar": ${data_size},
|
|
"database": ${db_size}
|
|
},
|
|
"sha256": {
|
|
"data_tar": "${data_sha}",
|
|
"database": "${db_sha}"
|
|
}
|
|
}
|
|
EOF
|
|
|
|
cd "${workdir}"
|
|
xorriso -as mkisofs -o "${workdir}/backup-${timestamp}.iso" "backup-${timestamp}"
|
|
|
|
if [ "${compression}" = "gzip" ]; then
|
|
gzip -9 "${workdir}/backup-${timestamp}.iso"
|
|
archive="${workdir}/backup-${timestamp}.iso.gz"
|
|
else
|
|
zstd -19 "${workdir}/backup-${timestamp}.iso"
|
|
archive="${workdir}/backup-${timestamp}.iso.zst"
|
|
fi
|
|
|
|
mkdir -p "${remote_path}"
|
|
mv "${archive}" "${remote_path}/"
|
|
|
|
rm -rf "${workdir}"
|