Files
smirk-backend-core/examples/paid-relay/.env.example
T
jwinterm d96f457b69 docs(examples): operator cookbook — six deployment recipes + premium-relay spec
Add ready-to-run .env + README recipes (personal, public-free, friends,
paid-access, paid-relay, community) and the premium-relay design overview,
with audit fixes to the config template and spec:

- Drop the inert INSTANCE_ID knob (config never read it) and document the real
  per-node id, which is derived from ADMIN_PUBLIC_URL.
- Warn that a placeholder PUBLIC_API_URL is rejected at boot in production
  (Nostr identity is on by default); soften the recipe "boots today" status.
- Remove dead template vars: BTC/LTC Core-RPC settings and the non-existent
  PUBLIC_EXPOSE_FEATURES (replaced with the real per-field landing switches).
- Mark ALTCHA_HMAC_KEY conditional in PoW-off recipes; blank placeholder
  payment creds so a recipe doesn't ship a key that fails validation.
- Fix premium-relay spec drift: the migration creates no premium_until index,
  disabled endpoints return 400/200 (not 404), and neutralize operator voice.
2026-07-02 19:47:46 -04:00

83 lines
3.3 KiB
Bash

# ── Recipe: paid-relay ───────────────────────────────────────────────────────
# Free wallet (open + PoW) PLUS a paid premium tier for GENERAL Nostr posting to
# your relay. Wallet-functional events (encrypted DMs, tips, swap coordination)
# stay FREE for registered users; premium unlocks general posting. This is the
# flagship monetization recipe — recurring revenue tied to a real service.
#
# ⚠️ Running a relay means hosting user content — read ../LEGAL_AND_OPS.md
# (DMCA designated agent + NCMEC reporting + acceptable-use + moderation).
#
# Start from ../../.env.example and apply the lines below. openssl rand -hex 32
# for each secret.
# ─────────────────────────────────────────────────────────────────────────────
SERVER_HOST=127.0.0.1
SERVER_PORT=8081
# REQUIRED: replace with YOUR real https domain. The your-domain.example placeholder
# is rejected at boot in production (Nostr identity is on by default).
PUBLIC_API_URL=https://api.your-domain.example/api/v1
ENVIRONMENT=production
DATABASE_URL=postgresql:///smirk?host=/var/run/postgresql
# Secrets (REQUIRED; openssl rand -hex 32 each).
JWT_SECRET=
SEED_FINGERPRINT_PEPPER=
REFRESH_TOKEN_PEPPER=
IP_SALT=
ALTCHA_HMAC_KEY=
ADMIN_KEY_INTEGRITY_SECRET=
# ── Free registration, PoW-gated (wallet use is always free) ──
# FEATURE_POW is the master switch; POW_REQUIRED alone is inert without it.
FEATURE_POW=true
POW_REQUIRED=true
REGISTRATION_REQUIRE_INVITE=false
REGISTRATION_REQUIRE_PAYMENT=false
# ── Relay ON, premium-post policy ──
RELAY_ENABLED=true
RELAY_MODE=bundled
RELAY_URL=wss://relay.your-domain.example
RELAY_WRITE_POLICY=premium-post
# Blunt cross-ecosystem DM spam (inbound gift-wraps from non-registered authors).
RELAY_INBOUND_POW_BITS=8
RELAY_ADMISSION_BIND=127.0.0.1:8090
# Shared-box resource governance — the relay runs beside the wallet backend + LWS.
# Also cap connections / subscriptions / ingest rate in the nostr-rs-relay config
# (see deploy/relay); move to RELAY_MODE=external on its own box if load climbs.
RELAY_MAX_EVENT_BYTES=65536
RELAY_RETENTION_DAYS=30
# ── Premium tier: tiered discount plans (id:days:amount), reusing the processor ──
PREMIUM_ENABLED=true
# Price currency: a fiat code the processor converts (so "5" = $5, paid in any coin
# your processor offers), or a specific coin (then amounts are in that coin).
PREMIUM_CURRENCY=USD
PREMIUM_PLANS=quarter:90:5,halfyear:182:9,year:365:15
# Payment processor (BTCPay-compatible; also serves xmrcheckout/wowcheckout). The
# backend only READS invoice status — it never holds funds. Invoices are paid
# directly to YOUR wallet.
PAYMENT_PROVIDER=btcpay
PAYMENT_PROVIDER_URL=https://pay.your-domain.example
PAYMENT_STORE_ID=
PAYMENT_API_KEY=
PAYMENT_CONFIRMATIONS=1
PAYMENT_EXPIRES_MINUTES=60
# Prices on; tips parked; admin plane optional.
FEATURE_PRICES=true
FEATURE_TIPS=false
ADMIN_ENABLED=false
# Chain endpoints — see ../../.env.example (XMR/WOW LWS + daemon, GRIN_*, electrum).
XMR_LWS_URL=
XMR_LWS_ADMIN_URL=
XMR_LWS_ADMIN_KEY=
XMR_DAEMON_URL=
WOW_LWS_URL=
WOW_LWS_ADMIN_URL=
WOW_LWS_ADMIN_KEY=
WOW_DAEMON_URL=