{"id":22294791,"url":"https://github.com/tkd-alex/dvpn-node-spawner","last_synced_at":"2025-07-29T01:31:37.575Z","repository":{"id":192013056,"uuid":"684769740","full_name":"Tkd-Alex/dvpn-node-spawner","owner":"Tkd-Alex","description":"Dashboard for manage and spawn dvpn-node","archived":false,"fork":false,"pushed_at":"2024-01-28T11:36:52.000Z","size":956,"stargazers_count":12,"open_issues_count":0,"forks_count":3,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-04-05T05:41:16.324Z","etag":null,"topics":["dashboard","dvpn","dvpn-client","dvpn-dashboard","dvpn-node","dvpn-node-spawner","gui","privacy","proxy","sentinel","v2ray","vpn","vpn-cliet","wireguard"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Tkd-Alex.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-08-29T20:20:53.000Z","updated_at":"2025-03-30T21:29:08.000Z","dependencies_parsed_at":null,"dependency_job_id":"2802625b-eed3-4620-b079-8529294b29bf","html_url":"https://github.com/Tkd-Alex/dvpn-node-spawner","commit_stats":null,"previous_names":["tkd-alex/dvpn-node-spawner"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Tkd-Alex/dvpn-node-spawner","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tkd-Alex%2Fdvpn-node-spawner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tkd-Alex%2Fdvpn-node-spawner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tkd-Alex%2Fdvpn-node-spawner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tkd-Alex%2Fdvpn-node-spawner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tkd-Alex","download_url":"https://codeload.github.com/Tkd-Alex/dvpn-node-spawner/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tkd-Alex%2Fdvpn-node-spawner/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267616555,"owners_count":24116153,"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","status":"online","status_checked_at":"2025-07-28T02:00:09.689Z","response_time":68,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["dashboard","dvpn","dvpn-client","dvpn-dashboard","dvpn-node","dvpn-node-spawner","gui","privacy","proxy","sentinel","v2ray","vpn","vpn-cliet","wireguard"],"created_at":"2024-12-03T17:38:49.080Z","updated_at":"2025-07-29T01:31:37.221Z","avatar_url":"https://github.com/Tkd-Alex.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"## dvpn-node-spawner\nNodeSpawner is a dashboard for manage \u0026 spawn [dvpn-node](https://github.com/sentinel-official/dvpn-node).\n\n\u003ca href=\"https://github.com/Tkd-Alex/dvpn-node-spawner/blob/master/LICENSE\"\u003e\u003cimg alt=\"License\" src=\"https://img.shields.io/github/license/Tkd-Alex/dvpn-node-spawner\"\u003e\u003c/a\u003e\n\u003ca href=\"https://www.python.org/downloads/release/python-310/\"\u003e\u003cimg alt=\"Python3.10\" src=\"https://img.shields.io/badge/built%20for-Python≥3.10-red.svg?style=flat\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Tkd-Alex/dvpn-node-spawner/pulls\"\u003e\u003cimg alt=\"PRsWelcome\" src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Tkd-Alex/dvpn-node-spawner/stargazers\"\u003e\u003cimg alt=\"GitHub Repo stars\" src=\"https://img.shields.io/github/stars/Tkd-Alex/dvpn-node-spawner\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Tkd-Alex/dvpn-node-spawner/forks\"\u003e\u003cimg alt=\"GitHub Repo stars\" src=\"https://img.shields.io/github/forks/Tkd-Alex/dvpn-node-spawner\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Tkd-Alex/dvpn-node-spawner/issues?q=is%3Aissue+is%3Aclosed\"\u003e\u003cimg alt=\"GitHub closed issues\" src=\"https://img.shields.io/github/issues-closed/Tkd-Alex/dvpn-node-spawner\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Tkd-Alex/dvpn-node-spawner\"\u003e\u003cimg alt=\"GitHub last commit\" src=\"https://img.shields.io/github/last-commit/Tkd-Alex/dvpn-node-spawner\"\u003e\u003c/a\u003e\n\nIf you want to support the project consider to delegate your DVPNs to me. 💙\n[sentvaloper10unne9aclcdwfysj6ya5vzh7xwj3xht6jhfxn6](https://www.mintscan.io/sentinel/validators/sentvaloper10unne9aclcdwfysj6ya5vzh7xwj3xht6jhfxn6)\n\n### How to run\n1. Clone the repository\n2. Make sure to have Python gte 3.10 and the virtualenv package installed\n3. Install the python requirements\n```bash\nvirtualenv -p python3 venv\nsource venv/bin/activate\npip install -r requirements.txt\n```\n4. Execute the script: `python main.py`\n5. Create a dashboard settings\n6. Navigate to http://127.0.0.1:3845/servers (default one, or your custom `listen_on` and `listen_port` values) and enjoy the dashboard 🥳\n\n### Systemd service\n1. Create a system unit file `sudo nano /etc/systemd/system/dvpn-node-spawner.service`\n2. Paste the following text\n```conf\n[Unit]\nDescription=dvpn-node-spawner\nAfter=network-online.target\n\n[Service]\nUser=\u003cyour_user\u003e # modify this field with your user\nTimeoutStartSec=2\nWorkingDirectory=/path/of/dvpn-node-spawner\nExecStart=python main.py\nRestart=always\nRestartSec=2\nKillSignal=SIGTERM\n\n[Install]\nWantedBy=multi-user.target\n```\n\n\u003e If you use a virtualenv replace `ExecStart=python main.py` with `ExecStart=/path/of/venv/bin/python main.py`\n\n3. Reload the systemd `sudo systemctl daemon-reload`\n4. Enable auto start `sudo systemctl enable dvpn-node-spawner`\n5. Enable auto start `sudo systemctl start dvpn-node-spawner`\n\n#### Docker\n1. Clone the repository\n2. Build the image\n```bash\ndocker build . -t dvpn-node-spawner\n```\n3. Run the container:\n```bash\ndocker run --name node-spawner -d \\\n    -v $(pwd)/instance:/usr/src/app/instance \\\n    -p 8080:3845 \\\n    dvpn-node-spawner\n```\n`$(pwd)` Could not work on Windows (cmd), please use the absolute path instead, like: `/path/of/your/instance:/usr/src/app/instance`\n\n4. Navigate to http://127.0.0.1:8080/servers and enjoy the dashboard 🥳\n\n\u003e This binds port 3845 of the container to TCP port 8080 on 127.0.0.1 of the host machine.\n\n### Details\n#### Dashboard settings\nOn the first run the dashboard will ask you to setup some simple settings\n- Listen on, you can leave the default for localhost binding, if you plan to access from another host set to `0.0.0.0` or use the same ip of the host machine\n- Liste port, you can leave the default or choose for a custom one\n- BasicAuth, the prompt will ask if you want to setup a simple authentication with username and password.\n\nYou can change manually all of this settings under the _settings.json_ file (the password is stored as sha256)\n#### SSH Connection\n- If you have a fresh VPS I suggest to perform at least one SSH connection manually before use the dashboard in order to know the RSA key fingerprint.\n- The ssh comunication can be done via password or via private-key auth (not already tested).\n- We need a sudoers permission in order to execute some commands (like docker/requirements install).\n- All the server info (host, username, password, port) are stored locally on a sqlite database.\n#### Requirements\n- **Docker**\n- **curl**, used for contact some ipinfo website and download .sh scripts\n- **tmux**, used for handle non-deamon container / especially useful when the keywring is setup as 'file' and we need to submit a wallet password\n- **openssl**, used for create SSL certificate that will be used to serve on https the /status page\n- **jq**, used for parsing the output of ipinfo website\n- **git**, used for clone the dvpn-node repo and build the image\n- **acl**, used for give the right permission to node-folder\n\nAll the bash scripting for install the requirements are developed for Ubuntu. If you plan to install docker or the requirements with the dashboard on ArchLinux / Centos or other disto please edit all the _apt_ reference with you os package manager like _pacman_ or _yum_.\n#### Management\nThe dashboard was developed on free time and it may not be perfect;\n- After some actions like start/restart stop and so on the page must be refreshed.\n- The logs are not live but will be refreshed each time you click on \"Node logs\" tab\n- Most of the default configuration are take from [Trinity dVPN Guides](https://trinityvalidator.com/docs/sentinelguides/node/node-config), like `gigabyte_prices` and `hourly_prices` values. The default configuration is stored on [handlers/Config.py](handlers/Config.py) file and in case of update by [dvpn-node](https://github.com/sentinel-official/dvpn-node), the file could need updates.\n- Configuration like udp port / tcp port / moniker are generated randomly.\n- With the dashboard you can pull the latest image from [official dvpn-node image](https://github.com/sentinel-official/dvpn-node/pkgs/container/dvpn-node). For **arm64** will be pulled a [un-official image](https://hub.docker.com/r/7f0a206d04a2/sentinel-dvpn-node).\nBtw, if you have already built by your self the image, the dashboard will handle only images that ends with `dvpn-node` or `dvpn-node:latest`. Images like: `sentine-dvpn-node` are also valid.\n#### Keyring\nIn order to handle the keyring will be use the [Sentinel CLI client](https://github.com/sentinel-official/cli-client).\nBased on your OS, the script will automatically download the client from [sentinel-official/cli-client release v0.3.2](https://github.com/sentinel-official/cli-client/releases/tag/v0.3.2). The client will work on /tmp folder, once the wallet is created / recovered the files will be uploaded on the server and the /tmp folder will be deleted.\n#### Know bugs / Not tested / Future improvements\n- The ssh authentication via private key was not tested\n- The keyring with backend as 'file' could have some issue linked to the password input. For example if you restart a container trougth the dashboard, probably the node will never start because is waiting for a input.\n- Currently, if you save a node configuration, the container must be manually restarted (can be done via dashboard) - We could evaluate an auto restart.\n- The [firewall](https://trinityvalidator.com/docs/sentinelguides/node/node-config#enable-firewall-ports) part is currently not managed, I found a lot of VPS/Hosting services without the ufw package or firwall rules - so, for the moment is not managed by the dasbhoard.\n- My skills on frontend side are very limited, forgive me about the simple bootstrap page (btw, dark mode 🌔 and light mode 🌞 are implemented)\n#### Dashboard auth\nAfter a feature request I've implement a basic auth for the dashboard. The credentials can be managed:\n- trought the bootstrap phase\n- by editing the settings.json\n- with the use of \"key\" icon on right-footer\n\n### Screenshot\n![Server list](assets/servers-dark.png)\n![Server info](assets/server-info-dark.png)\n![Node configuration](assets/node-config-dark.png)\n![Node status](assets/node-status-dark.png)\n![Node logs](assets/node-logs-dark.png)\n![Node health](assets/node-health-dark.png)\n![Node onchain](assets/node-onchain-dark.png)\n![Node stats](assets/node-stats-dark.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftkd-alex%2Fdvpn-node-spawner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftkd-alex%2Fdvpn-node-spawner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftkd-alex%2Fdvpn-node-spawner/lists"}