{ "info": { "author": "Martin Raag", "author_email": "hi@mraag.xyz", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Internet :: Name Service (DNS)", "Topic :: Utilities" ], "description": "# Nimi - Painless Dynamic DNS with AWS\n\nNimi is yet another self-hosted dynamic DNS solution, built using Python, AWS Route53, Lambda\nand API Gateway.\n\nWhile there are numerous implementations of similar systems available, this project was motivated\nby some of the shortcomings of projects I reviewed:\n\n- The setup process is often manual, which is tedious and error prone.\n- The clients interact directly with the cloud providers API, requiring appropriate credentials\n to be configured on each host.\n\nNimi aims to be easy to setup, manage and destroy - the tool provisions and tears down all the\nrequired AWS infrastructure. The dynamic DNS client does not interact with any AWS API's directly\nand can be deployed on any host with a bit more peace of mind.\n\n[![asciicast](https://asciinema.org/a/KO9RCVwMeQ05c8eCiC615UWpa.svg)](https://asciinema.org/a/KO9RCVwMeQ05c8eCiC615UWpa)\n\n## Installation\n\n```\npip install nimi\n```\n\n## Usage\n\nThe package will install the `nimi` command line tool, which is used to setup the AWS infrastructure\nwith CloudFront, add and remove domains from Route53 and configure dynamic DNS hostnames. This\nrequires valid AWS credentials to be configured.\nThe subcommand `nimi client` is for use on the hosts added to the system and don't require any AWS\ncredentials. Instead, it's configured with values generated during the setup.\n\n### Credentials\n\nThe `nimi` tool does not accept credentials explicitly and expects them to be configured either in\nthe environment or configuration file as described in the\n[AWS CLI documentation](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html).\n\n### Provision infrastructure\n\nIn order to use Nimi, corresponding AWS infrastructure must be provisioned first. This is done\nautomatically using CloudFormation by invoking the following command.\n\n```\nnimi setup\n```\n\n### Add a domain\n\nIf your domain is already configured in Route53, skip this step. Otherwise run the following command\nto create a new hosted zone. Once complete, the output will include a list of name servers, which\nyou will have to configure with your domain registrar.\n\n```\nnimi import \n```\n\n### Add a host\n\nBefore running `nimi client`, the desired hostname has to be configured. Invoking the following\ncommand will add the hostname to the configuration and generate a shared secret, that the client\napplication will use to sign requests sent to the system. The hostname can either be the root domain\nor a subdomain of any domain configured in Route53.\n\n```\nnimi add \n```\n\n### Configure client\n\nThe `nimi client` subcommands do not need or use any AWS credentials. Instead, the\ndeployments API URL, desired hostname and shared secret have to be passed as options to the command\nor set as environment variables. Each configured hostname must be paired with a unique shared\nsecret, while the API URL is common between them all. Invoke the following command to view said\ninformation.\n\n```\nnimi info\n```\n\nMake note of the configured values for the hostname you added. The mapping of values to environment\nvariables and command line options are marked below.\n\n| Value | Environment | Option |\n| ------------- | ------------- | -------- |\n| API URL | NIMI_URL | URL |\n| Hostname | NIMI_HOSTNAME | HOSTNAME |\n| Shared Secret | NIMI_SECRET | SECRET |\n\nSet the required environment variables and run the following command on the host you want to enable\ndynamic DNS for.\n\n```\nnimi client ping\n```\n\nAlternatively pass the values as command line options.\n\n```\nnimi client ping URL HOSTNAME SECRET\n```\n\nThe `ping` command sends a single request to the provisioned backend. The payload includes the\ndesired hostname and its HMAC-SHA256 hash created using the shared secret. The backend will validate\nthe request by comparing the hash and update the corresponding DNS `A` record if the source IP\naddress has changed.\n\n### Running client periodically\n\nThe `ping` command should be run periodically on the host to ensure the DNS records stay up to date.\nThe client currently has no means to setup periodic execution automatically.\nUsers should schedule the command to be executed at a desired interval using tools available on\nthe hosts platform, i.e. [Cron](https://help.ubuntu.com/community/CronHowto) on Linux or\n[launchd](https://www.launchd.info) on Mac OS.\n\n### Cleanup\n\nIf you wish to stop using the system, the `nimi` command line tool includes commands to delete\nanything you configured with it.\n\nRemove a configured hostname, any subsequent pings will have no effect.\n\n```\nnimi remove \n```\n\nRemove a domain from Route53 and all associated hostnames.\n\n```\nnimi eject \n```\n\nCompletely remove provisioned AWS infrastructure. Does not remove any domains from Route53.\n\n```\nnimi destroy\n```\n\n## Cost\n\nFor personal use, the cost of running the system should be neglieble, but not completely free.\nAWS Lambda includes a [geneours free tier](https://aws.amazon.com/lambda/pricing/) with up to\na million requests per month for free and your usage should stay well within those limits.\n\nAPI Gateways free tier is only valid for the first 12 months of the account, but for a small\ndeployment [the pricing](https://aws.amazon.com/api-gateway/pricing/) is reasonable and usually\ncomes to about \\$0.02 per month for a deployment with a couple of hosts pinging every 5 to 10\nminutes.\n\nThe most costly part of the deployment is [Route53](https://aws.amazon.com/route53/pricing/),\nwhich charges \\$0.50 per hosted zone (domain), as well as for DNS queries served, though for a\npersonal deployment the latter should be small enough to not be reflected in the bill.\n\nThere is no reason the system couldn't support other DNS providers that are cheaper or free, if\nyou'd like to extend support feel free to contribute.\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/martinraag/nimi", "keywords": "AWS,DNS,dynamic,Lambda,Route53", "license": "MIT", "maintainer": "Martin Raag", "maintainer_email": "hi@mraag.xyz", "name": "nimi", "package_url": "https://pypi.org/project/nimi/", "platform": "", "project_url": "https://pypi.org/project/nimi/", "project_urls": { "Homepage": "https://github.com/martinraag/nimi", "Repository": "https://github.com/martinraag/nimi" }, "release_url": "https://pypi.org/project/nimi/0.2.0/", "requires_dist": [ "boto3 (>=1.9,<2.0)", "click (>=7.0,<8.0)", "jinja2 (>=2.10,<3.0)", "requests (>=2.22,<3.0)", "terminaltables (>=3.1,<4.0)" ], "requires_python": ">=3.6,<4.0", "summary": "Painless Dynamic DNS with AWS", "version": "0.2.0" }, "last_serial": 5876297, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "8366545418f0c1d465674a12726173ef", "sha256": "761579758c9471552076645fe68aeed69a07fd66eace453fccc29dd74fa4ce49" }, "downloads": -1, "filename": "nimi-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "8366545418f0c1d465674a12726173ef", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 10709, "upload_time": "2019-09-23T17:25:52", "url": "https://files.pythonhosted.org/packages/66/43/cc96e05b90564fabaebecc1fea6f72c0258d0918ef87fb6ce1613e1d025e/nimi-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "18e69f178bced6042e75d391bc8f2098", "sha256": "6c84d1502d26c47b1f89524246cac8b051e6ad88346f501ec1cac3c83b0bcbae" }, "downloads": -1, "filename": "nimi-0.1.0.tar.gz", "has_sig": false, "md5_digest": "18e69f178bced6042e75d391bc8f2098", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 7867, "upload_time": "2019-09-23T17:25:57", "url": "https://files.pythonhosted.org/packages/77/8a/57712a769764a64e6cb6c574cd7dccd931e02720deb928e05cd238def37d/nimi-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "3855e5a9ffd9e420834af26216b85d91", "sha256": "109c8223b006d0bfbf09b55631df936fa03bf5af851287fc996179045a161883" }, "downloads": -1, "filename": "nimi-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "3855e5a9ffd9e420834af26216b85d91", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 13218, "upload_time": "2019-09-23T17:35:22", "url": "https://files.pythonhosted.org/packages/46/82/1a5d02de7695f66ddf83fc36e2009275f76495799b30f5dfbb6766411bb9/nimi-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5af4fc8ae10083ecaf5b5bbb4be89441", "sha256": "885f17c8c4659cb341070297f6c88175dc4ec9bfdd877ecf500fe4b6deea2580" }, "downloads": -1, "filename": "nimi-0.1.1.tar.gz", "has_sig": false, "md5_digest": "5af4fc8ae10083ecaf5b5bbb4be89441", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 13071, "upload_time": "2019-09-23T17:35:24", "url": "https://files.pythonhosted.org/packages/a9/9d/0b0c3165c85c68a63ea1c38501a6244fac463e88fa66092fc61c032e1736/nimi-0.1.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "b5ba847b743a2bdb5f561304a58c1f76", "sha256": "bd4b6f94e96ba1c2de2cf77a51b19afd64849c72e674da1924dbffe2076079dd" }, "downloads": -1, "filename": "nimi-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b5ba847b743a2bdb5f561304a58c1f76", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 13393, "upload_time": "2019-09-23T22:01:16", "url": "https://files.pythonhosted.org/packages/d4/c9/dff20033ecb020d31de872cb9661934a8a47f2ad8bbd3c1ee6e64bcd12c7/nimi-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "09b3548794c01e60785e3bdb590c6f77", "sha256": "1a49da49b064536ccb00d11d1c1d3bfcc373efae2d6103ed92aa9de884c7cd98" }, "downloads": -1, "filename": "nimi-0.2.0.tar.gz", "has_sig": false, "md5_digest": "09b3548794c01e60785e3bdb590c6f77", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 13374, "upload_time": "2019-09-23T22:01:18", "url": "https://files.pythonhosted.org/packages/7d/38/a104bee7c204584cd89b504337093389a1a5fb2fd98c3d82573432b32af9/nimi-0.2.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "b5ba847b743a2bdb5f561304a58c1f76", "sha256": "bd4b6f94e96ba1c2de2cf77a51b19afd64849c72e674da1924dbffe2076079dd" }, "downloads": -1, "filename": "nimi-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b5ba847b743a2bdb5f561304a58c1f76", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 13393, "upload_time": "2019-09-23T22:01:16", "url": "https://files.pythonhosted.org/packages/d4/c9/dff20033ecb020d31de872cb9661934a8a47f2ad8bbd3c1ee6e64bcd12c7/nimi-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "09b3548794c01e60785e3bdb590c6f77", "sha256": "1a49da49b064536ccb00d11d1c1d3bfcc373efae2d6103ed92aa9de884c7cd98" }, "downloads": -1, "filename": "nimi-0.2.0.tar.gz", "has_sig": false, "md5_digest": "09b3548794c01e60785e3bdb590c6f77", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 13374, "upload_time": "2019-09-23T22:01:18", "url": "https://files.pythonhosted.org/packages/7d/38/a104bee7c204584cd89b504337093389a1a5fb2fd98c3d82573432b32af9/nimi-0.2.0.tar.gz" } ] }