Automate DigitalOcean droplets, databases, and DNS from flows.

Provision a droplet per batch job and destroy it even when the job fails. Resize managed Postgres for business hours and back down at night. Snapshot the fleet by tag, catch shadow droplets minutes after they appear, and cut DNS over to the new environment as one audited operation.

Blueprints for DigitalOcean orchestration.

Connect DigitalOcean to a workflow engine that treats the whole account as orchestrable: droplets, managed databases, block storage, load balancers, Kubernetes clusters, firewalls, and DNS zones. Kestra chains them with Ansible runs, Kubernetes deploys, Postgres jobs, and Slack signals, with retries, polling, and guaranteed teardown that doctl scripts and console clicks never give you.

A droplet per batch job, with guaranteed teardown in a finally blockOpen blueprint
Scheduled vertical scaling for managed Postgres with completion pollingOpen blueprint
React to every new droplet, power off the ones violating naming policyOpen blueprint
Browse all 7 DigitalOcean blueprints

Above the DigitalOcean control panel.

DigitalOcean gives you clean primitives at a fair price. Kestra gives those primitives an operations brain: sequencing, polling, event reactions, teardown guarantees, and an audit trail across every resource type on the account.

Ephemeral droplets with guaranteed teardown

A flow provisions a droplet with droplet.Create, injects the job through cloud-init userData, and destroys it in a finally block that runs whether the job succeeded, failed, or timed out. A crashed workload never leaves a forgotten VM billing by the hour, which is exactly what happens when the same pattern is a shell script that dies halfway.

Managed database capacity as code

database.Resize returns immediately while the migration runs in the background. Kestra wraps it with a database.Get health pre-check, a LoopUntil poll that only succeeds when the cluster reports online again, and per-trigger inputs so one flow scales Postgres up at 06:00 and down at 20:00. DigitalOcean has no native scheduled resize at all.

An event trigger for the whole account

droplet.Trigger polls the account and fires one execution per droplet it has never seen, exposing its name, region, status, and creation time. That turns the public API into an event source for governance: naming policy checks, region allowlists, cost alerts, all reacting minutes after someone clicks Create Droplet outside your provisioning process.

Tag-driven fleet operations

droplet.List returns every droplet with its tags; a ForEach with bounded concurrency walks the fleet and acts per machine. Snapshot everything tagged auto-backup with a dated name, power off everything tagged ephemeral after hours. New machines join the policy by adding one tag, not by editing a server list.

DNS cutover as a deploy step

domain.record.List, Delete, Create, and Get compose into a blue-green cutover: remove every stale A record for the hostname, write the low-TTL replacement, read it back to verify what the zone actually serves. The dangerous window between delete and create becomes seconds inside one execution instead of an unlogged console session.

Whole-account inventory in seven API calls

Every resource group ships a List task with fetchType control: NONE for counts, FETCH for rows, STORE for ion files ready for DuckDB. A weekly parallel sweep counts droplets, volumes, databases, load balancers, DOKS clusters, firewalls, and domains, and posts one Slack digest before the invoice surprises anyone.

How teams use DigitalOcean and Kestra

Patterns platform teams run in production today. Each one shows the flow end to end, with the real plugin classes in play.

Burst compute

Provision a droplet per batch job, destroy it even when the job fails

The flow creates a droplet named after the execution ID, polls droplet.Get until DigitalOcean reports it active, locks it down with a per-run firewall, and runs the workload injected via cloud-init. Teardown of both firewall and droplet lives in a finally block, so no failure path leaks a paid VM.

Pay for minutes, not idle days

The droplet exists only for the duration of one execution, sized per run through flow inputs.

Boot handled as a synchronous step

LoopUntil polls every 10 seconds and fails the run if the droplet is not active within 10 minutes.

Teardown survives every failure mode

The finally block deletes firewall and droplet on success, crash, or timeout, skipping unused resources.

Create icon
create droplet
cloud-init userData
LoopUntil icon
wait until active
LoopUntil + Get
Create icon
lock down
per-run firewall
Delete icon
teardown
finally block
Cost control

Scale managed Postgres up for business hours, down for the night

Two schedules pass different size slugs into one flow. It refuses to act unless database.Get reports the cluster online, submits database.Resize, then polls until the migration completes. The Slack confirmation means the change actually landed, not that an API call returned 202.

Vertical scaling on a calendar

The sizing policy lives in version-controlled YAML with per-trigger inputs, not in a console reminder.

No stacked operations

A Fail task stops the run when the cluster is already resizing, instead of stacking a second operation.

Completion is verified, not assumed

Polling continues until status returns online, with a ceiling that fails loudly, not silently.

Schedule icon
schedule
06:00 up / 20:00 down
Get icon
health pre-check
refuse if not online
Resize icon
resize
size + node count
LoopUntil icon
wait until online
poll the migration
SlackIncomingWebhook icon
confirm
Slack
Backups

