Install on your computer
Both pieces on the machine in front of you. Firetower publishes on 127.0.0.1
and nothing else, so you open it in a browser on that same machine. Nothing
else to configure — no domain, no certificate, no VPN.
Not sure this is the right one? See the Overview — and note that you can move to a server or add a domain later without reinstalling.
#Before you start
Docker, the Compose plugin, and Node 20 or newer.
▶Run this onyour own computer
npm i -g @firetower/cli
firetower install#1. Answer Only from this machine
Firetower ◆ How will people reach this Firetower? │ ● Only from this machine (simplest to start — directly, or with `firetower tunnel` from your laptop) │ ○ Your own domain, over Tailscale or another mesh VPN │ ○ Behind a reverse proxy I already run └
Nothing else is asked about how it is reached.
#2. It fetches the deployment files
firetower.yml, the Caddyfile and Caddyfile.dockerfile, from the latest
Firetower release. If GitHub is unreachable it falls back to bundled copies and
says so.
#3. It asks which port to publish on
It checks which ports are free first, and recommends 8080. Ports below 1024 are a poor choice: if you ever forward this port over SSH, forwarding onto a low port requires root at the other end.
◆ Which port should Firetower publish? │ ● 8080 — free (recommended) │ ○ Let me choose └
#4. It checks the machine
Docker, the Compose plugin, the port it is about to publish, architecture,
disk, and whether ghcr.io is reachable. A failed check asks whether to
continue rather than stopping.
#5. Then the remaining questions
- Where should Firetower live?
A directory for the compose file, the
Caddyfileand.env. Defaults to~/firetower, or/opt/firetoweras root.- Administrator username
Defaults to
admin.- Administrator password
Generate one, or type your own.
#6. It generates the secrets, then shows the plan
POSTGRES_PASSWORD and FIRETOWER_ROOT_KEY, then:
Here is what I will do: directory /opt/firetower url http://localhost:8080 published 127.0.0.1:8080 certificate none — plain HTTP, on loopback only admin admin, with the password shown once below root key generated, written to /opt/firetower/.env ◆ Continue? │ ● Yes / ○ No └
Answering No writes nothing.
#7. It writes, pulls and starts
.env is written chmod 600. It then waits for Postgres and the control plane
to report healthy. No Caddy container is created with this option: there is no
certificate to terminate, and the control plane serves its own interface, API
and preview routing.
#8. It requires you to acknowledge the root key
────────────────────────────────────────────────────────────── Save this. It is not stored anywhere you can read it back. FIRETOWER_ROOT_KEY q1Zk8mWv2r7XcN0pT4sYbA6dJhLgE3uF9nRxKtVwQmc= Every credential Firetower holds is sealed with it. Back it up somewhere that is not your database backup — a stolen database opens nothing on its own, and losing this key means adding every credential again. ────────────────────────────────────────────────────────────── ◆ I have saved the root key │ ○ Yes / ● No └
This loses work
The root key is the only unrecoverable thing here. Every stored credential is sealed with it, which is why the installer requires you to acknowledge it. Back it up somewhere separate from your database backup — see Secrets.
#9. Done
Firetower is running. http://localhost:8080 That works on this machine. From your laptop, bring up a tunnel first: firetower tunnel you@this-machine --remote-port 8080 username admin password velvet-timber-harbor-332 You will be asked to replace that password when you sign in, and then to delete ADMIN_INITIAL_PASSWORD from .env.
The admin password is printed once. You are asked to replace it when you sign
in, and then to delete ADMIN_INITIAL_PASSWORD from .env.
The installer always prints that tunnel line, because it cannot tell whether
the machine it just ran on is the one in front of you. Here it is not needed —
open http://localhost:8080 and sign in. The tunnel is setup
2.
#What it wrote
- firetower.yml
The compose file, from the release. Replaced in full by
firetower upgrade.- .env
chmod 600. Port, URL, and the two generated secrets. An existing.envkeeps every value already in it — nothing here regenerates a secret.- Caddyfile, certs/
Written but unused with this option — no Caddy container is created. They matter once you add a domain.
firetower install refuses to run in a directory that already holds a
deployment. Use firetower domain to change how an existing deployment is
reached, and firetower upgrade to move it to a newer release.
#Next
- Want it on a machine that stays awake? → On your server, over SSH
- Want it on a domain, reachable from your phone and your team? → Custom
domain + Tailscale.
firetower domainadds one to the install you just made, without reinstalling. - Want agents running on other machines? → Add a machine
- Upgrade the app when a new release lands.