Install
Put the Otterdeploy control plane on your own server.
One command provisions the host, pulls the published images, puts Docker into Swarm mode and brings the stack up. There is no source checkout and no build toolchain involved.
curl -fsSL https://get.otterdeploy.com/install.sh | bashWhat the host needs
| OS | Linux, with root (or passwordless sudo) |
| Ports | 80 and 443 for the edge and ACME, 3000 for the dashboard |
| Disk | Enough for images, build caches and any volumes you create |
| Nodes | One is a valid cluster; more can join later as managers or workers |
Docker is installed and switched into Swarm mode by the installer if it isn't already.
What it does
In order, narrating each step:
- Checks the required ports are free.
- Installs Docker and initialises Swarm, using
OTTERDEPLOY_ADVERTISE_ADDRif the machine has more than one address. - Creates the data folder (default
/data/otterdeploy, mode0700) with the compose file and generated.envundersource/. - Optionally adds a swapfile, so a heavy build doesn't get OOM-killed.
- Optionally provisions a ZFS pool for future copy-on-write database branching. If ZFS isn't available it says so and falls back to the logical branching tier — it never blocks the install.
- Applies the host firewall and starts CrowdSec.
- Pulls the pinned release and brings the stack up.
Pinned by default
With no OTTERDEPLOY_VERSION set, the installer resolves the newest published
release tag and pins to it — e.g. v0.4.2. That pin is what lets the in-app
updater tell you an update exists. Set OTTERDEPLOY_VERSION=latest to ride
main instead.
Security defaults
A fresh install comes up protected, with both layers narrated in the installer output rather than applied silently:
- CrowdSec is bundled and on. The bouncer key and LAPI wiring are
generated for you and the
firewallcompose profile is started, so the edge is enforcing community and custom IP blocklists from the first boot. Opt out withOTTERDEPLOY_FIREWALL=falseor--no-firewall. - A host firewall baseline — default-deny
INPUTplus aDOCKER-USERguard — is applied with nftables. If ufw or firewalld is already managing the host, that takes precedence and the installer says so; it does not fight another firewall manager.
Options
Every tunable is an environment variable. The ones you're most likely to touch:
| Variable | Default | What it does |
|---|---|---|
OTTERDEPLOY_DATA_DIR | /data/otterdeploy | Host data folder — all platform state |
OTTERDEPLOY_VERSION | newest release | Image tag to pull; latest rides main |
OTTERDEPLOY_CONTROL_PLANE_PORT | 3000 | Dashboard port |
OTTERDEPLOY_ADVERTISE_ADDR | primary source IP | Swarm advertise address |
OTTERDEPLOY_FIREWALL | true | Bundle and start CrowdSec |
OTTERDEPLOY_BRANCHING | auto | ZFS pool for database branching |
OTTERDEPLOY_SWAP | auto | Add a swapfile for build headroom |
OTTERDEPLOY_DRY_RUN | false | Print what would happen, change nothing |
OTTERDEPLOY_YES | false | Skip the interactive prompts |
Docker's overlay address pool is configurable too, via
DOCKER_ADDRESS_POOL_BASE (default 10.0.0.0/8) and
DOCKER_ADDRESS_POOL_SIZE (default 24) — worth setting if 10/8 collides
with your own network.
Preview the whole run before committing to it:
curl -fsSL https://get.otterdeploy.com/install.sh | bash -s -- --dry-runUpdating
/data/otterdeploy/source/install.sh updateupdate skips host setup entirely — it pulls the new image tag and restarts,
preserving every generated secret.
Uninstalling
curl -fsSL https://get.otterdeploy.com/uninstall.sh | sudo bashThe uninstaller prints what it found on the host, then asks item by item what
to remove before requiring you to type wipe. The stack, every container it
provisioned, its networks and its images always go. Volumes, /data/otterdeploy,
the ZFS branching pool, Swarm membership and Docker itself are each a separate
choice — so "remove otterdeploy" doesn't have to mean "remove Docker".
Deleting data is the default
Left at the defaults, this removes your database volumes and
/data/otterdeploy — including backups. Take a copy off the box first.
Preview the whole run and change nothing with
curl -fsSL https://get.otterdeploy.com/uninstall.sh | sudo bash -s -- --dry-run.
Flags let you keep individual pieces (--keep-volumes, --keep-data,
--keep-zfs, --keep-swarm), and --yes runs unattended. Prompts are read
from the terminal rather than stdin, so the piped form above stays interactive;
with no terminal at all the script refuses unless you pass --yes.
Then
Open the dashboard on port 3000, create your organisation, and install the
CLI:
npm install -g @otterdeploy/cliotterdeploy login https://deploy.example.comNext: your first deploy.