diff --git a/docker/Dockerfile b/docker/Dockerfile index ead9af1..f9be892 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -29,6 +29,7 @@ COPY --from=api-build /app/server ./server COPY --from=frontend-build /app/packages/frontend/dist ./public COPY TheCloud.png ./public/TheCloud.png COPY svgAsset/authentik.svg ./public/authentik.svg +COPY aws-icons-svg ./public/aws-icons ENV PORT=4500 EXPOSE 4500 CMD ["./server"] diff --git a/index.sample.html b/index.sample.html new file mode 100644 index 0000000..c68b276 --- /dev/null +++ b/index.sample.html @@ -0,0 +1,176 @@ + + + + + +Sign in · TheCloud + + + + + +
+ + +
+
+
+ +
+

Your own cloud, on your own hardware.

+
    +
  • Invoke functionsLambda
  • +
  • Store objectsS3
  • +
  • Queue messagesSQS
  • +
  • Publish eventsSNS
  • +
  • Query tablesDynamoDB
  • +
  • Orchestrate workflowsStep Functions
  • +
+

Build and test against AWS services locally, with SSO in front.

+
+
+
+ + + + diff --git a/packages/api/src/auth.ts b/packages/api/src/auth.ts index fc8fa0f..0de9776 100644 --- a/packages/api/src/auth.ts +++ b/packages/api/src/auth.ts @@ -202,7 +202,7 @@ function loginErrorMessage(code: string | undefined): string | null { return 'We could not complete your sign-in. Please try again.' } -function isPublic(path: string): boolean { return path === '/login' || path === '/TheCloud.png' || path === '/authentik.svg' || path === '/api/auth/login' || path === '/api/auth/oidc/login' || path === '/api/auth/oidc/callback' || path === '/api/auth/session' || path === '/api/health' } +function isPublic(path: string): boolean { return path === '/login' || path === '/TheCloud.png' || path === '/authentik.svg' || path.startsWith('/aws-icons/') || path === '/api/auth/login' || path === '/api/auth/oidc/login' || path === '/api/auth/oidc/callback' || path === '/api/auth/session' || path === '/api/health' } function unauthenticated(c: Context): Response { return c.req.path.startsWith('/api/') ? c.json({error: 'Authentication required'}, 401) : c.redirect(`/login?returnTo=${encodeURIComponent(safeReturnTo(c.req.path + new URL(c.req.url).search))}`, 302) } function safeReturnTo(value?: string): string { return value && value.startsWith('/') && !value.startsWith('//') ? value : '/console/aws' } function escapeHtml(value: string): string { return value.replace(/[&<>'"]/g, (character) => ({'&': '&', '<': '<', '>': '>', "'": ''', '"': '"'}[character] ?? character)) } diff --git a/packages/api/src/loginPage.ts b/packages/api/src/loginPage.ts index 6840275..3b3e985 100644 --- a/packages/api/src/loginPage.ts +++ b/packages/api/src/loginPage.ts @@ -7,10 +7,8 @@ type LoginPageOptions = { } export function renderLoginPage(options: LoginPageOptions): string { - const destination = options.returnTo === '/' - ? '' - : `
Landing on ${escapeHtml(options.returnTo)}
` - const alert = options.error ? `` : '' + const destination = options.returnTo === '/console/aws' ? '' : `
Landing on ${escapeHtml(options.returnTo)}
` + const alert = options.error ? `` : '' const signIn = options.mode === 'oidc' ? `
` : `
` @@ -23,26 +21,19 @@ export function renderLoginPage(options: LoginPageOptions): string { Sign in · TheCloud
- -
powered by Flocilocal AWS, your hardware

$

Lambda, SQS, SNS, DynamoDB and Step Functions, running on your own network.

7workflow integrations
$0aws bill
1sign-in, sso + mfa

Sign in

Use your Authentik account to open the TheCloud console.

${destination}${alert}${signIn}
  • Browse and manage local AWS resources
  • Design state machines in Workflow Studio
  • Run executions and inspect every step

TheCloud never sees your password. Sessions end after a period of inactivity.

- -
quickstart

Same CLI. Different cloud.

Point any AWS SDK or the AWS CLI at your TheCloud endpoint and your code runs unchanged, with nothing leaving your network.

quickstart.sh
# point the AWS CLI at TheCloud (sample values)
+
+ +

$

Your own cloud, on your own hardware.

Invoke functionsLambda
Store objectsS3
Queue messagesSQS
Publish eventsSNS
Query tablesDynamoDB
Orchestrate workflowsStep Functions

Build and test against AWS services locally, with SSO in front.

+
quickstart

Same CLI. Different cloud.

Point any AWS SDK or the AWS CLI at your TheCloud endpoint and your code runs unchanged, with nothing leaving your network.

quickstart.sh
# point the AWS CLI at TheCloud (sample values)
 export AWS_ENDPOINT_URL=http://localhost:4566
 export AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test
 export AWS_DEFAULT_REGION=us-east-1
@@ -50,8 +41,8 @@ footer{border-top:1px solid var(--bd);padding:36px 0;font-size:13px;color:var(--
 aws s3 mb s3://demo-bucket
 aws sqs create-queue --queue-name fulfilment-queue
 aws stepfunctions list-state-machines
-
$ TheCloud, powered by Flocipress T to switch theme
- +
$ TheCloudpress T to switch theme
+ ` }