Uninstall
Uninstall is not one action. Decide which of these you actually want:
| Level | What it removes | What it keeps |
|---|---|---|
| Stop the control plane | Shipper service and boot units | Applications, proxy, certificates, volumes, Shipper metadata |
| Remove Shipper | Control plane, metadata, host units and helpers | Application containers and volumes |
| Remove everything | Every Shipper-owned application, volume, certificate and metadata | Docker and unrelated workloads |
The installer’s uninstall command performs the first level. The other two are deliberate follow-up actions.
Before you remove anything
Section titled “Before you remove anything”- Download an instance recovery archive and its recovery key from Settings → Recovery.
- Create a backup plan for every application database and writable volume.
- Download the latest archives and verify one restore.
- Record the dashboard hostname, application domains, and DNS records.
- Export any values that only exist in Shipper, including secret environment variables.
- Confirm no scheduled task or webhook still depends on the instance.
An uninstall that removes /var/lib/shipper without the recovery key cannot decrypt the instance archives. Treat the key as a separate credential.
Level 1: stop the control plane
Section titled “Level 1: stop the control plane”Preview:
sudo bash install.sh --uninstallApply:
sudo bash install.sh --uninstall --applyThis runs:
systemctl disable --now shipper.servicesystemctl disable --now shipper-host-status.timersystemctl disable --now shipper-update.path shipper-update.timerdocker compose ... rm --force shipperThe proxy, application containers, volumes, certificates, application data, Shipper metadata, and Docker are preserved. Rerunning the installer attaches the preserved state again.
Check what is still running:
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}'sudo systemctl status shipper.service --no-pagerThe Shipper service should be inactive. Application containers should still be running, because they are not part of the Shipper control-plane project.
Level 2: remove Shipper itself
Section titled “Level 2: remove Shipper itself”Do this only after the recovery archive and application backups are verified.
Remove the owned applications first
Section titled “Remove the owned applications first”While the dashboard is still available, delete each application through Settings → Danger zone → Delete application. The confirmation requires the application name. This removes the application’s containers and routing, and preserves its volumes unless you explicitly delete data.
If the control plane is already stopped, start it again:
sudo systemctl start shipper.serviceThen sign in and remove the applications through the UI. This is safer than removing containers by label because application deletion also removes routes and release records.
Remove host integration
Section titled “Remove host integration”sudo systemctl disable --now shipper.servicesudo systemctl disable --now shipper-host-status.timersudo systemctl disable --now shipper-update.path shipper-update.timersudo rm -f /etc/systemd/system/shipper.servicesudo rm -f /etc/systemd/system/shipper-host-status.servicesudo rm -f /etc/systemd/system/shipper-host-status.timersudo rm -f /etc/systemd/system/shipper-update.servicesudo rm -f /etc/systemd/system/shipper-update.pathsudo rm -f /etc/systemd/system/shipper-update.timersudo systemctl daemon-reloadsudo rm -f /usr/local/bin/shipperctlsudo rm -f /usr/local/libexec/shipper-updatesudo rm -f /usr/local/libexec/shipper-host-statusRemove Shipper metadata
Section titled “Remove Shipper metadata”sudo rm -rf /etc/shippersudo rm -rf /var/lib/shippersudo rm -rf /var/lib/shipper-installerRemoving /var/lib/shipper deletes the SQLite database, the encryption key, the setup token, and the local recovery state. The applications keep running, but Shipper can no longer manage them. There is no ordinary undo.
Remove the owned proxy
Section titled “Remove the owned proxy”The proxy and its certificate data are owned by Shipper but are not part of the control-plane container. Remove the proxy container by its ownership label, then remove the proxy data volume only if you are certain no other Shipper installation needs it:
docker ps -aq --filter label=io.shipper.infrastructure=proxy | xargs -r docker rm -fdocker volume ls -q --filter label=io.shipper.infrastructure=proxyReview the volume name before deleting it. Certificate data is the only copy of an issued certificate until it is reissued.
Level 3: remove everything
Section titled “Level 3: remove everything”Only do this when the server will be rebuilt or handed over without any Shipper workload.
- Delete every application through the dashboard and choose the named data deletion for each retained volume.
- Remove the control plane and metadata as in Level 2.
- Remove remaining Shipper-owned containers and volumes by label.
- Remove the Docker packages only if Docker is not used by anything else.
Inspect before deleting:
docker ps -a --filter label=io.shipper.managed=truedocker volume ls --filter label=io.shipper.managed=trueDelete only the resources you recognize:
docker ps -aq --filter label=io.shipper.managed=true | xargs -r docker rm -fdocker volume ls -q --filter label=io.shipper.managed=true# After reviewing the list:docker volume rm VOLUME_NAMEShipper never removes application volumes during ordinary cleanup or application deletion. A volume that is still referenced by a live application’s recorded release is protected from deletion. Do not bypass that protection with a broad docker volume prune.
Docker packages
Section titled “Docker packages”If the installer added Docker and nothing else uses it:
sudo systemctl disable --now docker.service docker.socketsudo apt-get remove --purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginsudo rm -f /etc/apt/keyrings/shipper-docker.ascsudo rm -f /etc/apt/sources.list.d/shipper-docker.sourcessudo rm -rf /var/lib/docker/var/lib/docker contains every image, container layer, and volume on the host. Removing it is irreversible. Confirm the host has no other workloads first.
Reattach a preserved installation
Section titled “Reattach a preserved installation”If you only ran the Level 1 uninstall, rerun the same installer. It detects the managed install, reuses the data directory, and restores the service:
curl -fsSL https://shipperkit.dev/install.sh | sudo bashSign in with the existing administrator. The applications, releases, routes, and volumes remain associated with the instance.
If the data directory is gone, follow the Recovery runbook and restore an instance archive into an empty installation.
Verify removal
Section titled “Verify removal”systemctl status shipper.service --no-pagerdocker ps --filter label=io.shipper.managed=truess -ltn 'sport = :8080'Expected after a full removal: no Shipper service, no Shipper-managed containers, and nothing listening on port 8080.