{ "info": { "author": "Felix Meyer-Wolters", "author_email": "felix@meyerwolters.de", "bugtrack_url": null, "classifiers": [], "description": "# Very Hungry Pi\n\"slideshow\"\n\n## News\n\n### Version 2 (beta) released.\n\nI'm happy to announce Version 2 (beta) of *vhpi*.\nIt's an entire rewrite. There is a `vhpi` package now on [pypi](https://pypi.python.org/pypi/vhpi) and a simple command line interface to run *vhpi* more conveniently. There are some minor breaking Changes in the config. The most important thing to notice, if you upgrade from v1 to v2, is that the snapshot directories have a new naming convention. `monthly.1` would now be `2017-10-11__02:07:03__monthly.1`. The timestamp tells you when the backup was finished. If you want to use your current snapshots with v2, you should adjust their names accordingly. See [CHANGELOG.md](https://github.com/feluxe/very_hungry_pi/blob/2.0/CHANGELOG.md) for more changes.\n\n## Contents\n* [Description](#description)\n* [Features](#features)\n* [Requirements](#requirements)\n* [Example Config](#example_config)\n* [Installation & Configuration](#install)\n\n## Description\nWith **vhpi** you can turn your Raspberry Pi into a silent backup module for your Network.\n*Vhpi* creates [incremental](https://en.wikipedia.org/wiki/Incremental_backup) [snapshot](https://github.com/feluxe/very_hungry_pi/wiki/Snapshots-explanation) backups of available network shares (e.g. [NFS](https://en.wikipedia.org/wiki/Network_File_System), [Samba](https://en.wikipedia.org/wiki/Samba_(software))) silently and automated with a minimum of disk space required.\n*Vhpi* runs entirely on 'server-side'; clients only need to share/export backup sources with the Pi and let the Pi run the backups in the background. \n*Vhpi* uses battle proven tools like [rsync](https://en.wikipedia.org/wiki/Rsync) to create the backups and [cp](https://en.wikipedia.org/wiki/Cp_(Unix)) to create hardlinks for the snapshots. \nTo get the most control over the backups *vhpi* takes raw [rsync options](http://linux.die.net/man/1/rsync) for configuration.\n*Vhpi* writes two log files: one for a short overview of the entire process ([info.log exmpl.](vhpi/examples/info.log)) and one for debugging ([debug.log exmpl.](vhpi/examples/debug.log)).\n\n\n**TL;DR:** Just setup *vhpi*, run your Pi 24/7 and don't care about backups no more.\n
\n\n## Features\n\n* *Vhpi* works with any rsync command you like. This gives you a wide and well documented variety of configuration options for your backup.\n* You can create multiple *exclude-lists* to exclude files/dirs from the backup. (See 'exclude_lib' in [Example Config](#example_config))\n* *Vhpi* creates [snapshots](https://github.com/feluxe/very_hungry_pi/wiki/Snapshots-explanation) for any time-interval you like. (e.g. 'hourly', 'daily', 'weekly', 'monthly', 'each-4-hours', 'half-yearly', etc...) Just add the interval name and its duration in seconds to the config. (See 'intervals' in [Example Config](#example_config)).\n* You can set the amount of snapshots that you want keep for each used interval.\n E.g. if you want to keep 3 snapshots for the 'hourly' interval you get three snapshot dirs: `hourly.0`, `hourly.1`, `hourly.2`. Each snapshot reaches an hour further into the past.\n* Snapshots require a minimum of disk space:\n * because the backups are created incrementally. \n * because *vhpi* creates new snapshots as 'hard links' for all files that haven't changed. (No duplicate files.. just links)\n* The process is nicely logged ('info.log', 'debug.log').\n* If a backup process takes long, *vhpi* blocks any attempt to start a new backup process until the first one has finished to prevent the Pi from overloading.\n* More features are planned (See: [Version Overview](https://github.com/feluxe/very_hungry_pi/wiki/Version-Overview-(TODOs)))\n\n## Requirements:\n\n* You need Python >= 3.6 on your Pi for *vhpi* to run. ([How to install Python3.x on your Pi](https://github.com/feluxe/very_hungry_pi/wiki/Install-Python3.X-from-source-on-a-Raspberry-Pi-(Raspbian)))\n* The file system of your Backup destination has to support hard links. (most common fs like NTFS and ext do...)\n\n## Installation & Configuration\n\n\n### Sharing sources with the Pi:\n\nYour Pi needs access to the directories of each client that you want to backup. Just share/export them with `NFS` or `Samba`. Perhaps *vhpi* can create local backups as well.\n\nYou should use `autofs` or similar to automatically mount the shared directories with your Pi whenever they are available. This way your Pi will automatically mount the directories whenever a machine enters the network.\n\nThere is a tutorial on this in the wiki: [How to share sources with your Raspberry Pi using NFS.](https://github.com/feluxe/very_hungry_pi/wiki/How-to-share-sources-with-your-Raspberry-Pi-using-NFS.)\n\n\n### Download and Install:\n\nSimplest way to install *vhpi* is by useing pip. You need Python3.6 for *vhpi* to run. ([How to install Python3.x on your Pi](https://github.com/feluxe/very_hungry_pi/wiki/Install-Python3.X-from-source-on-a-Raspberry-Pi-(Raspbian)))\nAfter you installed Python3.6 you can run pip to install *vhpi* like this:\n```\n$ pip3.6 install vhpi\n```\n\nRun this command to check if *vhpi* was isntalled successfully:\n\n```\n$ vhpi --help\n```\nIt should print the help text to the terminal.\n\n\n### Configure vhpi:\n\nWhen you run *vhpi* for the first time, it creates a config dir at `~/.config/vhpi/`, you'll find a file called `vhpi_cfg.yaml` there. This is where you configure your backups. The config file is pretty self explanatory, just have a look at the [Example Config](#example_config)\n\n\n### Test the configuration \n\nIn order to test *vhpi* I suggest setting up some dummy backup sources that point to some safe destinations. Maybe in the `/tmp` dir or so. Then run the following command a couple of times and see if the destination gets filled with backups/snapshots:\n\n ```\n $ vhpi run\n ```\n \nIf you get an error try to adjust the config. If you think there is a bug feel free to use the [github issue tracker](https://github.com/feluxe/very_hungry_pi/issues)!\nThe results of each run is written to the log-files as well (`~/.config/vhpi/debug.log` and `~/.config/vhpi/info.log`)\n\n### Create a Cronjob\n\nYou can run *vhpi* manually with this command `vhpi run`, but I suggest creating a cronjob that runs *vhpi* automatically every hour. To do so you can add the following line to `/etc/crontab`. (Replace `username` with the username that is supposed to run *vhpi*.)\n\n```\n@hourly username vhpi run\n```\n\nIf want to set the cronjob to something else than *hourly*, you might want to read this: [Choosing an interval for the cornjob.](https://github.com/feluxe/very_hungry_pi/wiki/Choosing-an-interval-for-the-cronjob.)\n\nYou can also add multiple cronjobs that execute *vhpi* in different intervals for different users.\n\nAfter you added the cronjob, you should restart your Pi or restart the crontab like this:\n\n```\n$ /etc/init.d/cron restart\n```\n\nIf this is all done, your Pi should run *vhpi* every hour and you should see some activity in the log files and of cause on your hard drive. Yay! :D\n\n\n\n## Example Config\n\n#### `~/.config/vhpi/vhpi_cfg.yaml`\n\n ```yaml \n# IMPORTANT: If you use paths that contain spaces, make sure to escape them \n# with \\ (backslash). The same counts for escape items.\n\n# Basic App Settings:\napp_cfg:\n # Create different list of files/dirs that you want to exclude from your\n # backups.\n exclude_lib:\n standard_list: [\n lost+found/*,\n .cache/chromium/*,\n .mozilla/firefox/*/Cache,\n .cache/thumbnails/*,\n .local/share/Trash/*\n ]\n another_list: [\n some_dir\n ]\n # Define time intervals, which you may use for your snapshots.\n # Feel free to use your own definitions like 'every_four_hours: 14400' etc.\n # Values must be in Seconds.\n intervals: {\n hourly: 3600,\n six-hourly: 21600,\n daily: 86400,\n weekly: 604800,\n monthly: 2592000,\n yearly: 31536000\n }\n\n# Backup Jobs Config.\n# Configure each backup source here:\njobs:\n # Source 1:\n - name: 'Dummy Source'\n source_ip: '192.168.178.20' # The ip of the computer to which the mounted src dir belongs to. If it's a local source use: \"127.0.0.1\" or \"localhost\".\n rsync_src: '/tmp/tests/dummy_src/src1/' # The path to the mounted or local dir.\n rsync_dst: '/tmp/tests/dummy_dest/dest1/' # The path to the destination dir in which each snapshot is created.\n rsync_options: '-aAHSvX --delete' # The options that you want to use for your rsync backup. Default is \"-av\". More info on rsync: http://linux.die.net/man/1/rsync\n exclude_lists: [ # Add exclude lists to exclude a list of file/folders. See above: app_cfg -> exclude_lib\n standard_list,\n another_list\n ]\n excludes: [ # Add additional source specific exclude files/dirs that are not covered by the exclude lists.\n downloads,\n tmp\n ]\n snapshots: # Define how many snapshots you want to keep for each interval. Older snapshots are deleted automatically.\n hourly: 6\n six-hourly: 4\n daily: 7\n weekly: 4\n monthly: 6\n yearly: 6\n\n # Source 2:\n # - name: 'Another Dummy Source'\n # source_ip: 192.168.178.36\n # etc...'\n ```\n \n", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/feluxe/very_hungry_pi/tarball/2.0.0-beta.14", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/feluxe/very_hungry_pi", "keywords": "raspberry-pi", "license": "AGPLv3", "maintainer": "", "maintainer_email": "", "name": "vhpi", "package_url": "https://pypi.org/project/vhpi/", "platform": "", "project_url": "https://pypi.org/project/vhpi/", "project_urls": { "Download": "https://github.com/feluxe/very_hungry_pi/tarball/2.0.0-beta.14", "Homepage": "https://github.com/feluxe/very_hungry_pi" }, "release_url": "https://pypi.org/project/vhpi/2.0.0b14/", "requires_dist": null, "requires_python": "", "summary": "Turn your Raspberry Pi into an independent backup module for your network. ", "version": "2.0.0b14" }, "last_serial": 4336862, "releases": { "2.0.0b0": [ { "comment_text": "", "digests": { "md5": "cb43edaf1dddd38ac94627fb594e775b", "sha256": "040b97573d2ca62b5806838539f92adde0b25aa84aa27147278330d6506ebcf4" }, "downloads": -1, "filename": "vhpi-2.0.0b0-py3-none-any.whl", "has_sig": false, "md5_digest": "cb43edaf1dddd38ac94627fb594e775b", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 29053, "upload_time": "2017-10-11T23:09:21", "url": "https://files.pythonhosted.org/packages/c1/1f/4086e914e44acffd847f2915e20ec51f8be9fbe0c00de10f12f7a15b5e31/vhpi-2.0.0b0-py3-none-any.whl" } ], "2.0.0b1": [ { "comment_text": "", "digests": { "md5": "cab828bc55ffbaf7cdeb8d0cd295b475", "sha256": "0392bc03f7eed70ea8d6f6b74ed9862efb52fa2033209313002dda01d79e1f00" }, "downloads": -1, "filename": "vhpi-2.0.0b1-py3-none-any.whl", "has_sig": false, "md5_digest": "cab828bc55ffbaf7cdeb8d0cd295b475", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 29141, "upload_time": "2017-10-11T23:24:18", "url": "https://files.pythonhosted.org/packages/33/1c/929e0fc177b3f8743988fd0d4f7722e4d58bd2e256141242f58773370091/vhpi-2.0.0b1-py3-none-any.whl" } ], "2.0.0b10": [ { "comment_text": "", "digests": { "md5": "189673e01a9b77dc72eae496d5f806b1", "sha256": "eb174be120cc5ffca25af09b6d69675166b9a192943b1b39137af1f8f7ce1bfc" }, "downloads": -1, "filename": "vhpi-2.0.0b10-py3-none-any.whl", "has_sig": false, "md5_digest": "189673e01a9b77dc72eae496d5f806b1", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 29800, "upload_time": "2017-10-31T03:57:57", "url": "https://files.pythonhosted.org/packages/67/0c/9aa67be7aaf37fbea74081a7fe93ee9c6c0aabe5a4fdb8dbfe8fddfcd157/vhpi-2.0.0b10-py3-none-any.whl" } ], "2.0.0b11": [ { "comment_text": "", "digests": { "md5": "dc0227ad61a2c98f818de418d9356ae0", "sha256": "f4c0637cbc349fdc37a86c29de814f50935bb110dbffdfae9ac173c4393b7e7b" }, "downloads": -1, "filename": "vhpi-2.0.0b11-py3-none-any.whl", "has_sig": false, "md5_digest": "dc0227ad61a2c98f818de418d9356ae0", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 29800, "upload_time": "2017-10-31T04:00:25", "url": "https://files.pythonhosted.org/packages/d5/74/0c7399580ebd60e4c44e92612d529bf49cdee0981426e058d73c674ff477/vhpi-2.0.0b11-py3-none-any.whl" } ], "2.0.0b12": [ { "comment_text": "", "digests": { "md5": "8979994a20572de801a7f9d767e6c4de", "sha256": "edcc6b1fef9aebfb5c789a6ca4f982da19216159cb2f3e7fb457ec8ad3944a3c" }, "downloads": -1, "filename": "vhpi-2.0.0b12-py3-none-any.whl", "has_sig": false, "md5_digest": "8979994a20572de801a7f9d767e6c4de", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 29786, "upload_time": "2017-10-31T04:02:37", "url": "https://files.pythonhosted.org/packages/85/27/ec8b87cc74050c5cc61129bb87e6a04679d0582d08d490544488937e8685/vhpi-2.0.0b12-py3-none-any.whl" } ], "2.0.0b13": [ { "comment_text": "", "digests": { "md5": "9028aaeec9bcb5508beebca8ce7ded93", "sha256": "0b826409c6e21faa26a64d55371c9f5c1e8e1ba8190bbec2e0ce3c4c00ec006b" }, "downloads": -1, "filename": "vhpi-2.0.0b13-py3-none-any.whl", "has_sig": false, "md5_digest": "9028aaeec9bcb5508beebca8ce7ded93", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 36888, "upload_time": "2018-10-01T17:19:08", "url": "https://files.pythonhosted.org/packages/af/82/9010e6fda8828a00083e33381ee9fdee3d6064f74e8063b17f8031a9fe21/vhpi-2.0.0b13-py3-none-any.whl" } ], "2.0.0b14": [ { "comment_text": "", "digests": { "md5": "41b0d293743d6fb384d8f91e0ad639e1", "sha256": "574c42401534920573f3f5b36bc962c85d72c05935080a93510148eb01e19c90" }, "downloads": -1, "filename": "vhpi-2.0.0b14-py3-none-any.whl", "has_sig": false, "md5_digest": "41b0d293743d6fb384d8f91e0ad639e1", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 36797, "upload_time": "2018-10-03T15:04:35", "url": "https://files.pythonhosted.org/packages/a6/d6/d8b7fcff0af09ee274363bb84a31c7f488fbe7b79e0777395c5bb444ed4a/vhpi-2.0.0b14-py3-none-any.whl" } ], "2.0.0b2": [ { "comment_text": "", "digests": { "md5": "cf5b306a212b3bf8d1539ac221ad4e65", "sha256": "9a5853a32859c3634206e79465833b8095f0648024201bd376d15d66873c7c64" }, "downloads": -1, "filename": "vhpi-2.0.0b2-py3-none-any.whl", "has_sig": false, "md5_digest": "cf5b306a212b3bf8d1539ac221ad4e65", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 29691, "upload_time": "2017-10-12T00:45:52", "url": "https://files.pythonhosted.org/packages/52/5b/a65f0a5b5971ba6145668170e70a2e93e32dc98689d4964b11a26151d17e/vhpi-2.0.0b2-py3-none-any.whl" } ], "2.0.0b4": [ { "comment_text": "", "digests": { "md5": "d573b44709335a08a6c061c14daa0885", "sha256": "9738553a0edd9a3d62a2ed9b439a3108a02a31fe6d182bf4ef3aad4bb122cca8" }, "downloads": -1, "filename": "vhpi-2.0.0b4-py3-none-any.whl", "has_sig": false, "md5_digest": "d573b44709335a08a6c061c14daa0885", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 29723, "upload_time": "2017-10-12T11:42:55", "url": "https://files.pythonhosted.org/packages/fe/15/8558705b82b1847170b228837ed4f8b043eb15ef022bdf7290734b4e8bbb/vhpi-2.0.0b4-py3-none-any.whl" } ], "2.0.0b5": [ { "comment_text": "", "digests": { "md5": "34586bc478ddb4c0ac0069be3722b769", "sha256": "f3fc26e4ee7f5ff7d4a662262b9c6b0527cb01e11147e48e5349423bc005aed3" }, "downloads": -1, "filename": "vhpi-2.0.0b5-py3-none-any.whl", "has_sig": false, "md5_digest": "34586bc478ddb4c0ac0069be3722b769", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 29845, "upload_time": "2017-10-12T12:39:49", "url": "https://files.pythonhosted.org/packages/9a/e1/f1c197aab816017eb7039303213fec70331fae1bf1ac4d11902258344f31/vhpi-2.0.0b5-py3-none-any.whl" } ], "2.0.0b6": [ { "comment_text": "", "digests": { "md5": "3775ff9232831d58c7f4dec494565d10", "sha256": "2b5728a9c59d8179b604fe3773aa262cc5ff48725fd8aa12f92aaf9bc6b413db" }, "downloads": -1, "filename": "vhpi-2.0.0b6-py3-none-any.whl", "has_sig": false, "md5_digest": "3775ff9232831d58c7f4dec494565d10", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 30259, "upload_time": "2017-10-12T23:13:29", "url": "https://files.pythonhosted.org/packages/0f/3a/169bfde09bdb297375ca6548575dda950bd61585a9457ad7e5c048e3eeef/vhpi-2.0.0b6-py3-none-any.whl" } ], "2.0.0b8": [ { "comment_text": "", "digests": { "md5": "c8fc31a830216f95dab2daa4a1b0dc13", "sha256": "f194115af1aedd1f126b88944f96c60e11034a04fb363c7983e284e50b94a0e4" }, "downloads": -1, "filename": "vhpi-2.0.0b8-py3-none-any.whl", "has_sig": false, "md5_digest": "c8fc31a830216f95dab2daa4a1b0dc13", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 29646, "upload_time": "2017-10-20T21:26:31", "url": "https://files.pythonhosted.org/packages/a5/2b/0d609c58dfd9d11ba65f55d60c5b737bf27054f5e1685b3b28280e0d62c5/vhpi-2.0.0b8-py3-none-any.whl" } ], "2.0.0b9": [ { "comment_text": "", "digests": { "md5": "19dc6e739a77048c17f59019e4f78a21", "sha256": "e6dbf1fe81ca373ae2c04f7780deb9d08aad54f85d4dd700df2f41683cf44868" }, "downloads": -1, "filename": "vhpi-2.0.0b9-py3-none-any.whl", "has_sig": false, "md5_digest": "19dc6e739a77048c17f59019e4f78a21", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 29631, "upload_time": "2017-10-20T21:28:37", "url": "https://files.pythonhosted.org/packages/b4/f6/e370f8bef65d5784e4c3c03b38076063566b8c5729d11abf49eb86c5b89f/vhpi-2.0.0b9-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "41b0d293743d6fb384d8f91e0ad639e1", "sha256": "574c42401534920573f3f5b36bc962c85d72c05935080a93510148eb01e19c90" }, "downloads": -1, "filename": "vhpi-2.0.0b14-py3-none-any.whl", "has_sig": false, "md5_digest": "41b0d293743d6fb384d8f91e0ad639e1", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 36797, "upload_time": "2018-10-03T15:04:35", "url": "https://files.pythonhosted.org/packages/a6/d6/d8b7fcff0af09ee274363bb84a31c7f488fbe7b79e0777395c5bb444ed4a/vhpi-2.0.0b14-py3-none-any.whl" } ] }