From aab2c1ceec2504bcd026a8d02e72e8da7364fdf8 Mon Sep 17 00:00:00 2001 From: jwinterm Date: Sun, 31 May 2026 15:13:06 -0400 Subject: [PATCH] docs: deploy artifacts for the monerogue.app stagenet instance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prepared (not executed) artifacts for the two-instance deployment: - scripts/deploy/monero-wallet-rpc.service: Monero STAGENET wallet-rpc unit (mirrors wownero-wallet-rpc; binds 127.0.0.1:38083, daemon :38081, password placeholder). - scripts/deploy/monerogue.service: second game instance unit (separate user/dir/DB, :3001). - docs/DEPLOY_INSTANCES.md: full runbook for both instances — mainnet reconfigured to free-to-play + NO payouts, and the new Monero stagenet instance with payouts ON; includes the monerogue .env and verification. No server changes and no secrets committed (placeholders only). --- docs/DEPLOY_INSTANCES.md | 189 +++++++++++++++++++++++ scripts/deploy/monero-wallet-rpc.service | 35 +++++ scripts/deploy/monerogue.service | 22 +++ 3 files changed, 246 insertions(+) create mode 100644 docs/DEPLOY_INSTANCES.md create mode 100644 scripts/deploy/monero-wallet-rpc.service create mode 100644 scripts/deploy/monerogue.service diff --git a/docs/DEPLOY_INSTANCES.md b/docs/DEPLOY_INSTANCES.md new file mode 100644 index 0000000..b697f45 --- /dev/null +++ b/docs/DEPLOY_INSTANCES.md @@ -0,0 +1,189 @@ +# Two-instance deployment runbook + +Two independent instances of the same secured codebase, behind Nginx Proxy Manager (NPM): + +| Instance | Domain | Port | Network | Money | Payouts | Leaderboards | +|----------|--------|------|---------|-------|---------|--------------| +| **wownerogue** (existing) | play.wowne.ro | 3000 | Wownero **mainnet** | real WOW | **OFF** | Pleb + Hall of Champions | +| **monerogue** (new) | monerogue.app | 3001 | Monero **stagenet** | fake XMR | **ON** | Pleb + Hall of Champions | + +NPM already forwards both domains to these ports + handles TLS — no reverse-proxy work here. + +> ⚠️ Nothing below has been executed. Run only after review. Step 0 is the urgent one +> (the live mainnet instance still runs pre-fix code with the underpayment exploit + payouts). + +Server facts (verified): root+sudo; `monerod --stagenet` RPC on `127.0.0.1:38081`; +`monero-wallet-rpc` at `/usr/bin`; stagenet wallet `…/monero-…-v0.18.4.4/test(.keys)`; +Postgres has `wownerogue`,`wowrace`; ports `3001` and `38083` free; code at +`/var/www/wownerogue/app` on branch `main` (commit 82fdcc0). + +--- + +## Step 0 — Get the secured branch onto the server + +```bash +# Local: push the remediation branch (or merge to main first) +git push origin security/phase-0-critical-fixes + +# Server (mainnet instance): +sudo -u wownerogue git -C /var/www/wownerogue/app fetch origin +sudo -u wownerogue git -C /var/www/wownerogue/app checkout security/phase-0-critical-fixes +cd /var/www/wownerogue/app/src && sudo -u wownerogue npm ci +# Migrations run automatically on boot; or apply manually with the app's runner. +``` + +--- + +## Step 1 — Reconfigure the MAINNET instance: free-to-play, NO payouts + +Edit `/var/www/wownerogue/app/src/.env` — change these keys (keep everything else): + +```ini +FREE_PLAY_ENABLED=true # offer free play as a choice (Pleb board) +PAYOUTS_ENABLED=false # no crypto leaves the house wallet +DIRECT_PAYOUTS_ENABLED=false +CREDITS_PAYOUTS_ENABLED=false +DIRECT_REQUIRES_ADDRESS=false # no payout = no payout address needed +CREDITS_REQUIRES_ADDRESS=false +TRUST_PROXY=true # we are behind NPM; read real client IP from X-Forwarded-For +``` + +Players still buy credits / pay entry (→ Hall of Champions prestige); free players → Pleb +board. No payouts = not gambling. + +```bash +sudo systemctl restart wownerogue.service +journalctl -u wownerogue.service -n 50 --no-pager # verify: "Payment system: ENABLED", payouts disabled +curl -s localhost:3000/api/game-modes | jq '{freePlayEnabled, PAID_SINGLE:.PAID_SINGLE.payoutMultiplier}' +``` + +--- + +## Step 2 — Stand up the MONERO STAGENET wallet-rpc + +```bash +sudo cp scripts/deploy/monero-wallet-rpc.service /etc/systemd/system/ +sudoedit /etc/systemd/system/monero-wallet-rpc.service # set REPLACE_WITH_WALLET_PASSWORD +sudo systemctl daemon-reload +sudo systemctl enable --now monero-wallet-rpc.service +sudo systemctl status monero-wallet-rpc.service --no-pager +# sanity: wallet answers + is the stagenet wallet that holds the coins +curl -s http://127.0.0.1:38083/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"get_balance"}' -H 'Content-Type: application/json' +``` + +> Needs the wallet password (not in the repo). Confirm `…/v0.18.4.4/test` is the stagenet +> wallet with the coins, or point `--wallet-file` at the right one. + +## Step 3 — Create the monerogue user, code checkout, and DB + +```bash +sudo useradd --system --home /var/www/monerogue --shell /usr/sbin/nologin monerogue +sudo mkdir -p /var/www/monerogue && sudo chown monerogue:monerogue /var/www/monerogue +sudo -u monerogue git clone git@github.com:jwinterm/wownerogue.git /var/www/monerogue/app +sudo -u monerogue git -C /var/www/monerogue/app checkout security/phase-0-critical-fixes +cd /var/www/monerogue/app/src && sudo -u monerogue npm ci + +sudo -u postgres createdb monerogue +sudo -u postgres psql -c "CREATE USER monerogue WITH PASSWORD 'CHANGE_ME';" +sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE monerogue TO monerogue;" +``` + +## Step 4 — The monerogue `.env` + +Write `/var/www/monerogue/app/src/.env` (owned by `monerogue`, `chmod 600`). Stagenet/fake +money, so payouts are fine. Amounts are XMR atomic units (1 XMR = 1e12): + +```ini +NODE_ENV=production +PORT=3001 +TRUST_PROXY=true +CRYPTO_TYPE=XMR +MONERO_NETWORK=stagenet +HOSTED_BY=https://monerogue.app +DIFFICULTY_PRESET=casino + +# --- payments + free play --- +PAYMENTS_ENABLED=true +PAYMENT_MODES=direct,credits +FREE_PLAY_ENABLED=true # both boards available + +# --- direct (pay per game) WITH payouts (fake stagenet money) --- +DIRECT_PAYMENT_ENABLED=true +DIRECT_GAME_PRICE=10000000000 # 0.01 XMR +DIRECT_REQUIRES_ADDRESS=true +DIRECT_PAYOUTS_ENABLED=true +DIRECT_PAYOUT_ESCAPE=2.0 +DIRECT_PAYOUT_TREASURE=3.0 + +# --- credits WITH payouts --- +CREDITS_ENABLED=true +CREDITS_PER_GAME=1 +CREDITS_REQUIRES_ADDRESS=true +CREDITS_PAYOUTS_ENABLED=true +CREDITS_PAYOUT_BASE=10000000000 +CREDITS_PAYOUT_ESCAPE=2.0 +CREDITS_PAYOUT_TREASURE=3.0 +CREDITS_PACKAGES=[{"id":"small","credits":10,"price":"90000000000","bonus":0},{"id":"medium","credits":20,"price":"170000000000","bonus":2}] +ALLOW_MIXED_MODE=true +PREFER_CREDITS_FIRST=true + +# --- payouts --- +PAYOUTS_ENABLED=true +PAYOUT_MIN_AMOUNT=1000000000 +PAYOUT_MAX_PER_GAME=1000000000000 +PAYOUT_BATCH_INTERVAL=300 +PAYOUT_MAX_RETRIES=3 + +# --- wallet RPC (monero stagenet) --- +PRIMARY_WALLET_ENDPOINT=http://127.0.0.1:38083 +# wallet-rpc started with --disable-rpc-login, so no WALLET_RPC_USER/PASSWORD + +# --- daemon RPC (monerod stagenet) --- +PRIMARY_RPC_ENDPOINT=http://127.0.0.1:38081 +FALLBACK_RPC_ENDPOINT=http://127.0.0.1:38081 +RPC_POLL_INTERVAL=2000 + +# --- database --- +DB_HOST=localhost +DB_PORT=5432 +DB_NAME=monerogue +DB_USER=monerogue +DB_PASSWORD=CHANGE_ME + +# --- admin --- +ADMIN_API_KEY=GENERATE_WITH_openssl_rand_hex_32 + +# --- smirk: disable for monero stagenet (Smirk doesn't support stagenet) --- +SMIRK_ENABLED=false +``` + +```bash +sudo chmod 600 /var/www/monerogue/app/src/.env +sudo chown monerogue:monerogue /var/www/monerogue/app/src/.env +``` + +## Step 5 — Install + start the monerogue instance + +```bash +sudo cp scripts/deploy/monerogue.service /etc/systemd/system/ +sudo systemctl daemon-reload +sudo systemctl enable --now monerogue.service +journalctl -u monerogue.service -n 60 --no-pager # expect: listening on :3001, payments ENABLED +curl -s localhost:3001/health | jq '{network:.network, wallet:.wallet.status, mode:.gameMode}' +``` + +## Step 6 — Verify end to end + +- `monerogue.app` loads; `play.wowne.ro` still healthy. +- Stagenet: buy credits / pay entry with a stagenet wallet → game starts → win → payout + arrives (this is the real `wownero-wallet-rpc`/`monero-wallet-rpc` integration test that + TODO.md has always wanted — now on fake money). +- Both boards populate: free game → Pleb, paid game → Hall of Champions, on each instance. +- Mainnet: confirm a winning paid game does NOT send a payout (no crypto out). + +--- + +## Rollback + +- `sudo systemctl stop monerogue monero-wallet-rpc` (stagenet instance is independent; stopping it can't affect mainnet). +- Mainnet: `git checkout main && systemctl restart wownerogue` to revert the reconfig. diff --git a/scripts/deploy/monero-wallet-rpc.service b/scripts/deploy/monero-wallet-rpc.service new file mode 100644 index 0000000..b330243 --- /dev/null +++ b/scripts/deploy/monero-wallet-rpc.service @@ -0,0 +1,35 @@ +# Monero STAGENET wallet RPC for the monerogue.app instance. +# Mirrors wownero-wallet-rpc.service. Install to /etc/systemd/system/monero-wallet-rpc.service +# +# Wallet: /home/jw/Programs/monero-x86_64-linux-gnu-v0.18.4.4/test (the stagenet wallet with coins) +# Daemon: monerod --stagenet RPC on 127.0.0.1:38081 (already running) +# RPC: binds :38083 (free) +# +# IMPORTANT: replace REPLACE_WITH_WALLET_PASSWORD below with the wallet's real password +# (do NOT commit the real password). Consider --wallet-dir + --rpc-login for production, +# but this mirrors the existing wownero setup for parity. +[Unit] +Description=Monero Wallet RPC (Stagenet) - monerogue +After=network-online.target monerod.service +Wants=monerod.service + +[Service] +User=jw +Group=jw +Type=simple + +ExecStart=/usr/bin/monero-wallet-rpc \ + --stagenet \ + --wallet-file /home/jw/Programs/monero-x86_64-linux-gnu-v0.18.4.4/test \ + --password "REPLACE_WITH_WALLET_PASSWORD" \ + --rpc-bind-port 38083 \ + --daemon-address 127.0.0.1:38081 \ + --non-interactive \ + --rpc-bind-ip 127.0.0.1 \ + --disable-rpc-login + +Restart=always +RestartSec=10 + +[Install] +WantedBy=multi-user.target diff --git a/scripts/deploy/monerogue.service b/scripts/deploy/monerogue.service new file mode 100644 index 0000000..f4ea139 --- /dev/null +++ b/scripts/deploy/monerogue.service @@ -0,0 +1,22 @@ +# monerogue.app game instance (Monero STAGENET, pay-to-play WITH payouts). +# Install to /etc/systemd/system/monerogue.service +# +# Separate code checkout + user + DB + .env from the wownerogue (mainnet) instance, so the +# two are fully independent. NPM (Nginx Proxy Manager) already forwards monerogue.app -> :3001. +[Unit] +Description=Monerogue Game Server (Monero Stagenet) +After=network.target postgresql.service monero-wallet-rpc.service +Wants=monero-wallet-rpc.service + +[Service] +Type=simple +User=monerogue +Group=monerogue +WorkingDirectory=/var/www/monerogue/app/src +EnvironmentFile=/var/www/monerogue/app/src/.env +ExecStart=/usr/bin/node index.js +Restart=on-failure +RestartSec=10 + +[Install] +WantedBy=multi-user.target