Start here

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 | bash

What the host needs

OSLinux, with root (or passwordless sudo)
Ports80 and 443 for the edge and ACME, 3000 for the dashboard
DiskEnough for images, build caches and any volumes you create
NodesOne 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:

  1. Checks the required ports are free.
  2. Installs Docker and initialises Swarm, using OTTERDEPLOY_ADVERTISE_ADDR if the machine has more than one address.
  3. Creates the data folder (default /data/otterdeploy, mode 0700) with the compose file and generated .env under source/.
  4. Optionally adds a swapfile, so a heavy build doesn't get OOM-killed.
  5. 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.
  6. Applies the host firewall and starts CrowdSec.
  7. 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 firewall compose profile is started, so the edge is enforcing community and custom IP blocklists from the first boot. Opt out with OTTERDEPLOY_FIREWALL=false or --no-firewall.
  • A host firewall baseline — default-deny INPUT plus a DOCKER-USER guard — 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:

VariableDefaultWhat it does
OTTERDEPLOY_DATA_DIR/data/otterdeployHost data folder — all platform state
OTTERDEPLOY_VERSIONnewest releaseImage tag to pull; latest rides main
OTTERDEPLOY_CONTROL_PLANE_PORT3000Dashboard port
OTTERDEPLOY_ADVERTISE_ADDRprimary source IPSwarm advertise address
OTTERDEPLOY_FIREWALLtrueBundle and start CrowdSec
OTTERDEPLOY_BRANCHINGautoZFS pool for database branching
OTTERDEPLOY_SWAPautoAdd a swapfile for build headroom
OTTERDEPLOY_DRY_RUNfalsePrint what would happen, change nothing
OTTERDEPLOY_YESfalseSkip 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-run

Updating

/data/otterdeploy/source/install.sh update

update 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 bash

The 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/cli
otterdeploy login https://deploy.example.com

Next: your first deploy.