From 57615772887bdcedd7ebdbe95ba1846dcdc5c558 Mon Sep 17 00:00:00 2001 From: Jiri Sveceny Date: Mon, 18 Aug 2025 14:04:30 +0200 Subject: [PATCH] Infrastructure related docs --- deployment/byoc.mdx | 5 - deployment/self-hosting.mdx | 5 - docs.json | 12 +- images/byoc-architecture-diagram.png | Bin 0 -> 79583 bytes infrastructure/architecture.mdx | 65 ++++++++++ infrastructure/byoc.mdx | 72 +++++++++++ infrastructure/self-hosting.mdx | 186 +++++++++++++++++++++++++++ 7 files changed, 327 insertions(+), 18 deletions(-) delete mode 100644 deployment/byoc.mdx delete mode 100644 deployment/self-hosting.mdx create mode 100644 images/byoc-architecture-diagram.png create mode 100644 infrastructure/architecture.mdx create mode 100644 infrastructure/byoc.mdx create mode 100644 infrastructure/self-hosting.mdx diff --git a/deployment/byoc.mdx b/deployment/byoc.mdx deleted file mode 100644 index 3024338..0000000 --- a/deployment/byoc.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "Bring Your Own Cloud" -description: "Configure Cursor for your documentation workflow" -icon: "cloud" ---- \ No newline at end of file diff --git a/deployment/self-hosting.mdx b/deployment/self-hosting.mdx deleted file mode 100644 index 45cc9e3..0000000 --- a/deployment/self-hosting.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "Self-Hosting" -description: "Configure Cursor for your documentation workflow" -icon: "server" ---- diff --git a/docs.json b/docs.json index 4d00c79..bd273de 100644 --- a/docs.json +++ b/docs.json @@ -49,18 +49,14 @@ ] }, { - "group": "Deploy E2B", + "group": "Infrastructure", "pages": [ - "deployment/byoc", - "deployment/self-hosting" + "infrastructure/architecture", + "infrastructure/self-hosting", + "infrastructure/byoc" ] } ] - }, - { - "anchor": "SDK Reference", - "icon": "square-terminal", - "href": "https://external-link.com/blog" } ] }, diff --git a/images/byoc-architecture-diagram.png b/images/byoc-architecture-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..eb8e3e0eb899ec6a45d0e2daca064e501500c881 GIT binary patch literal 79583 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 wgONUYvw)n4l5Cd9*S> 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�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 literal 0 HcmV?d00001 diff --git a/infrastructure/architecture.mdx b/infrastructure/architecture.mdx new file mode 100644 index 0000000..0817c92 --- /dev/null +++ b/infrastructure/architecture.mdx @@ -0,0 +1,65 @@ +--- +title: "Architecture" +description: "E2B infrastructure architecture overview" +icon: "sitemap" +--- + +## Sandbox architecture +E2B is built around the orchestration of microVMs using Firecracker and KVM virtualization. +Its multi-tenant architecture allows you to run multiple sandboxes on a single machine while ensuring strong isolation between them. + +Core is an orchestrator that receives requests from the E2B control plane and manages the sandbox lifecycle. +Its responsible for low-level operations such as memory mapping, snapshotting, and system configuration, and is using Firecracker to run microVMs. + +E2B can run hundreds of nodes, with each node running an orchestrator that manages hundreds of sandboxes. +The API serves as the main point of entry for customers, handling all permissions and logic to build sandbox requests. +It is also responsible for fast and reliable scheduling of sandbox requests to orchestrators. + +When someone wants to access a port running in the sandbox, Edge (client-proxy) is used to route traffic from load balancer to the correct node. +On the node level, the orchestrator proxy completes routing directly to the sandbox network interface. + +## Template architecture + +We are using Ubuntu-based images for sandbox templates. +Currently, you can use a Docker image as a source for building, or a template build V2 that supports faster and code-declarative build configuration. + +We will extract the file system from the source we received, install and configure the required packages, and then create a snapshot of the file system. +This snapshot is later used to create a microVM that runs in the sandbox. We can create both file-system and memory snapshots for even faster sandbox creation. + +## Components + +### Services +- **API** - Handled consistency and logic for whole E2B platform. Used for sandbox lifecycle and template management. +- **Orchestrator** - Manages sandbox microVM lifecycle, proper system configuration, snapshotting, and else. +- **Template Manager** - Currently part of orchestrator, but can be deployed separately. Responsible for building sandbox templates. +- **Envd** - Small service running in each sandbox as a service handling communication with the E2B control plane and command execution. +- **Edge (client-proxy)** - Routes traffic to sandboxes, exposes API for cluster management, and gRPC proxy used by E2B control plane to communicate with orchestrators. +- **Docker Reverse Proxy** - Docker reverse proxy allows us to receive template source images with our own authentication and authorization. +- **Open Telemetry** - Collects logs, metrics, and traces from deployed services. Used for observability and monitoring. +- **ClickHouse** - Used for storing sandbox lifecycle metrics. +- **Loki** - Used for storing sandbox logs. Stored only in the cluster and not sent to Grafana or any other 3rd party service. + +### Cloud Services +- **Redis** - Used for metadata and synchronization between components. +- **Container Registry** - Storage for customers' source files of sandbox templates. +- **Object Storage** - Storage for sandbox snapshots/templates. Needs to support byte-range read requests. +- **PostgreSQL Database (currently only Supabase is supported)** - Used as a Postgres database and an OAuth/users management tool. +- **Machines with KVM virtualization support** - Google Cloud Platform VM with native/nested virtualization support. +- **Grafana (optional for monitoring)** - Used for monitoring logs/traces/metrics coming from Open Telemetry and ClickHouse. + +## Security + +### Virtualization isolation + +We are using Firecracker and Linux KVM to provide strong isolation between sandboxes. +This allows us to run multiple sandboxes on a single machine while ensuring that they are isolated from each other. +Firecracker is a lightweight virtualization technology that provides a minimalistic virtual machine monitor (VMM) for running microVMs. +It is designed to be secure and efficient, making it a great choice for running sandboxes. + +### Why visualization over containerization? +Docker is a popular containerization technology, but it does not provide the same level of isolation as Firecracker. +Docker containers share the same kernel and resources, which can lead to security vulnerabilities and performance issues. + +Firecracker, on the other hand, provides a lightweight virtual machine that runs its own kernel and resources, ensuring strong isolation between sandboxes. +This makes Firecracker a better choice for running sandboxes, especially in a multi-tenant environment +where security and performance are critical. diff --git a/infrastructure/byoc.mdx b/infrastructure/byoc.mdx new file mode 100644 index 0000000..b00cba8 --- /dev/null +++ b/infrastructure/byoc.mdx @@ -0,0 +1,72 @@ +--- +title: "BYOC (Bring Your Own Cloud)" +sidebarTitle: "Bring Your Own Cloud" +description: "Allows you to deploy E2B sandboxes to your own cloud VPC." +icon: "cloud" +--- + +BYOC is currently only available for AWS. +We are working on adding support for Google Cloud and Azure. + + + BYOC is offered to enterprise customers only. + If you’re interested in BYOC offering, please book a call with our team [here](https://e2b.dev/contact) or contact us at [enterprise@e2b.dev](mailto:enterprise@e2b.dev). + + +## Architecture + +Sandbox templates, snapshots, and runtime logs are stored within the customer's BYOC VPC. +Anonymized system metrics such as cluster memory and cpu are sent to the E2B Cloud for observability and cluster management purposes. + +All potentially sensitive traffic, such as sandbox template build source files, +sandbox traffic, and logs, is transmitted directly from the client to the customer's BYOC VPC without ever touching the E2B Cloud infrastructure. + +### Glossary +- **BYOC VPC**: The customer's Virtual Private Network where the E2B sandboxes are deployed. For example your AWS account. +- **E2B Cloud**: The managed service that provides the E2B platform, observability and cluster management. +- **OAuth Provider**: Customer-managed service that provides user and E2B Cloud with access to the cluster. + + + Graphics explaining key BYOC architecture parts + + +### BYOC Cluster Components +- **Orchestrator**: Represents a node that is responsible for managing sandboxes and their lifecycle. Optionally, it can also run the template builder component. +- **Edge Controller**: Routes traffic to sandboxes, exposes API for cluster management, and gRPC proxy used by E2B control plane to communicate with orchestrators. +- **Monitoring**: Collector that receives sandbox and build logs and system metrics from orchestrators and edge controllers. Only anonymized metrics are sent to the E2B Cloud for observability purposes. +- **Storage**: Persistent storage for sandbox templates, snapshots, and runtime logs. Image container repository for template images. + +## Onboarding + +Customers can initiate the onboarding process by reaching out to us. +Customers need to have a dedicated AWS account and know the region they will use. +After that, we will receive the IAM role needed for managing account resources. +For AWS account quota limits may need to be increased. + +Terraform configuration and machine images will be used for provisioning BYOC cluster. +When provisioning is done and running, we will create a new team under your E2B account that can be used by SDK/CLI the same way as it is hosted on E2B Cloud. + +## FAQ + +### How Is Cluster Monitored? + +Cluster is forwarding anonymized metrics such as machine cpu/memory usage to E2B Control plane for advanced observability and alerting. +The whole observability stack is anonymized and does not contain any sensitive information. + +### Can cluster automatically scale? + +A cluster can be scaled horizontally by adding more orchestrators and edge controllers. +The autoscaler is currently in V1 not capable of automatically scale orchestrator nodes that are needed for sandbox spawning. +This feature is coming in the next versions. + +### Are sandboxes accessible only from a customer’s private network? + +Yes. Load balancer that is handling all requests coming to sandbox can be configured as internal and VPC peering +with additional customer’s VPC can be configured so sandbox traffic can stay in the private network. + +### How control plane secure communication is ensured? + +Data sent between the E2B Cloud and your BYOC VPC is encrypted using TLS. + +VPC peering can be established to allow direct communication between the E2B Cloud and your BYOC VPC. +When using VPC peering, the load balancer can be configured as private without a public IP address. \ No newline at end of file diff --git a/infrastructure/self-hosting.mdx b/infrastructure/self-hosting.mdx new file mode 100644 index 0000000..a95cce6 --- /dev/null +++ b/infrastructure/self-hosting.mdx @@ -0,0 +1,186 @@ +--- +title: "Self-Hosting" +description: "Deploy E2B to your own cloud infrastructure" +icon: "server" +--- + +Self-hosting E2B allows you to deploy and manage the whole E2B open-source stack on your own infrastructure. +This gives you full control over your sandboxes, data, and security policies. + +We are currently officially supporting self-hosting on Google Cloud Platform (GCP) with Amazon Web Services (AWS), and on-premise support is coming soon. + + + If you are looking for a managed solution, consider our [Bring Your Own Cloud](/infrastructure/byoc) offering that will + bring you the same security and control with the E2B team managing infrastructure for you. + + +## Google Cloud Platform + +### Prerequisites + +**Tools** +- [Packer](https://developer.hashicorp.com/packer/tutorials/docker-get-started/get-started-install-cli#installing-packer) +- [Golang](https://go.dev/doc/install) +- [Docker](https://docs.docker.com/engine/install/) +- [Terraform](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) (v1.5.x) + - [This version that is still using Mozilla Public License](https://github.com/hashicorp/terraform/commit/b145fbcaadf0fa7d0e7040eac641d9aef2a26433) + - The last version of Terraform that supports Mozilla Public License is **v1.5.7** + - You can install it with [tfenv](https://github.com/tfutils/tfenv) for easier version management +- [Google Cloud CLI](https://cloud.google.com/sdk/docs/install) + - Used for managing GCP resources deployed by Terraform + - Authenticate with `gcloud auth login && gcloud auth application-default login` + +**Accounts** +- Cloudflare account with a domain +- Google Cloud Platform account and project +- Supabase account with PostgreSQL database +- **(Optional)** Grafana account for monitoring and logging +- **(Optional)** Posthog account for analytics + +### Steps + +1. Go to `console.cloud.google.com` and create a new GCP project + > Make sure your Quota allows you to have at least 2500 GB for `Persistent Disk SSD (GB)` and at least 24 for `CPUs`. +2. Create `.env.prod`, `.env.staging`, or `.env.dev` from [`.env.template`](https://github.com/e2b-dev/infra/blob/main/.env.template). You can pick any of them. Make sure to fill in the values. All are required if not specified otherwise. + > Get Postgres database connection string from your database, e.g. [from Supabase](https://supabase.com/docs/guides/database/connecting-to-postgres#direct-connection): Create a new project in Supabase and go to your project in Supabase -> Settings -> Database -> Connection Strings -> Postgres -> Direct. + + > Your Postgres database needs to have IPv4 access enabled. You can do that in the Connect screen. +3. Run `make switch-env ENV={prod,staging,dev}` to start using your env +4. Run `make login-gcloud` to login to `gcloud` CLI so Terraform and Packer can communicate with GCP API. +5. Run `make init` + > If this error, run it a second time. It's due to a race condition on Terraform enabling API access for the various GCP services; this can take several seconds. + + > A full list of services that will be enabled for API access: [Secret Manager API](https://console.cloud.google.com/apis/library/secretmanager.googleapis.com), [Certificate Manager API](https://console.cloud.google.com/apis/library/certificatemanager.googleapis.com), [Compute Engine API](https://console.cloud.google.com/apis/library/compute.googleapis.com), [Artifact Registry API](https://console.cloud.google.com/apis/library/artifactregistry.googleapis.com), [OS Config API](https://console.cloud.google.com/apis/library/osconfig.googleapis.com), [Stackdriver Monitoring API](https://console.cloud.google.com/apis/library/monitoring.googleapis.com), [Stackdriver Logging API](https://console.cloud.google.com/apis/library/logging.googleapis.com) + +6. Run `make build-and-upload` +7. Run `make copy-public-builds` +8. Run `make migrate` +9. Secrets are created and stored in GCP Secrets Manager. Once created, that is the source of truth--you will need to update values there to make changes. Create a secret value for the following secrets: +10. Update `e2b-cloudflare-api-token` in GCP Secrets Manager with a value taken from Cloudflare. + > Get Cloudflare API Token: go to the [Cloudflare dashboard](https://dash.cloudflare.com/) -> Manage Account -> Account API Tokens -> Create Token -> Edit Zone DNS -> in "Zone Resources" select your domain and generate the token +11. Run `make plan-without-jobs` and then `make apply` +12. Fill out the following secret in the GCP Secrets Manager: + - e2b-supabase-jwt-secrets (optional / required to self-host the [E2B dashboard](https://github.com/e2b-dev/dashboard)) + > Get Supabase JWT Secret: go to the [Supabase dashboard](https://supabase.com/dashboard) -> Select your Project -> Project Settings -> Data API -> JWT Settings + - e2b-postgres-connection-string + > This is the same value as for the `POSTGRES_CONNECTION_STRING` env variable. +13. Run `make plan` and then `make apply` + > Note: This will work after the TLS certificates are issued. It can take some time; you can check the status in the Google Cloud Console. +14. Setup data in the cluster by following one of the two + - `make prep-cluster` in `packages/shared` to create an initial user, etc. (You need to be logged in via [`e2b` CLI](https://www.npmjs.com/package/@e2b/cli)). It will create a user with same information (access token, api key, etc.) as you have in E2B. + - You can also create a user in the database, it will automatically also create a team, an API key, and an access token. You will need to build template(s) for your cluster. Use [`e2b` CLI](https://www.npmjs.com/package/@e2b/cli?activetab=versions)) and run `E2B_DOMAIN= e2b template build`. + + +### Interacting with the cluster + +#### SDK +When using SDK pass the domain when creating a new `Sandbox` in the JS/TS SDK +```javascript +import { Sandbox } from "@e2b/sdk"; + +const sandbox = new Sandbox({domain: ""}); +``` + +or in Python SDK + +```python +from e2b import Sandbox + +sandbox = Sandbox(domain="") +``` + +#### CLI +When using CLI, you can pass the domain as well +```sh +E2B_DOMAIN= e2b +``` + +### Monitoring and logging jobs + +To access the Nomad web UI, go to `https://nomad.`. Go to sign in, and when prompted for an API token, you can find this in GCP Secrets Manager. +From here, you can see nomad jobs and tasks for both client and server, including logging. + +To update jobs running in the cluster, look inside packages/nomad for config files. This can be useful for setting your logging and monitoring agents. + +### Deployment Troubleshooting + +If any problems arise, open a [GitHub issue on the repo](https://github.com/e2b-dev/infra/issues) and we'll look into it. + + +### Google Cloud Troubleshooting +**Quotas not available** + +If you can't find the quota in `All Quotas` in GCP's Console, then create and delete a dummy VM before proceeding to step 2 in self-deploy guide. This will create additional quotas and policies in GCP +``` +gcloud compute instances create dummy-init --project=YOUR-PROJECT-ID --zone=YOUR-ZONE --machine-type=e2-medium --boot-disk-type=pd-ssd --no-address +``` +Wait a minute and destroy the VM: +``` +gcloud compute instances delete dummy-init --zone=YOUR-ZONE --quiet +``` +Now, you should see the right quota options in `All Quotas` and be able to request the correct size. + + +## Linux Machine +All E2B services are AMD64 compatible and ready to be deployed on Ubuntu 22.04 machines. +Tooling for on-premise clustering and load-balancing is **not yet officially supported**. + +### Service images + +For running E2B core, you need to build and deploy **API**, **Edge (client-proxy)**, and **Orchestrator** services. +This will work on any Linux machine with Docker installed. Orchestrator is built with Docker but deployed as a static binary, because it needs precise control over the Firecracker MicroVMs in the host system. + +Building and provisioning services can be similar to what we do with Google Cloud Platform builds and Nomad jobs setup. +Details about architecture can be found in our [architecture](/infrastructure/architecture) sections. + +### Client machine setup + +#### Configuration + +The Orchestrator (client) machine requires a precise setup to spawn and control Firecracker-based sandboxes. +This includes a correct OS version installed (Ubuntu 22.04) with KVM. It's possible to run KVM with nested virtualization, but there are some performance drawbacks. + +Most of the configuration can be taken from our client [machine setup script](https://github.com/e2b-dev/infra/blob/main/packages/cluster/scripts/start-client.sh). +There are adjustments for the maximum number of inodes, socket connections, NBD, and huge pages allocations needed for the MicroVM process to work properly. + +#### Static binaries + +There is a need for a few files and folders to be present on the machine. +For correctly working sandbox spawning, you need to have Firecracker, Linux kernel, and Envd binaries. +We are distributing a pre-built one in the public Google Cloud bucket. + +```bash +# Access publicly available pre-built binaries +gsutil cp -r gs://e2b-prod-public-builds . +``` + +Static files and folder setup example. Please replace Linux and Firecracker with the versions you want to use. +Ensure you use the same Linux and Firecracker versions for both sandbox build and spawning. + +```bash +sudo mkdir -p /orchestrator/sandbox +sudo mkdir -p /orchestrator/template +sudo mkdir -p /orchestrator/build + +sudo mkdir /fc-envd +sudo mkdir /fc-envs +sudo mkdir /fc-vm + +# Replace with the source where you envd binary is hosted +# Currently, envd needs to be taken from your source as we are not providing it. +sudo curl -fsSL -o /fc-envd/envd ${source_url} +sudo chmod +x /fc-envd/envd + +SOURCE_URL="https://storage.googleapis.com/e2b-prod-public-builds" +KERNEL_VERSION="vmlinux-6.1.102" +FIRECRACKER_VERSION="v1.12.1_d990331" + +# Download Kernel +sudo mkdir -p /fc-kernels/vmlinux-${KERNEL_VERSION} +sudo curl -fsSL -o /fc-kernels/${KERNEL_VERSION}/vmlinux.bin ${SOURCE_URL}/kernels/${KERNEL_VERSION}/vmlinux.bin + +# Download Firecracker +sudo mkdir -p /fc-versions/${FIRECRACKER_VERSION} +sudo curl -fsSL -o /fc-versions/${FIRECRACKER_VERSION}/firecracker ${SOURCE_URL}/firecrackers/${FIRECRACKER_VERSION}/firecracker +sudo chmod +x /fc-versions/${FIRECRACKER_VERSION}/firecracker +```