The Snowflake Native App supports Outposts from release 1.19.97, which exposes the
outposttunnel endpoint the Outpost dials. An older Native App does not, so its Outposts page
shows them as unavailable and they cannot be switched on until the app is upgraded. Outposts
are also available when Genesis runs in Docker, Kubernetes or as a Databricks App.Setting up an Outpost needs a Genesis administrator. For Snowflake deployments you also need
someone who can create users and roles in the Snowflake account (for example
ACCOUNTADMIN).Before you start
- Outbound HTTPS. The machine that runs the Outpost must be able to open outbound HTTPS
(port 443) to the Genesis tunnel endpoint shown in the setup. For Snowflake it also signs
in at
https://<orgname>-<account_name>.snowflakecomputing.com. An outbound proxy is supported throughHTTPS_PROXYandNO_PROXY. - Network reach. From that machine, the systems you want Genesis to use (for example
db.corp.internal:5432) must resolve and accept connections. - Resources. The Outpost is a single binary of about 13 MB and needs around 64 MB of memory and a fraction of a CPU.
Turn on Outposts
Outposts are off until an administrator turns them on. Open Config -> Outposts and switch Outposts on. While they are off, nothing is routed through any Outpost.Add and install an Outpost
1
Name your Outpost
Click Add Outpost and give it a name such as
acme-prod: lowercase letters, digits
and -. The name cannot be changed later.You choose which systems use the Outpost on each connection, so nothing else is needed
here. Under Advanced: route a whole domain you can optionally send every connection
to matching hosts through this Outpost; see
Route a whole domain.2
Choose where it will run
For a laptop or VM, pick the operating system and processor. For Kubernetes, pick the
namespace (default
genesis-outpost).For a VM, Docker or Kubernetes you can fill in Systems Genesis may reach through it:
a comma-separated list of host:port entries such as
db.corp.internal:5432, jira.corp.internal:443. It becomes the Outpost’s
ALLOWED_DESTINATIONS; see Allowed destinations. You can also
leave it empty and fill it in on the host.For VM, Docker or Kubernetes, you can also enable Read connection secrets from your
own store; it is off by default and is not offered for laptop evaluation. Choose AWS
Secrets Manager, Azure Key Vault or Google Secret Manager and set the secret-name prefix
(default genesis/). AWS is selected by default; Azure can use the generated Key Vault URL
placeholder or a URL you provide, while the Google Cloud project is optional. The wizard
generates the Outpost settings for that store; give its cloud identity read access as
described in Keep credentials in your own secret store.3
Set up how it signs in to Genesis
The setup shows the identity steps for where your Genesis runs. See
How the Outpost signs in.
4
Install it
Run the install commands shown, in order. Replace any
<placeholder> first. Then click
I’ve installed it. See What the install does.5
Wait for it to connect
Genesis checks every few seconds for up to 10 minutes. When the Outpost connects, the
setup shows its reported release version (when available), capabilities and the number of
destination routes it holds. Older releases may not report a version. This count excludes
the Outpost’s own tunnel control channel; zero means no connection is using the Outpost
yet. If it does not connect, the setup shows why; see
Troubleshooting.
6
Try it
Enter a host and port inside your network and click Test route. The Outpost resolves
the name and opens a TCP connection from inside your network, and Genesis shows the
result. Then click Create a connection to open the provider picker. When you select a
provider with a host field, the new connection form starts with this Outpost selected;
providers without a host field connect directly. If you started from the connection form,
click Use this Outpost instead.
How the Outpost signs in
Each Outpost has its own identity. Which one it uses depends on where Genesis runs. The tunnel endpoint requires an Outpost release that offers thegenesis-outpost.v1 protocol
(0.7.0 or later); older releases receive HTTP 400 and cannot connect.
- Snowflake Native App
- Databricks App
- Self-hosted Genesis
Needs Genesis Native App release 1.19.97 or later. The Outpost dials the app’s
outposttunnel endpoint; the setup fills in GENESIS_ENDPOINT with its ingress URL
(https://<id>-<account>.snowflakecomputing.app), looked up in Snowflake. Snowflake’s
ingress signs the Outpost’s service user in before the connection reaches Genesis.- Creates a role that holds only the Genesis application role
APP_OUTPOST_TUNNEL, which allows nothing but connecting to the Outpost tunnel endpoint. - Creates the service user (for Outpost
acme-prod,GENESIS_OUTPOST_ACME_PROD) with no password. - Creates a network policy that pins the user to your Outpost’s egress IP address.
- Registers the Outpost’s public key on the user.
- VM (Linux), Docker, Kubernetes: the setup’s first step generates the key pair with
opensslon the machine that will run the Outpost, and the SQL registers it in the same run. On Kubernetes the private key goes into a Kubernetes Secret. - Laptop:
outpost initgenerates the key and prints theALTER USERstatement with the key filled in. Run it as printed. - Windows VM:
outpost keygengenerates the key after the download and prints the statement.
OUTPOST_TUNNEL_KEY and keep it in a
secret store. The ingress admits any Snowflake user granted APP_OUTPOST_TUNNEL; behind
it the key signs in only this Outpost and opens only this Outpost’s own addresses.Each Outpost’s tunnel key
Every Outpost has a tunnel key of its own (Outpost 0.7.0 or later). It signs in only that Outpost, opens only that Outpost’s own addresses inside Genesis, and proves each of its answers to Genesis with the key, so Genesis knows which Outpost answered. The sign-in is a challenge-response in both directions: the key never crosses the network, and the Outpost checks that the endpoint holds the same key before it carries anything. Genesis keeps the key in its secret store and shows it once, when it is issued; issuing a new one replaces it at once. That Outpost is refused until it restarts with the new key. The other Outposts keep their keys and stay connected.An Outpost signs in only with its own key, on every deployment model: there is no shared
key and no sign-in without a key. Outpost 0.7.0 or later is required, and it refuses to
start without its own tunnel key. An Outpost before 0.7.0 cannot connect to Genesis’s tunnel;
upgrade it. Until its key is issued an Outpost cannot connect, and the Outposts page says so
on its card; issue the key (Install, then New tunnel key), set it on the Outpost,
and start it on Outpost 0.7.0 or later.
What the install does
Every install downloads the same Outpost from the public release page, github.com/genesis-computing-ai/genesis-outpost/releases, or runs the container imageghcr.io/genesis-computing-ai/genesis-outpost built from it. The
current install is Outpost 0.7.0, which uses only the native genesis-outpost.v1 tunnel
protocol; it does not use Chisel. Binaries are published for Linux, macOS and Windows on x64
and ARM, with a SHA256SUMS file beside them. The install commands check the download against
SHA256SUMS before installing it.
Laptop (evaluation)
Laptop (evaluation)
- Download the binary for your machine and check it against
SHA256SUMS. - Run
./outpost init(Windows:.\outpost.exe init). It asks for the tunnel endpoint URL and slot, how the Outpost signs in, and whichhost:portdestinations Genesis may reach through your machine. The setup page lists the answers to give. It writesoutpost.envin your user config directory, readable by you only. - For Snowflake, run the
ALTER USERstatementoutpost initprinted. - Run
./outpost run. It prints an evaluation-mode banner naming what it exposes, then every request Genesis makes. Stop it with Ctrl-C.
The binaries are not yet code-signed. On macOS the install command removes the download
quarantine flag after the checksum passes (or allow it under System Settings -> Privacy
& Security). On Windows, if SmartScreen warns, choose More info, then Run anyway.
VM: Linux with systemd
VM: Linux with systemd
- Download the binary to
/usr/local/bin/outpostand check it. - Write its settings to
/etc/genesis-outpost/outpost.env, readable by root only. - Create an unprivileged
genesis-outpostsystem user and agenesis-outpostsystemd service withRestart=always, then enable and start it. Follow its log withsudo journalctl -u genesis-outpost -f.
VM: Windows
VM: Windows
- Download
outpost.exetoC:\Program Files\genesis-outpostand check its hash. - For Snowflake, run
outpost keygen, then have a Snowflake administrator run theALTER USERstatement it prints. - Write the settings to
C:\ProgramData\genesis-outpost\outpost.env, readable only by SYSTEM and administrators. - Create a scheduled task, Genesis Outpost, that starts it at boot as SYSTEM.
Docker
Docker
One
docker run command starts the container genesis-outpost-<name> with
--restart unless-stopped, its settings as environment variables, a named volume for its
saved routes, and (for Snowflake) the private key mounted read-only. Follow its log with
docker logs -f genesis-outpost-<name>.The image is distroless (the binary and CA certificates only) and runs as a non-root user.Kubernetes
Kubernetes
Save the generated manifest, replace any It creates a namespace, a service account, a Secret holding the sign-in settings, and a
one-replica Deployment that runs as non-root with a read-only root filesystem and no Linux
capabilities. For the
<placeholder>, and apply it:secrets capability, give the pod your cloud’s workload identity:
on EKS, annotate the service account with an IAM role (IRSA); on AKS, annotate it with
azure.workload.identity/client-id: <managed identity client ID> and label the pod
azure.workload.identity/use: "true"; on GKE, annotate it with
iam.gke.io/gcp-service-account: <gsa>@<project>.iam.gserviceaccount.com.The saved routes live in an emptyDir, so a rescheduled pod starts with none. Genesis
re-sends its routes the next time a query or connection test through it fails to open,
and in its hourly check. Use a small PersistentVolumeClaim instead if you want routes to
survive rescheduling immediately.Outpost settings
The setup fills these in for you. You change them in the Outpost’s settings file, container environment or Kubernetes manifest, then restart it.
An Outpost that cannot use its settings (no slot, an unreadable key, two sign-in methods at
once) stops at startup with a log line naming the problem.
Allowed destinations
ALLOWED_DESTINATIONS is your ceiling. The Outpost reaches only what it lists, whatever
Genesis asks for, and reports anything else as refused. List a host:port for each system;
wildcards work:
Keep credentials in your own secret store
To let connections read passwords from your own secret store instead of storing them in Genesis:-
Set
OUTPOST_CAPABILITIES=tunnel,secrets. -
Set
ALLOWED_SECRET_PREFIXto the prefix of the secrets Genesis may read, for examplegenesis/. The Outpost refuses every other secret name. -
Choose your store and give the Outpost’s own identity read access to it:
The
tokenscapability still calls AWS whenOUTPOST_SECRETS_SOURCEisazureorgcp. On EKS, the service account’s IRSA role must also cover those AWS calls. On a laptop, your ownaws sso login,az loginorgcloud auth application-default loginsession works. - Restart the Outpost.
/,
so the Outpost stores each / of a Genesis secret name as --: the reference
outpost_acme-prod/genesis/postgres-prod#password reads the Key Vault secret (or Secret
Manager secret, latest version) named genesis--postgres-prod. Otherwise use only letters,
digits and - (Secret Manager also allows _); a name with other characters, or with --
itself, is refused. ALLOWED_SECRET_PREFIX stays in Genesis spelling (genesis/).
Then use a secret reference on the connection; see
Use a secret from the Outpost.
Rotate, revoke or remove
- Rotate a Snowflake key without downtime. Register a new public key in the free slot
(
ALTER USER <user> SET RSA_PUBLIC_KEY_2 = '<new public key>'), restart the Outpost with the new private key, thenALTER USER <user> UNSET RSA_PUBLIC_KEY. - Rotate a Databricks secret. Add a second OAuth secret to the service principal, restart the Outpost with it, then delete the old secret.
- Rotate or revoke the tunnel key. Choose New tunnel key for the Outpost and restart it with the new key. The old key stops working within about 15 seconds: Genesis ends that Outpost’s tunnel session (its log says its key was rotated or revoked). Other Outposts are not affected.
- Revoke. Unset the user’s public keys or disable the user
(
ALTER USER <user> SET DISABLED = TRUE), or remove the service principal’s CAN USE. The Outpost’s next connection attempt is refused. A tunnel that is already open stays open until it reconnects; to cut it at once in Snowflake, also revoke theAPP_OUTPOST_TUNNELgrant from the user’s role or restart the Genesis service. - Remove. Click Delete on the Outpost’s card. If saved connections choose it or reference one of its secrets, Genesis lists them and asks for a second confirmation; choose Delete anyway to proceed. Those connections stop working until you move them to another Outpost or update their secret references as needed. When you delete the last Outpost, Genesis also clears its remaining routes so hosts no longer map to a loopback address with no listener. Then stop the Outpost where it runs and drop its Snowflake user or Databricks service principal.

