Skip to main content
The default installation needs no options. Use this page to choose the sandbox backend at install time, run behind an existing reverse proxy, split Core and Web across hosts, run Core natively or install without internet access. Pass options to the downloaded script:
With the one-line command, append them after bash -s --. The release downloader also accepts --version TAG to select a published release; otherwise it selects the latest stable release. It verifies the bundle’s SHA-256 before extracting it and keeps the verified bundle for repair. The installer prints each stage, then a summary of addresses, sign-in details and next steps. Set NO_COLOR=1 to disable colors. A failed step stops installation without a success message.

Process settings

These flags seed the installation’s config.json once. Their defaults, valid values and restart behavior are defined in the configuration reference. After installation, edit that file and run oac apply; rerunning the installer only repairs the installation. --config FILE seeds config.json from a JSON file instead of these setting flags; they cannot be combined. A --config document follows the schema defaults, so set ingress: "managed" and host: "0.0.0.0" in it for managed HTTPS.

Installation actions

These options choose an installation location or perform initial setup; they are not saved in config.json. Several installations can share a machine when they use distinct installation directories and ports. Only one installation with managed HTTPS can hold ports 80 and 443 on an IP address; use distinct IP addresses or an external shared proxy for more. Each installation has its own database, Core key and nodes.

Sandbox backend

An installation runs its sandboxes on exactly one backend: Docker and microsandbox start at the Standard size in Web’s standard-sizes.json. If Core refuses the choice, for example because E2B rejects the key, the installer prints Core’s message and exits; the services keep running and you choose the backend in Web. To change the backend or size later, see change the sandbox configuration. Docker shares each node’s kernel with its sandboxes, and its node service account is root-equivalent. Choose it only for trusted workloads or hosts without KVM. The installer asks for confirmation (default No); without a terminal, pass --accept-docker-risks. E2B needs a public HTTPS URL that is not loopback, because E2B’s sandboxes call Core from E2B’s cloud, so pass --public-url. Prepare the template build with the E2B guide, then:

Listeners and access

The default combined Docker installation selects --ingress managed and --host 0.0.0.0. Its gateway publishes Web on --web-port (8080 by default), and ports 80 and 443 once HTTPS is on. Core’s --core-port stays on loopback and PostgreSQL stays private. --host accepts IPv4 or IPv6, without a port, scheme or zone. Use a concrete server IP in the browser, not a wildcard. Managed ingress needs a local Docker Unix socket. --ingress external uses your own reverse proxy instead. It is the only choice for Core-only, Web-only and native Core installations, and their default. Core and Web then listen on --host, loopback by default. External non-loopback listeners require an HTTPS public_url and a reverse proxy, and Web’s domain setup is unavailable: set public_url in config.json and run oac apply. --public-url seeds a DNS-based HTTPS origin for unattended setup; with managed ingress, the certificate and connectivity checks must pass. The ingress mode is fixed for an installation.

Ports

Before it verifies the bundle or loads images, the installer checks --host and every port the installation will listen on: Web’s and Core’s, PostgreSQL’s with native Core, and 80 and 443 with managed ingress and --public-url.
  • --host must be an address of this machine, or a wildcard such as 0.0.0.0.
  • A port set with --web-port, --core-port or in the --config file must be free, and so must a port that a loopback --public-url names, such as 8080 in http://localhost:8080. Otherwise the installer stops, names the port and prints the ss command that finds the program holding it.
  • A Web or Core port you leave out moves to the first free port above its default, at most 20 above, and never to another port of the same installation. The installer writes the chosen port to config.json and names it in the summary, for example Port 8080 was in use; Web uses 8081.
  • Managed ingress uses ports 80 and 443 only for HTTPS and never moves them. The gateway publishes them once public_url is set, from --public-url or domain setup in Web, and no other program on the host may use them. If either is in use at installation, free it, install without --public-url and set up the domain later, or install with --ingress external and use your own reverse proxy.
After installation, oac apply checks the ports of a changed host or port, and 80 and 443 when public_url turns HTTPS on. Domain setup in Web and oac domain check, before they start, that the hostname resolves and that no other program holds port 80 or 443, and name the port that is in use.

HTTPS and the reverse proxy

With external ingress, Core and Web share one public origin. Your reverse proxy terminates TLS and routes by path: The proxy must:
  • Preserve Host. Web accepts only the host of its public URL.
  • Pass WebSocket upgrades on /api/v1.
  • Not buffer or time out streams. /v1 streams Session events.
  • Accept large uploads. Source files may reach 512 MiB; Core enforces the limits.
Run the proxy on the Core host while Core and Web listen on loopback, the default. oac status prints these routes with your addresses and ports. Caddy obtains the certificate itself and passes Host and WebSockets by default:
nginx, for example in /etc/nginx/conf.d/oac.conf inside the http block:
Then set public_url in ~/.oac/core/config.json and run ~/.oac/core/oac apply. Check the routing:
401 means /v1 reached Core, which asks for a key. 404 means it reached Web: fix the proxy, or application calls and every node connection will fail. TLS verification stays on everywhere. With a private certificate authority, node hosts, self-hosted machines and the Runtime image must trust it.

Try it locally with a quick tunnel

A Cloudflare quick tunnel gives a trial installation with external ingress a temporary public HTTPS address. It forwards to one port, so put a local proxy with the same routes in front:
  1. Start the proxy: caddy run --config Caddyfile.
  2. Start the tunnel: cloudflared tunnel --url http://127.0.0.1:8443. It prints an address such as https://random-words.trycloudflare.com.
  3. Set that address as public_url in ~/.oac/core/config.json and run ~/.oac/core/oac apply.
The address changes whenever cloudflared restarts; nodes bound to the old address must then be added again. Throughput is low, so a node’s first Runtime download (about 500 MB) can be slow; see slow links.

Modes

The mode and native Core are fixed once installed; to change them, install into a new directory. A Web-only console forwards signed-in /core/v1 requests to its Core with the Core key, so --core-url must reach Core’s /core/v1 directly. The public URL doesn’t, because the proxy sends /core/v1 to Web:
  • Web on the Core host: use --core-url http://127.0.0.1:8091.
  • Web on another host: give Core a second HTTPS name that sends every path to Core, such as https://core-api.example, and allow only the Web host’s address.

Split deployment

Browsers and node installers use console.example. Applications, nodes, sandboxes and self-hosted machines call Core at core.example; self-hosted machines also download their installer there, which is why core.example forwards /node-install/* to Web. Missing node files redirect to the release; for disconnected nodes, install Web from the offline bundle. Caddy on the Core host, where 203.0.113.10 is the Web host’s address:
nginx on the Core host, with the map from the main example:
The Web host’s proxy sends every path to Web, for example console.example { reverse_proxy 127.0.0.1:8080 } in Caddy. Copy secrets/core.key from the Core host with mode 0600, then delete $HOME/core.key; the installer keeps its own copy. After a Core key rotation, copy it again. A Web-only install selects no sandbox backend.

Native Core

--native-core runs Core as a systemd user service; PostgreSQL and Web stay in containers. It needs a running systemd user manager with lingering, which the host administrator enables with sudo loginctl enable-linger "$USER", and the bundle’s native binaries must load on the host. PostgreSQL then listens on a loopback port the installer picks (ports.database). Native Core is unrelated to the sandbox backend.

Offline hosts

Transfer the release’s *-linux-amd64-offline.tar.gz and its .sha256 file, verify and extract them, then run the bundled ./install.sh. The offline bundle also carries the node and Runtime files, so Web serves them to nodes without release access.