Running public seed nodes
New nodes find the network through seed nodes. Run at least three on different providers and continents, and publish them two ways:
- DNS seeds: an A/AAAA record set
seed.<yourdomain>that returns the IPs of all seed nodes. Nodes resolve it on start (-dnsseed, and the compiled-in default list incmd/argonmined/main.goonce you have a domain). - Hardcoded seeds: the same IPs in
defaultSeedsincmd/argonmined/main.goandcmd/argonmine-app/main.go, as a fallback if DNS is blocked.
Option A: Docker (any VPS)
git clone <repo> && cd <repo>
export ARGONMINE_NETWORK=mainnet ARGONMINE_RPC_TOKEN=$(openssl rand -hex 24)
docker compose -f deploy/docker-compose.yml up -d --build
docker compose -f deploy/docker-compose.yml logs -f node
Open TCP 9333 (mainnet) or 19333 (testnet) in the provider firewall. The explorer listens on 8380; put Caddy or nginx with TLS in front of it.
Option B: systemd (bare Linux)
scripts/release.sh # builds release/argonmine-<ver>-linux-amd64.zip
scp release/*linux-amd64.zip host:
ssh host 'unzip argonmine-*.zip && sudo install -m755 argonmined /usr/local/bin/'
sudo useradd -r -m -d /var/lib/argonmine argonmine
sudo install -m644 deploy/argonmined.service /etc/systemd/system/
sudo systemctl enable --now argonmined
Option C: Railway (or Render / Fly)
deploy/railway/ holds a single image that runs the seed node, the explorer and
the website, selected by ARGONMINE_ROLE, plus the service layout, variables
and the CLI commands used for the public testnet deployment. See
deploy/railway/README.md. Platforms that only expose HTTP
cannot be P2P seeds; Railway's TCP proxy covers that. Behind a TCP proxy every
inbound peer arrives from the proxy's address, so run the node with
-behind-proxy (on Railway: ARGONMINE_ARGS=-behind-proxy); otherwise one
misbehaving peer could get the proxy's address banned and three connections
would fill its per-address cap. See Connection limits.
Hosting map (one domain)
| Host | Service | Notes |
|---|---|---|
domain.com |
argonmine-web -app https://app.domain.com -site https://domain.com |
Serves the rendered documentation at /docs and redirects / to the app. There is no landing page or downloads page by decision: the app is the product. |
app.domain.com |
the same argonmine-web instance (requests for this host get the app) |
The browser app: creates a wallet in the browser, mines whole blocks with the WebAssembly miner using templates from the explorer, shows balance and history from the explorer, links to docs, explorer and bridge. Point both hostnames at the one process, or serve the static export's index.html here. |
explorer.domain.com |
argonmine-explorer -listen 0.0.0.0:8380 |
Behind a TLS reverse proxy; one instance per network. Also the work server for browser miners (/api/work): it builds block templates from its node and submits solved blocks, holding no funds. |
bridge.domain.com |
argonmine-bridge -leader |
Guardians on separate hosts and providers; followers expose /guardian/* only to the leader (firewall or mTLS). |
seed.domain.com |
DNS A/AAAA records | List every seed node's IP. |
The public testnet on Railway uses app., explorer. and bridge.
argonmine.com; the bare domain is kept for a landing page, so the app also
serves the docs at /docs. Names, services, ports and DNS records are in
railway/README.md.
Put Caddy or nginx in front of every HTTP service for TLS; none of them terminates TLS themselves.
Checklist per seed
argonminedreachable:nc -vz <ip> 9333from outside.- Behind a TCP proxy or load balancer:
-behind-proxyis set. - Clock synced (chrony/ntpd). A node more than two hours off rejects valid blocks.
- Disk: the chain grows at most ~1 MB per 10 minutes (about 50 GB/year at full blocks).
- Monitor with the RPC
getpeerinfoandgetblockchaininfo; alert if peers drop to 0 or height stalls for 2 hours. - Keep the RPC bound to localhost (the Docker compose file binds it only inside the compose network).