Commit Graph
59 Commits
Author SHA1 Message Date
jwinterm b34a32c433 fix: nginx — re-resolve upstream hostname via Docker DNS
Mirror of wowcheckout e0c349a. Same bug would bite xmrcheckout after any api container rebuild — nginx caches IP at startup and never re-resolves, so a rebuild that gives the api container a new IP leaves nginx 502'ing until manually restarted. Use 'resolver 127.0.0.11 valid=10s' + variable-based proxy_pass so nginx re-resolves every ~10s via Docker's internal DNS.
2026-04-19 16:09:09 -04:00
jwinterm eb15c5202a fix: include fiat amount in BTCPay webhook payload; quiet wallet-rpc spam
Two fixes:

1. _build_payload now emits amount (fiat), currency, and amount_crypto. Downstream processors like Medusa need the amount to capture the right value. Without it, Medusa was capturing 0 and leaving payments stuck 'authorized' forever despite the InvoiceSettled/InvoicePaymentSettled webhooks firing correctly at 10+ confirmations.

2. get_status() called set_daemon RPC without first opening a wallet. set_daemon requires an open wallet, so on backends holding no wallet (the common idle case with our 3-backend hash-sharded setup) it errored with RPC -13 'No wallet file' every 5 seconds, flooding logs with a dozens-per-minute stream of raw RPC error dumps from the python-monero library logger. Dropped the set_daemon call — _daemon_height() already validates daemon reachability directly and doesn't need wallet-rpc.

3. Silenced monero.backends.jsonrpc.wallet library logger at CRITICAL so expected transient -13 errors from our _ensure_wallet_open close_wallet call stop polluting the stream.
2026-04-18 16:31:32 -04:00
jwinterm 8e48fdbda6 docs: add extra_hosts comment for LAN webhook delivery 2026-04-13 10:27:37 -04:00
jwinterm 9584cc37ed fix: auto-redirect on payment detection (0-conf), not just confirmation
The checkout UI only redirected when status was 'confirmed' (after all
N confirmations). Now also redirects on 'payment_detected' (0-conf in
mempool). This matches BTCPay's behavior for BTC/LTC where the customer
is redirected to the store immediately on detection.
2026-04-13 10:03:28 -04:00
jwinterm 2d8fee45b6 merge upstream: system status, health monitoring, connectivity caching
Merges xmrcheckout/xmrcheckout main (7 commits since 655d037):
- Add Monero system status and reconciler heartbeat
- Surface Monero health status in UI (dashboard + invoice pages)
- Harden reconciler status heartbeat startup
- Avoid false Monero outage states in UI
- Cache Monero connectivity in system status
- Next.js security patch (15.5.9 → 15.5.14)
- Bump Monero Docker defaults to 0.18.4.6

Resolved conflicts in reconciler.py (kept our advisory lock + upstream
heartbeat), routes.py (kept both imports), README.md (kept both sections).
2026-03-28 12:20:32 -04:00
jwinterm 6506ce1e18 fix: reconciler hardening, decimal formatting, webhook retries
- Advisory lock: wrap per-invoice processing in try/finally so lock is
  ALWAYS released, even on exception. Previously, any error between lock
  acquisition and release would leak the lock, causing the invoice to be
  silently skipped forever on subsequent cycles.

- Error logging: wallet RPC errors now logged at ERROR level (was DEBUG),
  making silent reconciliation failures visible in production logs.

- Transfer protection: don't delete stored transfers when wallet-rpc
  returns an empty response (transient RPC glitch). Only prune when we
  actually got transfer data back.

- Wallet restore height: new wallets generated from keys now look back
  ~2 days (1440 blocks) instead of starting at current height. Prevents
  missing payments that arrived before the wallet was first opened on a
  given wallet-rpc instance.

- Decimal formatting: _format_xmr_fixed() now strips trailing zeros
  instead of always showing 12 decimal places (0.033554999694 → 0.033555).

- Invoice amount rounding: fiat-converted amounts now use ROUND_UP with
  5 decimal places (was ROUND_DOWN with 12), preventing undercharging.

- Webhook retries: BTCPay webhook delivery now retries up to 3 times
  with 1s/2s backoff on 5xx or network errors. Timeout increased 5s→10s.
  Failures logged at ERROR level (was WARNING/DEBUG).
2026-03-28 11:50:51 -04:00
xmrcheckout a15569c535 Cache Monero connectivity in system status 2026-03-26 15:46:46 +00:00
xmrcheckout f7e70e3436 Bump Monero Docker defaults to 0.18.4.6 2026-03-26 15:46:38 +00:00
xmrcheckout d039d5a984 Avoid false Monero outage states in UI 2026-03-26 15:46:31 +00:00
xmrcheckout 10011ffb8c Harden reconciler status heartbeat startup 2026-03-26 15:46:23 +00:00
xmrcheckout ff96413d92 Surface Monero health status in UI and docs 2026-03-26 15:46:16 +00:00
xmrcheckout d22f1ba0dd Add Monero system status and reconciler heartbeat 2026-03-26 15:46:09 +00:00
xmrcheckout ef7ef8edab Update UI Next.js security patch 2026-03-26 13:57:36 +00:00
jwinterm b7d9d97ab7 docs: add webhook and extra_hosts documentation 2026-03-18 13:18:25 -04:00
jwinterm 5b747ab923 fix: correct API_BASE_URL default (was double-prefixing /api)
The default was http://nginx/api but all fetch calls already append
/api/... resulting in http://nginx/api/api/... (404). Changed to
http://nginx so the full path is http://nginx/api/admin/auth/verify.
2026-03-15 11:31:17 -04:00
jwinterm 1ce08560a2 security: harden admin auth, reconciler locking, and connection pooling
- Use secrets.compare_digest for timing-safe admin key comparison
- Strip whitespace from ADMIN_API_KEY env var
- Add PostgreSQL advisory locks per-invoice in reconciler to prevent
  duplicate processing during deployments
