{"id":15649948,"url":"https://github.com/book/dumbbackup","last_synced_at":"2025-03-30T00:13:43.737Z","repository":{"id":24258133,"uuid":"27651874","full_name":"book/dumbbackup","owner":"book","description":"Backup using rsync, but generate the command line using Perl","archived":false,"fork":false,"pushed_at":"2022-02-17T08:31:22.000Z","size":80,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-05T01:45:23.558Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Perl","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/book.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-12-06T22:52:07.000Z","updated_at":"2022-01-23T01:50:13.000Z","dependencies_parsed_at":"2022-09-10T06:21:46.841Z","dependency_job_id":null,"html_url":"https://github.com/book/dumbbackup","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/book%2Fdumbbackup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/book%2Fdumbbackup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/book%2Fdumbbackup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/book%2Fdumbbackup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/book","download_url":"https://codeload.github.com/book/dumbbackup/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246258871,"owners_count":20748573,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-03T12:32:38.690Z","updated_at":"2025-03-30T00:13:43.717Z","avatar_url":"https://github.com/book.png","language":"Perl","funding_links":[],"categories":[],"sub_categories":[],"readme":"# `dumbbackup`\n\n\u003e I'd rather have dumb backups now, than perfect backups too late.\n\nAfter I gave up on [BackupPC](https://backuppc.github.io/backuppc/)\n(version 3), I was left without a backup strategy. For a while, I\nfantasized about building my own backup system, which was getting more\nfeatures as I thought about it, but very little in terms of\nimplementation. It's easy to solve problems when you never write the\ncode that actually does it...\n\nNot having any backups, I wasn't feeling very safe about my data.\n\nSo I decided to go with a very simple strategy: back everything up with\n`rsync` *now* on my remote server (and later, NAS) so nothing horribly\ncatastrophic and unrecoverable would happen to my data. Worst case, I\ncould restore files by copying them back from the archives.\n\n# Installation\n\nJust copy the `dumbbackup` file, e.g. in `/usr/local/bin`, and make it\nexecutable:\n\n    sudo curl --silent --create-dirs \\\n        --output /usr/local/bin/dumbbackup \\\n        https://raw.githubusercontent.com/book/dumbbackup/master/dumbbackup\n    sudo chmod a+x /usr/local/bin/dumbbackup\n\n# Features\n\n* **Dumb**\n\n  Backups are made by `rsync`-ing a tree to a backup location. This is\n  the ~dumbest~ simplest backup scheme ever.\n\n* **Some data deduplication**\n\n  `dumbbackup` is not [bup](https://bup.github.io/).\n\n  The only data deduplication it offers is by hard-linking identicals\n  versions of the same file. That means each backup directory is a full\n  backup, and having multiple backups of the same version of the same\n  file means they all refer to the same location.\n\n* **Full backups, done in an differential way**\n\n  Each backup directory contains a full backup.\n\n  Thanks to hardlinks, multiple copies of the same file acrosse multiple\n  backups only use the space once.\n\n  Thanks to `rsync`, the data transfered for backing up an unmodified\n  file is minimal.\n\n* **Remote backups**\n\n  The versatility of `dumbbackup` comes from `rsync`:\n\n  \u003e It can copy locally, to/from another host over any remote shell, or\n  \u003e to/from a remote rsync daemon.\n\n* **A single script, all-included**\n\n  Although the logic of `dumbbackup` is now split over multiple modules,\n  you only have one script to download and install to use it.\n\n* **Few dependencies**\n\n  You need to have `perl` and `rsync` installed. You may also use `nice`\n  and `ionice`, if available.\n\n# History\n\n* October 2013\n\n  The first version was a shell script that would generate and execute\n  an `rsync` command similar to this:\n\n      rsync -aH --partial --log-file=/backup/2022-01-18.log --exclude=* / /backup/2013-10-24\n\n* January 2014\n\n  The script grew slowly, acquiring more and more options, until it\n  became silly to keep doing it in shell. So I eventually rewrote\n  it in Perl.\n\n* January 2022\n\n  Again, the script ended up doing many things and became unwieldy, so I\n  split it into several subcommands started by the same frontend.\n\n  This made it easier to separate the concerns and requirements between\n  the `backup` and `cleanup` command.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbook%2Fdumbbackup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbook%2Fdumbbackup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbook%2Fdumbbackup/lists"}