Skip to content

Preview deployments broken on v0.29.0: cannot pass more than 100 arguments to a function #4256

@colocated

Description

@colocated

Describe the bug

On a fresh v0.29.0 install, preview deployments are completely non-functional. A PR triggers preview creation and the GitHub comment appears with status "Building", but the preview never actually starts building — no container is ever created on the server. The preview card in the Dokploy UI is also unusable: Delete fails, Rebuild is permanently greyed out, and Logs / Deployments sub-views also fail.

The deployment record exists in Postgres and the Dokploy log prints ✅ SECURITY: Preview deployment authorized... immediately before the failure, but every subsequent read of the preview crashes with a Postgres error.

Root cause

Drizzle's relational query for hydrating a preview deployment with its nested application → server and application → environment → project relations generates a single json_build_array(...) call for the application row that exceeds Postgres's hard-compiled FUNC_MAX_ARGS = 100 limit. The application table has over 100 columns in v0.29.0 (preview-specific, Swarm, GitHub, GitLab, Gitea, Bitbucket, build config, etc.), so the select-all pattern inside the lateral join is no longer viable.

Error

dokploy.1.7shijo4fybb3@services01    | ✅ SECURITY: Preview deployment authorized for Next.js from user colocated on MyOrg/MyRepository. Permission: admin
dokploy.1.7shijo4fybb3@services01    | Error Error: Failed query: select "previewDeployments"."previewDeploymentId", "previewDeployments"."branch", "previewDeployments"."pullRequestId", "previewDeployments"."pullRequestNumber", "previewDeployments"."pullRequestURL", "previewDeployments"."pullRequestTitle", "previewDeployments"."pullRequestCommentId", "previewDeployments"."previewStatus", "previewDeployments"."appName", "previewDeployments"."applicationId", "previewDeployments"."domainId", "previewDeployments"."createdAt", "previewDeployments"."expiresAt", "previewDeployments_domain"."data" as "domain", "previewDeployments_application"."data" as "application" from "preview_deployments" "previewDeployments" left join lateral (select json_build_array("previewDeployments_domain"."domainId", "previewDeployments_domain"."host", "previewDeployments_domain"."https", "previewDeployments_domain"."port", "previewDeployments_domain"."customEntrypoint", "previewDeployments_domain"."path", "previewDeployments_domain"."serviceName", "previewDeployments_domain"."domainType", "previewDeployments_domain"."uniqueConfigKey", "previewDeployments_domain"."createdAt", "previewDeployments_domain"."composeId", "previewDeployments_domain"."customCertResolver", "previewDeployments_domain"."applicationId", "previewDeployments_domain"."previewDeploymentId", "previewDeployments_domain"."certificateType", "previewDeployments_domain"."internalPath", "previewDeployments_domain"."stripPath", "previewDeployments_domain"."middlewares") as "data" from (select * from "domain" "previewDeployments_domain" where "previewDeployments_domain"."domainId" = "previewDeployments"."domainId" limit $1) "previewDeployments_domain") "previewDeployments_domain" on true left join lateral (select json_build_array("previewDeployments_application"."applicationId", "previewDeployments_application"."name", "previewDeployments_application"."appName", "previewDeployments_application"."description", "previewDeployments_application"."env", "previewDeployments_application"."previewEnv", "previewDeployments_application"."watchPaths", "previewDeployments_application"."previewBuildArgs", "previewDeployments_application"."previewBuildSecrets", "previewDeployments_application"."previewLabels", "previewDeployments_application"."previewWildcard", "previewDeployments_application"."previewPort", "previewDeployments_application"."previewHttps", "previewDeployments_application"."previewPath", "previewDeployments_application"."certificateType", "previewDeployments_application"."previewCustomCertResolver", "previewDeployments_application"."previewLimit", "previewDeployments_application"."isPreviewDeploymentsActive", "previewDeployments_application"."previewRequireCollaboratorPermissions", "previewDeployments_application"."rollbackActive", "previewDeployments_application"."buildArgs", "previewDeployments_application"."buildSecrets", "previewDeployments_application"."memoryReservation", "previewDeployments_application"."memoryLimit", "previewDeployments_application"."cpuReservation", "previewDeployments_application"."cpuLimit", "previewDeployments_application"."title", "previewDeployments_application"."enabled", "previewDeployments_application"."subtitle", "previewDeployments_application"."command", "previewDeployments_application"."args", "previewDeployments_application"."icon", "previewDeployments_application"."refreshToken", "previewDeployments_application"."sourceType", "previewDeployments_application"."cleanCache", "previewDeployments_application"."repository", "previewDeployments_application"."owner", "previewDeployments_application"."branch", "previewDeployments_application"."buildPath", "previewDeployments_application"."triggerType", "previewDeployments_application"."autoDeploy", "previewDeployments_application"."gitlabProjectId", "previewDeployments_application"."gitlabRepository", "previewDeployments_application"."gitlabOwner", "previewDeployments_application"."gitlabBranch", "previewDeployments_application"."gitlabBuildPath", "previewDeployments_application"."gitlabPathNamespace", "previewDeployments_application"."giteaRepository", "previewDeployments_application"."giteaOwner", "previewDeployments_application"."giteaBranch", "previewDeployments_application"."giteaBuildPath", "previewDeployments_application"."bitbucketRepository", "previewDeployments_application"."bitbucketRepositorySlug", "previewDeployments_application"."bitbucketOwner", "previewDeployments_application"."bitbucketBranch", "previewDeployments_application"."bitbucketBuildPath", "previewDeployments_application"."username", "previewDeployments_application"."password", "previewDeployments_application"."dockerImage", "previewDeployments_application"."registryUrl", "previewDeployments_application"."customGitUrl", "previewDeployments_application"."customGitBranch", "previewDeployments_application"."customGitBuildPath", "previewDeployments_application"."customGitSSHKeyId", "previewDeployments_application"."enableSubmodules", "previewDeployments_application"."dockerfile", "previewDeployments_application"."dockerContextPath", "previewDeployments_application"."dockerBuildStage", "previewDeployments_application"."dropBuildPath", "previewDeployments_application"."healthCheckSwarm", "previewDeployments_application"."restartPolicySwarm", "previewDeployments_application"."placementSwarm", "previewDeployments_application"."updateConfigSwarm", "previewDeployments_application"."rollbackConfigSwarm", "previewDeployments_application"."modeSwarm", "previewDeployments_application"."labelsSwarm", "previewDeployments_application"."networkSwarm", "previewDeployments_application"."stopGracePeriodSwarm", "previewDeployments_application"."endpointSpecSwarm", "previewDeployments_application"."ulimitsSwarm", "previewDeployments_application"."replicas", "previewDeployments_application"."applicationStatus", "previewDeployments_application"."buildType", "previewDeployments_application"."railpackVersion", "previewDeployments_application"."herokuVersion", "previewDeployments_application"."publishDirectory", "previewDeployments_application"."isStaticSpa", "previewDeployments_application"."createEnvFile", "previewDeployments_application"."createdAt", "previewDeployments_application"."registryId", "previewDeployments_application"."rollbackRegistryId", "previewDeployments_application"."environmentId", "previewDeployments_application"."githubId", "previewDeployments_application"."gitlabId", "previewDeployments_application"."giteaId", "previewDeployments_application"."bitbucketId", "previewDeployments_application"."serverId", "previewDeployments_application"."buildServerId", "previewDeployments_application"."buildRegistryId", "previewDeployments_application_server"."data", "previewDeployments_application_environment"."data") as "data" from (select * from "application" "previewDeployments_application" where "previewDeployments_application"."applicationId" = "previewDeployments"."applicationId" limit $2) "previewDeployments_application" left join lateral (select json_build_array("previewDeployments_application_server"."serverId", "previewDeployments_application_server"."name", "previewDeployments_application_server"."description", "previewDeployments_application_server"."ipAddress", "previewDeployments_application_server"."port", "previewDeployments_application_server"."username", "previewDeployments_application_server"."appName", "previewDeployments_application_server"."enableDockerCleanup", "previewDeployments_application_server"."createdAt", "previewDeployments_application_server"."organizationId", "previewDeployments_application_server"."serverStatus", "previewDeployments_application_server"."serverType", "previewDeployments_application_server"."command", "previewDeployments_application_server"."sshKeyId", "previewDeployments_application_server"."metricsConfig") as "data" from (select * from "server" "previewDeployments_application_server" where "previewDeployments_application_server"."serverId" = "previewDeployments_application"."serverId" limit $3) "previewDeployments_application_server") "previewDeployments_application_server" on true left join lateral (select json_build_array("previewDeployments_application_environment"."environmentId", "previewDeployments_application_environment"."name", "previewDeployments_application_environment"."description", "previewDeployments_application_environment"."createdAt", "previewDeployments_application_environment"."env", "previewDeployments_application_environment"."projectId", "previewDeployments_application_environment"."isDefault", "previewDeployments_application_environment_project"."data") as "data" from (select * from "environment" "previewDeployments_application_environment" where "previewDeployments_application_environment"."environmentId" = "previewDeployments_application"."environmentId" limit $4) "previewDeployments_application_environment" left join lateral (select json_build_array("previewDeployments_application_environment_project"."projectId", "previewDeployments_application_environment_project"."name", "previewDeployments_application_environment_project"."description", "previewDeployments_application_environment_project"."createdAt", "previewDeployments_application_environment_project"."organizationId", "previewDeployments_application_environment_project"."env") as "data" from (select * from "project" "previewDeployments_application_environment_project" where "previewDeployments_application_environment_project"."projectId" = "previewDeployments_application_environment"."projectId" limit $5) "previewDeployments_application_environment_project") "previewDeployments_application_environment_project" on true) "previewDeployments_application_environment" on true) "previewDeployments_application" on true where "previewDeployments"."previewDeploymentId" = $6 limit $7
dokploy.1.7shijo4fybb3@services01    | params: 1,1,1,1,1,GG-t09ZME3yxj6JwsTKIb,1
dokploy.1.7shijo4fybb3@services01    |     at async PR.TR.autorun [as processFn] (dist/server.mjs:1:1657) {
dokploy.1.7shijo4fybb3@services01    |   query: 'select "previewDeployments"."previewDeploymentId", "previewDeployments"."branch", "previewDeployments"."pullRequestId", "previewDeployments"."pullRequestNumber", "previewDeployments"."pullRequestURL", "previewDeployments"."pullRequestTitle", "previewDeployments"."pullRequestCommentId", "previewDeployments"."previewStatus", "previewDeployments"."appName", "previewDeployments"."applicationId", "previewDeployments"."domainId", "previewDeployments"."createdAt", "previewDeployments"."expiresAt", "previewDeployments_domain"."data" as "domain", "previewDeployments_application"."data" as "application" from "preview_deployments" "previewDeployments" left join lateral (select json_build_array("previewDeployments_domain"."domainId", "previewDeployments_domain"."host", "previewDeployments_domain"."https", "previewDeployments_domain"."port", "previewDeployments_domain"."customEntrypoint", "previewDeployments_domain"."path", "previewDeployments_domain"."serviceName", "previewDeployments_domain"."domainType", "previewDeployments_domain"."uniqueConfigKey", "previewDeployments_domain"."createdAt", "previewDeployments_domain"."composeId", "previewDeployments_domain"."customCertResolver", "previewDeployments_domain"."applicationId", "previewDeployments_domain"."previewDeploymentId", "previewDeployments_domain"."certificateType", "previewDeployments_domain"."internalPath", "previewDeployments_domain"."stripPath", "previewDeployments_domain"."middlewares") as "data" from (select * from "domain" "previewDeployments_domain" where "previewDeployments_domain"."domainId" = "previewDeployments"."domainId" limit $1) "previewDeployments_domain") "previewDeployments_domain" on true left join lateral (select json_build_array("previewDeployments_application"."applicationId", "previewDeployments_application"."name", "previewDeployments_application"."appName", "previewDeployments_application"."description", "previewDeployments_application"."env", "previewDeployments_application"."previewEnv", "previewDeployments_application"."watchPaths", "previewDeployments_application"."previewBuildArgs", "previewDeployments_application"."previewBuildSecrets", "previewDeployments_application"."previewLabels", "previewDeployments_application"."previewWildcard", "previewDeployments_application"."previewPort", "previewDeployments_application"."previewHttps", "previewDeployments_application"."previewPath", "previewDeployments_application"."certificateType", "previewDeployments_application"."previewCustomCertResolver", "previewDeployments_application"."previewLimit", "previewDeployments_application"."isPreviewDeploymentsActive", "previewDeployments_application"."previewRequireCollaboratorPermissions", "previewDeployments_application"."rollbackActive", "previewDeployments_application"."buildArgs", "previewDeployments_application"."buildSecrets", "previewDeployments_application"."memoryReservation", "previewDeployments_application"."memoryLimit", "previewDeployments_application"."cpuReservation", "previewDeployments_application"."cpuLimit", "previewDeployments_application"."title", "previewDeployments_application"."enabled", "previewDeployments_application"."subtitle", "previewDeployments_application"."command", "previewDeployments_application"."args", "previewDeployments_application"."icon", "previewDeployments_application"."refreshToken", "previewDeployments_application"."sourceType", "previewDeployments_application"."cleanCache", "previewDeployments_application"."repository", "previewDeployments_application"."owner", "previewDeployments_application"."branch", "previewDeployments_application"."buildPath", "previewDeployments_application"."triggerType", "previewDeployments_application"."autoDeploy", "previewDeployments_application"."gitlabProjectId", "previewDeployments_application"."gitlabRepository", "previewDeployments_application"."gitlabOwner", "previewDeployments_application"."gitlabBranch", "previewDeployments_application"."gitlabBuildPath", "previewDeployments_application"."gitlabPathNamespace", "previewDeployments_application"."giteaRepository", "previewDeployments_application"."giteaOwner", "previewDeployments_application"."giteaBranch", "previewDeployments_application"."giteaBuildPath", "previewDeployments_application"."bitbucketRepository", "previewDeployments_application"."bitbucketRepositorySlug", "previewDeployments_application"."bitbucketOwner", "previewDeployments_application"."bitbucketBranch", "previewDeployments_application"."bitbucketBuildPath", "previewDeployments_application"."username", "previewDeployments_application"."password", "previewDeployments_application"."dockerImage", "previewDeployments_application"."registryUrl", "previewDeployments_application"."customGitUrl", "previewDeployments_application"."customGitBranch", "previewDeployments_application"."customGitBuildPath", "previewDeployments_application"."customGitSSHKeyId", "previewDeployments_application"."enableSubmodules", "previewDeployments_application"."dockerfile", "previewDeployments_application"."dockerContextPath", "previewDeployments_application"."dockerBuildStage", "previewDeployments_application"."dropBuildPath", "previewDeployments_application"."healthCheckSwarm", "previewDeployments_application"."restartPolicySwarm", "previewDeployments_application"."placementSwarm", "previewDeployments_application"."updateConfigSwarm", "previewDeployments_application"."rollbackConfigSwarm", "previewDeployments_application"."modeSwarm", "previewDeployments_application"."labelsSwarm", "previewDeployments_application"."networkSwarm", "previewDeployments_application"."stopGracePeriodSwarm", "previewDeployments_application"."endpointSpecSwarm", "previewDeployments_application"."ulimitsSwarm", "previewDeployments_application"."replicas", "previewDeployments_application"."applicationStatus", "previewDeployments_application"."buildType", "previewDeployments_application"."railpackVersion", "previewDeployments_application"."herokuVersion", "previewDeployments_application"."publishDirectory", "previewDeployments_application"."isStaticSpa", "previewDeployments_application"."createEnvFile", "previewDeployments_application"."createdAt", "previewDeployments_application"."registryId", "previewDeployments_application"."rollbackRegistryId", "previewDeployments_application"."environmentId", "previewDeployments_application"."githubId", "previewDeployments_application"."gitlabId", "previewDeployments_application"."giteaId", "previewDeployments_application"."bitbucketId", "previewDeployments_application"."serverId", "previewDeployments_application"."buildServerId", "previewDeployments_application"."buildRegistryId", "previewDeployments_application_server"."data", "previewDeployments_application_environment"."data") as "data" from (select * from "application" "previewDeployments_application" where "previewDeployments_application"."applicationId" = "previewDeployments"."applicationId" limit $2) "previewDeployments_application" left join lateral (select json_build_array("previewDeployments_application_server"."serverId", "previewDeployments_application_server"."name", "previewDeployments_application_server"."description", "previewDeployments_application_server"."ipAddress", "previewDeployments_application_server"."port", "previewDeployments_application_server"."username", "previewDeployments_application_server"."appName", "previewDeployments_application_server"."enableDockerCleanup", "previewDeployments_application_server"."createdAt", "previewDeployments_application_server"."organizationId", "previewDeployments_application_server"."serverStatus", "previewDeployments_application_server"."serverType", "previewDeployments_application_server"."command", "previewDeployments_application_server"."sshKeyId", "previewDeployments_application_server"."metricsConfig") as "data" from (select * from "server" "previewDeployments_application_server" where "previewDeployments_application_server"."serverId" = "previewDeployments_application"."serverId" limit $3) "previewDeployments_application_server") "previewDeployments_application_server" on true left join lateral (select json_build_array("previewDeployments_application_environment"."environmentId", "previewDeployments_application_environment"."name", "previewDeployments_application_environment"."description", "previewDeployments_application_environment"."createdAt", "previewDeployments_application_environment"."env", "previewDeployments_application_environment"."projectId", "previewDeployments_application_environment"."isDefault", "previewDeployments_application_environment_project"."data") as "data" from (select * from "environment" "previewDeployments_application_environment" where "previewDeployments_application_environment"."environmentId" = "previewDeployments_application"."environmentId" limit $4) "previewDeployments_application_environment" left join lateral (select json_build_array("previewDeployments_application_environment_project"."projectId", "previewDeployments_application_environment_project"."name", "previewDeployments_application_environment_project"."description", "previewDeployments_application_environment_project"."createdAt", "previewDeployments_application_environment_project"."organizationId", "previewDeployments_application_environment_project"."env") as "data" from (select * from "project" "previewDeployments_application_environment_project" where "previewDeployments_application_environment_project"."projectId" = "previewDeployments_application_environment"."projectId" limit $5) "previewDeployments_application_environment_project") "previewDeployments_application_environment_project" on true) "previewDeployments_application_environment" on true) "previewDeployments_application" on true where "previewDeployments"."previewDeploymentId" = $6 limit $7',
dokploy.1.7shijo4fybb3@services01    |   params: [ 1, 1, 1, 1, 1, 'GG-t09ZME3yxj6JwsTKIb', 1 ],
dokploy.1.7shijo4fybb3@services01    |   [cause]: Error [PostgresError]: cannot pass more than 100 arguments to a function
dokploy.1.7shijo4fybb3@services01    |       at ignore-listed frames {
dokploy.1.7shijo4fybb3@services01    |     severity_local: 'ERROR',
dokploy.1.7shijo4fybb3@services01    |     severity: 'ERROR',
dokploy.1.7shijo4fybb3@services01    |     code: '54023',
dokploy.1.7shijo4fybb3@services01    |     position: '1708',
dokploy.1.7shijo4fybb3@services01    |     file: 'parse_func.c',
dokploy.1.7shijo4fybb3@services01    |     line: '136',
dokploy.1.7shijo4fybb3@services01    |     routine: 'ParseFuncOrColumn'
dokploy.1.7shijo4fybb3@services01    |   }
dokploy.1.7shijo4fybb3@services01    | }

To reproduce

  1. Fresh install of Dokploy v0.29.0.
  2. Create a GitHub-sourced Application.
  3. Enable Preview Deployments on that Application.
  4. Open a PR against the configured target branch.
  5. Preview is created in the UI with status "Building".
  6. Nothing happens server-side; docker service ls shows no preview service.
  7. Any action on the preview card (Delete, Rebuild, Logs) fails silently in the UI; server log shows the 54023 error.

Suggested fix

Inside the preview deployment hydration query, explicitly select only the columns needed on the application relation via Drizzle's columns: { ... } selector, rather than pulling the full row. Alternatively, split the hydration into separate queries instead of one nested relational query. The 100-arg limit is compiled into Postgres and not configurable.

Impact

Preview deployments are entirely unusable on v0.29.0. Affects every install with >100 columns on application, which is every install.

Environment

  • Dokploy version: v0.29.0 (fresh install from today)
  • Postgres: 16 (official postgres:16 image, as shipped)
  • Deployment method: Docker Swarm
  • OS: Debian 13
  • VPS: 4c8g OVH Instance

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions