Operate/Docs/DigitalOcean

    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.

    Nothing about your deployment is sent to operatex.dev at launch. Once the Droplet is up, open its URL, create an admin account, and enter your App ID and integration credentials in Operate's own UI, the same as any other Operate install.

    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

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

    Attaching 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.

    bash
    sudo operate storage
    sudo operate storage my-volume-name

    Moving 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.

    bash
    sudo operate storage --to-local-storage
    If the Droplet ran on local Docker volumes before Block Storage was ever attached, those old volumes are still sitting there with old data. The command checks all four before copying anything and refuses to overwrite them, listing every affected volume together with the exact docker 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.

    bash
    sudo operate update
    sudo operate update --include-patches

    Everything 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