Run citadel-core signing nodes as Fargate tasks with Secrets Manager, S3 and EFS.
This guide deploys citadel-core on ECS Fargate: one service per node, secrets from AWS Secrets Manager, configuration and identity files from S3, and the encrypted share store on EFS. Infrastructure is expected to be provisioned with Terraform; this page covers what the application needs from it.
Run these on a dedicated, ephemeral workstation (a temporary instance in a private subnet or an air-gapped machine) and wipe it after uploading the outputs. Never on a laptop or shared host.
citadel-core-cli generate-peers -n 3citadel-core-cli generate-initiator --encrypt # private key → citadel-api; public key → config.yamlfor node in node0 node1 node2; do citadel-core-cli generate-identity --node "$node" --peers ./peers.json \ --output-dir ./identity/"$node" --encryptdoneopenssl rand -hex 32 # chain_code, shared by every node
Generate a share-store password per node and record it with each node’s identity password.
Encrypted at rest; mount targets in every task subnet; one access point per node rooted at /node0, /node1, /node2, owned by 65532:65532. Enable AWS Backup on the file system.
Secrets Manager
Per node: citadel-core/<node>/db-password and citadel-core/<node>/identity-password, stored as plain strings.
S3
A bucket with public access blocked: citadel-core/peers.json plus citadel-core/<node>/config.yaml and citadel-core/<node>/identity/ for each node. TLS certificates under citadel-core/certs/ if NATS uses mTLS.
CloudWatch Logs
Log group /ecs/citadel-core, retention set (30 days is a reasonable default).
ECS
A Fargate cluster; one service per node with desired_count = 1, maximum_percent = 100 and minimum_healthy_percent = 0, so two instances of a node never hold the share store’s lock at once. Private subnets, no public IP.
Security group
Egress only: NATS 4222, Consul 8500, EFS 2049, and 443 to S3, Secrets Manager and ECR (through VPC endpoints or NAT).
Execution role:AmazonECSTaskExecutionRolePolicy plus logs:CreateLogStream, logs:PutLogEvents and logs:CreateLogGroup on the log group.
Task role:secretsmanager:GetSecretValue on secret:citadel-core/*; s3:GetObject and s3:ListBucket on the bucket’s citadel-core/* prefix; elasticfilesystem:ClientMount, ClientWrite and ClientRootAccess on the file system.
Leave the NATS and Consul addresses empty in config.yaml and inject them as the NATS_URL and CONSUL_ADDRESS environment variables on the citadel-core container; the same file then works in every environment.
environment: productiondb_path: /app/data/dbbackup_dir: /app/data/backupsconsul: address: "" # set by CONSUL_ADDRESSnats: url: "" # set by NATS_URL # username / password / tls block when NATS requires themmpc_threshold: 2event_initiator_pubkey: <initiator public key>event_initiator_algorithm: ed25519chain_code: <64-character hex>max_concurrent_keygen: 3max_concurrent_signing: 10backup_enabled: truebackup_period_seconds: 300healthcheck: enabled: true address: "0.0.0.0:8080"
The data volume is the node’s EFS access point with transit encryption and IAM authorisation enabled. secrets, config and identity are ephemeral task volumes written by the init containers. Passing --peers makes each node sync the registry into Consul at start-up, so no separate register-peers step is needed.
CloudWatch should show, in order: the version banner, Connected to badger kv store, Loaded peers from consul, [READY] Node is ready, Starting consumers. GET /health on port 8080 reports readiness; add an ECS healthCheck on it if you want the service to track container health (allow a startPeriod of about 60 seconds).
Task role lacks Secrets Manager or S3 permission; secret name or S3 path mismatch; identity files not uploaded.
Task stuck in PROVISIONING
No EFS mount target in the subnet; security group blocks 2049; image pull failure.
Share-store error at start
Password in Secrets Manager differs from the one the store was created with; it cannot be changed after creation. Or the access point UID/GID is not 65532.
Failed to decrypt private key
Identity password mismatch, or the .age file was corrupted in upload.
Health check failing
healthcheck.enabled is false, or address is localhost rather than 0.0.0.0:8080.
{"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.4021","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":"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":"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":"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/install-ecs","slug":"/self-hosted/install-ecs","pageMetadata":{"title":"Install on AWS ECS Fargate","sidebarTitle":"Install: AWS ECS","description":"Run citadel-core signing nodes as Fargate tasks with Secrets Manager, S3 and EFS.","href":"/self-hosted/install-ecs"},"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: \"Run citadel-core signing nodes as Fargate tasks with Secrets Manager, S3 and EFS.\"\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={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`This guide deploys citadel-core on ECS Fargate: one service per node, secrets from AWS Secrets Manager, configuration and identity files from S3, and the encrypted share store on EFS. Infrastructure is expected to be provisioned with Terraform; this page covers what the application needs from it.`}),`\n`,_jsx(Heading,{level:`2`,id:`how-a-task-is-put-together`,children:`How a task is put together`}),`\n`,_jsx(_components.p,{children:`Each task runs four containers in sequence:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`init-secrets`}),`: reads the share-store and identity passwords from Secrets Manager into a shared `,_jsx(_components.code,{children:`/secrets`}),` volume.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`init-config`}),`: downloads `,_jsx(_components.code,{children:`config.yaml`}),`, `,_jsx(_components.code,{children:`peers.json`}),` and the node’s identity files from S3.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`init-data`}),`: copies the identity files and `,_jsx(_components.code,{children:`peers.json`}),` onto EFS so they survive restarts.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`citadel-core`}),`: the node itself: distroless, non-root (UID 65532), read-only root filesystem, reading everything above from mounted volumes.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`The main container has no shell, so every secret must already be a file by the time it starts.`}),`\n`,_jsx(Heading,{level:`2`,id:`generate-key-material`,children:`Generate key material`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Run these on a dedicated, ephemeral workstation (a temporary instance in a private subnet or an air-gapped machine) and wipe it after uploading the outputs. Never on a laptop or shared host.`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,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:`7`,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:` generate-peers`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -n`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 3`})]}),`\n`,_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:` generate-initiator`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --encrypt`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # private key → citadel-api; public key → config.yaml`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`for`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` node`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` in`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` node0`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` node1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` node2`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`; `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`do`})]}),`\n`,_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:` generate-identity`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --node`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$node`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --peers`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ./peers.json`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --output-dir`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ./identity/\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$node`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --encrypt`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`done`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`openssl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` rand`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -hex`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 32`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # chain_code, shared by every node`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Generate a share-store password per node and record it with each node’s identity password.`}),`\n`,_jsx(Heading,{level:`2`,id:`aws-resources`,children:`AWS resources`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{style:{textAlign:`left`},children:`Resource`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Requirement`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`ECR`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`A repository holding the citadel-core image.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`EFS`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Encrypted at rest; mount targets in every task subnet; `,_jsx(_components.strong,{children:`one access point per node`}),` rooted at `,_jsx(_components.code,{children:`/node0`}),`, `,_jsx(_components.code,{children:`/node1`}),`, `,_jsx(_components.code,{children:`/node2`}),`, owned by `,_jsx(_components.code,{children:`65532:65532`}),`. Enable AWS Backup on the file system.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Secrets Manager`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Per node: `,_jsx(_components.code,{children:`citadel-core/\u003cnode>/db-password`}),` and `,_jsx(_components.code,{children:`citadel-core/\u003cnode>/identity-password`}),`, stored as plain strings.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`S3`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`A bucket with public access blocked: `,_jsx(_components.code,{children:`citadel-core/peers.json`}),` plus `,_jsx(_components.code,{children:`citadel-core/\u003cnode>/config.yaml`}),` and `,_jsx(_components.code,{children:`citadel-core/\u003cnode>/identity/`}),` for each node. TLS certificates under `,_jsx(_components.code,{children:`citadel-core/certs/`}),` if NATS uses mTLS.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`CloudWatch Logs`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Log group `,_jsx(_components.code,{children:`/ecs/citadel-core`}),`, retention set (30 days is a reasonable default).`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`ECS`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`A Fargate cluster; `,_jsxs(_components.strong,{children:[`one service per node with `,_jsx(_components.code,{children:`desired_count = 1`})]}),`, `,_jsx(_components.code,{children:`maximum_percent = 100`}),` and `,_jsx(_components.code,{children:`minimum_healthy_percent = 0`}),`, so two instances of a node never hold the share store’s lock at once. Private subnets, no public IP.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Security group`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Egress only: NATS `,_jsx(_components.code,{children:`4222`}),`, Consul `,_jsx(_components.code,{children:`8500`}),`, EFS `,_jsx(_components.code,{children:`2049`}),`, and `,_jsx(_components.code,{children:`443`}),` to S3, Secrets Manager and ECR (through VPC endpoints or NAT).`]})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`iam`,children:`IAM`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Execution role:`}),` `,_jsx(_components.code,{children:`AmazonECSTaskExecutionRolePolicy`}),` plus `,_jsx(_components.code,{children:`logs:CreateLogStream`}),`, `,_jsx(_components.code,{children:`logs:PutLogEvents`}),` and `,_jsx(_components.code,{children:`logs:CreateLogGroup`}),` on the log group.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Task role:`}),` `,_jsx(_components.code,{children:`secretsmanager:GetSecretValue`}),` on `,_jsx(_components.code,{children:`secret:citadel-core/*`}),`; `,_jsx(_components.code,{children:`s3:GetObject`}),` and `,_jsx(_components.code,{children:`s3:ListBucket`}),` on the bucket’s `,_jsx(_components.code,{children:`citadel-core/*`}),` prefix; `,_jsx(_components.code,{children:`elasticfilesystem:ClientMount`}),`, `,_jsx(_components.code,{children:`ClientWrite`}),` and `,_jsx(_components.code,{children:`ClientRootAccess`}),` on the file system.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`configuration-for-ecs`,children:`Configuration for ECS`}),`\n`,_jsxs(_components.p,{children:[`Leave the NATS and Consul addresses empty in `,_jsx(_components.code,{children:`config.yaml`}),` and inject them as the `,_jsx(_components.code,{children:`NATS_URL`}),` and `,_jsx(_components.code,{children:`CONSUL_ADDRESS`}),` environment variables on the citadel-core container; the same file then works in every environment.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`19`,language:`yaml`,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:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`19`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`environment`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`production`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`db_path`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/app/data/db`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`backup_dir`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/app/data/backups`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`consul`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` address`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\"`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # set by CONSUL_ADDRESS`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`nats`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` url`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\"`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # set by NATS_URL`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # username / password / tls block when NATS requires them`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`mpc_threshold`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`2`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`event_initiator_pubkey`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\u003cinitiator public key>`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`event_initiator_algorithm`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`ed25519`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`chain_code`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\u003c64-character hex>`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`max_concurrent_keygen`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`3`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`max_concurrent_signing`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`10`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`backup_enabled`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`backup_period_seconds`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`300`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`healthcheck`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` enabled`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` address`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"0.0.0.0:8080\"`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`task-definition`,children:`Task definition`}),`\n`,_jsx(_components.p,{children:`The main container’s command and mounts, with the init containers omitted for brevity:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`27`,language:`json`,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:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`27`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"name\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"citadel-core\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"image\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003cACCOUNT>.dkr.ecr.\u003cREGION>.amazonaws.com/citadel-core:\u003cTAG>\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"essential\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"command\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"start\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"--name=\u003cNODE_NAME>\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"--config=/config/config.yaml\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"--password-file=/app/secrets/db-password.cred\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"--identity-password-file=/app/secrets/identity-password.cred\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"--decrypt-private-key\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"--peers=/config/peers.json\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ],`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"environment\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"name\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"NATS_URL\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"value\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003cNATS_URL>\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"name\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"CONSUL_ADDRESS\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"value\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003cCONSUL_ADDRESS>\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ],`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"mountPoints\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"sourceVolume\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"secrets\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"containerPath\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/app/secrets\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"readOnly\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"sourceVolume\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"config\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"containerPath\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/config\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"readOnly\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"sourceVolume\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"identity\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"containerPath\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/app/identity\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"readOnly\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"sourceVolume\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"data\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"containerPath\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/app/data\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ],`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"user\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"65532:65532\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"readonlyRootFilesystem\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"linuxParameters\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"initProcessEnabled\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`data`}),` volume is the node’s EFS access point with transit encryption and IAM authorisation enabled. `,_jsx(_components.code,{children:`secrets`}),`, `,_jsx(_components.code,{children:`config`}),` and `,_jsx(_components.code,{children:`identity`}),` are ephemeral task volumes written by the init containers. Passing `,_jsx(_components.code,{children:`--peers`}),` makes each node sync the registry into Consul at start-up, so no separate `,_jsx(_components.code,{children:`register-peers`}),` step is needed.`]}),`\n`,_jsx(Heading,{level:`2`,id:`verify`,children:`Verify`}),`\n`,_jsxs(_components.p,{children:[`CloudWatch should show, in order: the 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`}),`. `,_jsx(_components.code,{children:`GET /health`}),` on port 8080 reports readiness; add an ECS `,_jsx(_components.code,{children:`healthCheck`}),` on it if you want the service to track container health (allow a `,_jsx(_components.code,{children:`startPeriod`}),` of about 60 seconds).`]}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{style:{textAlign:`left`},children:`Symptom`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Likely cause`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`Init container exits non-zero`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Task role lacks Secrets Manager or S3 permission; secret name or S3 path mismatch; identity files not uploaded.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{style:{textAlign:`left`},children:[`Task stuck in `,_jsx(_components.code,{children:`PROVISIONING`})]}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`No EFS mount target in the subnet; security group blocks `,_jsx(_components.code,{children:`2049`}),`; image pull failure.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`Share-store error at start`}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Password in Secrets Manager differs from the one the store was created with; it cannot be changed after creation. Or the access point UID/GID is not `,_jsx(_components.code,{children:`65532`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.code,{children:`Failed to decrypt private key`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Identity password mismatch, or the `,_jsx(_components.code,{children:`.age`}),` file was corrupted in upload.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`Health check failing`}),_jsxs(_components.td,{style:{textAlign:`left`},children:[_jsx(_components.code,{children:`healthcheck.enabled`}),` is false, or `,_jsx(_components.code,{children:`address`}),` is `,_jsx(_components.code,{children:`localhost`}),` rather than `,_jsx(_components.code,{children:`0.0.0.0:8080`}),`.`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`next`,children:`Next`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.a,{href:`/self-hosted/operate`,children:`Operate a cluster`}),` and the `,_jsx(_components.a,{href:`/self-hosted/security-checklist`,children:`security checklist`}),`.`]})]})}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":"Install on AWS ECS Fargate","sidebarTitle":"Install: AWS ECS","description":"Run citadel-core signing nodes as Fargate tasks with Secrets Manager, S3 and EFS.","href":"/self-hosted/install-ecs"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"How a task is put together","slug":"how-a-task-is-put-together","depth":2,"children":[]},{"title":"Generate key material","slug":"generate-key-material","depth":2,"children":[]},{"title":"AWS resources","slug":"aws-resources","depth":2,"children":[{"title":"IAM","slug":"iam","depth":3,"children":[]}]},{"title":"Configuration for ECS","slug":"configuration-for-ecs","depth":2,"children":[]},{"title":"Task definition","slug":"task-definition","depth":2,"children":[]},{"title":"Verify","slug":"verify","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]},{"title":"Next","slug":"next","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"blockops-3855c227","siteName":"Blockops","title":"Install on AWS ECS Fargate - Blockops","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-08-30T10:08:43.972Z","originalFileLocation":"self-hosted/install-ecs.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=\"Run citadel-core signing nodes as Fargate tasks with Secrets Manager, S3 and EFS.\">\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=\"Install on AWS ECS Fargate - Blockops\">\u003cmeta data-mint-head property=\"og:description\" content=\"Run citadel-core signing nodes as Fargate tasks with Secrets Manager, S3 and EFS.\">\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/install-ecs\">\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=Install+on+AWS+ECS+Fargate\u0026amp;description=Run+citadel-core+signing+nodes+as+Fargate+tasks+with+Secrets+Manager%2C+S3+and+EFS.\u0026amp;theme=82b06bb4a99adf5e0ef9831d\u0026amp;signature=faf10bc6819fcc6946f818179d340c38b0bc218b1198bdb960c4ae63ce58574e\">\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=\"Install on AWS ECS Fargate - Blockops\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Run citadel-core signing nodes as Fargate tasks with Secrets Manager, S3 and EFS.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://blockops-3855c227.mintlify.app/_mintlify/api/og/v2?division=Self-hosted+signing\u0026amp;title=Install+on+AWS+ECS+Fargate\u0026amp;description=Run+citadel-core+signing+nodes+as+Fargate+tasks+with+Secrets+Manager%2C+S3+and+EFS.\u0026amp;theme=82b06bb4a99adf5e0ef9831d\u0026amp;signature=faf10bc6819fcc6946f818179d340c38b0bc218b1198bdb960c4ae63ce58574e\">\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/install-ecs\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/self-hosted/install-ecs.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/install-ecs#webpage\",\"url\":\"https://docs.blockops.network/self-hosted/install-ecs\",\"name\":\"Install on AWS ECS Fargate\",\"description\":\"Run citadel-core signing nodes as Fargate tasks with Secrets Manager, S3 and EFS.\",\"dateModified\":\"2026-08-30T10:08:43.972Z\",\"isPartOf\":{\"@id\":\"https://docs.blockops.network#website\"},\"breadcrumb\":{\"@id\":\"https://docs.blockops.network/self-hosted/install-ecs#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.blockops.network/self-hosted/install-ecs#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Self-hosted signing\",\"item\":\"https://docs.blockops.network/self-hosted/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Install on AWS ECS Fargate\",\"item\":\"https://docs.blockops.network/self-hosted/install-ecs\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.blockops.network/self-hosted/install-ecs#article\",\"headline\":\"Install on AWS ECS Fargate\",\"name\":\"Install on AWS ECS Fargate\",\"description\":\"Run citadel-core signing nodes as Fargate tasks with Secrets Manager, S3 and EFS.\",\"url\":\"https://docs.blockops.network/self-hosted/install-ecs\",\"mainEntityOfPage\":{\"@id\":\"https://docs.blockops.network/self-hosted/install-ecs#webpage\"},\"dateModified\":\"2026-08-30T10:08:43.972Z\",\"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","description":"Deploy citadel-core signing nodes as a StatefulSet with secrets, persistent storage, probes and network policy.","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","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":"Install on AWS ECS Fargate - Blockops","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":[],"chunks":[]}