Snapshot every droplet tagged auto-backup, nightly, with dated names

A nightly schedule lists the whole fleet, walks it with a concurrency limit of 2 to respect API rate limits, and fires droplet.Action with SNAPSHOT for each machine carrying the tag. Snapshot names embed the date, so retention tooling sorts and expires them without guesswork.

Opt-in by tag, not by list

New machines join the backup policy by adding the auto-backup tag. No server inventory file goes stale.

Per-droplet failure isolation

Each snapshot is its own task run inside the ForEach; one API error leaves every other backup untouched.

A silent night without backups cannot happen

A distinct alert fires when listing or snapshotting fails, separate from the nightly summary heartbeat.

Schedule icon
nightly schedule
cron 01:00
List icon
list fleet
rows with tags
ForEach icon
ForEach droplet
tag check per machine
Action icon
snapshot
dated name
SlackIncomingWebhook icon
report
Slack summary
Governance

Power off shadow droplets minutes after they appear

droplet.Trigger fires an execution for every new droplet on the account. A naming rule checks the first hyphen-separated segment against approved prefixes; violations get POWER_OFF rather than deletion, so a mis-named machine keeps its disk and can be revived after review.

Detection whoever created it

Console click, doctl, or API script: any new droplet is seen within one polling interval.

Containment that is reversible

Power off preserves the disk. A false positive costs a rename and a restart, not a restore from backup.

An audit trail for free

Compliant droplets get a log line, so history records everything that ever joined the account.

Trigger icon
new droplet detected
polling trigger
If icon
naming policy
If on trigger.name
Action icon
contain
POWER_OFF action
SlackIncomingWebhook icon
review queue
Slack with identity
Deploys

Cut DNS to the new environment, verified, with rollback bounded by TTL

The flow lists the zone, deletes every existing A record for the hostname including accidental duplicates, creates the replacement pointing at the new environment with a 300 second TTL, then reads the record back so the Slack announcement quotes what DigitalOcean actually serves. A failed half-applied cutover pages the team immediately.

Duplicates handled, not fatal

Zones accumulate duplicate A records from manual edits; the delete loop clears them all first.

Verification before victory

The announcement quotes the record read back from the API, not the flow's inputs.

Rollback is the same flow

Re-run with the previous IP as input. The 300 second TTL bounds how long clients keep the old answer.

List icon
list zone
find stale records
Delete icon
delete stale
per-record ForEach
Create icon
create record
TTL 300
Get icon
verify
read back from API
SlackIncomingWebhook icon
announce
Slack

Kestra vs DigitalOcean automation alternatives

Capability
DigitalOcean Console (manual)
doctl + cron on a droplet
Terraform DO provider
Ephemeral droplet lifecycle with guaranteed teardown
finally block destroys droplet + firewall on every failure path
Manual delete you hope someone remembersScript dies halfway, VM keeps billingMade for standing infra, not per-job VMs
Wait until a droplet is actually active
LoopUntil polls droplet.Get, fails loudly on timeout
Watch the spinnerHand-rolled sleep loopProvider waits, but only inside apply
Scheduled managed database resize
Schedule + Resize + poll until online, per-trigger sizes
One-off manual actiondoctl resize in cron, no completion checkPlan/apply per change, no calendar
Tag-filtered fleet snapshots with dated names
List + ForEach + Action SNAPSHOT, per-droplet isolation
Weekly built-in backups, fixed cadence, no tag filterCustom script with pagination and retriesNot an operations tool
React when a droplet appears on the account
droplet.Trigger fires one execution per new machine
Nothing reactsDiff two doctl outputs yourselfDetects drift only when you run plan
DNS cutover with duplicate cleanup and verification
record List + Delete + Create + Get in one execution
Console edits with an unbounded delete-create windowSequential doctl calls, no rollback storyRecords as state, cutover as a config edit
Whole-account inventory on a schedule
Seven parallel List tasks, totals-only mode, Slack digest
Seven console pagesCustom script + Slack plumbingState file lists managed resources only
Chain DigitalOcean with Ansible, Kubernetes, Postgres, Slack
Outputs flow between plugins in one execution history
No chainCustom glue per pairProvider per tool, no runtime semantics
Self-hosted, air-gapped, OSS edition
Self-hosted by default, OSS edition free
SaaS consoleSelf-hosted scripts, self-owned toilSelf-hosted or HCP

DigitalOcean & Kestra: common questions

Find answers to your questions right here, and don't hesitate to Contact Us if you couldn't find what you're looking for.

See How

Ready to give DigitalOcean an operations brain?

Ephemeral droplets with guaranteed teardown, business-hours database scaling, tag-driven snapshot policies, governance reactions to every new machine, and verified DNS cutovers. Open source, self-hosted, event-driven.