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 ? `${escapeHtml(options.error)}
` : ''
+ const destination = options.returnTo === '/console/aws' ? '' : `Landing on ${escapeHtml(options.returnTo)}
`
+ const alert = options.error ? `${escapeHtml(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.
-LambdaS3SQSSNSDynamoDBStep FunctionsEventBridgeECSEC2CloudWatch
-quickstartSame 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.
# point the AWS CLI at TheCloud (sample values)
+
+
+
+
quickstartSame 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.
# 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
-
-
+
+