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. Operate never sends your logs, records, or code to us. Investigation context goes only to the AI provider you configure, so with a model hosted in your own DigitalOcean account it stays there.

    Deploy Operate on DigitalOcean

    Opens the Operate listing on the DigitalOcean Marketplace, where the Create Operate Droplet button launches it into your 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.

    The Droplet serves Operate at the domain root (/) by default rather than under /operate. This is controlled by the same OPERATE_MOUNT_PATH variable the self-hosted guide documents; on the Droplet it lives in /opt/operate/operate.env. Open https://<droplet-ip>/ to continue setup.

    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. This works for a domain pointed straight at the Droplet's IP address. A DigitalOcean Reserved IP is different: the Droplet doesn't recognize it as one of its own addresses by default, so a domain pointed at a Reserved IP needs that address added to /opt/operate/tls/addresses by hand (one address per line, no restart needed) before its certificate will be issued.

    On first boot the Droplet checks whether a newer Operate release exists and updates before starting, so a Droplet launched from an older Marketplace snapshot still comes up current.

    •

    Data Volume

    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 (Storage → Volumes in the DigitalOcean control panel) 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. Attach only one volume: if more than one is attached when the Droplet is created, first boot picks one for you with no way to choose which, and no warning that it happened.

    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

    To move to a different volume without a new Droplet, for example switching to a larger one, attach the new volume while the old one is still attached and mounted, then run sudo operate storage <new-volume-name>. It detects that a different volume is now attached, copies your data across to it, and only then is the old volume safe to detach.

    Moving data back to local storage

    sudo operate storage --to-local-storage moves data from the data volume 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 a data volume 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 a data volume 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 data 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. If you only want your current Droplet on the latest release, you don't need a new Droplet at all, run sudo operate update instead, see Staying current below.

    The Mongo password isn't part of what moves automatically. Each Droplet generates its own random OPERATE_MONGODB_PASSWORD at first boot, independent of the data you migrate, so the new Droplet's password won't match the one already saved inside the database you just copied over, and the app will fail to start with an authentication error. Before detaching the volume from the old Droplet, copy OPERATE_MONGODB_PASSWORDand OPERATE_MONGODB_URI out of its /opt/operate/operate.env. Once the new Droplet has booted, paste those same two values into its own /opt/operate/operate.env, replacing the freshly generated ones, then run sudo systemctl restart operate.service before opening the app.
    •

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

    bash
    sudo operate update

    Everything is logged to /var/log/operate-setup.log, the same log data volume setup writes to.

    If an update's restart fails, operate.service is left running the previous version and /opt/operate/app/docker-compose.yml.bak keeps that version's compose file, so nothing is lost. Re-run sudo operate update to retry, or restore the .bak file over docker-compose.yml by hand and restart the service to stay on the previous version.

    •

    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.

    Deploy Operate on DigitalOcean

    Opens the Operate listing on the DigitalOcean Marketplace, where the Create Operate Droplet button launches it into your account.

    Still stuck? We can handle the full setup for you.

    Talk to us