Each node can serve GET /health (enable healthcheck in the configuration). It returns 200 when the node has connected to NATS and Consul and finished exchanging keys with its peers, and 503 until then, so use it for readiness, not liveness. Consul’s key-value store shows which nodes are registered (mpc_peers/) and which are ready (mpc_ready/).A node’s start-up sequence in the logs is: version banner → Connected to badger kv store → Loaded peers from consul → [READY] Node is ready → Starting consumers. Anything that stops short of [READY] is a configuration, identity or connectivity problem.
Logs go to standard output (containers) or the systemd journal (journalctl -u citadel-core). Search for keygen and signing with success to confirm operations, and for error to find failures. --debug at start-up adds protocol-level detail; do not leave it on in production.
With backup_enabled: true (the default) each node writes an encrypted backup of its share store to backup_dir every backup_period_seconds. The backups are encrypted with the same password as the store. Copy them off the host on a schedule, a CronJob to object storage on Kubernetes, AWS Backup on EFS for ECS, or your existing backup tooling for hosts.Three things must be backed up together, because each is useless without the others:
the share-store backups;
the node’s identity files (public and private);
the share-store password and identity password, held in your secrets manager.
A lost share-store password means the node’s shares are gone. The remaining nodes can still sign if they meet the threshold, and the lost node can be replaced by resharing, but that only works while enough nodes remain. Losing more than n − t nodes’ shares or passwords is unrecoverable.
Stop the node, run recover with the backup directory and the store path from db_path, supply the password, and start the node again. It rejoins with the shares it had at the time of the backup.
Upgrades are coordinated across the cluster: a signing session needs t nodes on compatible versions. Blockops publishes release notes with each version that say whether the protocol changed.
Kubernetes: update the StatefulSet image; the rolling update restarts one pod at a time while the others keep signing.
ECS: update each service’s task definition in turn.
systemd: replace the binaries and systemctl restart citadel-core one host at a time.
Restart nodes one at a time and wait for [READY] before moving on, so the cluster never drops below threshold. For a release that changes the protocol, schedule a maintenance window and follow the release’s resharing instructions.
Add the new node to peers.json and distribute the file.
Generate the new node’s identity; distribute its *_identity.json to every existing node and every node’s identity file to it.
Register the updated peers in Consul (or start the new node with --peers).
Deploy the new node.
Run a reshare from citadel-api so every wallet’s shares are regenerated for the new set of nodes. Resharing keeps every wallet’s public key and addresses; only the shares change.
If the threshold changes, update mpc_threshold on every node and restart them one at a time.
The same procedure retires a node: remove it from the registry, reshare to the smaller set, then decommission it and destroy its share store.
If a node’s storage is lost but its identity and passwords are intact, redeploy it with an empty store and reshare from citadel-api; the other nodes regenerate its shares. On Kubernetes, deleting the pod (and, if corrupted, its persistent volume claim) makes the StatefulSet recreate it. If the identity is lost as well, treat it as a new node.
Stop every node, then start them again; on Kubernetes scale the StatefulSet to 0 and back to 3. Nodes re-establish their peer sessions at start-up. Signing requests that arrive while the cluster is below threshold fail and are reported to citadel-api as failed, nothing is queued silently.
insufficient participants in the logs means fewer than t nodes were ready when a request arrived. Check that every pod or service is running, that all nodes are registered in Consul, and that mpc_threshold matches the cluster size.
{"docsConfig":{"theme":"palm","$schema":"https://mintlify.com/docs.json","name":"Blockops","colors":{"primary":"#045CF4","light":"#4286FC","dark":"#0346BB"},"logo":{"light":"https://mintcdn.com/blockops-3855c227/OGmnNOc7FURsTCyJ/images/logo-light.png?fit=max\u0026auto=format\u0026n=OGmnNOc7FURsTCyJ\u0026q=85\u0026s=d3c289c79894be543996ac099378cd53","dark":"https://mintcdn.com/blockops-3855c227/OGmnNOc7FURsTCyJ/images/logo-dark.png?fit=max\u0026auto=format\u0026n=OGmnNOc7FURsTCyJ\u0026q=85\u0026s=5a6f029e638834f78bf522386d1c0ae9","href":"https://blockops.network"},"favicon":"https://mintcdn.com/blockops-3855c227/OGmnNOc7FURsTCyJ/images/favicon.png?fit=max\u0026auto=format\u0026n=OGmnNOc7FURsTCyJ\u0026q=85\u0026s=0c407958b9ea2ad899e29b751dba48d2","appearance":{"default":"system"},"background":{"image":{"light":"https://mintcdn.com/blockops-3855c227/OGmnNOc7FURsTCyJ/images/background/dots-light.svg?fit=max\u0026auto=format\u0026n=OGmnNOc7FURsTCyJ\u0026q=85\u0026s=2f30d569f684a584a4ecec0f6583c470","dark":"https://mintcdn.com/blockops-3855c227/OGmnNOc7FURsTCyJ/images/background/dots-dark.svg?fit=max\u0026auto=format\u0026n=OGmnNOc7FURsTCyJ\u0026q=85\u0026s=a7a9ba8409a4ebe98101e1ca77882360"}},"footer":{"socials":{"x":"https://twitter.com/blockopsnetwork","github":"https://github.com/blockopsnetwork","discord":"https://discord.com/invite/nngqxkqdw8"}},"seo":{"metatags":{"description":"Core banking infrastructure for digital assets. Documentation for the Blockops platform.","og:site_name":"Blockops Docs"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"blockops-3855c227","hasAudioNarration":false,"actualSubdomain":"blockops-3855c227","customDomains":["docs.blockops.network"],"gitSource":{"type":"github","owner":"blockopsnetwork","repo":"blockops-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6a940118858a58a548e22f6e","collectionId":"b8d88b41-4888-423a-8d22-8c5352550ee9","liveDeploymentHistoryId":"6a940118858a58a548e22f6e","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6a940118858a58a548e22f6e","clientVersion":"0.0.4006","searchFilterCounts":[{"language":"default","tag":"Documentation","count":57},{"language":"default","tag":"API reference","count":42},{"language":"default","tag":"Endpoints","count":41},{"language":"default","tag":"Blockchain Infrastructure","count":20},{"language":"default","tag":"Blockchain API","count":11},{"language":"default","tag":"wallets","count":9},{"language":"default","tag":"webhooks","count":8},{"language":"default","tag":"Self-hosted signing","count":7},{"language":"default","tag":"Solutions","count":7},{"language":"default","tag":"Security \u0026 trust","count":6}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"self-hosted/operate","slug":"/self-hosted/operate","pageMetadata":{"title":"Operate a cluster","description":"Health, logs, backups, upgrades, adding nodes and recovering a lost node in a self-hosted citadel-core cluster.","href":"/self-hosted/operate"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Health, logs, backups, upgrades, adding nodes and recovering a lost node in a self-hosted citadel-core cluster.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`health`,children:`Health`}),`\n`,_jsxs(_components.p,{children:[`Each node can serve `,_jsx(_components.code,{children:`GET /health`}),` (enable `,_jsx(_components.code,{children:`healthcheck`}),` in the configuration). It returns `,_jsx(_components.code,{children:`200`}),` when the node has connected to NATS and Consul and finished exchanging keys with its peers, and `,_jsx(_components.code,{children:`503`}),` until then, so use it for readiness, not liveness. Consul’s key-value store shows which nodes are registered (`,_jsx(_components.code,{children:`mpc_peers/`}),`) and which are ready (`,_jsx(_components.code,{children:`mpc_ready/`}),`).`]}),`\n`,_jsxs(_components.p,{children:[`A node’s start-up sequence in the logs is: version banner → `,_jsx(_components.code,{children:`Connected to badger kv store`}),` → `,_jsx(_components.code,{children:`Loaded peers from consul`}),` → `,_jsx(_components.code,{children:`[READY] Node is ready`}),` → `,_jsx(_components.code,{children:`Starting consumers`}),`. Anything that stops short of `,_jsx(_components.code,{children:`[READY]`}),` is a configuration, identity or connectivity problem.`]}),`\n`,_jsx(Heading,{level:`2`,id:`logs`,children:`Logs`}),`\n`,_jsxs(_components.p,{children:[`Logs go to standard output (containers) or the systemd journal (`,_jsx(_components.code,{children:`journalctl -u citadel-core`}),`). Search for `,_jsx(_components.code,{children:`keygen`}),` and `,_jsx(_components.code,{children:`signing`}),` with `,_jsx(_components.code,{children:`success`}),` to confirm operations, and for `,_jsx(_components.code,{children:`error`}),` to find failures. `,_jsx(_components.code,{children:`--debug`}),` at start-up adds protocol-level detail; do not leave it on in production.`]}),`\n`,_jsx(Heading,{level:`2`,id:`backups`,children:`Backups`}),`\n`,_jsxs(_components.p,{children:[`With `,_jsx(_components.code,{children:`backup_enabled: true`}),` (the default) each node writes an encrypted backup of its share store to `,_jsx(_components.code,{children:`backup_dir`}),` every `,_jsx(_components.code,{children:`backup_period_seconds`}),`. The backups are encrypted with the same password as the store. Copy them off the host on a schedule, a CronJob to object storage on Kubernetes, AWS Backup on EFS for ECS, or your existing backup tooling for hosts.`]}),`\n`,_jsx(_components.p,{children:`Three things must be backed up together, because each is useless without the others:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`the share-store backups;`}),`\n`,_jsx(_components.li,{children:`the node’s identity files (public and private);`}),`\n`,_jsx(_components.li,{children:`the share-store password and identity password, held in your secrets manager.`}),`\n`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`A lost share-store password means the node’s shares are gone. The remaining nodes can still sign if they meet the threshold, and the lost node can be replaced by resharing, but that only works while enough nodes remain. Losing more than `,_jsx(_components.code,{children:`n − t`}),` nodes’ shares or passwords is unrecoverable.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`restore-a-node’s-share-store`,children:`Restore a node’s share store`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`citadel-core-cli`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` recover`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --backup-dir`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`backup`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`s`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`>`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --recovery-path`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`db`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` pat`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`h`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [--force]`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Stop the node, run `,_jsx(_components.code,{children:`recover`}),` with the backup directory and the store path from `,_jsx(_components.code,{children:`db_path`}),`, supply the password, and start the node again. It rejoins with the shares it had at the time of the backup.`]}),`\n`,_jsx(Heading,{level:`2`,id:`upgrades`,children:`Upgrades`}),`\n`,_jsxs(_components.p,{children:[`Upgrades are coordinated across the cluster: a signing session needs `,_jsx(_components.code,{children:`t`}),` nodes on compatible versions. Blockops publishes release notes with each version that say whether the protocol changed.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Kubernetes:`}),` update the StatefulSet image; the rolling update restarts one pod at a time while the others keep signing.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`ECS:`}),` update each service’s task definition in turn.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`systemd:`}),` replace the binaries and `,_jsx(_components.code,{children:`systemctl restart citadel-core`}),` one host at a time.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Restart nodes one at a time and wait for `,_jsx(_components.code,{children:`[READY]`}),` before moving on, so the cluster never drops below threshold. For a release that changes the protocol, schedule a maintenance window and follow the release’s resharing instructions.`]}),`\n`,_jsx(Heading,{level:`2`,id:`add-a-node-or-change-the-threshold`,children:`Add a node or change the threshold`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Add the new node to `,_jsx(_components.code,{children:`peers.json`}),` and distribute the file.`]}),`\n`,_jsxs(_components.li,{children:[`Generate the new node’s identity; distribute its `,_jsx(_components.code,{children:`*_identity.json`}),` to every existing node and every node’s identity file to it.`]}),`\n`,_jsxs(_components.li,{children:[`Register the updated peers in Consul (or start the new node with `,_jsx(_components.code,{children:`--peers`}),`).`]}),`\n`,_jsx(_components.li,{children:`Deploy the new node.`}),`\n`,_jsxs(_components.li,{children:[`Run a `,_jsx(_components.strong,{children:`reshare`}),` from citadel-api so every wallet’s shares are regenerated for the new set of nodes. Resharing keeps every wallet’s public key and addresses; only the shares change.`]}),`\n`,_jsxs(_components.li,{children:[`If the threshold changes, update `,_jsx(_components.code,{children:`mpc_threshold`}),` on every node and restart them one at a time.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`The same procedure retires a node: remove it from the registry, reshare to the smaller set, then decommission it and destroy its share store.`}),`\n`,_jsx(Heading,{level:`2`,id:`recover-a-lost-node`,children:`Recover a lost node`}),`\n`,_jsx(_components.p,{children:`If a node’s storage is lost but its identity and passwords are intact, redeploy it with an empty store and reshare from citadel-api; the other nodes regenerate its shares. On Kubernetes, deleting the pod (and, if corrupted, its persistent volume claim) makes the StatefulSet recreate it. If the identity is lost as well, treat it as a new node.`}),`\n`,_jsx(Heading,{level:`2`,id:`full-cluster-restart`,children:`Full cluster restart`}),`\n`,_jsxs(_components.p,{children:[`Stop every node, then start them again; on Kubernetes scale the StatefulSet to `,_jsx(_components.code,{children:`0`}),` and back to `,_jsx(_components.code,{children:`3`}),`. Nodes re-establish their peer sessions at start-up. Signing requests that arrive while the cluster is below threshold fail and are reported to citadel-api as failed, nothing is queued silently.`]}),`\n`,_jsx(Heading,{level:`2`,id:`threshold-not-met`,children:`Threshold not met`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`insufficient participants`}),` in the logs means fewer than `,_jsx(_components.code,{children:`t`}),` nodes were ready when a request arrived. Check that every pod or service is running, that all nodes are registered in Consul, and that `,_jsx(_components.code,{children:`mpc_threshold`}),` matches the cluster size.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Operate a cluster","description":"Health, logs, backups, upgrades, adding nodes and recovering a lost node in a self-hosted citadel-core cluster.","href":"/self-hosted/operate"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Health","slug":"health","depth":2,"children":[]},{"title":"Logs","slug":"logs","depth":2,"children":[]},{"title":"Backups","slug":"backups","depth":2,"children":[]},{"title":"Restore a node’s share store","slug":"restore-a-node’s-share-store","depth":2,"children":[]},{"title":"Upgrades","slug":"upgrades","depth":2,"children":[]},{"title":"Add a node or change the threshold","slug":"add-a-node-or-change-the-threshold","depth":2,"children":[]},{"title":"Recover a lost node","slug":"recover-a-lost-node","depth":2,"children":[]},{"title":"Full cluster restart","slug":"full-cluster-restart","depth":2,"children":[]},{"title":"Threshold not met","slug":"threshold-not-met","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"blockops-3855c227","siteName":"Blockops","title":"Operate a cluster - Blockops","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-08-30T10:08:43.963Z","originalFileLocation":"self-hosted/operate.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Health, logs, backups, upgrades, adding nodes and recovering a lost node in a self-hosted citadel-core cluster.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Blockops\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/blockops-3855c227/pn3GVmhy1yY9Iw6W/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/blockops-3855c227/pn3GVmhy1yY9Iw6W/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/blockops-3855c227/pn3GVmhy1yY9Iw6W/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/blockops-3855c227/pn3GVmhy1yY9Iw6W/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/blockops-3855c227/pn3GVmhy1yY9Iw6W/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/blockops-3855c227/pn3GVmhy1yY9Iw6W/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/blockops-3855c227/pn3GVmhy1yY9Iw6W/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/blockops-3855c227/pn3GVmhy1yY9Iw6W/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/blockops-3855c227/pn3GVmhy1yY9Iw6W/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Operate a cluster - Blockops\">\u003cmeta data-mint-head property=\"og:description\" content=\"Health, logs, backups, upgrades, adding nodes and recovering a lost node in a self-hosted citadel-core cluster.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Blockops Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.blockops.network/self-hosted/operate\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://blockops-3855c227.mintlify.app/_mintlify/api/og/v2?division=Self-hosted+signing\u0026amp;title=Operate+a+cluster\u0026amp;description=Health%2C+logs%2C+backups%2C+upgrades%2C+adding+nodes+and+recovering+a+lost+node+in+a+self-hosted+citadel-core+cluster.\u0026amp;theme=82b06bb4a99adf5e0ef9831d\u0026amp;signature=96b4ccb4f8548c439083c0fdb6d57b87f130719db7181552e9c0cbf1166cfc8c\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Operate a cluster - Blockops\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Health, logs, backups, upgrades, adding nodes and recovering a lost node in a self-hosted citadel-core cluster.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://blockops-3855c227.mintlify.app/_mintlify/api/og/v2?division=Self-hosted+signing\u0026amp;title=Operate+a+cluster\u0026amp;description=Health%2C+logs%2C+backups%2C+upgrades%2C+adding+nodes+and+recovering+a+lost+node+in+a+self-hosted+citadel-core+cluster.\u0026amp;theme=82b06bb4a99adf5e0ef9831d\u0026amp;signature=96b4ccb4f8548c439083c0fdb6d57b87f130719db7181552e9c0cbf1166cfc8c\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/blockops-3855c227/pn3GVmhy1yY9Iw6W/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Blockops\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#045CF4\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.blockops.network/self-hosted/operate\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/self-hosted/operate.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.blockops.network/#organization\",\"name\":\"Blockops\",\"url\":\"https://docs.blockops.network\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/blockops-3855c227/OGmnNOc7FURsTCyJ/images/logo-light.png?fit=max\u0026auto=format\u0026n=OGmnNOc7FURsTCyJ\u0026q=85\u0026s=d3c289c79894be543996ac099378cd53\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.blockops.network#website\",\"name\":\"Blockops\",\"url\":\"https://docs.blockops.network\",\"publisher\":{\"@id\":\"https://docs.blockops.network/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.blockops.network/self-hosted/operate#webpage\",\"url\":\"https://docs.blockops.network/self-hosted/operate\",\"name\":\"Operate a cluster\",\"description\":\"Health, logs, backups, upgrades, adding nodes and recovering a lost node in a self-hosted citadel-core cluster.\",\"dateModified\":\"2026-08-30T10:08:43.963Z\",\"isPartOf\":{\"@id\":\"https://docs.blockops.network#website\"},\"breadcrumb\":{\"@id\":\"https://docs.blockops.network/self-hosted/operate#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.blockops.network/self-hosted/operate#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Self-hosted signing\",\"item\":\"https://docs.blockops.network/self-hosted/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Operate a cluster\",\"item\":\"https://docs.blockops.network/self-hosted/operate\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.blockops.network/self-hosted/operate#article\",\"headline\":\"Operate a cluster\",\"name\":\"Operate a cluster\",\"description\":\"Health, logs, backups, upgrades, adding nodes and recovering a lost node in a self-hosted citadel-core cluster.\",\"url\":\"https://docs.blockops.network/self-hosted/operate\",\"mainEntityOfPage\":{\"@id\":\"https://docs.blockops.network/self-hosted/operate#webpage\"},\"dateModified\":\"2026-08-30T10:08:43.963Z\",\"publisher\":{\"@id\":\"https://docs.blockops.network/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.blockops.network#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Blockops\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Blockops","nav":{"global":null,"tabs":[{"tab":"Documentation","groups":[{"group":"Introduction","pages":[{"title":"Welcome to Blockops","sidebarTitle":"Welcome","href":"/welcome"},{"title":"Quickstart: first wallet and transaction","sidebarTitle":"Quickstart","href":"/get-started/first-wallet-and-transaction"}]},{"group":"Core concepts","pages":[{"title":"What is Blockops?","sidebarTitle":"What is Blockops?","href":"/overview/what-is-blockops"},{"title":"Platform architecture","href":"/overview/platform-architecture"},{"title":"Core concepts","href":"/overview/core-concepts"},{"title":"Deployment models","href":"/overview/deployment-models"}]},{"group":"Security \u0026 trust","pages":[{"title":"How the platform is secured","href":"/security/how-the-platform-is-secured"},{"title":"Who holds the keys","href":"/security/who-holds-the-keys"},{"title":"Threshold signing with citadel-core","href":"/security/threshold-signing"},{"title":"Access control","href":"/security/access-control"},{"title":"Continuity and recovery","href":"/security/continuity-and-recovery"},{"title":"Compliance \u0026 assurance","href":"/security/compliance-and-assurance"}]},{"group":"Wallets \u0026 signing","pages":[{"title":"MPC Wallet Infrastructure","sidebarTitle":"Overview","href":"/wallets/overview"},{"title":"Wallets \u0026 accounts","href":"/wallets/wallets-and-accounts"},{"title":"Transactions \u0026 signing","href":"/wallets/transactions-and-signing"},{"title":"Policies \u0026 approvals","href":"/wallets/policies-and-approvals"},{"title":"Webhooks \u0026 events","href":"/wallets/webhooks-and-events"},{"title":"Reporting \u0026 audit trail","href":"/wallets/reporting-and-audit"}]},{"group":"Networks","pages":[{"title":"Supported networks \u0026 assets","href":"/overview/supported-networks"}]},{"group":"Solutions","pages":[{"group":"Payments","pages":[{"title":"Automate deposits","href":"/solutions/payments/automate-deposits"},{"title":"Automate payments","href":"/solutions/payments/automate-payments"}]},{"group":"Custody","pages":[{"title":"Accept cryptocurrencies","href":"/solutions/custody/accept-cryptocurrencies"},{"title":"Govern wallet access","href":"/solutions/custody/govern-wallet-access"},{"title":"Embed user wallets","href":"/solutions/custody/embed-user-wallets"}]},{"group":"Compliance","pages":[{"title":"Define treasury policies","href":"/solutions/compliance/define-treasury-policies"},{"title":"Build programmable approval policies","href":"/solutions/compliance/build-programmable-approval-policies"}]}]},{"group":"Self-hosted signing","pages":[{"title":"Self-hosted signing","sidebarTitle":"Overview","href":"/self-hosted/overview"},{"title":"Install on Linux hosts (systemd)","sidebarTitle":"Install: systemd","href":"/self-hosted/install-systemd"},{"title":"Install on Kubernetes","sidebarTitle":"Install: Kubernetes","href":"/self-hosted/install-kubernetes"},{"title":"Install on AWS ECS Fargate","sidebarTitle":"Install: AWS ECS","href":"/self-hosted/install-ecs"},{"title":"Configuration reference","description":"Every citadel-core configuration key, environment override, command-line flag and CLI command.","href":"/self-hosted/configuration"},{"title":"Operate a cluster","href":"/self-hosted/operate"},{"title":"Security checklist","description":"The controls a self-hosted citadel-core deployment must have in place before it holds production key shares.","href":"/self-hosted/security-checklist"}]},{"group":"Blockchain Infrastructure","pages":[{"title":"Blockchain Infrastructure","sidebarTitle":"Overview","href":"/blockchain-infrastructure/overview"},{"group":"Getting started","pages":[{"title":"Getting started with the Blockchain API","sidebarTitle":"Overview","href":"/get-started/overview"},{"title":"How to create an account","sidebarTitle":"Create your account","href":"/get-started/create-your-account"}]},{"group":"Blockchain API","pages":[{"title":"Blockchain API","href":"/blockchain-infrastructure/blockchain-api/overview"},{"title":"Endpoints, keys \u0026 authentication","href":"/blockchain-infrastructure/blockchain-api/endpoints-and-authentication"},{"title":"Rate limits \u0026 error codes","href":"/blockchain-infrastructure/blockchain-api/rate-limits-and-errors"},{"title":"Common RPC methods \u0026 examples","href":"/blockchain-infrastructure/blockchain-api/rpc-methods-and-examples"},{"title":"Ethereum","href":"/blockchain-infrastructure/blockchain-api/networks/ethereum"},{"title":"Base","href":"/blockchain-infrastructure/blockchain-api/networks/base"},{"title":"Optimism","href":"/blockchain-infrastructure/blockchain-api/networks/optimism"},{"title":"Polkadot","href":"/blockchain-infrastructure/blockchain-api/networks/polkadot"},{"title":"Kusama","href":"/blockchain-infrastructure/blockchain-api/networks/kusama"},{"title":"Westend","href":"/blockchain-infrastructure/blockchain-api/networks/westend"},{"title":"Gargantua","sidebarTitle":"Hyperbridge (Gargantua testnet)","href":"/blockchain-infrastructure/blockchain-api/networks/gargantua"}]},{"group":"Node operations (Mission Control)","pages":[{"title":"Mission Control","sidebarTitle":"Node operations (Mission Control)","href":"/blockchain-infrastructure/node-operations/overview"},{"title":"Node Deployment","sidebarTitle":"Deploy a node","href":"/blockchain-infrastructure/node-operations/deploy-a-node"},{"title":"Private Servers Deployment","sidebarTitle":"Deploy to your own servers","href":"/blockchain-infrastructure/node-operations/deploy-to-your-own-servers"}]},{"title":"Telescope","sidebarTitle":"Monitoring \u0026 alerting (Telescope)","href":"/blockchain-infrastructure/monitoring-and-alerting"},{"title":"Pulsar","sidebarTitle":"Indexing (Pulsar)","href":"/blockchain-infrastructure/indexing"},{"title":"Rollup Deployment","sidebarTitle":"Rollups","href":"/blockchain-infrastructure/rollups"}]},{"group":"Resources","pages":[{"title":"Glossary","href":"/overview/glossary"},{"title":"Frequently asked questions","sidebarTitle":"FAQ","href":"/resources/faq"},{"title":"Blog","href":"/resources/blog"},{"title":"Support","href":"/get-started/support"}]}]},{"tab":"API reference","pages":[{"title":"API reference","href":"/api-reference/introduction"}]}]},"title":"Operate a cluster - Blockops","buildId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","deploymentId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","dynamics":[],"chunks":[]}