Send XMR to launch a public Monero node for the world.
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lza_menace 492b7ddf2a adding new api route to use dynamic nginx upstreams 2 years ago
app adding new api route to use dynamic nginx upstreams 2 years ago
bin Improve logging and setup error notifications via webhook (#1) 3 years ago
docs initial commit 3 years ago
.gitignore initial commit 3 years ago adding license 3 years ago
Makefile initial commit 3 years ago specify networks for different make opts 3 years ago
crontab.txt initial commit 3 years ago
docker-compose.yaml initial commit 3 years ago
env-example Improve logging and setup error notifications via webhook (#1) 3 years ago
requirements.txt initial commit 3 years ago


This is a web service that allows anonymous visitors to fund the launch of public Monero nodes onto Digital Ocean's compute infrastructure. The service will autonomously organize, execute, and track launches and payouts for the operators and participants (moneronauts?).

Send XMR to host a named Monero node for the world to see and use. New nodes can provision on the fly and bootstrap their configurations and Monero blockchain; comes with operational dashboards w/ metrics.

Pricing fluctuates and is determined by the market price of XMR and the amount of hours the server was running (since last payout). Payouts are run every few hours and come out of each launches' wallet account balance.

Technical Details

This is a Python app (Flask) which relies on relational and key-value data stores; PostgreSQL and Redis today. It uses docker-compose for both development and production. For development use the flask web server (flask run) and for production use gunicorn and nginx. Run the Monero wallets as a direct CLI invocation docker run to run the latest Monero release from a Docker container image (lalanza808/monero:latest). Run 2 containers in succession; an init (to generate and show seeds) and RPC (to maintain open RPC port).

Most of this is simplified with helper scripts BASH scripts (./bin/*) invoked via make.

Most of the user facing pages use Redis cache as an intermediary so as to not overwhelm the wallet RPC service; direct API calls go in app.library.x.y (where x is the thing, coingecko, monero, digitalocean, etc, y is function/method name) and cached versions go in app.library.cache.y (where y is the function/method name).



Use the provided Makefile to provision stuff; pass prod or dev depending on your environment.

  • Run cp env-example .env && vim .env to create a secrets file for the app and containers. Be sure to edit it's contents with the proper secrets.
  • Run make dev-up to stand up development infrastructure (pg, redis, stagenet rpc wallet).
  • Run make dev to run the development web server.
  • Run make prod-up to stand up production infrastructure (pg, redis, mainnet rpc wallet).
  • Run make prod to run production web server.
  • Run make init to apply base database schemas.


All secrets are passed to the application as environment variables which are loaded from .env in the root directory. The file references env vars or uses a default; docker-compose and the app consume secrets from .env.

Monero Node Initialization

Nodes are configured using a user data/cloud-init script in the docker-monero-node repo.

User data is defined in app.library.digitalocean.create_droplet method.

Digital Ocean Backend

Digital Ocean configuration can be found here: Digital Ocean


You can host this service on any provider, it just needs to have a Digital Ocean account and token to operate correctly.

Background Tasks

Currently tasks are handled by the OS via crontab of the user running the web service. Use the provided crontab.txt file to set it: sudo -u monero crontab ~/xmrcannon/crontab.txt (assumes you've cloned to ~/xmrcannon)

The tasks right now are for 1. launching new nodes that have received funding (launch_funded_operations) and 2. performing payouts (process_payouts).