New advanced.block-broadcast-fallback union:
* enabled (default: false)
* grace-seconds (default: 30, range 10-600)
* backup-rpcs: list of full bitcoind RPC URLs, with inline
credentials supported (https://user:pass@host:port/). Up to 10.
docker_entrypoint reads the list with yq, joins with newlines, and
exports BACKUP_RPC_URLS plus PENDING_BLOCKS_DIR=<logdir>/pending-blocks
and PENDING_BLOCKS_GRACE so kamado-api's blocksubmit watcher activates.
If the user enables the fallback but provides no URLs, we log a
warning and disable rather than spam pending-block warnings.
The companion ckpool patch (KamadoPool repo, 0004-dump-pending-block-
for-fallback) writes raw block hex to PENDING_BLOCKS_DIR before each
submit attempt and unlinks on success. The watcher only fires if
ckpool's primary submit fails AND the operator configured backup RPCs.
261 lines
9.3 KiB
TypeScript
261 lines
9.3 KiB
TypeScript
import { compat, types as T } from "../deps.ts";
|
|
|
|
export const getConfig: T.ExpectedExports.getConfig = compat.getConfig({
|
|
"bitcoind": {
|
|
"type": "union",
|
|
"name": "Bitcoin Core",
|
|
"description":
|
|
"Select which Bitcoin Core node Kamado should use. Both variants work — pick whichever is installed on your server.",
|
|
"tag": {
|
|
"id": "type",
|
|
"name": "Network",
|
|
"description": "Mainnet bitcoind or the testnet4 variant.",
|
|
"variant-names": {
|
|
"bitcoind": "Bitcoin Core (mainnet)",
|
|
"bitcoind-testnet": "Bitcoin Core (testnet4)",
|
|
},
|
|
},
|
|
"default": "bitcoind",
|
|
"variants": {
|
|
"bitcoind": {
|
|
"user": {
|
|
"type": "pointer",
|
|
"name": "RPC Username",
|
|
"description": "The RPC username from Bitcoin Core.",
|
|
"subtype": "package",
|
|
"package-id": "bitcoind",
|
|
"target": "config",
|
|
"multi": false,
|
|
"selector": "$.rpc.username",
|
|
},
|
|
"password": {
|
|
"type": "pointer",
|
|
"name": "RPC Password",
|
|
"description": "The RPC password from Bitcoin Core.",
|
|
"subtype": "package",
|
|
"package-id": "bitcoind",
|
|
"target": "config",
|
|
"multi": false,
|
|
"selector": "$.rpc.password",
|
|
},
|
|
},
|
|
"bitcoind-testnet": {
|
|
"user": {
|
|
"type": "pointer",
|
|
"name": "RPC Username",
|
|
"description": "The RPC username from Bitcoin Core (testnet4).",
|
|
"subtype": "package",
|
|
"package-id": "bitcoind-testnet",
|
|
"target": "config",
|
|
"multi": false,
|
|
"selector": "$.rpc.username",
|
|
},
|
|
"password": {
|
|
"type": "pointer",
|
|
"name": "RPC Password",
|
|
"description": "The RPC password from Bitcoin Core (testnet4).",
|
|
"subtype": "package",
|
|
"package-id": "bitcoind-testnet",
|
|
"target": "config",
|
|
"multi": false,
|
|
"selector": "$.rpc.password",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
"stratum-port": {
|
|
"type": "number",
|
|
"name": "Stratum Port",
|
|
"description":
|
|
"TCP port the plaintext stratum server listens on inside the container. Most miners connect here.",
|
|
"nullable": false,
|
|
"default": 3333,
|
|
"range": "[1,65535]",
|
|
"integral": true,
|
|
},
|
|
"tls": {
|
|
"type": "union",
|
|
"name": "Stratum TLS",
|
|
"description":
|
|
"Optionally accept stratum connections over TLS via an stunnel sidecar. A self-signed certificate is generated once on first start and persisted — miners must connect with TLS verification disabled (stratum+ssl:// plus a skip-verify flag).",
|
|
"tag": {
|
|
"id": "enabled",
|
|
"name": "Mode",
|
|
"description": "Disable or enable TLS termination.",
|
|
"variant-names": {
|
|
"disabled": "Disabled",
|
|
"enabled": "Enabled",
|
|
},
|
|
},
|
|
"default": "disabled",
|
|
"variants": {
|
|
"disabled": {},
|
|
"enabled": {
|
|
"port": {
|
|
"type": "number",
|
|
"name": "TLS Port",
|
|
"description":
|
|
"TCP port stunnel listens on for TLS stratum connections.",
|
|
"nullable": false,
|
|
"default": 3334,
|
|
"range": "[1,65535]",
|
|
"integral": true,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
"advanced": {
|
|
"type": "object",
|
|
"name": "Advanced",
|
|
"description":
|
|
"Fine-tuning knobs for vardiff, logging, and block notifications. Safe to ignore — the defaults work well for Bitaxe-class miners.",
|
|
"spec": {
|
|
"pool-identifier": {
|
|
"type": "string",
|
|
"name": "Coinbase Tag",
|
|
"description":
|
|
"Short string embedded in the coinbase transaction of solved blocks.",
|
|
"nullable": false,
|
|
"default": "/Kamado/",
|
|
"masked": false,
|
|
"copyable": false,
|
|
},
|
|
"startdiff": {
|
|
"type": "number",
|
|
"name": "Starting Difficulty",
|
|
"description":
|
|
"Initial vardiff target for new miner connections. Bitaxe-class miners typically land around 16384.",
|
|
"nullable": false,
|
|
"default": 16384,
|
|
"range": "[1,*)",
|
|
"integral": true,
|
|
},
|
|
"mindiff": {
|
|
"type": "number",
|
|
"name": "Minimum Difficulty",
|
|
"description": "Floor for the vardiff algorithm.",
|
|
"nullable": false,
|
|
"default": 1000,
|
|
"range": "[1,*)",
|
|
"integral": true,
|
|
},
|
|
"maxdiff": {
|
|
"type": "number",
|
|
"name": "Maximum Difficulty",
|
|
"description":
|
|
"Ceiling for the vardiff algorithm. 0 means no cap.",
|
|
"nullable": false,
|
|
"default": 0,
|
|
"range": "[0,*)",
|
|
"integral": true,
|
|
},
|
|
"dropidle": {
|
|
"type": "number",
|
|
"name": "Drop Idle (seconds)",
|
|
"description":
|
|
"Disconnect clients that have not submitted a share in this many seconds. 0 disables the idle disconnect.",
|
|
"nullable": false,
|
|
"default": 0,
|
|
"range": "[0,*)",
|
|
"integral": true,
|
|
},
|
|
"zmq-enabled": {
|
|
"type": "boolean",
|
|
"name": "Enable ZMQ Block Notifications",
|
|
"description":
|
|
"Subscribe to Bitcoin Core's hashblock ZMQ topic for sub-second chain refresh on the dashboard. Requires zmqpubhashblock on bitcoind.",
|
|
"default": true,
|
|
},
|
|
"log-level": {
|
|
"type": "enum",
|
|
"name": "Log Level",
|
|
"description": "Verbosity of the kamado-api log output.",
|
|
"values": ["debug", "info", "warn", "error"],
|
|
"value-names": {
|
|
"debug": "Debug",
|
|
"info": "Info",
|
|
"warn": "Warn",
|
|
"error": "Error",
|
|
},
|
|
"default": "info",
|
|
},
|
|
"mempool-explorer": {
|
|
"type": "union",
|
|
"name": "Block Explorer",
|
|
"description":
|
|
"Where Kamado's UI links should send you when you click a block hash or a user's BTC address. Defaults to mempool.space (the public instance). Switch to 'Custom' to point Kamado at a self-hosted mempool.space mirror — useful if you run mempool as another StartOS service or on the same network.",
|
|
"tag": {
|
|
"id": "type",
|
|
"name": "Source",
|
|
"description": "Public mempool.space, or your own instance.",
|
|
"variant-names": {
|
|
"default": "mempool.space (default)",
|
|
"custom": "Custom URL",
|
|
},
|
|
},
|
|
"default": "default",
|
|
"variants": {
|
|
"default": {},
|
|
"custom": {
|
|
"url": {
|
|
"type": "string",
|
|
"name": "Mempool URL",
|
|
"description":
|
|
"Base URL of your mempool instance, e.g. https://mempool.example.com. Kamado will append /address/<addr> and /block/<hash> to it, so the instance must follow the standard mempool.space URL layout.",
|
|
"nullable": false,
|
|
"default": "",
|
|
"pattern": "^https?://[^\\s]+$",
|
|
"pattern-description":
|
|
"Must be an http:// or https:// URL with no whitespace.",
|
|
"masked": false,
|
|
"copyable": false,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
"block-broadcast-fallback": {
|
|
"type": "object",
|
|
"name": "Block Broadcast Fallback",
|
|
"description":
|
|
"Safety net for the moment a share meets network difficulty. ckpool always submits the block to its primary bitcoind first; if that fails (bitcoind crashed, RPC saturated, peering broken), kamado-api re-broadcasts the raw block to one or more backup RPC URLs you list here. A block is only re-submitted if it hasn't been accepted within the grace window — well-behaved primaries are never disturbed.",
|
|
"spec": {
|
|
"enabled": {
|
|
"type": "boolean",
|
|
"name": "Enable fallback broadcaster",
|
|
"description":
|
|
"Off by default. Turning on requires at least one Backup RPC URL — without one we'd just log warnings about pending blocks we can't help with.",
|
|
"default": false,
|
|
},
|
|
"grace-seconds": {
|
|
"type": "number",
|
|
"name": "Grace period (seconds)",
|
|
"description":
|
|
"How long a block waits before kamado-api considers ckpool's submission attempt failed and broadcasts via fallback. 30s gives ckpool's own retry loop room to succeed against the primary.",
|
|
"nullable": false,
|
|
"range": "[10,600]",
|
|
"integral": true,
|
|
"units": "seconds",
|
|
"default": 30,
|
|
},
|
|
"backup-rpcs": {
|
|
"type": "list",
|
|
"name": "Backup Bitcoin RPC URLs",
|
|
"description":
|
|
"Each entry is a full bitcoind RPC URL, optionally with credentials inline (https://user:pass@host:8332/). Used in order. Anything that speaks the standard JSON-RPC submitblock method works — a second self-hosted bitcoind, an authenticated public RPC service (Quicknode, GetBlock.io, Allnodes, etc.), or a peer node you trust. Leaving this empty disables the broadcaster.",
|
|
"subtype": "string",
|
|
"spec": {
|
|
"pattern": "^https?://[^\\s]+$",
|
|
"pattern-description":
|
|
"Must be an http:// or https:// URL with no whitespace.",
|
|
"masked": false,
|
|
"copyable": false,
|
|
},
|
|
"default": [],
|
|
"range": "[0,10]",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
});
|