From 54bd25da398d0289feb91c5c17625cbe6ec48120 Mon Sep 17 00:00:00 2001 From: Mauricio Siu Date: Sat, 7 Feb 2026 12:51:45 -0600 Subject: [PATCH 1/2] feat(gitlab): add optional internal URL for GitLab integration - Introduced a new field `gitlabInternalUrl` in the GitLab provider settings to allow users to specify an internal URL for OAuth token exchange when GitLab runs on the same instance as Dokploy. - Updated the GitLab provider forms to include the new field with appropriate descriptions. - Modified the token exchange logic to utilize the internal URL if provided, enhancing connectivity options for users. --- .../git/gitlab/add-gitlab-provider.tsx | 33 + .../git/gitlab/edit-gitlab-provider.tsx | 33 + .../drizzle/0140_lame_mattie_franklin.sql | 1 + apps/dokploy/drizzle/meta/0140_snapshot.json | 7242 +++++++++++++++++ apps/dokploy/drizzle/meta/_journal.json | 7 + .../pages/api/providers/gitlab/callback.ts | 4 +- packages/server/schema.dbml | 1211 --- packages/server/src/db/schema/gitlab.ts | 3 + packages/server/src/db/schema/schema.dbml | 1 + packages/server/src/utils/providers/gitlab.ts | 4 +- schema.dbml | 1205 --- 11 files changed, 7326 insertions(+), 2418 deletions(-) create mode 100644 apps/dokploy/drizzle/0140_lame_mattie_franklin.sql create mode 100644 apps/dokploy/drizzle/meta/0140_snapshot.json delete mode 100644 packages/server/schema.dbml delete mode 100644 schema.dbml diff --git a/apps/dokploy/components/dashboard/settings/git/gitlab/add-gitlab-provider.tsx b/apps/dokploy/components/dashboard/settings/git/gitlab/add-gitlab-provider.tsx index f1369ade9..8fda94223 100644 --- a/apps/dokploy/components/dashboard/settings/git/gitlab/add-gitlab-provider.tsx +++ b/apps/dokploy/components/dashboard/settings/git/gitlab/add-gitlab-provider.tsx @@ -21,6 +21,7 @@ import { FormControl, FormField, FormItem, + FormDescription, FormLabel, FormMessage, } from "@/components/ui/form"; @@ -35,6 +36,10 @@ const Schema = z.object({ gitlabUrl: z.string().min(1, { message: "GitLab URL is required", }), + gitlabInternalUrl: z + .union([z.string().url(), z.literal("")]) + .optional() + .transform((v) => (v === "" ? undefined : v)), applicationId: z.string().min(1, { message: "Application ID is required", }), @@ -66,6 +71,7 @@ export const AddGitlabProvider = () => { redirectUri: webhookUrl, name: "", gitlabUrl: "https://gitlab.com", + gitlabInternalUrl: "", }, resolver: zodResolver(Schema), }); @@ -80,6 +86,7 @@ export const AddGitlabProvider = () => { redirectUri: webhookUrl, name: "", gitlabUrl: "https://gitlab.com", + gitlabInternalUrl: "", }); }, [form, isOpen]); @@ -92,6 +99,7 @@ export const AddGitlabProvider = () => { name: data.name || "", redirectUri: data.redirectUri || "", gitlabUrl: data.gitlabUrl || "https://gitlab.com", + gitlabInternalUrl: data.gitlabInternalUrl || undefined, }) .then(async () => { await utils.gitProvider.getAll.invalidate(); @@ -192,6 +200,31 @@ export const AddGitlabProvider = () => { )} /> + ( + + + Internal URL (Optional) + + + + + + Use when GitLab runs on the same instance as Dokploy. + Used for OAuth token exchange to reach GitLab via + internal network (e.g. Docker service name). + + + + )} + /> + (v === "" ? undefined : v)), groupName: z.string().optional(), }); @@ -61,6 +66,7 @@ export const EditGitlabProvider = ({ gitlabId }: Props) => { groupName: "", name: "", gitlabUrl: "https://gitlab.com", + gitlabInternalUrl: "", }, resolver: zodResolver(Schema), }); @@ -72,6 +78,7 @@ export const EditGitlabProvider = ({ gitlabId }: Props) => { groupName: gitlab?.groupName || "", name: gitlab?.gitProvider.name || "", gitlabUrl: gitlab?.gitlabUrl || "", + gitlabInternalUrl: gitlab?.gitlabInternalUrl || "", }); }, [form, isOpen]); @@ -82,6 +89,7 @@ export const EditGitlabProvider = ({ gitlabId }: Props) => { groupName: data.groupName || "", name: data.name || "", gitlabUrl: data.gitlabUrl || "", + gitlabInternalUrl: data.gitlabInternalUrl ?? null, }) .then(async () => { await utils.gitProvider.getAll.invalidate(); @@ -151,6 +159,31 @@ export const EditGitlabProvider = ({ gitlabId }: Props) => { )} /> + ( + + + Internal URL (Optional) + + + + + + Use when GitLab runs on the same instance as Dokploy. + Used for OAuth token exchange to reach GitLab via + internal network (e.g. Docker service name). + + + + )} + /> + application.applicationId - -ref: mount.postgresId > postgres.postgresId - -ref: mount.mariadbId > mariadb.mariadbId - -ref: mount.mongoId > mongo.mongoId - -ref: mount.mysqlId > mysql.mysqlId - -ref: mount.redisId > redis.redisId - -ref: mount.composeId > compose.composeId - -ref: user.id - account.user_id - -ref: ai.organizationId - organization.id - -ref: apikey.user_id > user.id - -ref: application.environmentId > environment.environmentId - -ref: application.customGitSSHKeyId > "ssh-key".sshKeyId - -ref: application.registryId > registry.registryId - -ref: application.githubId - github.githubId - -ref: application.gitlabId - gitlab.gitlabId - -ref: application.giteaId - gitea.giteaId - -ref: application.bitbucketId - bitbucket.bitbucketId - -ref: application.serverId > server.serverId - -ref: backup.destinationId > destination.destinationId - -ref: backup.postgresId > postgres.postgresId - -ref: backup.mariadbId > mariadb.mariadbId - -ref: backup.mysqlId > mysql.mysqlId - -ref: backup.mongoId > mongo.mongoId - -ref: backup.userId > user.id - -ref: backup.composeId > compose.composeId - -ref: git_provider.gitProviderId - bitbucket.gitProviderId - -ref: certificate.serverId > server.serverId - -ref: certificate.organizationId - organization.id - -ref: compose.environmentId > environment.environmentId - -ref: compose.customGitSSHKeyId > "ssh-key".sshKeyId - -ref: compose.githubId - github.githubId - -ref: compose.gitlabId - gitlab.gitlabId - -ref: compose.bitbucketId - bitbucket.bitbucketId - -ref: compose.giteaId - gitea.giteaId - -ref: compose.serverId > server.serverId - -ref: deployment.applicationId > application.applicationId - -ref: deployment.composeId > compose.composeId - -ref: deployment.serverId > server.serverId - -ref: deployment.previewDeploymentId > preview_deployments.previewDeploymentId - -ref: deployment.scheduleId > schedule.scheduleId - -ref: deployment.backupId > backup.backupId - -ref: rollback.deploymentId - deployment.deploymentId - -ref: deployment.volumeBackupId > volume_backup.volumeBackupId - -ref: destination.organizationId - organization.id - -ref: domain.applicationId > application.applicationId - -ref: domain.composeId > compose.composeId - -ref: preview_deployments.domainId - domain.domainId - -ref: environment.projectId > project.projectId - -ref: github.gitProviderId - git_provider.gitProviderId - -ref: gitlab.gitProviderId - git_provider.gitProviderId - -ref: gitea.gitProviderId - git_provider.gitProviderId - -ref: git_provider.organizationId - organization.id - -ref: git_provider.userId - user.id - -ref: invitation.organization_id - organization.id - -ref: mariadb.environmentId > environment.environmentId - -ref: mariadb.serverId > server.serverId - -ref: member.organization_id > organization.id - -ref: member.user_id - user.id - -ref: mongo.environmentId > environment.environmentId - -ref: mongo.serverId > server.serverId - -ref: mysql.environmentId > environment.environmentId - -ref: mysql.serverId > server.serverId - -ref: notification.slackId - slack.slackId - -ref: notification.telegramId - telegram.telegramId - -ref: notification.discordId - discord.discordId - -ref: notification.emailId - email.emailId - -ref: notification.resendId - resend.resendId - -ref: notification.gotifyId - gotify.gotifyId - -ref: notification.ntfyId - ntfy.ntfyId - -ref: notification.customId - custom.customId - -ref: notification.larkId - lark.larkId - -ref: notification.organizationId - organization.id - -ref: organization.owner_id > user.id - -ref: port.applicationId > application.applicationId - -ref: postgres.environmentId > environment.environmentId - -ref: postgres.serverId > server.serverId - -ref: preview_deployments.applicationId > application.applicationId - -ref: project.organizationId > organization.id - -ref: redirect.applicationId > application.applicationId - -ref: redis.environmentId > environment.environmentId - -ref: redis.serverId > server.serverId - -ref: schedule.applicationId - application.applicationId - -ref: schedule.composeId > compose.composeId - -ref: schedule.serverId > server.serverId - -ref: schedule.userId > user.id - -ref: security.applicationId > application.applicationId - -ref: server.sshKeyId > "ssh-key".sshKeyId - -ref: server.organizationId > organization.id - -ref: "ssh-key".organizationId - organization.id - -ref: volume_backup.applicationId - application.applicationId - -ref: volume_backup.postgresId - postgres.postgresId - -ref: volume_backup.mariadbId - mariadb.mariadbId - -ref: volume_backup.mongoId - mongo.mongoId - -ref: volume_backup.mysqlId - mysql.mysqlId - -ref: volume_backup.redisId - redis.redisId - -ref: volume_backup.composeId - compose.composeId - -ref: volume_backup.destinationId - destination.destinationId diff --git a/packages/server/src/db/schema/gitlab.ts b/packages/server/src/db/schema/gitlab.ts index e665b7fac..0d2bc8a0d 100644 --- a/packages/server/src/db/schema/gitlab.ts +++ b/packages/server/src/db/schema/gitlab.ts @@ -11,6 +11,7 @@ export const gitlab = pgTable("gitlab", { .primaryKey() .$defaultFn(() => nanoid()), gitlabUrl: text("gitlabUrl").default("https://gitlab.com").notNull(), + gitlabInternalUrl: text("gitlabInternalUrl"), applicationId: text("application_id"), redirectUri: text("redirect_uri"), secret: text("secret"), @@ -41,6 +42,7 @@ export const apiCreateGitlab = createSchema.extend({ authId: z.string().min(1), name: z.string().min(1), gitlabUrl: z.string().min(1), + gitlabInternalUrl: z.string().optional().nullable(), }); export const apiFindOneGitlab = createSchema @@ -70,4 +72,5 @@ export const apiUpdateGitlab = createSchema.extend({ name: z.string().min(1), gitlabId: z.string().min(1), gitlabUrl: z.string().min(1), + gitlabInternalUrl: z.string().optional().nullable(), }); diff --git a/packages/server/src/db/schema/schema.dbml b/packages/server/src/db/schema/schema.dbml index c19a569d9..8134885fe 100644 --- a/packages/server/src/db/schema/schema.dbml +++ b/packages/server/src/db/schema/schema.dbml @@ -497,6 +497,7 @@ table github { table gitlab { gitlabId text [pk, not null] gitlabUrl text [not null, default: 'https://gitlab.com'] + gitlabInternalUrl text application_id text redirect_uri text secret text diff --git a/packages/server/src/utils/providers/gitlab.ts b/packages/server/src/utils/providers/gitlab.ts index 3343c9bb6..22e5df3ae 100644 --- a/packages/server/src/utils/providers/gitlab.ts +++ b/packages/server/src/utils/providers/gitlab.ts @@ -21,7 +21,9 @@ export const refreshGitlabToken = async (gitlabProviderId: string) => { return; } - const response = await fetch(`${gitlabProvider.gitlabUrl}/oauth/token`, { + // Use internal URL for token refresh when GitLab is on same instance as Dokploy + const baseUrl = gitlabProvider.gitlabInternalUrl || gitlabProvider.gitlabUrl; + const response = await fetch(`${baseUrl}/oauth/token`, { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", diff --git a/schema.dbml b/schema.dbml deleted file mode 100644 index 3ee3e763a..000000000 --- a/schema.dbml +++ /dev/null @@ -1,1205 +0,0 @@ -enum applicationStatus { - idle - running - done - error -} - -enum backupType { - database - compose -} - -enum buildType { - dockerfile - heroku_buildpacks - paketo_buildpacks - nixpacks - static - railpack -} - -enum certificateType { - letsencrypt - none - custom -} - -enum composeType { - "docker-compose" - stack -} - -enum databaseType { - postgres - mariadb - mysql - mongo - "web-server" -} - -enum deploymentStatus { - running - done - error - cancelled -} - -enum domainType { - compose - application - preview -} - -enum gitProviderType { - github - gitlab - bitbucket - gitea -} - -enum mountType { - bind - volume - file -} - -enum notificationType { - slack - telegram - discord - email - resend - gotify - ntfy - custom - lark -} - -enum protocolType { - tcp - udp -} - -enum publishModeType { - ingress - host -} - -enum RegistryType { - selfHosted - cloud -} - -enum scheduleType { - application - compose - server - "dokploy-server" -} - -enum serverStatus { - active - inactive -} - -enum serviceType { - application - postgres - mysql - mariadb - mongo - redis - compose -} - -enum shellType { - bash - sh -} - -enum sourceType { - docker - git - github - gitlab - bitbucket - gitea - drop -} - -enum sourceTypeCompose { - git - github - gitlab - bitbucket - gitea - raw -} - -enum triggerType { - push - tag -} - -table account { - id text [pk, not null] - account_id text [not null] - provider_id text [not null] - user_id text [not null] - access_token text - refresh_token text - id_token text - access_token_expires_at timestamp - refresh_token_expires_at timestamp - scope text - password text - is2FAEnabled boolean [not null, default: false] - created_at timestamp [not null] - updated_at timestamp [not null] - resetPasswordToken text - resetPasswordExpiresAt text - confirmationToken text - confirmationExpiresAt text -} - -table ai { - aiId text [pk, not null] - name text [not null] - apiUrl text [not null] - apiKey text [not null] - model text [not null] - isEnabled boolean [not null, default: true] - organizationId text [not null] - createdAt text [not null] -} - -table apikey { - id text [pk, not null] - name text - start text - prefix text - key text [not null] - user_id text [not null] - refill_interval integer - refill_amount integer - last_refill_at timestamp - enabled boolean - rate_limit_enabled boolean - rate_limit_time_window integer - rate_limit_max integer - request_count integer - remaining integer - last_request timestamp - expires_at timestamp - created_at timestamp [not null] - updated_at timestamp [not null] - permissions text - metadata text -} - -table application { - applicationId text [pk, not null] - name text [not null] - appName text [not null, unique] - description text - env text - previewEnv text - watchPaths text[] - previewBuildArgs text - previewBuildSecrets text - previewLabels text[] - previewWildcard text - previewPort integer [default: 3000] - previewHttps boolean [not null, default: false] - previewPath text [default: '/'] - certificateType certificateType [not null, default: 'none'] - previewCustomCertResolver text - previewLimit integer [default: 3] - isPreviewDeploymentsActive boolean [default: false] - previewRequireCollaboratorPermissions boolean [default: true] - rollbackActive boolean [default: false] - buildArgs text - buildSecrets text - memoryReservation text - memoryLimit text - cpuReservation text - cpuLimit text - title text - enabled boolean - subtitle text - command text - refreshToken text - sourceType sourceType [not null, default: 'github'] - cleanCache boolean [default: false] - repository text - owner text - branch text - buildPath text [default: '/'] - triggerType triggerType [default: 'push'] - autoDeploy boolean - gitlabProjectId integer - gitlabRepository text - gitlabOwner text - gitlabBranch text - gitlabBuildPath text [default: '/'] - gitlabPathNamespace text - giteaRepository text - giteaOwner text - giteaBranch text - giteaBuildPath text [default: '/'] - bitbucketRepository text - bitbucketOwner text - bitbucketBranch text - bitbucketBuildPath text [default: '/'] - username text - password text - dockerImage text - registryUrl text - customGitUrl text - customGitBranch text - customGitBuildPath text - customGitSSHKeyId text - enableSubmodules boolean [not null, default: false] - dockerfile text - dockerContextPath text - dockerBuildStage text - dropBuildPath text - healthCheckSwarm json - restartPolicySwarm json - placementSwarm json - updateConfigSwarm json - rollbackConfigSwarm json - modeSwarm json - labelsSwarm json - networkSwarm json - stopGracePeriodSwarm bigint - replicas integer [not null, default: 1] - applicationStatus applicationStatus [not null, default: 'idle'] - buildType buildType [not null, default: 'nixpacks'] - railpackVersion text [default: '0.15.4'] - herokuVersion text [default: '24'] - publishDirectory text - isStaticSpa boolean - createdAt text [not null] - registryId text - environmentId text [not null] - githubId text - gitlabId text - giteaId text - bitbucketId text - serverId text -} - -table backup { - backupId text [pk, not null] - appName text [not null, unique] - schedule text [not null] - enabled boolean - database text [not null] - prefix text [not null] - serviceName text - destinationId text [not null] - keepLatestCount integer - backupType backupType [not null, default: 'database'] - databaseType databaseType [not null] - composeId text - postgresId text - mariadbId text - mysqlId text - mongoId text - userId text - metadata jsonb -} - -table bitbucket { - bitbucketId text [pk, not null] - bitbucketUsername text - bitbucketEmail text - appPassword text - apiToken text - bitbucketWorkspaceName text - gitProviderId text [not null] -} - -table certificate { - certificateId text [pk, not null] - name text [not null] - certificateData text [not null] - privateKey text [not null] - certificatePath text [not null, unique] - autoRenew boolean - organizationId text [not null] - serverId text -} - -table compose { - composeId text [pk, not null] - name text [not null] - appName text [not null] - description text - env text - composeFile text [not null, default: ''] - refreshToken text - sourceType sourceTypeCompose [not null, default: 'github'] - composeType composeType [not null, default: 'docker-compose'] - repository text - owner text - branch text - autoDeploy boolean - gitlabProjectId integer - gitlabRepository text - gitlabOwner text - gitlabBranch text - gitlabPathNamespace text - bitbucketRepository text - bitbucketOwner text - bitbucketBranch text - giteaRepository text - giteaOwner text - giteaBranch text - customGitUrl text - customGitBranch text - customGitSSHKeyId text - command text [not null, default: ''] - enableSubmodules boolean [not null, default: false] - composePath text [not null, default: './docker-compose.yml'] - suffix text [not null, default: ''] - randomize boolean [not null, default: false] - isolatedDeployment boolean [not null, default: false] - isolatedDeploymentsVolume boolean [not null, default: false] - triggerType triggerType [default: 'push'] - composeStatus applicationStatus [not null, default: 'idle'] - environmentId text [not null] - createdAt text [not null] - watchPaths text[] - githubId text - gitlabId text - bitbucketId text - giteaId text - serverId text -} - -table custom { - customId text [pk, not null] - endpoint text [not null] - headers text -} - -table deployment { - deploymentId text [pk, not null] - title text [not null] - description text - status deploymentStatus [default: 'running'] - logPath text [not null] - pid text - applicationId text - composeId text - serverId text - isPreviewDeployment boolean [default: false] - previewDeploymentId text - createdAt text [not null] - startedAt text - finishedAt text - errorMessage text - scheduleId text - backupId text - rollbackId text - volumeBackupId text -} - -table destination { - destinationId text [pk, not null] - name text [not null] - provider text - accessKey text [not null] - secretAccessKey text [not null] - bucket text [not null] - region text [not null] - endpoint text [not null] - organizationId text [not null] - createdAt timestamp [not null, default: `now()`] -} - -table discord { - discordId text [pk, not null] - webhookUrl text [not null] - decoration boolean -} - -table domain { - domainId text [pk, not null] - host text [not null] - https boolean [not null, default: false] - port integer [default: 3000] - path text [default: '/'] - serviceName text - domainType domainType [default: 'application'] - uniqueConfigKey serial [not null, increment] - createdAt text [not null] - composeId text - customCertResolver text - applicationId text - previewDeploymentId text - certificateType certificateType [not null, default: 'none'] - internalPath text [default: '/'] - stripPath boolean [not null, default: false] -} - -table email { - emailId text [pk, not null] - smtpServer text [not null] - smtpPort integer [not null] - username text [not null] - password text [not null] - fromAddress text [not null] - toAddress text[] [not null] -} - -table resend { - resendId text [pk, not null] - apiKey text [not null] - fromAddress text [not null] - toAddress text[] [not null] -} - -table environment { - environmentId text [pk, not null] - name text [not null] - description text - createdAt text [not null] - env text [not null, default: ''] - projectId text [not null] -} - -table git_provider { - gitProviderId text [pk, not null] - name text [not null] - providerType gitProviderType [not null, default: 'github'] - createdAt text [not null] - organizationId text [not null] - userId text [not null] -} - -table gitea { - giteaId text [pk, not null] - giteaUrl text [not null, default: 'https://gitea.com'] - redirect_uri text - client_id text - client_secret text - gitProviderId text [not null] - access_token text - refresh_token text - expires_at integer - scopes text [default: 'repo,repo:status,read:user,read:org'] - last_authenticated_at integer -} - -table github { - githubId text [pk, not null] - githubAppName text - githubAppId integer - githubClientId text - githubClientSecret text - githubInstallationId text - githubPrivateKey text - githubWebhookSecret text - gitProviderId text [not null] -} - -table gitlab { - gitlabId text [pk, not null] - gitlabUrl text [not null, default: 'https://gitlab.com'] - application_id text - redirect_uri text - secret text - access_token text - refresh_token text - group_name text - expires_at integer - gitProviderId text [not null] -} - -table gotify { - gotifyId text [pk, not null] - serverUrl text [not null] - appToken text [not null] - priority integer [not null, default: 5] - decoration boolean -} - -table invitation { - id text [pk, not null] - organization_id text [not null] - email text [not null] - role text - status text [not null] - expires_at timestamp [not null] - inviter_id text [not null] - team_id text -} - -table lark { - larkId text [pk, not null] - webhookUrl text [not null] -} - -table mariadb { - mariadbId text [pk, not null] - name text [not null] - appName text [not null, unique] - description text - databaseName text [not null] - databaseUser text [not null] - databasePassword text [not null] - rootPassword text [not null] - dockerImage text [not null] - command text - env text - memoryReservation text - memoryLimit text - cpuReservation text - cpuLimit text - externalPort integer - applicationStatus applicationStatus [not null, default: 'idle'] - healthCheckSwarm json - restartPolicySwarm json - placementSwarm json - updateConfigSwarm json - rollbackConfigSwarm json - modeSwarm json - labelsSwarm json - networkSwarm json - stopGracePeriodSwarm bigint - replicas integer [not null, default: 1] - createdAt text [not null] - environmentId text [not null] - serverId text -} - -table member { - id text [pk, not null] - organization_id text [not null] - user_id text [not null] - role text [not null] - created_at timestamp [not null] - team_id text - is_default boolean [not null, default: false] - canCreateProjects boolean [not null, default: false] - canAccessToSSHKeys boolean [not null, default: false] - canCreateServices boolean [not null, default: false] - canDeleteProjects boolean [not null, default: false] - canDeleteServices boolean [not null, default: false] - canAccessToDocker boolean [not null, default: false] - canAccessToAPI boolean [not null, default: false] - canAccessToGitProviders boolean [not null, default: false] - canAccessToTraefikFiles boolean [not null, default: false] - canDeleteEnvironments boolean [not null, default: false] - canCreateEnvironments boolean [not null, default: false] - accesedProjects text[] [not null, default: `ARRAY[]::text[]`] - accessedEnvironments text[] [not null, default: `ARRAY[]::text[]`] - accesedServices text[] [not null, default: `ARRAY[]::text[]`] -} - -table mongo { - mongoId text [pk, not null] - name text [not null] - appName text [not null, unique] - description text - databaseUser text [not null] - databasePassword text [not null] - dockerImage text [not null] - command text - env text - memoryReservation text - memoryLimit text - cpuReservation text - cpuLimit text - externalPort integer - applicationStatus applicationStatus [not null, default: 'idle'] - healthCheckSwarm json - restartPolicySwarm json - placementSwarm json - updateConfigSwarm json - rollbackConfigSwarm json - modeSwarm json - labelsSwarm json - networkSwarm json - stopGracePeriodSwarm bigint - replicas integer [not null, default: 1] - createdAt text [not null] - environmentId text [not null] - serverId text - replicaSets boolean [default: false] -} - -table mount { - mountId text [pk, not null] - type mountType [not null] - hostPath text - volumeName text - filePath text - content text - serviceType serviceType [not null, default: 'application'] - mountPath text [not null] - applicationId text - postgresId text - mariadbId text - mongoId text - mysqlId text - redisId text - composeId text -} - -table mysql { - mysqlId text [pk, not null] - name text [not null] - appName text [not null, unique] - description text - databaseName text [not null] - databaseUser text [not null] - databasePassword text [not null] - rootPassword text [not null] - dockerImage text [not null] - command text - env text - memoryReservation text - memoryLimit text - cpuReservation text - cpuLimit text - externalPort integer - applicationStatus applicationStatus [not null, default: 'idle'] - healthCheckSwarm json - restartPolicySwarm json - placementSwarm json - updateConfigSwarm json - rollbackConfigSwarm json - modeSwarm json - labelsSwarm json - networkSwarm json - stopGracePeriodSwarm bigint - replicas integer [not null, default: 1] - createdAt text [not null] - environmentId text [not null] - serverId text -} - -table notification { - notificationId text [pk, not null] - name text [not null] - appDeploy boolean [not null, default: false] - appBuildError boolean [not null, default: false] - databaseBackup boolean [not null, default: false] - dokployRestart boolean [not null, default: false] - dockerCleanup boolean [not null, default: false] - serverThreshold boolean [not null, default: false] - notificationType notificationType [not null] - createdAt text [not null] - slackId text - telegramId text - discordId text - emailId text - resendId text - gotifyId text - ntfyId text - customId text - larkId text - organizationId text [not null] -} - -table ntfy { - ntfyId text [pk, not null] - serverUrl text [not null] - topic text [not null] - accessToken text [not null] - priority integer [not null, default: 3] -} - -table organization { - id text [pk, not null] - name text [not null] - slug text [unique] - logo text - created_at timestamp [not null] - metadata text - owner_id text [not null] -} - -table port { - portId text [pk, not null] - publishedPort integer [not null] - publishMode publishModeType [not null, default: 'host'] - targetPort integer [not null] - protocol protocolType [not null] - applicationId text [not null] -} - -table postgres { - postgresId text [pk, not null] - name text [not null] - appName text [not null, unique] - databaseName text [not null] - databaseUser text [not null] - databasePassword text [not null] - description text - dockerImage text [not null] - command text - env text - memoryReservation text - externalPort integer - memoryLimit text - cpuReservation text - cpuLimit text - applicationStatus applicationStatus [not null, default: 'idle'] - healthCheckSwarm json - restartPolicySwarm json - placementSwarm json - updateConfigSwarm json - rollbackConfigSwarm json - modeSwarm json - labelsSwarm json - networkSwarm json - stopGracePeriodSwarm bigint - replicas integer [not null, default: 1] - createdAt text [not null] - environmentId text [not null] - serverId text -} - -table preview_deployments { - previewDeploymentId text [pk, not null] - branch text [not null] - pullRequestId text [not null] - pullRequestNumber text [not null] - pullRequestURL text [not null] - pullRequestTitle text [not null] - pullRequestCommentId text [not null] - previewStatus applicationStatus [not null, default: 'idle'] - appName text [not null, unique] - applicationId text [not null] - domainId text - createdAt text [not null] - expiresAt text -} - -table project { - projectId text [pk, not null] - name text [not null] - description text - createdAt text [not null] - organizationId text [not null] - env text [not null, default: ''] -} - -table redirect { - redirectId text [pk, not null] - regex text [not null] - replacement text [not null] - permanent boolean [not null, default: false] - uniqueConfigKey serial [not null, increment] - createdAt text [not null] - applicationId text [not null] -} - -table redis { - redisId text [pk, not null] - name text [not null] - appName text [not null, unique] - description text - password text [not null] - dockerImage text [not null] - command text - env text - memoryReservation text - memoryLimit text - cpuReservation text - cpuLimit text - externalPort integer - createdAt text [not null] - applicationStatus applicationStatus [not null, default: 'idle'] - healthCheckSwarm json - restartPolicySwarm json - placementSwarm json - updateConfigSwarm json - rollbackConfigSwarm json - modeSwarm json - labelsSwarm json - networkSwarm json - stopGracePeriodSwarm bigint - replicas integer [not null, default: 1] - environmentId text [not null] - serverId text -} - -table registry { - registryId text [pk, not null] - registryName text [not null] - imagePrefix text - username text [not null] - password text [not null] - registryUrl text [not null, default: ''] - createdAt text [not null] - selfHosted RegistryType [not null, default: 'cloud'] - organizationId text [not null] -} - -table rollback { - rollbackId text [pk, not null] - deploymentId text [not null] - version serial [not null, increment] - image text - createdAt text [not null] - fullContext jsonb -} - -table schedule { - scheduleId text [pk, not null] - name text [not null] - cronExpression text [not null] - appName text [not null] - serviceName text - shellType shellType [not null, default: 'bash'] - scheduleType scheduleType [not null, default: 'application'] - command text [not null] - script text - applicationId text - composeId text - serverId text - userId text - enabled boolean [not null, default: true] - createdAt text [not null] -} - -table security { - securityId text [pk, not null] - username text [not null] - password text [not null] - createdAt text [not null] - applicationId text [not null] - - indexes { - (username, applicationId) [name: 'security_username_applicationId_unique', unique] - } -} - -table server { - serverId text [pk, not null] - name text [not null] - description text - ipAddress text [not null] - port integer [not null] - username text [not null, default: 'root'] - appName text [not null] - enableDockerCleanup boolean [not null, default: false] - createdAt text [not null] - organizationId text [not null] - serverStatus serverStatus [not null, default: 'active'] - command text [not null, default: ''] - sshKeyId text - metricsConfig jsonb [not null, default: `{"server":{"type":"Remote","refreshRate":60,"port":4500,"token":"","urlCallback":"","cronJob":"","retentionDays":2,"thresholds":{"cpu":0,"memory":0}},"containers":{"refreshRate":60,"services":{"include":[],"exclude":[]}}}`] -} - -table session_temp { - id text [pk, not null] - expires_at timestamp [not null] - token text [not null, unique] - created_at timestamp [not null] - updated_at timestamp [not null] - ip_address text - user_agent text - user_id text [not null] - impersonated_by text - active_organization_id text -} - -table slack { - slackId text [pk, not null] - webhookUrl text [not null] - channel text -} - -table "ssh-key" { - sshKeyId text [pk, not null] - privateKey text [not null, default: ''] - publicKey text [not null] - name text [not null] - description text - createdAt text [not null] - lastUsedAt text - organizationId text [not null] -} - -table telegram { - telegramId text [pk, not null] - botToken text [not null] - chatId text [not null] - messageThreadId text -} - -table two_factor { - id text [pk, not null] - secret text [not null] - backup_codes text [not null] - user_id text [not null] -} - -table user_temp { - id text [pk, not null] - name text [not null, default: ''] - isRegistered boolean [not null, default: false] - expirationDate text [not null] - createdAt text [not null] - created_at timestamp [default: `now()`] - two_factor_enabled boolean - email text [not null, unique] - email_verified boolean [not null] - image text - banned boolean - ban_reason text - ban_expires timestamp - updated_at timestamp [not null] - serverIp text - certificateType certificateType [not null, default: 'none'] - https boolean [not null, default: false] - host text - letsEncryptEmail text - sshPrivateKey text - enableDockerCleanup boolean [not null, default: false] - logCleanupCron text [default: '0 0 * * *'] - role text [not null, default: 'user'] - enablePaidFeatures boolean [not null, default: false] - allowImpersonation boolean [not null, default: false] - metricsConfig jsonb [not null, default: `{"server":{"type":"Dokploy","refreshRate":60,"port":4500,"token":"","retentionDays":2,"cronJob":"","urlCallback":"","thresholds":{"cpu":0,"memory":0}},"containers":{"refreshRate":60,"services":{"include":[],"exclude":[]}}}`] - cleanupCacheApplications boolean [not null, default: false] - cleanupCacheOnPreviews boolean [not null, default: false] - cleanupCacheOnCompose boolean [not null, default: false] - stripeCustomerId text - stripeSubscriptionId text - serversQuantity integer [not null, default: 0] -} - -table verification { - id text [pk, not null] - identifier text [not null] - value text [not null] - expires_at timestamp [not null] - created_at timestamp - updated_at timestamp -} - -table volume_backup { - volumeBackupId text [pk, not null] - name text [not null] - volumeName text [not null] - prefix text [not null] - serviceType serviceType [not null, default: 'application'] - appName text [not null] - serviceName text - turnOff boolean [not null, default: false] - cronExpression text [not null] - keepLatestCount integer - enabled boolean - applicationId text - postgresId text - mariadbId text - mongoId text - mysqlId text - redisId text - composeId text - createdAt text [not null] - destinationId text [not null] -} - -ref: mount.applicationId > application.applicationId - -ref: mount.postgresId > postgres.postgresId - -ref: mount.mariadbId > mariadb.mariadbId - -ref: mount.mongoId > mongo.mongoId - -ref: mount.mysqlId > mysql.mysqlId - -ref: mount.redisId > redis.redisId - -ref: mount.composeId > compose.composeId - -ref: user_temp.id - account.user_id - -ref: ai.organizationId - organization.id - -ref: apikey.user_id > user_temp.id - -ref: application.environmentId > environment.environmentId - -ref: application.customGitSSHKeyId > "ssh-key".sshKeyId - -ref: application.registryId > registry.registryId - -ref: application.githubId - github.githubId - -ref: application.gitlabId - gitlab.gitlabId - -ref: application.giteaId - gitea.giteaId - -ref: application.bitbucketId - bitbucket.bitbucketId - -ref: application.serverId > server.serverId - -ref: backup.destinationId > destination.destinationId - -ref: backup.postgresId > postgres.postgresId - -ref: backup.mariadbId > mariadb.mariadbId - -ref: backup.mysqlId > mysql.mysqlId - -ref: backup.mongoId > mongo.mongoId - -ref: backup.userId > user_temp.id - -ref: backup.composeId > compose.composeId - -ref: git_provider.gitProviderId - bitbucket.gitProviderId - -ref: certificate.serverId > server.serverId - -ref: certificate.organizationId - organization.id - -ref: compose.environmentId > environment.environmentId - -ref: compose.customGitSSHKeyId > "ssh-key".sshKeyId - -ref: compose.githubId - github.githubId - -ref: compose.gitlabId - gitlab.gitlabId - -ref: compose.bitbucketId - bitbucket.bitbucketId - -ref: compose.giteaId - gitea.giteaId - -ref: compose.serverId > server.serverId - -ref: deployment.applicationId > application.applicationId - -ref: deployment.composeId > compose.composeId - -ref: deployment.serverId > server.serverId - -ref: deployment.previewDeploymentId > preview_deployments.previewDeploymentId - -ref: deployment.scheduleId > schedule.scheduleId - -ref: deployment.backupId > backup.backupId - -ref: rollback.deploymentId - deployment.deploymentId - -ref: deployment.volumeBackupId > volume_backup.volumeBackupId - -ref: destination.organizationId - organization.id - -ref: domain.applicationId > application.applicationId - -ref: domain.composeId > compose.composeId - -ref: preview_deployments.domainId - domain.domainId - -ref: environment.projectId > project.projectId - -ref: github.gitProviderId - git_provider.gitProviderId - -ref: gitlab.gitProviderId - git_provider.gitProviderId - -ref: gitea.gitProviderId - git_provider.gitProviderId - -ref: git_provider.organizationId - organization.id - -ref: git_provider.userId - user_temp.id - -ref: invitation.organization_id - organization.id - -ref: mariadb.environmentId > environment.environmentId - -ref: mariadb.serverId > server.serverId - -ref: member.organization_id > organization.id - -ref: member.user_id - user_temp.id - -ref: mongo.environmentId > environment.environmentId - -ref: mongo.serverId > server.serverId - -ref: mysql.environmentId > environment.environmentId - -ref: mysql.serverId > server.serverId - -ref: notification.slackId - slack.slackId - -ref: notification.telegramId - telegram.telegramId - -ref: notification.discordId - discord.discordId - -ref: notification.emailId - email.emailId - -ref: notification.resendId - resend.resendId - -ref: notification.gotifyId - gotify.gotifyId - -ref: notification.ntfyId - ntfy.ntfyId - -ref: notification.customId - custom.customId - -ref: notification.larkId - lark.larkId - -ref: notification.organizationId - organization.id - -ref: organization.owner_id > user_temp.id - -ref: port.applicationId > application.applicationId - -ref: postgres.environmentId > environment.environmentId - -ref: postgres.serverId > server.serverId - -ref: preview_deployments.applicationId > application.applicationId - -ref: project.organizationId > organization.id - -ref: redirect.applicationId > application.applicationId - -ref: redis.environmentId > environment.environmentId - -ref: redis.serverId > server.serverId - -ref: schedule.applicationId - application.applicationId - -ref: schedule.composeId > compose.composeId - -ref: schedule.serverId > server.serverId - -ref: schedule.userId > user_temp.id - -ref: security.applicationId > application.applicationId - -ref: server.sshKeyId > "ssh-key".sshKeyId - -ref: server.organizationId > organization.id - -ref: "ssh-key".organizationId - organization.id - -ref: volume_backup.applicationId - application.applicationId - -ref: volume_backup.postgresId - postgres.postgresId - -ref: volume_backup.mariadbId - mariadb.mariadbId - -ref: volume_backup.mongoId - mongo.mongoId - -ref: volume_backup.mysqlId - mysql.mysqlId - -ref: volume_backup.redisId - redis.redisId - -ref: volume_backup.composeId - compose.composeId - -ref: volume_backup.destinationId - destination.destinationId From a8293b7b5c66039c4da12e64b82125629ac027e9 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sat, 7 Feb 2026 18:52:44 +0000 Subject: [PATCH 2/2] [autofix.ci] apply automated fixes --- .../dashboard/settings/git/gitlab/add-gitlab-provider.tsx | 4 +--- .../dashboard/settings/git/gitlab/edit-gitlab-provider.tsx | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/apps/dokploy/components/dashboard/settings/git/gitlab/add-gitlab-provider.tsx b/apps/dokploy/components/dashboard/settings/git/gitlab/add-gitlab-provider.tsx index 8fda94223..69d926194 100644 --- a/apps/dokploy/components/dashboard/settings/git/gitlab/add-gitlab-provider.tsx +++ b/apps/dokploy/components/dashboard/settings/git/gitlab/add-gitlab-provider.tsx @@ -205,9 +205,7 @@ export const AddGitlabProvider = () => { name="gitlabInternalUrl" render={({ field }) => ( - - Internal URL (Optional) - + Internal URL (Optional) { name="gitlabInternalUrl" render={({ field }) => ( - - Internal URL (Optional) - + Internal URL (Optional)