parent
2e7d4aa52b
commit
b40a1f4fee
6 changed files with 185 additions and 37 deletions
15
.woodpecker/build.yml
Normal file
15
.woodpecker/build.yml
Normal file
|
@ -0,0 +1,15 @@
|
|||
when:
|
||||
- event: push
|
||||
branch: main
|
||||
|
||||
steps:
|
||||
- name: "PKGBUILD"
|
||||
image: git.hydrar.de/jmarya/pacco-build:latest
|
||||
commands:
|
||||
- pacman -Syu --noconfirm
|
||||
- buildpkg navos x86_64 pac.hydrar.de "$TOKEN" "$KEY"
|
||||
environment:
|
||||
TOKEN:
|
||||
from_secret: pacco_token
|
||||
KEY:
|
||||
from_secret: sign_key
|
41
PKGBUILD
Normal file
41
PKGBUILD
Normal file
|
@ -0,0 +1,41 @@
|
|||
# Maintainer: JMARyA <jmarya@hydrar.de>
|
||||
pkgname=bk
|
||||
pkgver=2025.01.07_2e7d4aa
|
||||
pkgrel=1
|
||||
pkgdesc="backup utility"
|
||||
arch=('x86_64')
|
||||
url="https://git.hydrar.de/jmarya/bk"
|
||||
license=("MIT")
|
||||
depends=("borg" "rsync")
|
||||
makedepends=("rustup" "git")
|
||||
source=("${pkgname}::git+https://git.hydrar.de/jmarya/bk.git")
|
||||
sha256sums=("SKIP")
|
||||
|
||||
pkgver() {
|
||||
cd "$srcdir/$pkgname"
|
||||
echo "$(date +%Y.%m.%d)_$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "$srcdir/$pkgname"
|
||||
rustup default nightly
|
||||
cargo fetch
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "$srcdir/$pkgname"
|
||||
cargo build --release
|
||||
}
|
||||
|
||||
check() {
|
||||
cd "$srcdir/$pkgname"
|
||||
cargo test --release
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$srcdir/$pkgname"
|
||||
install -Dm755 "target/release/bk" "$pkgdir/usr/bin/bk"
|
||||
install -Dm644 "src/systemd/bk.service" "/usr/lib/systemd/system/bk.service"
|
||||
install -Dm644 "src/systemd/bk.timer" "/usr/lib/systemd/system/bk.timer"
|
||||
install -Dm644 "config.toml" "/etc/bk.toml"
|
||||
}
|
68
config.toml
68
config.toml
|
@ -1,91 +1,91 @@
|
|||
# Run a script before backup
|
||||
start_script = "before.sh"
|
||||
# start_script = "before.sh"
|
||||
|
||||
# Run a script after backup
|
||||
end_script = "after.sh"
|
||||
# end_script = "after.sh"
|
||||
|
||||
# Rsync Operation
|
||||
[[rsync]]
|
||||
# [[rsync]]
|
||||
# Directories SHOULD have trailing `/`
|
||||
src = "/home/me/"
|
||||
dest = "/backup/home/me/"
|
||||
# src = "/home/me/"
|
||||
# dest = "/backup/home/me/"
|
||||
|
||||
# Excludes
|
||||
exclude = [".cache", ".local"]
|
||||
# exclude = [".cache", ".local"]
|
||||
|
||||
# Delete entries not present in `src` from `destination`
|
||||
delete = true
|
||||
# delete = true
|
||||
|
||||
# Ensure this directory exists and it not empty before running rsync
|
||||
ensure_exists = "/home"
|
||||
# ensure_exists = "/home"
|
||||
|
||||
# Make a CephFS snapshot before rsync
|
||||
cephfs_snap = true
|
||||
# cephfs_snap = true
|
||||
|
||||
# Borg Operation
|
||||
[[borg]]
|
||||
# [[borg]]
|
||||
# Repo to backup to
|
||||
repo = "/backup/repo.borg"
|
||||
# repo = "/backup/repo.borg"
|
||||
|
||||
# Passphrase
|
||||
passphrase = "pass"
|
||||
# passphrase = "pass"
|
||||
|
||||
# Source Directories
|
||||
src = [ "/home/me/.config" ]
|
||||
# src = [ "/home/me/.config" ]
|
||||
|
||||
# Excludes
|
||||
exclude = [
|
||||
"some/dir"
|
||||
]
|
||||
# exclude = [
|
||||
# "some/dir"
|
||||
# ]
|
||||
|
||||
# Exclude if present (example: Do not backup directories with `.nobackup`)
|
||||
exclude_if_present = [".nobackup"]
|
||||
# exclude_if_present = [".nobackup"]
|
||||
|
||||
# Stay in one filesystem
|
||||
one_file_system = true
|
||||
# one_file_system = true
|
||||
|
||||
# Backup change time
|
||||
ctime = false
|
||||
# ctime = false
|
||||
|
||||
# Do not backup ACLs
|
||||
no_acls = true
|
||||
# no_acls = true
|
||||
|
||||
# Do not backup extended attributes
|
||||
no_xattrs = true
|
||||
# no_xattrs = true
|
||||
|
||||
# Comment to add to the backup
|
||||
comment = "Backup of /home/me/"
|
||||
# comment = "Backup of /home/me/"
|
||||
|
||||
# Compression
|
||||
compression = "zstd,10"
|
||||
# compression = "zstd,10"
|
||||
|
||||
# Ensure directory exists before backup
|
||||
ensure_exists = "/home/me"
|
||||
# ensure_exists = "/home/me"
|
||||
|
||||
# Make a CephFS snapshot before backup
|
||||
cephfs_snap = true
|
||||
# cephfs_snap = true
|
||||
|
||||
# Borg Check Operation
|
||||
[[borg_check]]
|
||||
# [[borg_check]]
|
||||
# Repository to check
|
||||
repo = "/backup/repo.borg"
|
||||
# repo = "/backup/repo.borg"
|
||||
|
||||
# Full Data Verify
|
||||
verify_data = true
|
||||
# verify_data = true
|
||||
|
||||
# Repair Attempt
|
||||
repair = false
|
||||
# repair = false
|
||||
|
||||
# Borg Prune Operation
|
||||
[[borg_prune]]
|
||||
# [[borg_prune]]
|
||||
# Repository to prune
|
||||
repo = "/backup/repo.borg"
|
||||
# repo = "/backup/repo.borg"
|
||||
|
||||
# Passphrase
|
||||
passphrase = "pass"
|
||||
# passphrase = "pass"
|
||||
|
||||
keep_within = "30d"
|
||||
keep_last = 20
|
||||
# keep_within = "30d"
|
||||
# keep_last = 20
|
||||
# keep_secondly = 3
|
||||
# keep_minutely = 3
|
||||
# keep_hourly = 10
|
||||
|
|
|
@ -1,64 +1,138 @@
|
|||
use serde::Deserialize;
|
||||
|
||||
/// Configuration structure for the backup system.
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct Config {
|
||||
/// Run a script before backup
|
||||
/// Optional script to run before starting the backup process.
|
||||
pub start_script: Option<String>,
|
||||
|
||||
// Run a script after backup
|
||||
/// Optional script to run after completing the backup process.
|
||||
pub end_script: Option<String>,
|
||||
|
||||
/// Configuration for rsync jobs.
|
||||
pub rsync: Option<Vec<RsyncConfig>>,
|
||||
|
||||
/// Configuration for Borg backup jobs.
|
||||
pub borg: Option<Vec<BorgConfig>>,
|
||||
|
||||
/// Configuration for Borg check jobs to verify repository integrity.
|
||||
pub borg_check: Option<Vec<BorgCheckConfig>>,
|
||||
|
||||
/// Configuration for Borg prune jobs to manage repository snapshots.
|
||||
pub borg_prune: Option<Vec<BorgPruneConfig>>,
|
||||
}
|
||||
|
||||
/// Configuration for an individual rsync job.
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct RsyncConfig {
|
||||
/// Source path for rsync.
|
||||
pub src: String,
|
||||
|
||||
/// Destination path for rsync.
|
||||
pub dest: String,
|
||||
|
||||
/// List of patterns to exclude from synchronization.
|
||||
pub exclude: Option<Vec<String>>,
|
||||
|
||||
/// Whether to delete files at the destination that are not in the source.
|
||||
pub delete: Option<bool>,
|
||||
|
||||
/// Ensure a specific directory exists before running the rsync job.
|
||||
pub ensure_exists: Option<String>,
|
||||
|
||||
/// Create CephFS snapshot before the rsync job.
|
||||
pub cephfs_snap: Option<bool>,
|
||||
}
|
||||
|
||||
/// Configuration for an individual Borg backup job.
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct BorgConfig {
|
||||
/// Borg repository path.
|
||||
pub repo: String,
|
||||
|
||||
/// Optional passphrase for the repository.
|
||||
pub passphrase: Option<String>,
|
||||
|
||||
/// List of source paths to include in the backup.
|
||||
pub src: Vec<String>,
|
||||
|
||||
/// List of patterns to exclude from the backup.
|
||||
pub exclude: Option<Vec<String>>,
|
||||
|
||||
/// List of marker files; directories containing these will be excluded.
|
||||
pub exclude_if_present: Option<Vec<String>>,
|
||||
|
||||
/// Whether to limit the backup to a single filesystem.
|
||||
pub one_file_system: Option<bool>,
|
||||
|
||||
/// Whether to backup ctime
|
||||
pub ctime: Option<bool>,
|
||||
|
||||
/// Disable backup of ACLs (Access Control Lists).
|
||||
pub no_acls: Option<bool>,
|
||||
|
||||
/// Disable backup of extended attributes.
|
||||
pub no_xattrs: Option<bool>,
|
||||
|
||||
/// Optional comment to associate with the backup.
|
||||
pub comment: Option<String>,
|
||||
|
||||
/// Compression mode to use for the backup.
|
||||
pub compression: Option<String>,
|
||||
|
||||
/// Ensure a specific directory exists before running the backup.
|
||||
pub ensure_exists: Option<String>,
|
||||
pub cephfs_snap: Option<bool>,
|
||||
|
||||
/// Create CephFS snapshots before the backup.
|
||||
pub cephfs_snap: Option<bool>
|
||||
}
|
||||
|
||||
/// Configuration for a Borg repository integrity check job.
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct BorgCheckConfig {
|
||||
/// Borg repository path.
|
||||
pub repo: String,
|
||||
|
||||
/// Whether to verify the repository's data integrity.
|
||||
pub verify_data: Option<bool>,
|
||||
|
||||
/// Whether to attempt repairs on detected issues.
|
||||
pub repair: Option<bool>,
|
||||
}
|
||||
|
||||
/// Configuration for a Borg repository pruning job.
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct BorgPruneConfig {
|
||||
/// Borg repository path.
|
||||
pub repo: String,
|
||||
|
||||
/// Passphrase for accessing the repository.
|
||||
pub passphrase: String,
|
||||
|
||||
/// Retain all archives within this time period.
|
||||
pub keep_within: String,
|
||||
|
||||
/// Retain the last `n` archives.
|
||||
pub keep_last: Option<u32>,
|
||||
|
||||
/// Retain the last `n` secondly archives.
|
||||
pub keep_secondly: Option<u32>,
|
||||
|
||||
/// Retain the last `n` minutely archives.
|
||||
pub keep_minutely: Option<u32>,
|
||||
|
||||
/// Retain the last `n` hourly archives.
|
||||
pub keep_hourly: Option<u32>,
|
||||
|
||||
/// Retain the last `n` daily archives.
|
||||
pub keep_daily: Option<u32>,
|
||||
|
||||
/// Retain the last `n` weekly archives.
|
||||
pub keep_weekly: Option<u32>,
|
||||
|
||||
/// Retain the last `n` monthly archives.
|
||||
pub keep_monthly: Option<u32>,
|
||||
|
||||
/// Retain the last `n` yearly archives.
|
||||
pub keep_yearly: Option<u32>,
|
||||
}
|
||||
|
|
9
src/systemd/bk.service
Normal file
9
src/systemd/bk.service
Normal file
|
@ -0,0 +1,9 @@
|
|||
[Unit]
|
||||
Description=Backup
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/usr/bin/bk /etc/bk.toml
|
||||
User=root
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
9
src/systemd/bk.timer
Normal file
9
src/systemd/bk.timer
Normal file
|
@ -0,0 +1,9 @@
|
|||
[Unit]
|
||||
Description=Scheduled backup
|
||||
|
||||
[Timer]
|
||||
OnCalendar=daily
|
||||
Persistent=true
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
Loading…
Add table
Reference in a new issue