Prefer load-project-env over raw ip-addresses.conf; add --vmid/--apply patterns and safer dry-run defaults across fix-all-besu, static-nodes reload, node-list deploy, max-peers rollout, rolling upgrade, and permissions verification. Made-with: Cursor
Verification Scripts
Scripts for ingress, NPMplus, DNS, and source-of-truth verification.
Dependencies
Required tools (install before running):
| Tool | Purpose | Install |
|---|---|---|
bash |
Shell (4.0+) | Default on most systems |
curl |
API calls, HTTP | apt install curl |
jq |
JSON parsing | apt install jq |
dig |
DNS resolution | apt install dnsutils |
openssl |
SSL certificate inspection | apt install openssl |
ssh |
Remote execution | apt install openssh-client |
ss |
Port checking | apt install iproute2 |
systemctl |
Service status | System (systemd) |
sqlite3 |
Database backup | apt install sqlite3 |
Optional (recommended for automation): sshpass, rsync, screen, tmux, htop, shellcheck, parallel. See docs/11-references/APT_PACKAGES_CHECKLIST.md § Automation / jump host.
One-line install (Debian/Ubuntu): sudo apt install -y sshpass rsync dnsutils iproute2 screen tmux htop shellcheck parallel
| Tool | Purpose |
|---|---|
wscat or websocat |
WebSocket testing (manual verification) |
Scripts
backup-npmplus.sh- Full NPMplus backup (database, API exports, certificates)check-contracts-on-chain-138.sh- Check that Chain 138 deployed contracts have bytecode on-chain (cast codefor 31 addresses; requirescastand RPC access). Use[RPC_URL]or envRPC_URL_138;--dry-runlists addresses only (no RPC calls);SKIP_EXIT=1to exit 0 when RPC unreachable.generate-contract-verification-publish-matrix.mjs- Generates the repo-wide all-network contract verification/publication backlog fromconfig/smart-contracts-master.jsonandcross-chain-pmm-lps/config/deployment-status.json. Writesreports/status/contract_verification_publish_matrix.jsonanddocs/11-references/CONTRACT_VERIFICATION_AND_PUBLICATION_MATRIX_ALL_NETWORKS.md.generate-crosschain-publication-packs.mjs- Groups the requested cross-chain publication packs (ethereum-mainnet,optimism,bsc,polygon,base) from the generated matrix and writesreports/status/publication-packs/*/{pack.json,README.md}.check-publication-pack-explorer-status.mjs- Queries the Etherscan-family explorers for the five publication packs and writesreports/status/publication-pack-explorer-status.jsonplusdocs/11-references/PUBLICATION_PACK_EXPLORER_STATUS.md. RequiresETHERSCAN_API_KEY. The markdown intentionally showsUnknowncounts so pack closure is not overstated.generate-publication-actionable-backlog.mjs- Separates the five requested publication packs intoauto-submittable,manual-or-external, andinventory/referencebuckets. Writesreports/status/publication-actionable-backlog.jsonanddocs/11-references/PUBLICATION_ACTIONABLE_BACKLOG.md.check-chain138-x402-readiness.sh- RPC + explorer smoke plus ERC-2612 / ERC-3009 on default V2 then V1 USD tokens;--strictexits non-zero if not x402-ready. See CHAIN138_X402_TOKEN_SUPPORT.md.check-chain138-token-permit-support.sh- cast checks permit / ERC-3009 per token; defaults match x402 script (V2 then V1). Use for CHAIN138_X402_TOKEN_SUPPORT.md.validate-address-registry-xe-aliases.mjs- Validatesweb3_eth_ibanaliases in institutional registry examples (or paths you pass) usingweb3-eth-iban. Run:node scripts/verify/validate-address-registry-xe-aliases.mjs.check-public-report-api.sh- Verify token-aggregation report + networks JSON (not Blockscout). Probes/api/v1/networksfirst, then/token-aggregation/api/v1/networks, and uses the working prefix for all checks. UseSKIP_EXIT=1for diagnostic-only mode. SetSKIP_BRIDGE_ROUTES=0,SKIP_BRIDGE_PREFLIGHT=0, orSKIP_GAS_REGISTRY=0for bridge and gas-rollout assertions.check-info-defi-oracle-public.sh- After publishinginfo-defi-oracle-138/dist/, confirms the public host serves the real Vite SPA (detects generic placeholder pages),/agents, and static agent files (llms.txt,agent-hints.json,robots.txt,sitemap.xml). Optionaljqvalidatesagent-hints.json. SetINFO_SITE_BASEfor a non-default URL. If/passes but static paths look wrong through Cloudflare, runscripts/cloudflare/purge-info-defi-oracle-cache.sh(orpnpm run cloudflare:purge-info-defi-oracle-cache).pmm-swap-quote-chain138.sh- On-chain PMM quote forswapExactIn: callsquerySellBase/querySellQuoteon the DODO pool (not the REST/quotexy=k estimate). Prints 99% / 95% / 90%minAmountOutand acast sendexample. Requirescast+bc. Defaults:RPC_URL_138, poolPMM_QUOTE_POOL(or0x9e89…40dCcUSDT/cUSDC), traderDEPLOYER_ADDRESS. Example:bash scripts/verify/pmm-swap-quote-chain138.sh --token-in 0x93E6…f22 --amount-in 100000000.check-token-aggregation-chain138-api.sh- Hits tokens, pools, quote,bridge/routes,bridge/status,bridge/preflight, and networks on both/api/v1/*and/token-aggregation/api/v1/*, then probes planner-v2 on/token-aggregation/api/v2/*for provider capabilities, route selection, the live DODO v3 pilot execution path throughEnhancedSwapRouterV2, and the public route-tree depth sanity for the funded canonicalcUSDC/USDCDODO pool.BASE_URL=https://explorer.d-bis.org(default) orhttp://192.168.11.140.check-dodo-api-chain138-route-support.sh- Probes official DODO docs/contract inventory plus hosted SmartTrade quote support for Chain 138. Hosted quote probes readDODO_API_KEY(fallbacks:DODO_SECRET_KEY,DODO_DEVELOPER_API_KEY) and deriveUSER_ADDRfromPRIVATE_KEYby default, so placing the DODO developer key in the root.envor exported shell alongside the deployerPRIVATE_KEYis the canonical repo path.check-dodo-v3-planner-visibility-chain138.sh- Verifies the Chain 138 DODO v3 / D3MM pilot is promoted into planner-v2 capability and route-matrix visibility, and that the canonical pilot pair now emitsEnhancedSwapRouterV2executable calldata.check-gru-transport-preflight.sh- Operator-focused GRU runtime preflight. Calls/api/v1/bridge/preflight, prints blocked pairs witheligibilityBlockers/runtimeMissingRequirements, and fails unless all active pairs are runtime-ready orALLOW_BLOCKED=1is set.check-gru-v2-d3mm-expansion-status.sh- Summarizes the GRU v2 / D3MM public-EVM rollout posture against the explicit chain-by-chain expansion plan, including whether bootstrap-ready chains already have tracked first-tier pool scaffolds.build-gru-v2-first-tier-pool-scaffolds.sh- Builds the canonicalconfig/gru-v2-first-tier-pool-scaffolds.jsoninventory for missing first-tier public PMM rows. Use--writeto refresh the tracked file.print-gru-v2-first-tier-pool-scaffolds.sh- Prints ad-hoc scaffold snippets for selected chain IDs. Useful for operator copy/paste, but the canonical tracked source isconfig/gru-v2-first-tier-pool-scaffolds.json.report-mainnet-deployer-liquidity-and-routes.sh- Read-only snapshot: deployer ETH / USDC / USDT / cWUSDC / cWUSDT balances, DODO integration allowances, Balancer vault USDC/USDT balances, Aave V3 available USDC/USDT under aTokens (flash premium bps), Curve 3pool USDC/USDT depth, Uniswap V3 USDC/USDT 0.01%/0.05% pool liquidity, DODO PMM reserves for all MainnetcWUSDT/cWUSDCpairs indeployment-status.json, and a pointer for 1inch/DODO keys. Requirescast,jq,PRIVATE_KEY(address derivation only).plan-mainnet-usdt-usdc-via-cw-paths.sh- Read-only Mainnet routing map:cWUSDT/USDT,cWUSDC/USDC,cWUSDT/USDC,cWUSDC/USDT, andcWUSDT/cWUSDC(0xe944…68DB), with two-hop and three-hop USDT↔USDC path recipes and optional--with-examplesdry-run command lines.run-mainnet-cwusdc-usdc-ladder-steps-1-3.sh- Operator helper for the current staged MainnetcWUSDC/USDCladder. Runs preflight, prints the staged matched top-up dry-run, executes dry-runs for steps 1-3, and verifies the expected matched reserve state after each rebalance without sending any live flash swaps. OptionalPMM_FLASH_EXIT_PRICE_CMDoverrides the defaultprintf 1.12for--external-exit-price-cmd(seeprint-mainnet-cwusdc-usdc-pmm-sellbase-implied-price.shfor on-chain pool-implied diagnostics only).check-public-pmm-dry-run-readiness.sh- Read-only checklist: mainnetcWUSDT/cWUSDCpools,ETHEREUM_MAINNET_RPC/DODO_PMM_INTEGRATION_MAINNET, Balancer and Aave V3 flash liquidity snapshots, Chain 138 flash-candidate note, and suggestedpmm-flash-push-break-even.mjstemplates.print-mainnet-cwusdc-usdc-pmm-sellbase-implied-price.sh- Prints one number: implied gross USDC per cWUSDC for a base sell size, usinggetVaultReserve+_LP_FEE_RATE_(same fallback asrun-mainnet-public-dodo-cw-swap.shwhenquerySellBasereverts). Args:[base_raw] [pool_address]; pool defaults to canonical publiccWUSDC/USDCvault or envPMM_CWUSDC_USDC_IMPLIED_PRICE_POOL. Not a real external unwind quote.print-mainnet-cwusdc-external-exit-quote.sh- Prints one number: hosted gross USDC per cWUSDC from DODO SmartTrade or 1inch v6 for mainnetcWUSDC→USDCat a raw base amount. Args:dodo|1inch [base_raw]. Keys:DODO_API_KEY(orDODO_SECRET_KEY/DODO_DEVELOPER_API_KEY) orONEINCH_API_KEY; optionalDODO_QUOTE_URL,ONEINCH_API_URL,DODO_SLIPPAGE,DODO_USER_ADDRESS. Use as--external-exit-price-cmdfor execution-grade dry-runs. Same quoting logic aspackages/economics-toolkit(dodo-quote.ts,oneinch-quote.ts). Alternative:pnpm exec economics-toolkit swap-quote --engine oneinch|dodo --chain-id 1 --rpc … --token-in … --token-out … --amount-in ….check-gas-public-pool-status.sh- Operator-focused gas-native rollout summary. Combines the active GRU transport gas lanes withcross-chain-pmm-lps/config/deployment-status.json, then reports per-lane DODO wrapped-native and stable-quote pool state, Uniswap v3 reference visibility, 1inch exposure, and runtime/env blockers. The summary now distinguishes active vs deferred gas transport pairs, so deferred lanes such aswemixdo not pollute the active counts. Use--jsonfor machine-readable output.check-gas-rollout-deployment-matrix.sh- Cross-checks the gas-family rollout against live bytecode on Chain 138 and the destination chains. Reports which canonical contracts, mirrored contracts, bridge refs, verifier refs, and vault refs are actually live, includes the deployed generic gas verifier on Chain 138 when present, distinguishes active vs deferred gas transport pairs, resolves each lane's CCIP selector, checks whether the live Chain 138 bridge has that destination wired, and classifies the observed L1 bridge read surface asfull_accounting,partial_destination_only,admin_only, orunknown_or_incompatible. Use--jsonfor machine-readable output.../deployment/print-gas-l1-destination-wiring-commands.sh- Prints the exactconfigureDestination(address,uint64,address,bool)commands still required on the live Chain 138CWMultiTokenBridgeL1for the active gas-native rollout lanes. Uses the same active transport overlay and selector metadata as the deployment matrix. Use--jsonfor machine-readable output.../deployment/run-gas-l1-destination-wiring.sh- Operator-ready wrapper for the same 10 active gas-laneconfigureDestination(address,uint64,address,bool)writes on the live Chain 138 bridge. Dry-run by default; only broadcasts whenEXECUTE_GAS_L1_DESTINATIONS=1is set.check-gru-global-priority-rollout.sh- Compares the ranked GRU global-priority currency rollout queue against the current repo state: live manifest,c* -> cW*mapping, and transport overlay. Use--wave=wave1to focus on the next promotion wave or--jsonfor machine-readable output.check-gru-v2-public-protocols.sh- Canonical GRU v2 public-network status surface. Summarizes the desired public EVM cW mesh, loaded cW suites, Wave 1 transport state, and the current public-protocol truth forUniswap v3,Balancer,Curve 3,DODO PMM, and1inch. Use--jsonfor machine-readable output or--write-explorer-configto regenerateexplorer-monorepo/backend/api/rest/config/metamask/GRU_V2_PUBLIC_DEPLOYMENT_STATUS.json.check-gru-v2-deployment-queue.sh- Operator-grade deployment queue for what is left to finish the public-network GRU v2 rollout. Breaks the remaining work down by Wave 1 asset, destination chain, and protocol stage, and now includes a blockerresolutionMatrixfor missing cW suites, pending Wave 1 transport, public pool rollout, protocol staging, backlog assets, and Solana. Use--jsonfor machine-readable output or--write-explorer-configto regenerateexplorer-monorepo/backend/api/rest/config/metamask/GRU_V2_DEPLOYMENT_QUEUE.json.check-gru-v2-d3mm-expansion-status.sh- Expansion-focused status summary for the explicit GRU v2 / D3MM public-EVM rollout order. Readsconfig/gru-v2-d3mm-network-expansion-plan.json,cross-chain-pmm-lps/config/deployment-status.json, andcross-chain-pmm-lps/config/pool-matrix.json, then reports which priority chains are already live-first-tier, only partially live, bootstrap-ready, or still blocked. Use--jsonfor machine-readable output.print-gru-v2-first-tier-pool-scaffolds.sh- Prints JSON snippets for the missing first-tier public PMM rows from the GRU v2 / D3MM expansion plan. This is scaffold output only: replace the zero pool address and keeppublicRoutingEnabled=falseuntil the pool is actually deployed and seeded.check-gru-v2-deployer-funding-status.sh- Current deployer-wallet funding posture for the remaining GRU v2 rollout. Checks Mainnet, Cronos, Arbitrum, and Chain 138 balances, then flags the live funding blockers for public deployment work and canonical Chain 138 liquidity seeding. Use--jsonfor machine-readable output.check-cw-evm-deployment-mesh.sh- Reports the public EVM cW token deployment mesh recorded insmom-dbis-138/.env: expected 12-token suites per chain, missing addresses, and on-chain bytecode presence when RPCs are available. Current expected result is10/11loaded targets with10/10full sets across Mainnet, Optimism, Cronos, BSC, Gnosis, Polygon, Base, Arbitrum, Celo, and Avalanche;Wemixremains the only desired target without a loaded cW suite.check-cw-public-pool-status.sh- Readscross-chain-pmm-lps/config/deployment-status.jsonand reports how many chains have cW tokens, bridge availability, and any recorded public-chainpmmPools. Current expected result is that the trackedcW*token mesh exists on several chains and the first Mainnet DODO PMM pool wave is recorded (includingcWUSDT/cWUSDCand the first six non-USD Wave 1 rows), while the broader public-chain mesh remains incomplete.check-mainnet-public-dodo-cw-bootstrap-pools.sh- Verifies the eleven recorded Mainnet DODOcW*bootstrap pools (includingcwusdt-cwusdc) are still mapped by the integration, have non-zero reserves, and remain dry-run routable throughrun-mainnet-public-dodo-cw-swap.sh.check-mainnet-pmm-peg-bot-readiness.sh- Readscross-chain-pmm-lps/config/deployment-status.json(chain1), confirmseth_chainIdis 1, checks integration mapping and reserves for each recorded pool, and flags USD-class cW vs USDC/USDT reserve imbalance againstpeg-bands.json. Optional:PMM_TRUU_BASE_TOKEN+PMM_TRUU_QUOTE_TOKEN,MIN_POOL_RESERVE_RAW,SKIP_EXIT=1. See MAINNET_PMM_TRUU_CWUSD_PEG_AND_BOT_RUNBOOK.md. Included incheck-full-deployment-status.shwhenETHEREUM_MAINNET_RPCandDODO_PMM_INTEGRATION_MAINNETare set (afterload-env).../deployment/deploy-mainnet-pmm-cw-truu-pool.sh- Mainnet DODO PMM: create and seed cWUSDT/TRUU or cWUSDC/TRUU (TRUU_MAINNETdefaults to canonical Truth token). Defaults: fee 30 bps,k=0.5e18, TWAP off. Requires correct--initial-price(DODOi). Use--dry-runfirst.../deployment/add-mainnet-truu-pmm-topup.sh- Add liquidity to an existing cW/TRUU pool using max wallet balances that fit the reference USD ratio (see runbook section 11). Exits 0 if either leg balance is zero.../deployment/compute-mainnet-truu-liquidity-amounts.sh- Given USD per leg, printsbase_raw/quote_rawand suggesteddeploy-mainnet-pmm-cw-truu-pool.shlines for cWUSDT/TRUU and cWUSDC/TRUU (runbook section 11.1).../deployment/add-mainnet-truu-pmm-fund-both-pools.sh- Funds both volatile pools sequentially with optional--reserve-bps(runbook: partial add + trading inventory).../deployment/compute-mainnet-truu-pmm-seed-amounts.sh- Given USD notional per leg and TRUU/USD (per full token), prints--base-amount/--quote-amountfor equal dollar liquidity on each side (not equal raw 1:1 tokens). SeeMAINNET_PMM_TRUU_CWUSD_PEG_AND_BOT_RUNBOOK.mdsection 9.check-full-deployment-status.sh- Aggregates the current full-deployment posture across config validation, the Chain 138 canonical on-chain inventory, public token-aggregation health, GRU v2 readiness, the GRU global rollout queue, the GRU v2 public-protocol matrix, the deployer-funding gate, the public EVM cW token mesh, the gas-native c* / cW* rollout summary, and the public-chain cW* pool graph. It fails until the remaining deployment blockers are cleared; useSKIP_EXIT=1or--jsonfor reporting.../deployment/run-progressive-router-v2-swaps-chain138.sh- Live operator swap ladder for the public Chain 138 planner-v2 path. Fetches/token-aggregation/api/v2/routes/internal-execution-plan, ensures allowance, executes router-v2 calldata on-chain, and prints actual in/out for a progressive set of USD notionals (default:10 50 100 250 500 1000). RequiresPRIVATE_KEY; optionalBASE_URL,RPC_URL_138,ENHANCED_SWAP_ROUTER_V2_ADDRESS.check-cstar-v2-transport-stack.sh- Predeploy Forge verifier for thec* V2bridge stack. Runs the base V2 token suite, legacy reserve-verifier compatibility suite, V2 reserve/verifier full L1/L2 round-trip suite, and the coreCWMultiTokenBridgeround-trip suite.check-gru-v2-chain138-readiness.sh- Live Chain 138 readiness gate for the deployedcUSDT V2/cUSDC V2addresses. Verifies bytecode, GRU registry activation, V2 identity/signing surface,forwardCanonical, IPFS-backedtokenURI, and the governance/supervision metadata ABI expected by the latest GRU V2 standards.run-repo-green-test-path.sh- Local deterministic green-path aggregate behind rootpnpm test. Runs config validation, then the focusedsmom-dbis-138contract and service CI targets.audit-npmplus-ssl-all-instances.sh- Audits the documented NPMplus fleet forno_certificate,expired,cert_domain_mismatch,missing_cert_record, andssl_not_forced.ssl_not_forcedis expected for RPC / WebSocket-style hosts where plain HTTP or non-browser clients must keep working.../nginx-proxy-manager/fix-npmplus-ssl-issues.sh- Applies the primary NPMplus SSL remediation: enables Force SSL + HSTS for browser-facing hosts that already have certs, and requests or reuses certificates for hosts missing them or bound to the wrong certificate. It intentionally leaves Force SSL off for RPC / WebSocket endpoints such asrpc-core.d-bis.org,rpc.defi-oracle.io, andwss.*.xdc-zero-chain138-preflight.sh-eth_chainIdHTTP checks forXDC_PARENTNET_URL/PARENTNET_URLandRPC_URL_138; optionalETHEREUM_MAINNET_RPC,BSC_RPC_URL. See CHAIN138_XDC_ZERO_BRIDGE_RUNBOOK.../xdc-zero/merge-endpointconfig-chain138.sh- Mergechain138into XDC-Zeroendpointconfig.jsonand appendxdcparentnet.registersfrom fragments. Pass path toendpointconfig.jsonorXDC_ZERO_ENDPOINT_DIR;--dry-run. See config/xdc-zero/README.md.../xdc-zero/deploy-endpoint-chain138.sh- Hardhat deploy Endpoint stack to--network chain138(XDC_ZERO_REPO,PRIVATE_KEY). See scripts/xdc-zero/README.md.../xdc-zero/run-xdc-zero-138-operator-sequence.sh- Prints full XDC Zero + 138 operator order.../validation/validate-xdc-zero-config.sh-jqparse check forconfig/xdc-zero/*.json.check-completion-status.sh- One-command summary of repo-completable checks, public report API health, and pointers to operator/external remaining work. SetINCLUDE_INFO_DEFI_PUBLIC_VERIFY=1to also runcheck-info-defi-oracle-public.sh(needs HTTPS toINFO_SITE_BASE/ production).reconcile-env-canonical.sh- Emit recommended .env lines for Chain 138 (canonical source of truth); use to reconcilesmom-dbis-138/.envwith CONTRACT_ADDRESSES_REFERENCE. Usage:./scripts/verify/reconcile-env-canonical.sh [--print]print-gas-runtime-env-canonical.sh- Emit the non-secret gas-lane runtime env scaffold fromgru-transport-active.jsonplus live canonicaltotalSupply()on Chain 138. Uses per-lane gas caps from the registry, defaults outstanding / escrowed to the current canonical supply, defaults treasury-backed / treasury-cap to0, and leaves the active gas verifier envs commented until the live L1 bridge is explicitly attached.check-deployer-balance-blockscout-vs-rpc.sh- Compare deployer native balance from Blockscout API vs RPC (to verify index matches current chain); see EXPLORER_AND_BLOCKSCAN_REFERENCEsync-blockscout-address-labels-from-registry.sh- Plan or sync Blockscout address labels fromaddress-registry-entryJSON (config/dbis-institutional/schemas/address-registry-entry.schema.json:blockscout.label,status: active). Supports--mode=http,--mode=db, and--mode=auto; on the self-hosted Chain 138 explorer,dbis the right live mode because/api/v1/*is token-aggregation, not a native Blockscout label-write API. DB mode writes primary labels into Blockscoutpublic.address_namesthrough CT5000. Seeconfig/dbis-institutional/README.mdand OMNL_DBIS_CORE_CHAIN138_SMART_VAULT_RTGS_RUNBOOK.md.check-dependencies.sh- Verify required tools (bash, curl, jq, openssl, ssh)export-cloudflare-dns-records.sh- Export Cloudflare DNS recordsexport-npmplus-config.sh- Export NPMplus proxy hosts and certificates via APIgenerate-source-of-truth.sh- Combine verification outputs into canonical JSONrun-full-verification.sh- Run full verification suiteverify-backend-vms.sh- Verify backend VMs (status, IPs, nginx configs)verify-end-to-end-routing.sh- E2E routing verificationverify-udm-pro-port-forwarding.sh- UDM Pro port forwarding checksverify-websocket.sh- WebSocket connectivity test (requires websocat or wscat)
Task runners (no LAN vs from LAN)
- From anywhere (no LAN/creds):
../run-completable-tasks-from-anywhere.sh— runs config validation, on-chain contract check, run-all-validation --skip-genesis, public report API diagnostics, reconcile-env-canonical, and the gas runtime env scaffold. - Completion snapshot:
check-completion-status.sh— summarizes what is complete locally and what still depends on operator or external execution. Optional:INCLUDE_INFO_DEFI_PUBLIC_VERIFY=1adds the public info hub check. - Full LAN execution order:
../run-full-operator-completion-from-lan.sh— starts with the token-aggregation/api/v1repair, then Wave 0, verification, E2E, non-fatal info.defi-oracle.io public smoke, and optional operator-only deployment steps. Use--skip-info-publicwithout outbound HTTPS to the public hostname. Use--dry-runfirst. - From LAN (NPM_PASSWORD, optional PRIVATE_KEY):
../run-operator-tasks-from-lan.sh— runs W0-1 (NPMplus RPC fix), W0-3 (NPMplus backup), O-1 (Blockscout verification); use--dry-runto print commands only. See ALL_TASKS_DETAILED_STEPS.
Common operator patterns
- Primary NPMplus SSL audit/fix:
bash scripts/verify/audit-npmplus-ssl-all-instances.shthenbash scripts/nginx-proxy-manager/fix-npmplus-ssl-issues.sh --dry-runand rerun without--dry-runon the primary instance. The scripts now handle both JSON bearer-token auth and cookie-session auth from NPMplus, and the fixer can renew expired cert bindings as well as fill missing certs, wrong-cert bindings, and Force SSL gaps. - Tunnel-backed NPM hosts: if a hostname is publicly served by a proxied Cloudflare tunnel
CNAMEto*.cfargotunnel.com, the SSL audit intentionally ignores origin-cert expiry or mismatch on that NPM host. Public TLS is terminated by Cloudflare in that mode, and the tunnel origin usesnoTLSVerifyby design. - Other NPMplus instances: the fleet scripts already assume a shared
NPM_EMAILacross instances. Rerun the same fix script withNPM_URL=https://<ip>:81and the matching per-instance password env vars such asNPM_PASSWORD_SECONDARY,NPM_PASSWORD_ALLTRA_HYBX,NPM_PASSWORD_FOURTH, orNPM_PASSWORD_MIFOS. If audit showsauth_failed, the repo cannot finish that from here without the correct UI password for that instance. - Alltra/HYBX tunnel migration:
bash scripts/cloudflare/configure-alltra-hybx-tunnel-and-dns.shis the preferred public-path repair forrpc-alltra*,rpc-hybx*,rpc-core-2, and the related service names on192.168.11.169. The script now replaces legacy directArecords with proxied tunnelCNAMEs when needed. - RPC TLS mismatch: if
rpc.defi-oracle.iohas a certificate attached but the browser still reports a hostname mismatch, the fix is to request or assign a certificate whose SAN/CN actually includesrpc.defi-oracle.io; Force SSL toggles alone will not fix that.
Environment
Set variables in .env or export before running. See project root .env.example and docs/04-configuration/VERIFICATION_GAPS_AND_TODOS.md.