From d3f5ab1ee8af0f4f5f13d58e3bc2a183f0d17588 Mon Sep 17 00:00:00 2001 From: Gregory Ballantine Date: Thu, 3 Sep 2026 13:34:29 -0400 Subject: [PATCH] Updated the README --- README.md | 73 +++++++++++++++++++++++++++++++++++++++++++++++---- goblin-store | Bin 37620444 -> 37620444 bytes 2 files changed, 68 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 89cc0c4..4192a3e 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,82 @@ # Goblin Store -Incremental backup tool using rclone. +Incremental backup tool using rsync and rclone. ## Usage -To backup a directory, simply run it like so: +Goblin store provides two options to backup a directory - **cloud** and **local**. + +### Local Backups + +Local backups use rsync as the backend, as it provides better control over local file permissions and can utilize hardlinks to provide a "more complete" snapshot of the source directory on a given day. ```shell -./goblin-store backup -s -d +./goblin-store backup local -s -d ``` -Breaking down the above: +This will provide the following directory structure: + +```shell +DESTINATION_DIRECTORY/ +├── 2026-09-03_13-14-07/ <- Baseline backup +│ ├── dir1/ <- Real directory +│ │ └── data.bin <- Original file (inode: 1001) +│ ├── dir2/ +│ └── file1.txt <- Original file (inode: 1002) +│ +└── 2026-09-04_00-00-00/ <- Next snapshot (hardlinked against previous) + ├── dir1/ <- Real directory (recreated) + │ └── data.bin <- Unchanged: hard link to previous run (inode: 1001, 0 bytes used) + ├── dir2/ + ├── file1.txt <- Unchanged: hard link to previous run (inode: 1002, 0 bytes used) + └── file2.txt <- New file copied from source (inode: 1003) +``` + +Breaking down the above command: * `./goblin-store` - running the app binary -* `backup` - call the **backup** command +* `backup` - run the **backup** command +* `local` - run the **local** subcommand +* `-s ` - the directory you'd wish to backup (REQUIRED) +* `-d ` - the directory you'd wish to store the backups in (REQUIRED) + +You may modify the behavior with these additional flags: + +* `-v` - enable verbose console logging + +### Cloud Backups + +**Note:** Cloud backends are currently not integrated into the app, but they can be used currently if you prefer the latest/incrementals directory structure on local disk. + +Cloud backups utilize rclone as the backend for file copies, as it provides better support for cloud backends (S3, etc) and multi-threading support. + +```shell +./goblin-store backup cloud -s -d +``` + +This will provide the following directory structure: + +```shell +DESTINATION_DIRECTORY/ +├── 2026-09-03_13-14-07/ <- Baseline backup +│ ├── dir1/ <- Real directory +│ │ └── data.bin <- Original file (inode: 1001) +│ ├── dir2/ +│ └── file1.txt <- Original file (inode: 1002) +│ +└── 2026-09-04_00-00-00/ <- Next snapshot (hardlinked against previous) + ├── dir1/ <- Real directory (recreated) + │ └── data.bin <- Unchanged: hard link to previous run (inode: 1001, 0 bytes used) + ├── dir2/ + ├── file1.txt <- Unchanged: hard link to previous run (inode: 1002, 0 bytes used) + └── file2.txt <- New file copied from source (inode: 1003) +``` + +Breaking down the above command: + +* `./goblin-store` - running the app binary +* `backup` - run the **backup** command +* `cloud` - run the **cloud** subcommand * `-s ` - the directory you'd wish to backup (REQUIRED) * `-d ` - the directory you'd wish to store the backups in (REQUIRED) diff --git a/goblin-store b/goblin-store index 738c4347253c84fc3bab37398651dfabde3cade7..cfffb929131d90a3157905d995f1b7821a1ef531 100755 GIT binary patch delta 2923 zcmb`{`F{^|9Ki8?=f2IAbM9l9?fc#LyTetDkvW=#lClfKww&9jm{dYpt%ypZ`ykzS zBb8j~K6M`|p+g}>uU9|y2lT`1`FKA*kH_cp)93Tqzv_6*e%eylXi@sG5rd|uPnud% zI=nDBbNGZ{?!1D8f~>q?Zhq;kwDgR@Ws|~1V~UE)5{e6pOTr~N2pG3LisahE*Kmxo*bVZRXr*ysu@+Ip`*q|?Fg+tnLRFR;F5Kbp4(3> zE+26uHY%ZTT5fVUVadTpOAj^*P&8Ge>QsYjQZ1@Yb*L`Yqx#f<8j^b(Qw%ksrqqm@ zQwutST2d=&O>L+xwWC;SPaUWub)wGHg}PEV>P|fP_*~hY~1}f)t`83R8rV zDTPugjrvkQ>Q4h`Ae~8P(b<$vgJ>{i&=49*=g=_9q~SDzM$#xcm$GOyokwHnd>TvR zXgpm&7t#c}h$hm-bO}wOY|5cr%Aa z=t+8to~CE$S$dA1rx)l&dWouND{Z5fX*<0_uhMI@gI=edw2OAr9@q=qUY8f6y^HPABM3I!S-g-*k#jui))hkVH#0sV+67rqq(!Qb+1aJ*h7Zq@nzK zRAZ+YX(COfnKYLcfhvB5z`kQKp^YTKu;mJ9PRl94o3}klf@!z$aP=0bS z5=>2+k`&HQ4TqA`QiAy@iOG>Esj2G+#I+2>)(8drM#2@@%+N|&OB-n`?Ic#(O9$yF zouspLk*?BBx=RmzfGDL>TIWkN#Ww?xxkuplol`I)8=gAm3U&hKf87~*eg)%`dl8JJ$Tq2VsTXG~< z@+4m-%M_U^1u{*h%M2-$A}N+jWv0xM*)m7w$~-BNQYn-9vOq4A%jF7LD2t?A7R!~g zM6Qyn#5ga;w}Xx63-YL)OckvOzY=U2?bFBlpUEa=$zv56VOGuxyge@`!AaN98ejT%M38 z4q>XUK%Xj4&xg`;u@jvqU(BsaZi z*6_TU;et8YBZ`yK^JWYi9L~#oLw+Fsko@PG^I2$c2>#AL51mg^K1vq;PTk$lV(TuG+C}`L-?b z2l}6CyEUn3`qZ?Pq(z4sEIrg9K(SPXs!}zoPBo||)uP%|hw4&2s!#51NO9DN8dDQ$ zO3mmDYECVvCAFf~)P~}zEw!We)PXuuC+bXHs4I1&1nN#bs3#>-FG`|h3Q~x|ltQVL zM(LD6nbe#5P+#gtXHtJUiw4j@8bpIBi_WGYG?a$Xa5{%Z&`26Z=TbK1P%e$8^C*wT z&{!Hr<7on&PZQ|^nnaUn3Port<rSp?OqF z^JxKHLYLBIbU9r?SJFZ%qpRp@T13~-Vp>8==~}vuuBT;m1Kmi=shn2ON~)k$bQ7(n zo9Pz1m2RWk=?=P+?xMSC4c$Zc(tUJ4JwOlAL-a5`LXXm8w3gPPTIwC-vpu zqZ&HJNh4`2O{A$b3smwe1a_T>OAZAy6APkg!Q@~hH5`g&R_?6PJTSa{xBsq1!>Q9E zp_Gi&XfzZIr%X%Fh!jLZslnv@Xk<;lgywcru3JyWPl8m zK{8mfUPvva*U;hJeIM6{#xKq`K6Qno>(@OC6~z^`yQu zkcJW`jij+Ok*3m2&XDHPLRv~IX)SFeUfN1KX)hh5qjZwa(nY#TH%XB0(nESmqV$p^ gNtU35BrGYCDru4~8ImczrH}NDtt_kP7dvsmKXa$6?f?J)