Gupax in Docker — Monero mining GUI w/ P2Pool + XMRig via browser (noVNC). Optional Tor.
10K+
Docker packaging for Gupax — the GUI that unites P2Pool and XMRig for easy, decentralized Monero mining. Optional built-in 🧅 Tor hidden service for private transaction relay.
Self-contained with noVNC — access the Gupax GUI directly from your web browser. No X11 server or additional setup needed.
| Feature | Description |
|---|---|
| 🌐 Browser Access | noVNC web interface — just open http://localhost:6080 |
| 🖥️ Gupax GUI | Full graphical interface for P2Pool + XMRig mining |
| 🔗 Decentralized mining | P2Pool provides trustless, decentralized Monero mining |
| 💾 Persistent config | Gupax settings persist across container restarts |
| 🔄 Auto-restart | Container restarts automatically on failure |
| 📊 Mining dashboard | Real-time hashrate, shares, payouts, and node status |
| 🔧 XMRig proxy | Built-in proxy for connecting external miners |
| 🧅 Tor hidden service | Optional — expose your node as a .onion for private transactions |
# 1. Clone the repository
git clone https://github.com/libre-7/Gupax-docker.git
cd Gupax-docker
# 2. Copy and edit environment file
cp .env.example .env
# 3. Start the container
docker compose up -d
# 4. Open your browser
open http://localhost:6080
# Pull and run
docker run -d \
--name gupax \
-p 6080:6080 \
-p 3333:3333 \
-p 37889:37889 \
-p 18080:18080 \
-p 18081:18081 \
-v gupax-data:/home/miner/.local/share/gupax \
-v gupax-state:/home/miner/.local/state/gupax \
-v gupax-monero:/home/miner/.bitmonero \
libre7/gupax-docker:latest
# Open browser
open http://localhost:6080
Click Connect on the noVNC page — no password required by default.
When TOR_ENABLED=true, the container starts a Tor daemon with a SOCKS5 proxy on 127.0.0.1:9050 and a hidden service that exposes your Monero node as a .onion address:
See the Ports table in Configuration for all Tor-related ports (18081, 18084, 18086). In short:
| Port | Service |
|---|---|
<onion>:18081 | Wallet RPC — connect wallets over Tor (restricted, read-only) |
<onion>:18084 | P2P inbound — other Tor peers relay transactions here |
The container uses tx-only mode — P2P blockchain sync stays on clearnet; only wallet-originated transactions are routed through Tor. This keeps bandwidth through Tor negligible (~2 KB per transaction) while still protecting transaction privacy.
Bandwidth — the ethical concern. A synced Monero node pushes hundreds of GB to multiple TB per month through its P2P connections. The Tor network consists of ~7,000 volunteer-run relays provisioned for web browsing and messaging — low-bandwidth, bursty traffic. Monero P2P is the opposite: sustained, high-throughput, always-on. Pushing full node sync through Tor degrades the network for everyone else, analogous to torrenting over Tor.
Monero's own design acknowledges this. From official docs:
Monerod does not support synchronizing the blockchain over onion or I2P hidden services. anonymous-inbound is not for blockchain sync!
What --tx-proxy gives you instead. Only wallet-originated transactions (~2 KB) route through Tor. Your ISP sees you running a Monero node on clearnet, but individual transaction origins are hidden behind Tor circuits. Combined with --anonymous-inbound, transactions enter and leave your node through Tor while bulk sync stays efficient on clearnet.
Note: If you need full-P2P-over-Tor (e.g., ISP blocks Monero traffic entirely), you can add
--proxy 127.0.0.1:9050manually in Gupax's Node → Arguments. This works but will consume significant Tor network bandwidth — please reduce rate limits with--limit-rate-upand--limit-rate-downif you do this.
1. Find your .onion address in the container logs
docker logs gupax 2>&1 | grep -A5 "Monero .onion"
You'll see output like:
[+] Monero .onion: dqwj5fyc4xfjnlswv2b4xjayxo2enr5sjgwjlimlvgeejkudo6msmqqd.onion
│ Wallet RPC: dqwj5fyc...onion:18081
│ P2P inbound: dqwj5fyc...onion:18084
│
│ Connect wallets over Tor:
│ monero-wallet-cli --proxy 127.0.0.1:9050 \
│ --daemon-address dqwj5fyc...onion:18081 \
│ --trusted-daemon
│
│ Mobile wallets (Cake, Monerujo): add .onion as remote node.
│ RPC is restricted — read-only wallet operations, no admin access.
[+] Recommended monerod arguments (Gupax → Node → Arguments):
--restricted-rpc
--no-igd
--tx-proxy=tor,127.0.0.1:9050
--anonymous-inbound=dqwj5fyc...onion:18084,127.0.0.1:18086,40
2. Open the Gupax web UI at http://your-server:6080
3. Go to the Node tab and switch from Simple to Advanced mode to reveal the "Start options:" text box
Note: If you don't see the Node tab, open Settings → Tabs, check Node, and click Save.
4. ⚠️ Fix the --data-dir path first. Gupax's default is the relative path .bitmonero, which does not resolve correctly in this Docker setup. In the Start options box, locate --data-dir and change it to the absolute path:
--data-dir /home/miner/.bitmonero
Why this matters: Every time you click "Reset to Advanced options" or switch between Simple/Advanced modes, Gupax resets
--data-dirback to.bitmonero. If left as the relative path, monerod will fail to find the blockchain and exit immediately. You must manually correct this each time the options are reset.
5. Paste the four Tor arguments from the log output (after the --data-dir fix):
--restricted-rpc --no-igd --tx-proxy=tor,127.0.0.1:9050 --anonymous-inbound=dqwj5fyc...onion:18084,127.0.0.1:18086,40
The complete Start options line should look like:
--data-dir /home/miner/.bitmonero --zmq-pub tcp://127.0.0.1:18083 --rpc-bind-ip 127.0.0.1 --rpc-bind-port 18081 --out-peers 8 --in-peers 16 --log-level 0 --sync-pruned-blocks --enable-dns-blocklist --disable-dns-checkpoints --prune-blockchain --restricted-rpc --no-igd --tx-proxy=tor,127.0.0.1:9050 --anonymous-inbound=dqwj5fyc...onion:18084,127.0.0.1:18086,40
6. Click Save (Gupax does not auto-save — if you skip this, the arguments are lost on restart)
7. Click Start to launch monerod with Tor
8. ⚠️ Fix P2Pool's ZMQ port. Gupax has a known bug where it copies the RPC port (18081) into P2Pool's --zmq-port argument. ZMQ is a different protocol on a different port (18083, set by --zmq-pub tcp://127.0.0.1:18083 on monerod). If --zmq-port 18081 is left as-is, P2Pool won't receive real-time block notifications from monerod.
Open the P2Pool tab → Advanced mode → Arguments, and change:
--zmq-port 18081
to:
--zmq-port 18083
Then click Save.
Mount the gupax-tor volume (enabled by default in docker-compose.yml) to persist the hidden service private key at /home/miner/.tor/hs_monerod/hs_ed25519_secret_key. As long as that file survives, your .onion address stays the same across container recreations.
Once monerod is running, you can connect any Monero wallet through the same .onion address over the wallet RPC port (18081).
With a Monero wallet:
<onion>:18081 (e.g. dqwj5fyc...onion:18081)With monero-wallet-cli:
monero-wallet-cli --daemon-address <onion>:18081 --proxy 127.0.0.1:9050
How it works: The hidden service maps
:18081directly to monerod's JSON-RPC at127.0.0.1:18081. Wallet sync (get_blocks.bin) and transaction submission (send_raw_transaction) both flow through this port. Transaction broadcast from monerod to the network uses--tx-proxy=tor,...to route through SOCKS5.
This section covers installing and running Gupax-docker on Unraid.
1920x1080x24)If Gupax-docker is not yet in the Community Applications store, you can install it manually by dropping the template XML onto your Unraid USB flash drive.
# From Unraid terminal, or mount the flash drive on another machine and copy it:
wget -O /boot/config/plugins/dockerMan/templates-user/my-gupax-docker.xml \
https://raw.githubusercontent.com/libre-7/gupax-docker/main/templates/gupax-docker.xml
1920x1080x24)Once the container is running:
http://your-unraid-ip:6080
Inside the Gupax GUI:
Note: Gupax v2.0.0+ hides the Node tab by default. You must enable it manually. The wallet address is set inside the Gupax GUI itself — it is not a Docker environment variable or template field.
See the Ports table in Configuration for a complete list. The Unraid template maps 6080, 3333, 37889, 18080, and 18081 by default. Port 5900 (VNC) is available but disabled by default — only enable it if you have set VNC_AUTH_TOKEN.
If you have an existing Monero blockchain on your Unraid server:
/home/miner/.bitmonero as a volume/home/miner/.bitmonero
| Variable | Required | Default | Description |
|---|---|---|---|
TOR_ENABLED | No | false | Enable Tor daemon with SOCKS5 proxy + hidden service for monerod |
VNC_AUTH_TOKEN | No | (none) | Set to require a password on the noVNC/VNC interface |
PUID | No | (auto) | UID to run Gupax as — auto-detected from gupax-data volume owner |
PGID | No | (auto) | GID to run Gupax as — auto-detected from gupax-data volume owner |
MONERO_RPC_RESTRICTED | No | true | Restrict monerod RPC to view-only commands |
MONERO_DATA_PATH | No | gupax-monero | Path (volume name or host path) for Monero blockchain data |
SCREEN_RESOLUTION | No | 1920x1080x24 | Resolution for the virtual X display (WxHxD format) |
Note:
GUPAX_VERSIONandGUPAX_SHA256are managed automatically by the CI workflow — no manual configuration needed. The Docker image is always built with the latest detected upstream Gupax version.
| Port | Service | Category | Map | Description |
|---|---|---|---|---|
6080 | noVNC | Access | ✅ Yes | Web UI — open in your browser |
5900 | VNC | Access | ⚠️ Optional | Direct VNC (only needed if VNC_AUTH_TOKEN is set) |
3333 | P2Pool | Mining | ✅ Yes | Stratum — external miners connect here |
37889 | P2Pool | Mining | ✅ Yes | P2P — p2pool peer connections |
18080 | monerod | Node | ✅ Yes | P2P network — connects to other Monero nodes |
18081 | monerod | Node | ✅ Yes | RPC — JSON-RPC API for Gupax and wallets |
18083 | monerod | Node | — | ZMQ pub — block notifications for P2Pool (loopback only, --zmq-pub flag) |
18084 | Tor HS | Tor | — | Hidden service virtual port (Tor routes this internally) |
18086 | monerod | Tor | — | --anonymous-inbound bind target (Tor routes this internally) |
| Volume | Path | Description |
|---|---|---|
gupax-data | /home/miner/.local/share/gupax | Downloaded Gupax binaries (P2Pool, XMRig, monerod) |
gupax-state | /home/miner/.local/state/gupax | Gupax configuration and session state |
gupax-monero (or host path) | /home/miner/.bitmonero | Monero blockchain data |
gupax-tor | /home/miner/.tor | Persistent .onion address and Tor data |
If you have an existing Monero blockchain directory, you can mount it directly.
First start the container to create the volume:
docker compose up -d
Then in the Gupax GUI, go to the Node tab and set the database path to:
/home/miner/.bitmonero
Alternatively, pre-populate the volume before starting:
# Copy your blockchain to the volume
docker run --rm -v gupax-monero:/data -v /path/to/your/blockchain:/source alpine cp -r /source /data/
# Or use a host directory directly in docker-compose.yml:
# volumes:
# - /path/to/your/blockchain:/home/miner/.bitmonero
If you mount an existing blockchain from a host directory (not a fresh Docker volume), the container must have read and write permission to those files. The container runs Gupax as the user owning the gupax-data volume — auto-detected at startup or set via PUID/PGID.
If the container UID does not match the blockchain file owner, monerod will fail immediately:
Node | Stopped ... Uptime was: [1s], Exit status: [Failed]
To check and fix ownership:
# 1. Find the container's expected UID/GID
# Check PUID/PGID env vars in docker-compose.yml or Unraid template.
# Default on Unraid: 99:100 (nobody:users)
# 2. Check current ownership of your blockchain files
ls -ln /path/to/your/blockchain/lmdb/data.mdb
# 3. Change ownership to match the container (example for Unraid: 99:100)
chown -R 99:100 /path/to/your/blockchain
⚠️ Unraid FUSE caveat: If your blockchain is on a user share path like
/mnt/user/appdata/...,chownwill appear to succeed but have no effect — Unraid's FUSE overlay filesystem (shfs) silently ignores ownership changes. Use the direct disk or cache path instead:# Correct — bypasses FUSE: chown -R 99:100 /mnt/cache/appdata/gupax/monero # or chown -R 99:100 /mnt/disk1/appdata/gupax/moneroVerify from inside the container after changing ownership:
docker exec gupax stat /home/miner/.bitmonero/lmdb/data.mdb | grep Uid # Should show: Uid: (99/nobody) — not 999/miner
Tip: If you're unsure which UID the container uses, check the startup logs:
[*] Running Gupax as UID:99 GID:100Then run
chown -R <UID>:<GID> /path/to/your/blockchainto match.
VNC_AUTH_TOKEN to enable authenticationUnraid uses FUSE (fuse.shfs) for its appdata shares, which silently ignores
chown. The container detects this at startup and applies world-writable
permissions (chmod a+rwX) on the Gupax data volume so the container can
write files regardless of the host user ID.
What this means: Any process on your Unraid host — or any other
container — can read and write files in /mnt/user/appdata/gupax/.
This includes:
Mitigations:
appdata from a non-FUSE location (e.g., an SSD cache
pool with btrfs or xfs) if security is a concernTry refreshing the page and waiting 10-20 seconds for Gupax to fully initialize. If the issue persists, restart the container:
docker compose restart
Make sure the container is running:
docker compose logs
docker compose ps
Check the logs:
docker compose logs
empty response / EBADF errorsSymptoms: Log fills with:
JSONRPCRequest uv_poll_start returned error EBADF
P2Pool get_info RPC request to host 127.0.0.1:RPC 18081:ZMQ 18083 failed: Error (empty response)
Root cause: Gupax v2.0.0+ hides the Node tab by default. If the Node was never enabled, monerod is not running — but P2Pool (and possibly XMRig/xmrig-proxy) still tries to connect to 127.0.0.1:18081, producing endless RPC failures.
Fix:
Local and Port is 18081--zmq-pub tcp://127.0.0.1:18083
Note for auto-start users: If you previously had Node set to auto-start but the tab was hidden after a config reset or Gupax upgrade, the auto-start setting may also be reset. You must re-enable both the tab visibility AND the auto-start toggle on the Node tab.
Mining cryptocurrency consumes significant electricity and may not be profitable depending on your hardware, electricity costs, and market conditions. This project is provided as-is for educational and convenience purposes. Always do your own research before investing in mining hardware or cryptocurrency. The maintainers of this repository are not responsible for any financial losses.
This project is licensed under the GNU General Public License v3.0.
Gupax, P2Pool, and XMRig are each licensed under their respective licenses — see the official repositories linked above.
Content type
Image
Digest
sha256:f4b20c760…
Size
278.5 MB
Last updated
about 2 months ago
docker pull libre7/gupax-docker:86f845e1dc7a025d82c4573c2743b4fef7f34fda