Externals
The egress allowlist: the third-party hosts each service and build may reach.
externals:
openai: { hosts: [api.openai.com] }
prisma: { hosts: [binaries.prisma.sh] }
services:
web:
build: { context: ., externals: [prisma] } # the build may download Prisma's engines
externals: [openai] # the running app may call OpenAIexternals defines each host once, by name. A service lists the externals its running app (and its jobs) may reach in externals, and its build lists its own in build.externals. A build reaches only what it lists. At run time, every service and job of a sandbox may reach any external that one of its services lists. Both are limited to ports 443 and 80. Every other outbound call is blocked and listed under egress.blocked in the sandbox's status.
-
An external that no service or build lists is an error, and so is a name that isn't defined.
-
hostsare exact public DNS names, or*.example.comfor any name underexample.com(notexample.comitself). No other wildcards, and a wildcard can't cover a public suffix such as*.co.uk. -
The allowlist comes from the promoted manifest. That is the default branch's
parity.yamlafter each merge (unless it is invalid or production is frozen), or a manifest a person promotes withparity promote. A sandbox only gets the hosts that baseline also allows. A branch that adds a host keeps it blocked, and the sandbox lists it underegress.notApproved. An agent'sparity upwith a sandbox token that adds a host is refused withegress_not_approved. To allow a new host, changeexternalsin a pull request; merging it updates the allowlist. -
Credentials. Vendor keys go in
{ secret: <ref> }variables, read from the secret store in staging and production. Sandboxes never receive them, so run vendor features that need a live key switched off in sandboxes, or point them at the vendor's test mode with a test key set as a literalenvvalue, overridden inenvironmentsfor staging and production.