launchroom
Getting started

Install launchroom

One command on a Linux server with Docker. launchroom is Docker containers and one folder, and nothing is written outside that folder.

launchroom installs with one command on any Linux server that runs Docker. After a few minutes:

  • the dashboard runs on its own HTTPS address,
  • the server can build and run your apps,
  • you create the owner account in the browser.

Every install follows two rules:

  • It's Docker containers and a folder. Everything launchroom needs lives in one folder, ./launchroom by default.
  • Nothing is written outside the folder. The installer installs no packages, writes nothing to /etc, creates no systemd units and never edits Docker's daemon.json. Outside the folder, launchroom only creates Docker objects (containers, images, volumes, networks) labelled launchroom.managed=true.

Requirements

WhatNeeded
Operating systemLinux, x86_64 or arm64. Debian and Ubuntu are first-class; any distribution with a recent Docker Engine should work.
DockerDocker Engine 24 or newer with the compose plugin. Docker installed from snap is not supported.
Userroot, or a user in the docker group.
Memory2 vCPU and 2 GB RAM for the control plane, small apps and builds on the same server. 1 GB works when builds run on a separate build server.
Ports80 and 443 (TCP) free and reachable from the internet, plus 443/UDP for HTTP/3. UDP 3478 helps other servers connect directly once you add them.
OutboundHTTPS to GitHub (the release bundle) and to the container registries the images come from.

If Docker is missing, the installer prints the link to Docker's official install instructions and stops. It never installs Docker for you. If the server has less than 2 GB of RAM, it warns and continues.

Run the installer

On the server
curl -fsSL https://launchroom.vantezzen.io/install | sh

The folder is created where you run the command. Run it in the directory you want launchroom/ to live in, for example your home directory.

Your own domain or the automatic address

Without options, the dashboard gets an automatic address built from the server's public IP: https://203-0-113-10.sslip.io for a server at 203.0.113.10. It has a real certificate and needs no DNS.

If you already have a name for the dashboard, pass it with --domain and point an A (or AAAA) record at the server first:

On the server
curl -fsSL https://launchroom.vantezzen.io/install | sh -s -- --domain dash.example.com

Use a stable name if you have one. If the server has to be rebuilt from a backup, you only change DNS and every other server reconnects by itself. You can also move the dashboard to a domain later, from the dashboard, without reinstalling. See Dashboard domain.

What the installer does

Checks the server

It checks for:

  • Linux
  • Docker Engine 24 or newer, not from snap
  • the compose plugin
  • at least 2 GB of RAM (warning only)
  • ports 80 and 443 are free

Downloads and verifies the release

It downloads the release bundle (compose file, helper script, image pins), checks its checksum and verifies its signature against the launchroom release on GitHub. A bundle whose signature does not verify is never installed.

Creates the folder and its secrets

It creates launchroom/ with compose.yml, .env (mode 0600) and data/, and generates:

  • the application key
  • database and cache passwords
  • the key that encrypts your stored secrets
  • the signing key servers trust

Starts the control plane

Postgres and Valkey start first, then the dashboard (which runs its database migrations on first start), background workers, realtime server, scheduler, image registry and private network coordinator.

Connects this server

The installer starts launchroomd on this server and connects it to the dashboard with the roles Run apps, Serve traffic and Build. From here on this server serves the dashboard over HTTPS too.

It prints the dashboard address, a one-time setup link valid for 60 minutes and a reminder to back up two things.

Back up .env and data/keys/

launchroom/.env and launchroom/data/keys/ decrypt every secret launchroom stores. Copy them somewhere safe right after the install. Setting up backups in the dashboard also produces a recovery kit that covers them.

Create the owner account

