New to Kestra?
Use blueprints to kickstart your first workflows.
Automate nightly DigitalOcean droplet snapshots with Kestra. List the fleet, filter by an auto-backup tag, create dated snapshots, and alert Slack on failure.
Give every droplet that opts in through a tag a nightly, dated snapshot without writing a single doctl script. This blueprint lists the whole DigitalOcean fleet on a schedule, walks it with bounded concurrency, snapshots only the machines tagged auto-backup, and posts a Slack summary. Because each snapshot is its own task run inside a ForEach, one machine failing to snapshot never cancels backups for the rest of the fleet, and the errors block makes a silent backup failure impossible.
list_droplets (io.kestra.plugin.digitalocean.droplet.List) fetches every droplet on the account with fetchType: FETCH, so each row carries the droplet's id, name, and tags straight from the DigitalOcean API.snapshot_tagged_droplets (io.kestra.plugin.core.flow.ForEach) iterates over those rows with a concurrencyLimit of 2 to stay well inside DigitalOcean API rate limits.check_backup_tag (io.kestra.plugin.core.flow.If) inspects the droplet's tag list, defaulting to an empty list for untagged machines, and only proceeds when auto-backup is present.snapshot_droplet (io.kestra.plugin.digitalocean.droplet.Action) fires the SNAPSHOT action with a name like auto-web-01-2026-08-17, so retention tooling can sort and expire snapshots by date.notify posts a Slack summary with the total number of droplets evaluated, and the errors block posts a separate alert whenever the sweep fails.Every DigitalOcean task carries the API token from the DIGITALOCEAN_TOKEN secret directly.
DigitalOcean's built-in backups run on a fixed weekly cadence per droplet and cannot be filtered by tag, named by date, coordinated with rate limits, or reported to Slack. Kestra composes the same public API into a policy: List discovers the fleet dynamically, ForEach with a concurrency limit paces the calls, If applies the tag rule, and Kestra's execution history shows exactly which droplet was snapshotted when, with retries and alerting handled by the platform instead of shell glue.
auto-backup.DIGITALOCEAN_TOKEN: DigitalOcean personal access token.SLACK_WEBHOOK_URL: Slack incoming webhook URL.auto-backup in the DigitalOcean console or via doctl.disabled: false on the nightly trigger to put the sweep on schedule.backup-hourly and backup-nightly, by duplicating the flow with different If conditions and cron expressions.auto- and deletes the ones older than your window.droplet.Action and POWER_OFF, then power back on after, for crash-consistent images of write-heavy machines.