- Add wallet-RPC retry with backoff (3 attempts: 0.5s, 1s, 2s)
- Raise MAX_SUBADDRESS_INDEX from 100 to 300
- Tune DB connection pool (pool_size=20, max_overflow=10, recycle=3600)
- Add 1-hour admin session timeout
- Regenerate UI lockfile
2026-03-15 10:49:24 -04:00
jwinterm 17ba489ee2 Add admin panel docs to README, fix nginx for reverse proxy setup 2026-03-10 11:34:28 -04:00
jwinterm 47cd52686a Remove TLS from nginx — NPM handles TLS on LAN 2026-03-10 11:32:16 -04:00
jwinterm 5f1154d363 Add admin panel for merchant management
- POST/GET/DELETE /api/admin/users endpoints
- Admin UI at /admin with login, user list, create/delete
- Auth via ADMIN_API_KEY env var (separate from tenant auth)
- Tenants remain scoped to their own store only
2026-03-10 11:24:38 -04:00
jwinterm bf6dd29c1f Send signup requests to apps@such.software 2026-03-09 13:12:01 -04:00
jwinterm 57e549ddf4 Fix turnstile and resend package versions 2026-03-09 13:04:23 -04:00
jwinterm 3eabad598d Add OPEN_REGISTRATION gate, signup request form, favicon 2026-03-09 13:02:21 -04:00
jwinterm 408312cce7 Add hosted by Such Software to footer 2026-03-09 11:54:38 -04:00
jwinterm a69d199fab Switch rate provider from CoinGecko to Kraken
Kraken public API is free and doesn't require an API key.
Supports XMR/USD and XMR/EUR pairs.
2026-03-09 10:27:47 -04:00
xmrcheckout 655d037c49 ui: highlight active nav item 2026-01-30 16:52:36 +00:00
xmrcheckout a19b3566a6 reword marketing homepage in plain english 2026-01-30 16:52:31 +00:00
xmrcheckout fa359443f8 ui: add public tour with simulated data 2026-01-30 16:52:25 +00:00
xmrcheckout 5753e2171c Bump monero version to 0.18.4.5 2026-01-17 17:57:03 +00:00
xmrcheckout ee35140633 docs: add post login UI screenshots and general polish 2026-01-17 15:29:56 +00:00
xmrcheckout 59fbd0c78a docs: add non-Docker deployment and optional reverse proxy 2026-01-11 21:47:42 +00:00
xmrcheckout 7eadd14ca0 ui: wording tweaks 2026-01-10 22:28:19 +00:00
xmrcheckout 98d944ce0c Ensure services restart after reboot 2026-01-09 20:02:58 +00:00
xmrcheckout 4db4b51fe9 ui: make donate copy voluntary 2026-01-09 17:20:20 +00:00
xmrcheckout 31eaf2d6a3 compose: only expose nginx by default 2026-01-09 15:23:18 +00:00
xmrcheckout 0ea8732062 ui: trim invoice page messaging 2026-01-09 14:57:08 +00:00
xmrcheckout 6290136327 Add optional Postgres backup service 2026-01-09 14:40:31 +00:00
xmrcheckout 81ce66803d Add local monerod docker compose profile 2026-01-09 14:33:10 +00:00
xmrcheckout 39083eafb4 invoices: search by amount and refine archive copy 2026-01-09 14:01:02 +00:00
xmrcheckout 4c86be83f5 ui: simplify invoices table columns 2026-01-09 13:50:46 +00:00
xmrcheckout 274c5d80a7 Update monero logo 2026-01-08 18:49:50 +00:00
xmrcheckout 1125eb90a5 ui: add amount copy button to btcpay classic invoice 2026-01-08 18:30:28 +00:00
xmrcheckout a4df797294 Align BTCPay receipt layout with reference 2026-01-08 17:57:24 +00:00
xmrcheckout 723891d7ea Update hero wording 2026-01-08 17:56:06 +00:00
xmrcheckout af60d1d4c6 Fix BTCPay webhook events and delivery 2026-01-08 17:50:09 +00:00
xmrcheckout 7bde17a3eb Change default confirmation target to 1 2026-01-08 17:39:58 +00:00
xmrcheckout 90ade88057 improve README readability 2026-01-08 17:31:36 +00:00
xmrcheckout 7c6370646e Add gitignore for local artifacts 2026-01-08 16:43:11 +00:00
xmrcheckout 0148caf501 Redesign create invoice modal 2026-01-08 16:43:11 +00:00
xmrcheckout 6a3156991a Add optional post-confirmation continue URL 2026-01-08 16:43:11 +00:00
xmrcheckout 6eb8d381c9 BTCPay: add paid/receipt flow and redirect support 2026-01-08 16:43:11 +00:00