diff --git a/.vale/styles/Flipt/spelling-exceptions.txt b/.vale/styles/Flipt/spelling-exceptions.txt index 87b0ba1..e666e7b 100644 --- a/.vale/styles/Flipt/spelling-exceptions.txt +++ b/.vale/styles/Flipt/spelling-exceptions.txt @@ -67,4 +67,7 @@ uncomment uncompromised URIs yaml -zipkin \ No newline at end of file +zipkin +NATs +hyperscaler +Reverst diff --git a/cloud/architecture/overview.mdx b/cloud/architecture/overview.mdx index 355aabc..7da040f 100644 --- a/cloud/architecture/overview.mdx +++ b/cloud/architecture/overview.mdx @@ -2,3 +2,79 @@ title: Technical Details description: Learn the technical details of how Flipt Hybrid Cloud works --- + +This page details how Flipt Cloud is built to provide a simple and scalable solution for accessing and securing your internal, self-hosted deployments of Flipt. + +Flipt comes baked with lots of critical features for scale and security, including: + +- Ability to scale horizontally +- HTTPS/TLS support +- Configurable authentication mechanisms (Static Token, OIDC, GitHub, JWT and Kubernetes) +- API and UI with session management and termination + +These capabilities are super important for deploying Flipt into your infrastructure and making it secure for your users. +However, enabling and integrating these features isn't free of complexities, infrastructure, and time investment. +In order to take advantage of these, you're likely going to have to perform one or many of the following: + +- Enable networking and routing to your Flipt instance +- Issue and assign an (internal or external) DNS name for your Flipt +- Add a load-balancer to distribute load across your instances of Flipt +- Issue TLS certificates and manage their rotation over time +- Manually configure OAuth client credentials for your SSO provider for OIDC authentication +- Deploy and manage a database for Flipt to store session credentials in + + + + +Flipt Cloud replaces all these steps with a few clicks and some API credentials. + +## Flipt the Problem on its Head + +Flipt Cloud reverses the ingress problem so that your deployments of Flipt dial out to us instead. +This approach is commonly referred to as _reverse tunneling_. +Tunneling in this way has some advantages for applications, as they can be deployed in environments without a stable IP address (e.g. behind restrictive NATs). +For Flipt, this means you can safely expose Flipt from inside a major cloud provider, a modern hyperscaler or simply from your own laptop on your home network. + + + + +When you register your instance in this way with Flipt Cloud, we issue you with a stable subdomain under flipt.cloud (e.g. production-megacorp.flipt.cloud). +Using this DNS name, requests for your instances will flow though our API gateways, load-balancers and then only reach your instances once fully authenticated. +This entire process is performed over secure TLS connections from your end users back to your instances. +All of which is done without you having to provide TLS certificates, and without having to manage rotation. + +## Tunnel Registration + +Your connections are made using an API key credential obtained from our Flipt Cloud UI, or via the `flipt cloud login` sub-command of the Flipt CLI. +This credential is used in an initial handshake to identify your Flipt Cloud organization and the logical instance your Flipt is joining. + + + + +Once registered and associated with Flipt Cloud, your Flipt instance is added to our remote load balancer pool for your logical instance. +Now when you visit your new Flipt Cloud instance subdomain, your requests are routed to the instances deployed on your infrastructure. + +The majority of the tunneling functionality we perform is now open-source in our project [Reverst](https://github.com/flipt-io/reverst). +Reverst is unique in that it leverages HTTP/3 and the QUIC protocol to establish secure, reliable, and performant connections for tunnels. +Keep your eyes peeled for our upcoming blog on how and why we choose to build our reverse tunnels in this way. + +We deploy and scale multiple instances of Reverst on our infrastructure for establishing and managing these tunnels for you. +All while tightly integrating them with the Flipt Cloud user interface, authentication, and instance management system. diff --git a/images/cloud/architecture/architecture-overview-dark.svg b/images/cloud/architecture/architecture-overview-dark.svg new file mode 100644 index 0000000..e1573d6 --- /dev/null +++ b/images/cloud/architecture/architecture-overview-dark.svg @@ -0,0 +1,190 @@ +internetYour InfrastructureQUICGatewayFlipt CloudReverst flipt.cloudinstance-org.flipt.cloudflipt.cloudinstance-org.flipt.cloud + + + + + + + + + + + + diff --git a/images/cloud/architecture/architecture-overview-light.svg b/images/cloud/architecture/architecture-overview-light.svg new file mode 100644 index 0000000..40b1973 --- /dev/null +++ b/images/cloud/architecture/architecture-overview-light.svg @@ -0,0 +1,118 @@ +internetYour InfrastructureQUICGatewayFlipt CloudReverst flipt.cloudinstance-org.flipt.cloudflipt.cloudinstance-org.flipt.cloud + + + + + + + + + + + + diff --git a/images/cloud/architecture/architecture-overview.d2 b/images/cloud/architecture/architecture-overview.d2 new file mode 100644 index 0000000..f232e70 --- /dev/null +++ b/images/cloud/architecture/architecture-overview.d2 @@ -0,0 +1,82 @@ +vars: { + d2-config: { + layout-engine: elk + } +} + +style: { + fill: transparent +} + +direction: right + +internet: { + shape: image + icon: https://icons.terrastruct.com/essentials%2F140-internet.svg +} + +internet -> cloud.gateway: flipt.cloud { + style.font-size: 32 +} +internet -> cloud.gateway: instance-org.flipt.cloud { + style.font-size: 32 +} + +cloud: "" { + style: { + fill: transparent + } + + gateway: Gateway { + shape: image + icon: https://icons.terrastruct.com/infra%2F033-protection.svg + style.font-size: 32 + } + + cloudInstance: Flipt Cloud { + shape: image + icon: https://flipt.cloud/icon.svg?3c7bba14eb804cba + style.font-size: 32 + } + gateway -> cloudInstance: flipt.cloud { + style.font-size: 32 + } + + reverst: Reverst { + shape: image + icon: https://icons.terrastruct.com/infra%2F012-data.svg + style.font-size: 32 + } + gateway -> reverst: instance-org.flipt.cloud { + style.font-size: 32 + } +} + +yours: Your Infrastructure { + style.fill: transparent + fapi: "" { + icon: https://assets-global.website-files.com/659480aa07716c37f0fd8dee/6597f2baa456ff33c9f13a07_logo%201.svg + } + + ftwo: "" { + icon: https://assets-global.website-files.com/659480aa07716c37f0fd8dee/6597f2baa456ff33c9f13a07_logo%201.svg + } + + fthree: "" { + icon: https://assets-global.website-files.com/659480aa07716c37f0fd8dee/6597f2baa456ff33c9f13a07_logo%201.svg + } +} + +cloud.reverst <-> quic +cloud.reverst <-> quic +cloud.reverst <-> quic + +quic: "QUIC" { + shape: image + icon: https://raw.githubusercontent.com/quicwg/wg-materials/main/badge/transparent/QUIC-Badge-Dark-RGB.svg + style.font-size: 32 +} + +quic <-> yours.fapi +quic <-> yours.ftwo +quic <-> yours.fthree diff --git a/images/cloud/architecture/common-infrastructure-dark.svg b/images/cloud/architecture/common-infrastructure-dark.svg new file mode 100644 index 0000000..954adaf --- /dev/null +++ b/images/cloud/architecture/common-infrastructure-dark.svg @@ -0,0 +1,179 @@ +internetYour InfrastructureDNS ZoneLoad BalancerTLS CredentialsDatabase + + + + + + + + diff --git a/images/cloud/architecture/common-infrastructure-light.svg b/images/cloud/architecture/common-infrastructure-light.svg new file mode 100644 index 0000000..b10b5f2 --- /dev/null +++ b/images/cloud/architecture/common-infrastructure-light.svg @@ -0,0 +1,107 @@ +internetYour InfrastructureDNS ZoneLoad BalancerTLS CredentialsDatabase + + + + + + + + diff --git a/images/cloud/architecture/common-infrastructure.d2 b/images/cloud/architecture/common-infrastructure.d2 new file mode 100644 index 0000000..adaede9 --- /dev/null +++ b/images/cloud/architecture/common-infrastructure.d2 @@ -0,0 +1,68 @@ +vars: { + d2-config: { + layout-engine: elk + } +} + +direction: right + +style.fill: transparent + +internet: { + shape: image + icon: https://icons.terrastruct.com/essentials%2F140-internet.svg +} + +internet -> user.zone.elb + +user: Your Infrastructure { + style: { + stroke: transparent + fill: transparent + } + + zone: DNS Zone { + icon: https://icons.terrastruct.com/aws%2FNetworking%20&%20Content%20Delivery%2FAmazon-Route-53_Hosted-Zone_light-bg.svg + + style: { + fill: transparent + } + + elb: Load Balancer { + shape: image + icon: https://icons.terrastruct.com/aws%2FNetworking%20&%20Content%20Delivery%2FElastic-Load-Balancing-ELB_Network-load-balancer_light-bg.svg + } + + keys: TLS Credentials { + shape: image + icon: https://icons.terrastruct.com/essentials%2F216-key.svg + } + + elb -> keys + + fapi: "" { + icon: https://assets-global.website-files.com/659480aa07716c37f0fd8dee/6597f2baa456ff33c9f13a07_logo%201.svg + } + + ftwo: "" { + icon: https://assets-global.website-files.com/659480aa07716c37f0fd8dee/6597f2baa456ff33c9f13a07_logo%201.svg + } + + fthree: "" { + icon: https://assets-global.website-files.com/659480aa07716c37f0fd8dee/6597f2baa456ff33c9f13a07_logo%201.svg + } + + elb -> fapi + elb -> ftwo + elb -> fthree + + db: Database { + shape: image + icon: https://icons.terrastruct.com/essentials%2F117-database.svg + } + + fapi -> db + ftwo -> db + fthree -> db + } +} diff --git a/images/cloud/architecture/handshake-dark.svg b/images/cloud/architecture/handshake-dark.svg new file mode 100644 index 0000000..54bf5ac --- /dev/null +++ b/images/cloud/architecture/handshake-dark.svg @@ -0,0 +1,185 @@ +FliptFlipt CloudFlipt UserFlipt registers on flipt.cloudInstance served on flipt.cloudtunnelled request Register TunnelRegisteredinstance-org.flipt.cloudRequestResponseResponse + + + + + + + + + + + + + + diff --git a/images/cloud/architecture/handshake-light.svg b/images/cloud/architecture/handshake-light.svg new file mode 100644 index 0000000..219cf9e --- /dev/null +++ b/images/cloud/architecture/handshake-light.svg @@ -0,0 +1,113 @@ +FliptFlipt CloudFlipt UserFlipt registers on flipt.cloudInstance served on flipt.cloudtunnelled request Register TunnelRegisteredinstance-org.flipt.cloudRequestResponseResponse + + + + + + + + + + + + + + diff --git a/images/cloud/architecture/handshake.d2 b/images/cloud/architecture/handshake.d2 new file mode 100644 index 0000000..318762c --- /dev/null +++ b/images/cloud/architecture/handshake.d2 @@ -0,0 +1,22 @@ +shape: sequence_diagram + +style.fill: transparent + +client_one: Flipt +tunnel: Flipt Cloud + +register: Flipt registers on flipt.cloud { + client_one -> tunnel.handshake: Register Tunnel + tunnel.handshake -> client_one: Registered +} + +user: Flipt User + +instance: Instance served on flipt.cloud { + user -> tunnel.req: instance-org.flipt.cloud + tunnelled request: { + tunnel -> client_one.req: Request + client_one.req -> tunnel: Response + } + tunnel.req -> user: Response +}