Open the setup link the installer printed (https://<your dashboard>/setup?token=…). The first-run screen confirms the install and asks for your name, email and a password. This account becomes the instance owner.

First-run screen: 'Your launchroom is installed' on fra-1, Hetzner Cloud, with a server illustration, beside a Create the owner account form.First-run screen: 'Your launchroom is installed' on fra-1, Hetzner Cloud, with a server illustration, beside a Create the owner account form.
Install, open the address, create the owner account.

If the setup link expired, run ./launchroom setup-token in the install folder for a new one.

After sign-in, Get started guides you through the remaining steps:

  1. Connect GitHub.
  2. Set an address for your apps.
  3. Deploy the first app.
  4. Set up backups.

Get started also recommends two-factor authentication. It is optional.

The install folder

launchroom/
├── compose.yml              managed: replaced on upgrade (do not edit)
├── compose.override.yml     yours: optional overrides (ports, resource limits)
├── .env                     generated secrets, settings and image pins (0600)
├── launchroom               helper script
├── guard/                   the pinned release identity for updates
└── data/
    ├── keys/                encryption and signing keys
    ├── postgres/  valkey/   control-plane state
    ├── zot/                 the image registry's config and storage
    ├── headscale/           the private network's coordination state
    ├── daemon/              launchroomd's identity, last desired state, cached proxy config
    └── backups/             control-plane backups to a local destination

Put local changes to the stack in compose.override.yml. compose.yml is replaced on every upgrade.

The ./launchroom helper

Run these from inside the install folder.

CommandWhat it does
./launchroom statusThe dashboard address, every container's state and whether this server's launchroomd is connected.
./launchroom logs [service]Follow the logs of all services, or one (dashboard, horizon, launchroomd, …).
./launchroom updatePull the images pinned in .env again, restart and migrate. A new release comes from re-running the installer.
./launchroom backupTake a control-plane backup now.
./launchroom restoreRestore the control plane from a backup.
./launchroom registry show / applyShow the registry config with credentials hidden, or write it and restart the registry.
./launchroom setup-tokenA new one-time setup link.
./launchroom reset-owner-2fa EMAILRemove an instance owner's two-factor authentication after a typed confirmation. They set it up again at the next sign-in.
./launchroom dashboard-domain-resetGo back to the install address when the dashboard's own domain locks you out.
./launchroom uninstallRemove launchroom from this server.

Installer options

OptionWhat it does
--dir DIRInstall folder. Default: $LAUNCHROOM_DIR, else ./launchroom.
--domain HOSTDashboard host name. Default: <public-ip>.sslip.io.
--version VRelease to install. Default: the latest.
--unstableInstall the newest release, including pre-releases, and offer pre-releases as updates.
--bundle DIRUse an unpacked bundle instead of downloading one. Not signature-verified: for air-gapped installs and testing.
--no-public-ip-detectNever contact IP echo services. Needs --domain.
--skip-port-checkInstall even though 80 or 443 are taken. The dashboard is then only reachable on 127.0.0.1:8000, for example through an SSH tunnel.
--allow-unsignedAccept a downloaded bundle without a signature (development builds only). A signature that is present but does not verify is always refused.
--restoreRebuild the control plane from a backup. See Restore and disaster recovery.
--recovery-kit FILEThe recovery kit for --restore (implies --restore).
--restore-allow-httpAccept a plain-HTTP backup endpoint for --restore (LAN or test storage only).

Pass options after sh -s --, for example curl -fsSL https://launchroom.vantezzen.io/install | sh -s -- --dir /srv/launchroom.

Upgrading is re-running the installer

Running the same command again is safe. It is how you move to a new release:

  • .env and everything in data/ are kept.
  • compose.yml, the helper script and the image pins are replaced.
  • The stack is brought up to date, and this server's launchroomd stays connected.

Run it from the same directory, or pass --dir to point at the existing folder.

You can also update from the dashboard. Settings → Updates takes a backup, updates the control plane and then every server, and rolls back if the new version doesn't come up. See Updates.

Uninstall

In the install folder
./launchroom uninstall

The command asks twice:

  1. Type uninstall to stop the stack, remove launchroomd's firewall rules and remove every container and network labelled launchroom.managed=true, including your deployed apps, Caddy and BuildKit.
  2. Type delete to also remove the labelled volumes (your databases and app data), the images those containers used and the folder. Skip this step and your data stays on disk.

Other servers you added have their own small install folder. See Uninstalling a server.

Next steps

On this page