Add Emberwake Cloud Ecosystem deploy hub with AWS and generic spread templates.
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Unified expandable panels with mermaid flows, ZIP export, connection tests, and Playwright smoke coverage.
This commit is contained in:
17
server/web/src/help/cloudSpreadMethods.test.ts
Normal file
17
server/web/src/help/cloudSpreadMethods.test.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { CLOUD_SPREAD_METHODS, cloudMethodsByGroup } from './cloudSpreadMethods';
|
||||
|
||||
describe('cloudSpreadMethods', () => {
|
||||
it('defines eight cloud deploy methods', () => {
|
||||
expect(CLOUD_SPREAD_METHODS).toHaveLength(8);
|
||||
expect(cloudMethodsByGroup('aws')).toHaveLength(6);
|
||||
expect(cloudMethodsByGroup('generic')).toHaveLength(2);
|
||||
});
|
||||
|
||||
it('each method has mermaid flow and zip name', () => {
|
||||
for (const m of CLOUD_SPREAD_METHODS) {
|
||||
expect(m.mermaid).toMatch(/flowchart/);
|
||||
expect(m.zipName).toMatch(/^aetherforge-.*\.zip$/);
|
||||
}
|
||||
});
|
||||
});
|
||||
142
server/web/src/help/cloudSpreadMethods.ts
Normal file
142
server/web/src/help/cloudSpreadMethods.ts
Normal file
@@ -0,0 +1,142 @@
|
||||
/** Cloud deploy hub — AWS ecosystem + generic S3-compatible methods. */
|
||||
|
||||
import { SPREAD_TEMPLATES } from './spreadTemplateExport';
|
||||
import { spreadTechniqueDocUrl } from './spreadTechniques';
|
||||
|
||||
export type CloudMethodGroup = 'aws' | 'generic';
|
||||
|
||||
export type CloudMethodId =
|
||||
| 's3-cloudfront'
|
||||
| 'ssm-document'
|
||||
| 'launch-template'
|
||||
| 'fargate'
|
||||
| 'eventbridge'
|
||||
| 'cloud-map'
|
||||
| 'minio'
|
||||
| 'curl-manifest';
|
||||
|
||||
export interface CloudSpreadMethod {
|
||||
id: CloudMethodId;
|
||||
group: CloudMethodGroup;
|
||||
label: string;
|
||||
hint: string;
|
||||
docAnchor: string;
|
||||
mermaid: string;
|
||||
zipName: string;
|
||||
connectionTest?: { kind: string; endpointKey: 'serverUrl' | 'minioEndpoint' | 'cloudfrontDomain' | 'bucketRegion' };
|
||||
}
|
||||
|
||||
export const CLOUD_SPREAD_METHODS: CloudSpreadMethod[] = [
|
||||
{
|
||||
id: 's3-cloudfront',
|
||||
group: 'aws',
|
||||
label: 'S3 + CloudFront erasure swarm',
|
||||
hint: 'Sync Reed–Solomon shards to S3; agents fetch via CloudFront OAC.',
|
||||
docAnchor: 'aws-s3-cloudfront',
|
||||
zipName: 'aetherforge-s3-cloudfront.zip',
|
||||
connectionTest: { kind: 's3', endpointKey: 'bucketRegion' },
|
||||
mermaid: `flowchart LR
|
||||
Deck[Command deck] -->|aws s3 sync| S3[(S3 bucket)]
|
||||
S3 --> CF[CloudFront]
|
||||
CF --> Agent[Agent shard fetch]`,
|
||||
},
|
||||
{
|
||||
id: 'ssm-document',
|
||||
group: 'aws',
|
||||
label: 'SSM Run Command document',
|
||||
hint: 'Owned EC2 — document curls install.sh from your deck.',
|
||||
docAnchor: 'ssm-document',
|
||||
zipName: 'aetherforge-ssm-document.zip',
|
||||
mermaid: `flowchart LR
|
||||
Deck[Command deck] --> Doc[SSM document]
|
||||
Doc --> EC2[Managed instance]
|
||||
EC2 -->|curl install.sh| Deck`,
|
||||
},
|
||||
{
|
||||
id: 'launch-template',
|
||||
group: 'aws',
|
||||
label: 'EC2 Launch Template',
|
||||
hint: 'ASG user-data bootstraps agents with genesis snapshot markers.',
|
||||
docAnchor: 'aws-launch-template',
|
||||
zipName: 'aetherforge-launch-template.zip',
|
||||
mermaid: `flowchart LR
|
||||
LT[Launch template] --> ASG[Auto scaling group]
|
||||
ASG --> EC2[New instance]
|
||||
EC2 -->|user-data curl| Deck[Command deck]`,
|
||||
},
|
||||
{
|
||||
id: 'fargate',
|
||||
group: 'aws',
|
||||
label: 'Fargate burst seeder',
|
||||
hint: 'Short TTL ECS tasks seed erasure shards inside VPC.',
|
||||
docAnchor: 'aws-fargate-burst',
|
||||
zipName: 'aetherforge-fargate.zip',
|
||||
mermaid: `flowchart LR
|
||||
Deck[Command deck] --> ECS[ECS RunTask]
|
||||
ECS --> Task[Fargate seeder]
|
||||
Task -->|shard fanout| VPC[VPC agents]`,
|
||||
},
|
||||
{
|
||||
id: 'eventbridge',
|
||||
group: 'aws',
|
||||
label: 'EventBridge policy fan-out',
|
||||
hint: 'Scheduled Lambda polls policy snapshot for degraded mode.',
|
||||
docAnchor: 'aws-eventbridge',
|
||||
zipName: 'aetherforge-eventbridge.zip',
|
||||
mermaid: `flowchart LR
|
||||
EB[EventBridge rule] --> Lambda[Policy relay]
|
||||
Lambda -->|poll| Deck[Policy snapshot]
|
||||
Lambda --> Webhook[Agent webhook]`,
|
||||
},
|
||||
{
|
||||
id: 'cloud-map',
|
||||
group: 'aws',
|
||||
label: 'Cloud Map service registry',
|
||||
hint: 'Register seeder DNS names for lattice shard discovery.',
|
||||
docAnchor: 'aws-cloud-map',
|
||||
zipName: 'aetherforge-cloud-map.zip',
|
||||
mermaid: `flowchart LR
|
||||
Seeder[Primary seeder] --> CM[Cloud Map]
|
||||
CM --> DNS[seeder.svc.local]
|
||||
DNS --> Agent[Agent manifest fetch]`,
|
||||
},
|
||||
{
|
||||
id: 'minio',
|
||||
group: 'generic',
|
||||
label: 'MinIO / S3-compatible upload',
|
||||
hint: 'mc mirror spread-kit to any on-prem object store.',
|
||||
docAnchor: 'minio-spread-kit',
|
||||
zipName: 'aetherforge-minio.zip',
|
||||
connectionTest: { kind: 'minio', endpointKey: 'minioEndpoint' },
|
||||
mermaid: `flowchart LR
|
||||
Kit[Spread kit ZIP] --> MC[mc cp]
|
||||
MC --> MinIO[(MinIO bucket)]
|
||||
MinIO --> Browser[Waterhole index.html]`,
|
||||
},
|
||||
{
|
||||
id: 'curl-manifest',
|
||||
group: 'generic',
|
||||
label: 'curl manifest.json',
|
||||
hint: 'Portable manifest for any VPS — no cloud SDK required.',
|
||||
docAnchor: 'curl-manifest',
|
||||
zipName: 'aetherforge-curl-manifest.zip',
|
||||
connectionTest: { kind: 'http', endpointKey: 'serverUrl' },
|
||||
mermaid: `flowchart LR
|
||||
VPS[Any VPS] -->|curl manifest.json| Deck[Command deck]
|
||||
VPS -->|curl install.sh| Agent[Agent bootstrap]`,
|
||||
},
|
||||
];
|
||||
|
||||
export function cloudMethodsByGroup(group: CloudMethodGroup): CloudSpreadMethod[] {
|
||||
return CLOUD_SPREAD_METHODS.filter((m) => m.group === group);
|
||||
}
|
||||
|
||||
export function cloudMethodDocUrl(anchor: string): string {
|
||||
return spreadTechniqueDocUrl(anchor);
|
||||
}
|
||||
|
||||
export const RELATED_SPREAD_TEMPLATE_LINKS = SPREAD_TEMPLATES.map((t) => ({
|
||||
id: t.id,
|
||||
label: t.label,
|
||||
docUrl: spreadTechniqueDocUrl(t.docAnchor),
|
||||
}));
|
||||
@@ -64,9 +64,11 @@ describe('UI_HELP', () => {
|
||||
'fm_encrypt_path',
|
||||
'pt_path_tracer',
|
||||
'pt_agent_chain',
|
||||
'pt_subnet_autopsy',
|
||||
'fleet_runtime_policy',
|
||||
'fleet_runtime_modules',
|
||||
'spread_funnel_widget',
|
||||
'subnet_immune_autopsy',
|
||||
'md_overview',
|
||||
'md_operation_chip',
|
||||
'md_spread_profile',
|
||||
@@ -82,6 +84,10 @@ describe('UI_HELP', () => {
|
||||
'ew_install_links',
|
||||
'ew_spread_kit',
|
||||
'ew_war_room',
|
||||
'ew_cloud_ecosystem',
|
||||
'ew_cloud_aws',
|
||||
'ew_cloud_generic',
|
||||
'ew_ssm_document',
|
||||
'ew_supply_chain',
|
||||
'ew_public_urls',
|
||||
'ew_techniques',
|
||||
@@ -104,6 +110,7 @@ describe('UI_HELP', () => {
|
||||
'set_webhook',
|
||||
'ui_color_scheme',
|
||||
'crucible_section_spread_templates',
|
||||
'crucible_section_launch_template',
|
||||
] as const;
|
||||
|
||||
it('defines help for every documented UI key', () => {
|
||||
|
||||
Reference in New Issue
Block a user