Linux

Install 3AM on a Linux server or VM with one command. What the installer asks, how to open the console, the options worth knowing, RHEL, and Compose.

Install

On the server, as your normal user:

curl -fsSL https://get.3am.si/install | sh

Add -s -- --trial to start a free trial at the same time, or -s -- --code 3AM-… if you already have a code.

The installer asks only what it can't work out:

It asksWhen
Where 3AM should runAlways. Choose 1, this machine
Whether to install PodmanOnly if neither Podman nor Docker is installed
Where the models runOnly if the server has no GPU. Your own endpoint, or OpenRouter (Models)
How you'll open the consoleOn the first install. An SSH tunnel, or open to the network (below)
Whether to go aheadLast. Type y

It ends by printing the console's address, the ssh command for the tunnel if you chose one, and the admin token. The admin token creates the first owner in the console; copy it.

Everything it set up survives a reboot: Podman's containers restart on boot, and keep running after you log out.

Prefer to look first?

curl -fsSL https://get.3am.si | sh only downloads. It leaves a 3am-<version> folder; read it, then run ./install.sh inside it. ./install.sh --help lists every option.

Open the console

The installer asks how you'll reach the console, and remembers the answer.

Through an SSH tunnelthe default: nothing is exposedYour laptoplocalhost:8700SSH, port 22SERVER3AM127.0.0.1:8700ssh -N -L 8700:127.0.0.1:8700 you@serverOpen to your networkfor a team, or behind your proxyAny browserserver:8700port 8700cloud firewallSERVER3AM0.0.0.0:8700The installer opensthe server's firewall,and says what to allowin your cloud's.

The default. The console listens only on the server, so nothing is exposed. On your laptop, run the command the installer printed and leave it running:

ssh -N -L 8700:127.0.0.1:8700 you@your-server

Then open http://localhost:8700.

Options worth knowing

Run the installer again with an option to change it. Everything else is kept.

OptionWhat it does
--bind 0.0.0.0, --port 8700Where the console listens. The default is 127.0.0.1:8700
--console-url URLThe address people use, for links in on-call messages
--openrouter-key-file FILEModels through OpenRouter, with the key in this file
--model-url URL --model NAMEModels on your own OpenAI-compatible endpoint. Add --model-key-file if it needs a key
--s1-url URLSystem 1's endpoint, needed with your own model endpoint
--resend-key-file FILESend sign-in codes by email through Resend. --smtp-host uses any SMTP server instead
--runtime dockerUse Docker when both are installed. Podman is the default
--yesAsk nothing: use the defaults and what's remembered
--forgetIgnore what was remembered from the last install
--doctorCheck the running install, piece by piece

Keep keys in files that only you can read. The installer copies them to ~/.3am/keys/, so you can delete the originals:

umask 077; printf '%s' 'sk-or-…' > ~/openrouter.key

Red Hat Enterprise Linux

RHEL 8 and 9 work with SELinux enforcing and in FIPS mode. Install Podman from the RHEL AppStream, then:

sudo ./install.sh

Run as root, the installer also ties the licence to the machine's hardware. On FIPS hosts, ask us for the UBI image, which uses RHEL's FIPS-validated OpenSSL.

To run without containers, each release has a native install with a hardened systemd unit:

sudo deploy/rhel/install-native.sh --licence licence.json
sudo deploy/rhel/rhel-verify.sh     # checks the result

Docker Compose

Each release has compose/compose.yaml, with the same containers and hardening as the installer:

cd 3am-<version>
for f in images/*.tar; do docker load -i "$f"; done
cd compose && cp .env.example .env    # fill in the model endpoint and a random THREEAM_INGEST_TOKEN
docker compose up -d core
docker compose logs core | grep "admin token"

With a GPU, add -f compose.gpu.yaml. You manage upgrades yourself with Compose, so the installer is usually easier.

If something goes wrong

Next

Open the console, create the first owner, and follow the setup wizard.

On this page