Releases: Dokploy/dokploy
Release list
v0.30.2
What's Changed
- fix(github-webhook): apply preview limit only to new previews by @NoiceHax in #5079
- fix: don't quote .env values for stack deploys by @Siumauricio in #5125
Full Changelog: v0.30.1...v0.30.2
v0.30.1
What's Changed
- fix: assign tags created from the project dialog by @andwati in #5118
- fix: correct switch thumb translate-x for checked state by @Siumauricio in #5121
- fix: sync terminal size with backend PTY (fixes #5092) by @Siumauricio in #5104
- fix: prevent Postgres 100-arg limit crash and restore data parity for restricted-member project access by @shuv-o in #5103
Full Changelog: v0.30.0...v0.30.1
v0.30.0
Features
Network Management
Docker networks now have a full management UI instead of only being reachable through the CLI. From the Networks tab in the Docker dashboard you can create, inspect, and delete bridge or overlay networks per server, with MTU, internal/attachable flags, IPv4/IPv6, and custom IPAM (subnet/gateway/IP range) exposed in the creation form.
Networks also attach per-service now. Every application and compose service joins the shared dokploy-network by default — you can detach it and attach only the networks that service actually needs, applied on the next deploy. This is also why Isolated Deployment is deprecated: it's still available in Compose's advanced settings, but attaching/detaching networks per service covers the same use case declaratively, without breaking on restarts.
DNS Provider Integration
You can now connect Cloudflare or AWS Route53 and let Dokploy manage DNS records for your domains directly. When you add a domain, Dokploy creates the record for you instead of making you switch tabs and wait for propagation to find out whether you typed it correctly. Apex domains are handled too — @ resolves to the zone's apex automatically.
Vault Providers for Environment Secrets
Environment variables can now be resolved at deploy time from an external secret manager, using a unified reference syntax: DATABASE_PASSWORD=${{vault.production.db_password}}. The value is never stored in Dokploy — it's fetched from your provider when the deployment runs, so rotating a secret in the vault takes effect on the next deploy with no changes on the Dokploy side. Supported providers: HashiCorp Vault/OpenBao, Infisical, AWS Secrets Manager, Doppler, and Scaleway Secret Manager.
Concurrent Builds
For the first two years, Dokploy used a single global build queue across every server. Each server now has its own dedicated queue.
Unified Docker Dashboard
Docker management used to be spread across separate pages. /dashboard/docker is now a single hub: Containers, Volumes, Networks, Events, Images, Disk Usage, Health, and Swarm, all under one set of tabs.
Volumes now has a built-in file explorer, so you can browse volume contents without SSH-ing into the server.
Images shows every image on the host with size and age, so you can spot the ones worth pruning before reaching for docker system prune.
Events streams what the Docker daemon reports in real time — container starts/stops, image pulls, network connects — filterable and paginated.
Disk Usage breaks down images, containers, volumes, and build cache with reclaimable space called out for each.
Health runs a read-only diagnostic over SSH — inotify limits, disk, memory/CPU reservations, per-network IP usage — the same checks we used to walk people through manually when a deploy mysteriously stalled.
Overview Dashboard
Projects now open to an overview page that summarizes Services, Backups, and Domains at a glance, with Deployments moved into its own tab.
SCIM 2.0 Provisioning (Enterprise)
Users and groups now sync automatically from your identity provider, so deprovisioning in Okta or Entra deprovisions in Dokploy. SCIM-provisioned users also link correctly through SSO now, and sign-in errors surface instead of failing silently.
Session Management
A new page lists your active sessions and lets you revoke them individually — useful if you've logged in from a machine you no longer control.
Passkey Support
You can now sign in without a password using your device's biometrics, security key, or password manager. Add a passkey from Settings → Profile, and it shows up right on the login screen as a "Sign in with Passkey" option alongside email/password and SSO.
Default Organization Role
Admins can set a default role that's applied automatically to new members joining an organization, instead of remembering to downgrade every invite after the fact.
Domain Enable/Disable Toggle
Domains can now be disabled without deleting them. The route comes out of Traefik but the configuration stays intact, so you can pull a domain temporarily and bring it back without re-entering certificates, paths, and middleware.
Bug Fixes
A few fixes worth calling out on their own:
- Command injection via compose domain
serviceName— a crafted service name could escape into the host shell. - SSRF via Route53 endpoint override — the endpoint override has been removed.
- Traefik updated from v3.6.7 to v3.6.25, pulling in upstream security patches.
- Postgres 100-argument limit was breaking rollback, schedule, port, and volume backup lookups on instances with enough rows — fixed.
- Backups ran the database dump twice per backup and could leave partial uploads behind on failure — now runs once and cleans up after itself.
- MySQL/MariaDB restores could target the wrong database because
USE/CREATE DATABASEstatements in the dump overrode the selected one — now stripped. - Docker cleanup could hang silently on a false-positive busy-wait match.
This is in addition to the security batch shipped in v0.29.13 (~16 command-injection and cross-org IDOR fixes) and v0.29.14 (20 backported fixes) — if you're upgrading straight from v0.29.0 or skipped those patch releases, v0.30.0 covers all of it.
What's Changed
- fix(ui): add cursor pointer style for buttons by @steadexe in #4890
- fix: prevent environment form from resetting while editing by @veksen in #4626
- Feat/add network management by @Siumauricio in #3774
- fix(ui): make interactive icons inside badges clickable again by @narcisonunez in #4929
- chore: remove leftover Redis infrastructure code by @Siumauricio in #4930
- fix: avoid postgres 100-argument limit in findRollbackById by @dmtrTm in #4924
- fix: avoid postgres 100-argument limit in schedule, volume backup and port queries by @Siumauricio in #4931
- feat(icon): enhance icon management for services by @Siumauricio in #4932
- fix(domains): don't render CDN info message as an error in DNS tooltip by @AbiRaditya in #4911
- fix(ui): persist trigger type selection in GitHub provider forms by @narcisonunez in #4937
- fix(ui): resolve unclickable watch path removal button by @imrja8 in #4782
- fix(ui): prevent collapsed avatar clipping by @azizbecha in #4948
- fix(ui): scope deployment delete loading by @azizbecha in #4947
- fix(ui): keep dropdown menus open on window blur by @Siumauricio in #4953
- fix(ui): show real status code on error page by @Siumauricio in #4954
- fix(preview-deployment): refetch github provider before authenticating by @CyrilBIENNE in #4933
- fix(schedule): return deployment metadata from runManually and fail early on missing container by @Siumauricio in ...
v0.29.14
What's Changed
Patch release with bug fixes only — no new features.
- fix(ui): add cursor pointer style for buttons by @steadexe in #4890
- fix: prevent environment form from resetting while editing by @veksen in #4626
- fix(ui): make interactive icons inside badges clickable again by @narcisonunez in #4929
- fix: avoid postgres 100-argument limit in findRollbackById by @dmtrTm in #4924
- fix: avoid postgres 100-argument limit in schedule, volume backup and port queries by @Siumauricio in #4931
- fix(domains): don't render CDN info message as an error in DNS tooltip by @AbiRaditya in #4911
- fix(ui): persist trigger type selection in GitHub provider forms by @narcisonunez in #4937
- fix(ui): resolve unclickable watch path removal button by @imrja8 in #4782
- fix(ui): prevent collapsed avatar clipping by @azizbecha in #4948
- fix(ui): scope deployment delete loading by @azizbecha in #4947
- fix(ui): keep dropdown menus open on window blur by @Siumauricio in #4953
- fix(ui): show real status code on error page by @Siumauricio in #4954
- fix(preview-deployment): refetch github provider before authenticating by @CyrilBIENNE in #4933
- fix(schedule): return deployment metadata from runManually and fail early on missing container by @Siumauricio in #4955
- fix(application): remove preview deployments when deleting an application by @Siumauricio in #4959
- fix: invalidate railpack build cache when env changes by @rnkp755 in #4557
- fix: resolve environment variables on application rollback by @dmtrTm in #4923
- fix(requests): guard RequestHost before filtering to avoid crash on malformed logs by @narcisonunez in #4966
- fix(ui): widen restore backup dialog to match other backup dialogs by @Siumauricio in #4971
- fix(webhook): include added and removed files in watchPaths validation by @rifatdinc in #4772
- fix(schedule): mark cloud-restricted schedule deployments as error instead of leaving them running by @Siumauricio
New Contributors
- @veksen made their first contribution in #4626
- @narcisonunez made their first contribution in #4929
- @dmtrTm made their first contribution in #4924
- @AbiRaditya made their first contribution in #4911
- @CyrilBIENNE made their first contribution in #4933
- @rnkp755 made their first contribution in #4557
- @rifatdinc made their first contribution in #4772
Full Changelog: v0.29.13...v0.29.14
v0.29.13
What's Changed
- fix: validate API key name length to prevent opaque 500 by @tanaymishra in #4806
- fix(compose): preserve named-volume access mode when adding suffix by @Siumauricio in #4823
- fix(ui): disambiguate repos with the same name in the repository selector by @Siumauricio in #4826
- fix(settings): allow clearing the server domain by @Siumauricio in #4825
- fix(ui): typos by @EvanSchleret in #4800
- fix(security): OS command injection in git clone across all providers by @Siumauricio in #4855
- fix(security): git provider credential disclosure via cross-org IDOR (.one endpoints) by @Siumauricio in #4856
- fix(security): SSH private key disclosure via server read endpoints by @Siumauricio in #4857
- fix(security): cross-org IDOR + nodeId injection in swarm read endpoints by @Siumauricio in #4858
- fix(security): git provider secret disclosure via application.one by @Siumauricio in #4859
- fix(security): OS command injection in docker build/pull commands by @Siumauricio in #4860
- fix(security): OS command injection via dockerImage in database service deploys by @Siumauricio in #4861
- fix(security): OS command injection in database backup/restore commands by @Siumauricio in #4862
- fix(security): OS command injection via compose path and custom command by @Siumauricio in #4863
- fix(security): OS command injection via swarm nodeId and registry tag by @Siumauricio in #4864
- fix(security): missing authorization on docker/terminal WebSocket handlers (member -> root) by @Siumauricio in #4865
- fix(security): host-schedule owner/admin bypass via applicationId (member → root) by @Siumauricio in #4869
- fix(security): missing authorization on GitHub App setup callback (unauth cross-org write) by @Siumauricio in #4870
- refactor(providers): inline quote() in git clone commands, drop shellWord helper by @Siumauricio in #4871
- fix(security): escape user-controlled values across command-injection sinks (quote sweep) by @Siumauricio in #4873
- fix(security): command injection in registry.testRegistry / testRegistryById by @Siumauricio in #4875
- fix(security): cross-org authorization bypass in server.remove by @Siumauricio in #4874
- fix(ui): organization menu clipped when sidebar is collapsed by @Siumauricio in #4876
- fix(2fa): show correct error message for invalid TOTP code by @Siumauricio in #4877
- fix: rename compose "Reload" action to "Rebuild" by @ANSUJKMEHER in #4847
- fix(auth): enable email verification for SSO and user creation by @Siumauricio in #4880
- feat(ai): allow organizations to define custom AI provider presets by @Siumauricio in #4882
New Contributors
- @tanaymishra made their first contribution in #4806
- @EvanSchleret made their first contribution in #4800
- @ANSUJKMEHER made their first contribution in #4847
Full Changelog: v0.29.12...v0.29.13
v0.29.12
What's Changed
- fix(ui): adjust button container to grid layout to prevent overflow in 2FA screen by @juanjk24 in #4786
- feat: encrypt environment variables at rest with AES-256-GCM by @Siumauricio in #4789
- feat: export full keyring in backup encryption key file by @Siumauricio in #4814
New Contributors
Full Changelog: v0.29.11...v0.29.12
v0.29.11
What's Changed
- fix(requests): chart not visible in Requests tab by @Siumauricio in #4751
- feat(ci): attach install.sh to each GitHub release by @Siumauricio in #4757
- feat(ci): pin install.sh release asset to the released version by @Siumauricio in #4758
- fix(databases): resolve crash when opening rebuild database dialog by @Siumauricio in #4763
- fix(ui): resolve CommandDialog crash on CMD/CTRL + J shortcut by @imrja8 in #4761
- fix(ui): enable vertical scroll on collapsed sidebar by @imrja8 in #4755
- chore(ui): fix biome formatting issues from #4761 by @imrja8 in #4768
- fix(sso): apply trusted origin changes without server restart by @Siumauricio in #4776
- feat(scim): SCIM 2.0 user provisioning (enterprise) by @Siumauricio in #4771
- perf: share db, docker and auth singletons across duplicated bundles by @Siumauricio in #4777
- feat: make concurrent builds an OSS feature by @Siumauricio in #4778
New Contributors
Full Changelog: v0.29.10...v0.29.11
v0.29.10
What's Changed
- fix(ui): prevent scrollbar layout shift by @emi-ran in #4744
- Feat/plan limits by @Siumauricio in #4745
New Contributors
Full Changelog: v0.29.9...v0.29.10
v0.29.9
Build Concurrency 🚀
For the last 2 years, Dokploy has used a single global queue for all builds. Starting with this release, each server now has its own dedicated queue, with support for up to 2 concurrent builds per server default is 1 (unlimited on Enterprise).
This means faster deployments, less waiting, and better resource utilization across your infrastructure. We hope this change helps everyone ship faster!
Breaking Changes
⚠️ Enterprise users with White Labeling:** The white labeling CSS was updated (Tailwind v4 migration), so your custom colors may render differently after this update. Review and re-adjust your branding colors if needed. you can reset the colors to default and then adjust accordingly to your palette colors.
What's Changed
- refactor: unify server admin tools into dashboard pages with server selector by @Siumauricio in #4625
- Feat/concurrent deployments in memory queue by @Siumauricio in #4645
- fix: resolve server from parent entity in deployment.readLogs by @elijahdev0 in #4689
- feat: enhance TLS certificate selection UI in AddDomain component by @Siumauricio in #4705
- fix: add method="post" to auth forms to prevent credential leak in URL by @vikyw89 in #4683
- Feat/tailwind v4 shadcn update by @Siumauricio in #4706
- feat: add claim mapping functionality to OIDC registration dialog by @Siumauricio in #4712
- fix: allow members with git providers permission to create/delete their own providers by @Siumauricio in #4713
- prevent social icons from overlapping in onboarding layout by @Phoenix1808 in #4692
- fix(registry): preserve username case for ECR compatibility by @rafaumeu in #4647
- fix: don't let ssh-keyscan abort SSH git clones by @weibeu in #4605
- fix(validation): allow hashtag in git branch names by @Siumauricio in #4714
- fix: prevent request path truncation in request logs by @Siumauricio in #4643
- fix: resolve traefik container dynamically in access-log cleanup (swarm mode) by @Siumauricio in #4646
- fix: use github owner login for webhook deploy matching by @agentHits in #4674
- fix(server-setup): report the installed Docker version in the setup banner by @ioanbeilic in #4723
- fix(domain): validate hostname format to reject invalid characters by @Siumauricio in #4729
- fix: reduce SSR payload size by scoping user.get columns by @Siumauricio in #4730
- fix(projects): make project cards grid fill available width by @Siumauricio in #4731
- fix(ai): use nullable instead of optional for configFiles in AI suggestion schema by @Siumauricio in #4732
- fix(deployment): resolve schedule to its service before permission check in allByType by @Siumauricio in #4733
- fix(databases): update default Redis version from 7 to 8 by @GuillaumeLecomte1 in #4224
- feat(databases): add copy button to User and Database Name fields by @Siumauricio in #4735
- fix(ai): allow configFiles to be null in template generator Details type by @Siumauricio in #4736
- fix(backup): redact S3 credentials from logs and error output by @rafaumeu in #4648
- fix(ai): allow Ollama Cloud API key in AI settings by @VincentEmmanuel in #4262
New Contributors
- @elijahdev0 made their first contribution in #4689
- @Phoenix1808 made their first contribution in #4692
- @rafaumeu made their first contribution in #4647
- @weibeu made their first contribution in #4605
- @agentHits made their first contribution in #4674
- @ioanbeilic made their first contribution in #4723
- @GuillaumeLecomte1 made their first contribution in #4224
- @VincentEmmanuel made their first contribution in #4262
Full Changelog: v0.29.8...v0.29.9
v0.29.8
What's Changed
- 🚀 Release v0.29.6 by @github-actions[bot] in #4514
- fix: scope dokploy-server schedules to organization instead of user by @Siumauricio in #4526
- Feat/forward auth sso by @Siumauricio in #4555
- fix: swarm health check fields not resetting to default values by @Siumauricio in #4558
- fix: add docker cleanup toggle to remote server creation by @Siumauricio in #4559
- fix: use stop-first update order for database services by @Siumauricio in #4560
- fix: respect gitProviders permissions in git provider UI by @Siumauricio in #4561
- fix: strip credentials from service-level API responses by @Siumauricio in #4564
- refactor: improve restore logging for database backups by @Siumauricio in #4566
- fix: use swarm advertise address in docker swarm join command by @Siumauricio in #4567
- fix: enforce docker:read on container start/stop/kill/restart mutations by @Siumauricio in #4568
- fix: strip credentials from gitProvider.getAll API response by @Siumauricio in #4569
- fix: correct git provider access check for existing deploys by @Siumauricio in #4570
- fix: prevent registry password from appearing in error messages and shell commands by @Siumauricio in #4579
Full Changelog: v0.29.6...v0.29.8

















