v0.29.12-community.2
Community fork of Dokploy, built on the upstream v0.29.12 base (environment encryption at rest, backup keyring). This release rolls up the full port train that landed since v0.29.12-community.1: 100+ upstream fixes and features ported 1:1, plus fork-side security hardening.
Every ported change credits the original upstream author — their work, ported and re-verified against the fork's divergent networking and branding layer. Thanks to everyone whose PRs and issue reports made this release.
Security hardening
Direct fork commits (this release):
- Restrict admin invites and validate team ownership in the organization router (
1aeafd5aa).moveMemberToTeamis validated member-based — the fork has no team table, soteamIdis checked against existing members'teamIds in the caller's organization. - Shell-less rclone
obscureand validation of SFTP/FTP destination fields (800324fc0). - Add a service-permission gate to
loadTemplateFromGitin the compose router (7167d3477). - Kill the attach PTY on WebSocket disconnect and spawn
docker attachwithout a shell (6cebac837). - Validate and escape mount-permission command inputs (
7d8d47049). - Mock
node:fs/promisesin the web-server restore test to stabilize the suite (e118489f8). - Authorize GitLab MR previews by author, not webhook actor (
065233cd4). GitLab merge-request preview deployments now authorize the MR author (object_attributes.author_id) instead of the webhook event actor (body.user), closing a bypass where any Developer+ member labeling or updating an untrusted contributor's MR could trigger a preview deployment of untrusted code.
Ported hardening:
- Update Traefik from v3.6.7 to v3.6.20 — #15 (ports Dokploy#4584, @andershermansen)
- Disable the Traefik insecure API by default — #16 (ports Dokploy#4107, @knowsuchagency)
- Disable HTTP/2 on
websecureto fix WebSocket connections — #17 (ports Dokploy#4204, @vincent067) - Masked webhook URL by default with an optional reveal toggle — #36 (ports Dokploy#4506, @nktnet1)
- Disable the default body parser on the OpenAPI catch-all route — #53 (ports Dokploy#4770, @mutawakkilalallah)
- Prevent the SSH private key from leaking into build-failure notifications — #63 (ports Dokploy#4630, @jsheely)
- Validate API-key prefixes before creation — #64 (ports Dokploy#4629, @KirillYarkov)
- Validate
customGitUrlto prevent command injection — #66 (ports Dokploy#4676, @gsmatheus) - Quote and escape environment-variable values — #115 (ports Dokploy#4140, @rgdcastro)
- Scope assigned-server access to the active organization — #119 (ports Dokploy#4446, @SadmanPinon)
- Gate custom-role listings behind
member:read— #120 (ports Dokploy#4465, @haki203, @zergzorg) - Validate API-key name length to prevent an opaque 500 — #125 (ports Dokploy#4806, @tanaymishra)
- Redact private keys from logged command errors — #127 (ports Dokploy#4602, @weibeu)
Registries & deployments
- Add AWS ECR registry support — #105 (ports Dokploy#4141, @EphraimHaber)
- Pull images with stored registry credentials — #103 (ports Dokploy#3678, @AceRRR10)
- Pre-deploy and post-deploy command hooks for applications — #11 (ports Dokploy#4240, @Alfredao)
- Compose: pull latest images on deploy toggle — #12 (implements upstream issue Dokploy#2655, @paulwer)
- Deploy a specific Docker image/tag at deploy time — #84 (implements upstream issue Dokploy#1942, @DrakkoFire)
- Inject the git commit hash and message as Docker build args — #79 (ports Dokploy#4007, @nurikk)
- Inject predefined
DOKPLOY_*environment variables at deploy time — #81 (implements upstream issue Dokploy#3829, @Asamsig) - Invalidate the railpack build cache when env changes — #70 (ports Dokploy#4557, @rnkp755)
- Fetch railpack versions dynamically from GitHub releases — #102 (ports Dokploy#4070, @s24407-pj)
- Compose: "Deploy with Fresh Volumes" option — #93 (ports Dokploy#4195, @lamualfa)
- Accept
sourceTypein the create-application and create-compose schemas — #92 (ports Dokploy#4710, @elijahdev0) - Compose: allow manual webhook calls when autoDeploy is off — #61 (ports Dokploy#4286, @ews-pgasser)
- Normalize watch-path changed-file matching for added/removed files — #73 (ports Dokploy#4085, @jakvbs)
- Honor
triggerTypeon refresh-token deploys (On tag) — #65 (ports Dokploy#4627, @andikadevs)
Backups & destinations
- S3 backup encryption at rest via rclone crypt — #109 (ports Dokploy#3194, @amirhmoradi)
- Add generic rclone remote support for backup destinations — #106 (ports Dokploy#4563, @heickerv1001-dev)
- Add SFTP and FTP backup destination support via rclone — #33 (ports Dokploy#4546, @thanhtrieunguyen)
- Honor a user-defined S3 prefix — #107 (ports Dokploy#4405, @imajus)
- Allow MongoDB backup of all databases (empty database name) — #100 (ports Dokploy#4187, @krisvanmelis)
- Prevent database backups from running the dump twice — #25 (ports Dokploy#4586, @ravindu0823)
- Fix MongoDB compose restore gzip filename mismatch — #29 (ports Dokploy#3916, @surajmgr)
- Use 3-section sequential
pg_restoreto prevent OID race conditions — #114 (ports Dokploy#4170, @mixelburg) - Backup restore button visibility + unzip path validation — #71 (ports Dokploy#4344, @aayushbaluni)
- Restart the service after a failed volume backup when "Turn Off Container" is enabled — #77 (ports Dokploy#4587, @ravindu0823)
- Refresh server IP after a web-server restore — #83 (ports Dokploy#4542, @NoelisTired)
- Keep replica sets on a partial MongoDB update — #99 (ports Dokploy#4543, @linkthai)
- Disable the restore-backup action when the target service is not running — #129 (ports Dokploy#4478, @slig)
- Allow resetting volume-backup retention to unlimited — #130 (ports Dokploy#4588, @ravindu0823)
- Avoid the Postgres 100-argument limit in the volume-backups scheduler query — #24 (implements upstream issue Dokploy#4256, @colocated)
Domains & networking
- Wildcard domain support — #13 (ports Dokploy#2859, @LukasParke; upstream issue Dokploy#1404)
- Add a wildcard-domain restriction setting — #108 (ports Dokploy#4259, @TuroYT)
- Write
certificate.ymlto the top-level dynamic dir for Traefik file-provider discovery — #18 (ports Dokploy#4711, @Mubashir-teapot) - Preserve remote YAML shell quotes — #19 (ports Dokploy#4725, @yusoofsh)
- Add an explicit
HostIpto Traefik port bindings — #20 (ports Dokploy#4106, @knowsuchagency) - Global response-compression toggle (Traefik compress middleware) — #49 (implements upstream issue Dokploy#3494, @dtinth)
- Use the public IP for
traefik.medomains when the server IP is private — #51 (ports Dokploy#3950, @lcaputo) - Display the custom certificate provider — #86 (ports Dokploy#4613, @Hoshino-Yumetsuki)
- Configurable MTU for isolated networks — #98 (ports Dokploy#4071, @Hobby-Student)
- Only add the compose default network when a service had no explicit networks — #95 (ports Dokploy#4592, @ravindu0823)
- Resolve
${{service.<name>.fqdn}}cross-service env references — #30 (ports Dokploy#4667, @AlessandroCaroli) - Per-server
defaultDomainfor auto-generated app domains — #110 (ports Dokploy#4364, @tatdorian)
Cloudflare integration
- Native Cloudflare integration — credentials, Tunnel publishing, and Access (zero-trust) — #116 (ports Dokploy#4528, @maxsam4)
Preview deployments
- Custom preview template — #35 (@ajnart; rebased continuation of the fork's #7)
- Re-clone source on rebuild so PR pushes propagate — #52 (ports Dokploy#4319, @budivoogt)
- Trigger preview deployments via the API — #62 (implements upstream issue Dokploy#1365, @Esmaay)
- Deterministic per-PR preview domains via a
${prNumber}template variable — #78 (ports Dokploy#4766, @fidelis05) - Don't block updates to existing previews at the limit — #111 (ports Dokploy#4139, @mixelburg)
- Use
buildServerIdfor preview-deployment build and service creation — #47 (ports Dokploy#3863, @kopandante) - Prevent duplicate preview deployments (concurrent
pull_requestwebhooks and labeled PRs); includes a one-time dedupe of existing duplicate rows — #118 (ports Dokploy#4289, @colocated; Dokploy#4551, @Wouter8) - GitLab merge-request preview deployments via webhook — #121 (ports Dokploy#4089, @edouard-mangel)
Notifications
- Use the real server name in remote threshold alerts — #58 (ports Dokploy#4791, @PixelPerfector)
- Notify on a container crash loop after deployment — #72 (ports Dokploy#4357, @sajdakabir)
- Notify on scheduled-job failure — #117 (ports Dokploy#4212, @YgorLeal)
Git providers & auth
- GitHub/Google social login on self-hosted (clean-room un-gate) — #10 (@BSalaeddin)
- Fix login redirect — #22 (ports Dokploy#4607, @Wormav)
- Fix GitLab OAuth callback ignoring the Internal URL (HTTPS ECONNREFUSED) — #48 (ports Dokploy#3852, @isboyjc)
- Use the default
expires_infor older GitLab versions — #50 (ports Dokploy#4387, @tfnick) - Codeberg preset in the Gitea provider creation dialog — #54 (implements upstream issue Dokploy#2021, @laem)
- Fix invalid Docker host when using Docker Desktop — #57 (ports Dokploy#4171, @rpoetrap)
- Refactor
auth.tsto lazy-load by default — #60 (ports Dokploy#3634, @AlexDev404) - Add the
write:repositoryscope to Gitea OAuth — #124 (ports Dokploy#4413, @lamualfa) - Support hashtag and special characters in branch names for git clone — #113 (ports Dokploy#4644, @Siumauricio)
- Allow password reset on self-hosted (remove the
IS_CLOUDgate on reset pages) — #112 (ports Dokploy#4665, @nizepart)
Database, schedules & mounts
- Fix the Postgres 100-argument limit in port and rollback queries — #34 (implements upstream issue Dokploy#4256, @colocated)
- Preserve server-schedule failures through the tee pipeline — #59 (ports Dokploy#4122, @Gabrielgvl)
- Support external Redis configuration — #82 (ports Dokploy#4443, @satoukouga)
- Store
serverIdon the deployment record to enable remote log cleanup — #39 (ports Dokploy#4565, @Irwnda) - Clear old deployment records and logs, keeping only the active deployment — #42 (ports Dokploy#4554, @Irwnda)
- Customizable uid/gid/mode for volume mounts — #101 (ports Dokploy#2517, @divaltor, @Siumauricio)
- Preserve raw remote mounts — #75 (ports Dokploy#4795, @yusoofsh)
- Preserve named-volume access mode in the compose randomize transform — #126 (ports Dokploy#4819, @tanaymishra)
Monitoring
- Container resource breakdown in monitoring — #31 (ports Dokploy#4571, @agentHits)
- Show swap usage in monitoring — #85 (ports Dokploy#4574, @agentHits)
- Disable animation and use linear interpolation in charts — #94 (ports Dokploy#4467, @mixelburg)
- Remote-server stats via a server selector — #104 (ports Dokploy#4460, @manalkaff)
- Show container healthcheck status in the UI — #90 (implements upstream issue Dokploy#1557, @TeamBattino)
- Attach to a container for inserting inputs — #91 (ports Dokploy#3302, @okunamayanad)
Organizations & teams
- Editable organization descriptions — #21 (ports Dokploy#4426, @realkoreanbeef)
- Bulk invitations & move member to team — #32 (ports Dokploy#4481, @BSalaeddin)
- Drag-and-drop logo upload for organizations — #87 (ports Dokploy#4765, @imrja8)
- Export a project to a portable JSON file — #88 (implements upstream issue Dokploy#1733, @kolanski)
- Eliminate whitelabeling FOUC across all pages — #80 (ports Dokploy#4769, @imrja8)
Reliability & server ops
- Use Docker 29.4.2 on Ubuntu 26.04 to fix an install failure — #55 (ports Dokploy#4660, @pparage)
- Add
unzipto Arch server setup — #56 (ports Dokploy#4176, @daniel-abramov) - Exit cleanly on fatal startup errors instead of crash-looping — #69 (ports Dokploy#4601, @apotema)
- Support custom
template.tomlin git repositories — #96 (ports Dokploy#3074, @M4rshe1, @Siumauricio) - Idle-exec with Podman support; enable cleanup by default — #97 (ports Dokploy#4346, @fir4tozden)
- Idempotent log-level handling: respect the log level declared by structured loggers — #67 (ports Dokploy#4624, @fcsouza)
- Don't classify successful log lines as errors — #68 (ports Dokploy#4538, @ravindu0823)
UI/UX fixes
- Adjust the 2FA screen button container to a grid layout to prevent overflow — #23 (ports Dokploy#4786, @juanjk24)
- Prevent the environment form from resetting while editing — #26 (ports Dokploy#4626, @veksen)
- Open the deployments tab when opening a service from the deployments list — #27 (ports Dokploy#4583, @TpmyCT)
- Filter the deployments table by server — #28 (ports Dokploy#4672, @pparage)
- Sort services in the breadcrumb dropdown by user preference — #37 (ports Dokploy#4388, @vadamk)
- Typo fixes — #38 (ports Dokploy#4800, @EvanSchleret)
- Add padding to the select component — #40 (ports Dokploy#4783, @juanjk24)
- Prevent layout shift in the log counter using tabular-nums — #41 (ports Dokploy#4317, @difagume)
- Improve responsive layout for the application logs page — #43 (ports Dokploy#4180, @TuroYT)
- Fix tooltip incorrectly listing volumes among Daily Cleanup targets — #44 (ports Dokploy#4328, @teoobarca)
- Use a lazy initializer for
useStatewith function calls — #46 (ports Dokploy#3867, @karyanayandi) - Resolve the unclickable watch-path removal button — #76 (ports Dokploy#4782, @imrja8, @fredhii)
- Show a modal when switching to incompatible providers — #89 (ports Dokploy#4288, @colocated)
- Show commit metadata in recent deployments on the home page — #128 (ports Dokploy#4487, @iamyahyr)
- Make the MariaDB icon visible in dark theme — #131 (ports Dokploy#4820, @techdawnarea)
- Add missing Korean translations for Traefik ports and terminal — #132 (ports Dokploy#4788, @moduvoice)
Fork infrastructure
- Sync upstream v0.29.11 into canary + community release rename — #14 (@AminDhouib)
- Sync upstream v0.29.12 (env encryption at rest, backup keyring) — #133 (@AminDhouib)
- Fork release links + combined release notes in the update dialog — #134 (@AminDhouib)
Migrations
Schema migrations 0176 → 0188 land in this release:
| Slot | Tag | Notes |
|---|---|---|
| 0176 | smiling_harry_osborn |
|
| 0177 | hot_supreme_intelligence |
|
| 0178 | overjoyed_korvac |
|
| 0179 | overrated_bug |
|
| 0180 | greedy_veda |
|
| 0181 | closed_the_initiative |
|
| 0182 | round_landau |
|
| 0183 | sloppy_franklin_storm |
|
| 0184 | fresh_oracle |
Cloudflare integration (#116) |
| 0185 | minor_harrier |
Duplicate preview-deployment prevention + existing-row dedupe (#118) |
| 0186 | giant_thanos |
Scheduled-job failure notifications (#117) |
| 0187 | amusing_molten_man |
GitLab MR preview deployments (#121); webhook_secret backfill uses core gen_random_uuid (no pgcrypto required) |
| 0188 | steady_scrambler |
Per-server defaultDomain (#110) |
Migrations apply automatically on startup in when-timestamp order.
Install / upgrade
docker service update \
--image ghcr.io/devinosolutions/dokploy-community:v0.29.12-community.2 \
--with-registry-auth \
dokployThe image is public — no registry login required. See the README for fresh-install and rollback instructions.
Known caveats
- S3 backup encryption (#109) is unit-tested only. A live rclone + S3 smoke test is still recommended before relying on it. Upstream's crypt connection-string approach had a shell-quoting bug; the fork configures crypt via
RCLONE_CRYPT_*environment variables instead (encrypt with obscured passwords; supported on S3 and generic destinations). moveMemberToTeamvalidation is member-based. The fork has no team table, soteamIdis validated against theteamIds of existing members in the caller's organization rather than against a dedicated teams table.