DigitalOcean
Deploy Operate on DigitalOcean
Operate is also available as a one-click Droplet image on the DigitalOcean Marketplace. Launch it from the Marketplace into your own DigitalOcean account and it comes up as a fully provisioned Operate instance, Docker, the full Compose stack, a reverse proxy, and a trusted HTTPS certificate for the Droplet's own IP address, all configured automatically. Your data never leaves your DigitalOcean account.
How it works
The image is built on Ubuntu 24.04 with Docker Engine and the Compose plugin already installed, along with a pinned Operate release. The stack is wired to a systemd service, operate.service, so it starts on boot and comes back on its own after a reboot.
HTTPS is automatic. Caddy fronts ports 80 and 443 and obtains a trusted certificate for the Droplet's own IP address, so you get a working HTTPS URL with no domain to buy and nothing to run yourself. The web interface is also reachable directly on port 8080 if you prefer.
You can point a domain at the Droplet later. As long as the name resolves to the Droplet, it gets its own certificate on the first request, again with nothing for you to configure.
On first boot the Droplet checks whether a newer major or minor Operate release exists and updates before starting, so a Droplet launched from an older Marketplace snapshot still comes up current.
Block Storage
By default the Droplet keeps MongoDB, Redis, and the rest of Operate's data on the Droplet itself, in persistent Docker volumes. That data is durable across container restarts and reboots, but it lives and dies with the Droplet, destroy the Droplet and the data goes with it.
Attaching a DigitalOcean Block Storage volume moves that data off the Droplet. It then survives the Droplet being destroyed or replaced, and can be snapshotted independently of the Droplet.
Recommended size
20GB is the practical minimum (about $2/month) and 50GB is a good starting point for production (about $5/month), at DigitalOcean's rate of $0.10 per GiB per month.
Attaching at Droplet creation
Attach the volume while creating the Droplet and there is nothing else to configure. On first boot the Droplet detects the volume, formats it if it is unformatted, mounts it, and points the stack's data at it through a single environment variable, OPERATE_DATA_ROOT. That is the same variable the self-hosted guide already documents for moving data onto a separate disk, it is not DigitalOcean-specific.
Four things move onto the volume: MongoDB data, Redis data, cloned repositories, and Operate's internal secrets.
Verifying it's active
mountpoint /mnt/operate-data && df -h /mnt/operate-data
grep OPERATE_DATA_ROOT /opt/operate/operate.env
docker compose --env-file /opt/operate/operate.env -f /opt/operate/app/docker-compose.yml config | grep /mnt/operate-data
cat /var/log/operate-setup.logAttaching or switching volumes later
Attach the volume from the DigitalOcean control panel, then run sudo operate storage on the Droplet. If more than one volume is attached, pass the volume name. The command stops the service, mounts the volume, migrates existing data onto it, and restarts, all on its own.
sudo operate storage
sudo operate storage my-volume-nameMoving data back to local storage
sudo operate storage --to-local-storage moves data from Block Storage back onto local Docker volumes so the volume can be safely detached. It is a clean no-op if the data is already on local storage. It refuses if OPERATE_DATA_ROOT points at Block Storage but the volume isn't mounted. It checks free disk space first and refuses with a clear error if there isn't enough room. Otherwise it copies the data across, clears OPERATE_DATA_ROOT, unmounts the volume, removes the /etc/fstab entry, and restarts the stack. The volume is then genuinely safe to detach.
sudo operate storage --to-local-storagedocker volume rm command needed before it will proceed. Note that a volume name and --to-local-storage can't be passed together.Moving to a new Droplet
A Block Storage volume can carry your data to a different Droplet: attach it on the old Droplet, detach it, create a new Droplet from the current image, and attach the volume to the new one. If you'd rather stop paying for the volume afterwards, run sudo operate storage --to-local-storage on the new Droplet and detach it.
Staying current
A Marketplace snapshot is a point-in-time image. Apart from the first-boot check described above, nothing updates a Droplet on its own after it is created.
sudo operate update checks for a newer major or minor release and updates if one exists. It is safe to re-run at any time and is a no-op when you're already current. sudo operate update --include-patches also picks up patch releases, which are skipped by default.
sudo operate update
sudo operate update --include-patchesEverything is logged to /var/log/operate-setup.log, the same log Block Storage setup writes to.
Verify
Open the Droplet's HTTPS URL and confirm the getting-started page loads with a trusted certificate, no browser warning. From there, follow step 6 of the self-hosted guide to confirm the integration is wired end to end.
Still stuck? We can handle the full setup for you.
Talk to us