Added systemd services for backups

This commit is contained in:
2025-06-13 12:16:29 +02:00
parent 004f1092f6
commit 2ab58a1a4e
17 changed files with 176 additions and 30 deletions

View File

@@ -1,14 +0,0 @@
[Unit]
Description=Backup Home Assistant
After=network.target
[Service]
ExecStart=/home/willem/.bun/bin/bun /home/willem/repos/homeAutomation/home-server/homeassistant-backup/homeassistant-backup/index.ts
WorkingDirectory=/home/willem/repos/homeAutomation/home-server/homeassistant-backup/homeassistant-backup
Restart=on-failure
User=willem
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target

View File

@@ -1,15 +0,0 @@
import { $ } from "bun";
import moment from "moment";
import logger from "pino";
const log = logger();
const timestamp = moment().format("YYYY-MM-DD_hh-mm-ss"); // Return today's date time
log.info('Creating new copy')
// Sync new copy
await $`rsync -a /etc/homeassistant /mnt/usb/backup_homeassistant_${timestamp}`;
log.info('Only keep last 3 copies')
// Only keep last 3 copies
await $`cd /mnt/usb && ls | grep homeassistant | tail -n +4 | xargs rm -rf`;

View File

@@ -0,0 +1,86 @@
import { $ } from "bun";
import moment from "moment";
import logger from "pino";
import { parseArgs } from "util";
const { values } = parseArgs({
args: Bun.argv,
options: {
mode: {
type: "string",
required: true,
},
sourceFolder: {
type: "string",
required: true,
},
targetFolder: {
type: "string",
required: true,
},
backupName: {
type: "string",
required: true,
},
},
strict: true,
allowPositionals: true,
});
const log = logger();
switch (values.mode) {
case "hot":
await hotCopy(
values.sourceFolder!,
values.targetFolder!,
values.backupName!,
);
break;
case "cold":
await coldCopy(
values.sourceFolder!,
values.targetFolder!,
values.backupName!,
);
break;
}
// 3 cold copies are stored
async function hotCopy(
sourceFolder: string,
targetFolder: string,
backupName: string,
) {
const timestamp = moment().format("YYYY-MM-DD_HH-mm-ss"); // Return today's date time
log.info("Creating new copy");
await $`mkdir -p ${targetFolder}`;
// Sync new copy
await $`rsync -a ${sourceFolder} ${targetFolder}/backup_${backupName}_${timestamp}`;
log.info("Only keep last 3 copies");
// Only keep last 3 copies
await $`cd ${targetFolder} && ls | grep ${backupName} | sort -r | tail -n +4 | xargs rm -rf`;
}
// Only 1 cold copy is retained
async function coldCopy(
sourceFolder: string,
targetFolder: string,
backupName: string,
) {
const timestamp = moment().format("YYYY-MM-DD_HH-mm-ss"); // Return today's date time
log.info("Creating new copy");
// find latest backup
const sourceFolderToBackup =
await $`cd ${sourceFolder} && ls | grep ${backupName} | sort | tail -n 1`.text().then(resp => resp.replace('\n',''));
log.info(`Folder to back up: ${sourceFolderToBackup}`);
await $`mkdir -p ${targetFolder}`;
await $`zip -r ${targetFolder}/${backupName}_${timestamp}.zip ${sourceFolder}/${sourceFolderToBackup}`;
log.info("Only keep last copy");
// Only keep last copy
await $`cd ${targetFolder} && ls | grep ${backupName} | sort -r | tail -n +2 | xargs rm -rf`;
}

View File

@@ -0,0 +1,14 @@
[Unit]
Description=Backup Home Assistant - Cold
After=network.target
[Service]
ExecStart=homeassistant-backup --mode cold --sourceFolder /mnt/usb/homeassistant/hot --targetFolder /mnt/usb/homeassistant/cold --backupName homeassistant
WorkingDirectory=/etc/homeassistant
Restart=off
User=willem
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,11 @@
[Unit]
Description=Run Home assistant cold backup Service every day
[Timer]
OnBootSec=1min
OnUnitActiveSec=1day
Persistent=true
[Install]
WantedBy=timers.target

View File

@@ -0,0 +1,14 @@
[Unit]
Description=Backup Home Assistant - Hot
After=network.target
[Service]
ExecStart=homeassistant-backup --mode hot --sourceFolder /etc/homeassistant --targetFolder /mnt/usb/homeassistant/hot --backupName homeassistant
WorkingDirectory=/etc/homeassistant
Restart=off
User=willem
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target

View File

@@ -1,5 +1,5 @@
[Unit]
Description=Run Home assistant backup Service every hour
Description=Run Home assistant hot backup Service every hour
[Timer]
OnBootSec=1min

View File

@@ -0,0 +1,14 @@
[Unit]
Description=Pull zettelkasten
After=network.target
[Service]
ExecStart=git pull
WorkingDirectory=/home/willem/repos/zettelkasten
Restart=no
User=willem
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,11 @@
[Unit]
Description=Pull zettelkasten every hour
[Timer]
OnBootSec=1min
OnUnitActiveSec=1min
Persistent=true
[Install]
WantedBy=timers.target

View File

@@ -0,0 +1,14 @@
[Unit]
Description=Send todo mail
After=network.target
[Service]
ExecStart=sh -c "rg '\- \[ \]' . | mail -s todos willemserruys@proton.me"
WorkingDirectory=/home/willem/repos/zettelkasten
Restart=no
User=willem
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,11 @@
[Unit]
Description=Send ToDo mail
[Timer]
OnBootSec=1min
OnUnitActiveSec=5min
Persistent=true
[Install]
WantedBy=timers.target