From 747c2137c9c6fd47c6a7868e9d39843bc058a574 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sun, 2 Mar 2025 00:30:02 -0600 Subject: [PATCH] Reapply "Merge branch 'canary' into kucherenko/canary" This reverts commit e6cb6454db375c66d4466071289706449f76028f. --- .circleci/config.yml | 119 - .github/sponsors/openalternative.png | Bin 0 -> 4170 bytes .github/sponsors/synexa.png | Bin 0 -> 42254 bytes .github/workflows/create-pr.yml | 83 + .github/workflows/deploy.yml | 9 +- .github/workflows/dokploy.yml | 161 + .github/workflows/monitoring.yml | 118 + .gitignore | 3 + Dockerfile | 2 +- Dockerfile.cloud | 2 +- Dockerfile.monitoring | 41 + Dockerfile.schedule | 2 +- Dockerfile.server | 2 +- README.md | 5 + apps/api/src/index.ts | 2 +- apps/api/src/utils.ts | 2 +- .../__test__/compose/config/config.test.ts | 2 +- .../compose/network/network-root.test.ts | 23 - .../compose/secrets/secret-root.test.ts | 2 +- .../__test__/compose/volume/volume.test.ts | 6 +- apps/dokploy/__test__/drop/drop.test.test.ts | 2 +- .../server/update-server-config.test.ts | 49 +- apps/dokploy/__test__/traefik/traefik.test.ts | 2 +- apps/dokploy/components/auth/login-2fa.tsx | 132 - .../cluster/modify-swarm-settings.tsx | 2 +- .../cluster/show-cluster-settings.tsx | 1 - .../advanced/general/add-command.tsx | 1 - .../application/advanced/ports/show-port.tsx | 1 - .../advanced/redirects/show-redirects.tsx | 1 - .../advanced/security/show-security.tsx | 1 - .../application/advanced/show-resources.tsx | 65 +- .../advanced/traefik/show-traefik-config.tsx | 1 - .../advanced/volumes/show-volumes.tsx | 28 +- .../advanced/volumes/update-volume.tsx | 4 +- .../application/deployments/refresh-token.tsx | 1 - .../deployments/show-deployment.tsx | 25 +- .../deployments/show-deployments.tsx | 14 +- .../application/domains/show-domains.tsx | 99 +- .../environment/show-enviroment.tsx | 2 +- .../application/environment/show.tsx | 2 +- .../generic/save-bitbucket-provider.tsx | 10 +- .../general/generic/save-github-provider.tsx | 9 +- .../general/generic/save-gitlab-provider.tsx | 9 +- .../application/general/generic/show.tsx | 2 +- .../dashboard/application/general/show.tsx | 4 +- .../show-preview-builds.tsx | 12 +- .../show-preview-deployments.tsx | 1 - .../show-preview-settings.tsx | 2 +- .../application/update-application.tsx | 2 +- .../compose/advanced/add-command.tsx | 1 - ...{delete-compose.tsx => delete-service.tsx} | 108 +- .../deployments/refresh-token-compose.tsx | 1 - .../deployments/show-deployment-compose.tsx | 18 +- .../deployments/show-deployments-compose.tsx | 13 +- .../compose/domains/show-domains.tsx | 112 +- .../compose/general/compose-file-editor.tsx | 9 +- .../save-bitbucket-provider-compose.tsx | 10 +- .../generic/save-github-provider-compose.tsx | 9 +- .../generic/save-gitlab-provider-compose.tsx | 9 +- .../compose/general/generic/show.tsx | 2 +- .../compose/general/isolated-deployment.tsx | 191 + .../compose/general/randomize-compose.tsx | 245 +- .../general/show-converted-compose.tsx | 2 +- .../compose/general/show-utilities.tsx | 46 + .../dashboard/compose/general/show.tsx | 1 - .../dashboard/compose/logs/show.tsx | 2 +- .../database/backups/show-backups.tsx | 3 +- .../database/backups/update-backup.tsx | 2 +- .../docker/logs/since-logs-filter.tsx | 1 - .../dashboard/docker/logs/terminal-line.tsx | 22 +- .../components/dashboard/docker/logs/utils.ts | 12 +- .../dashboard/docker/show/colums.tsx | 1 - .../dashboard/docker/show/show-containers.tsx | 28 +- .../file-system/show-traefik-system.tsx | 3 +- .../show-external-mariadb-credentials.tsx | 2 +- .../mariadb/general/show-general-mariadb.tsx | 2 +- .../show-internal-mariadb-credentials.tsx | 1 - .../dashboard/mariadb/update-mariadb.tsx | 2 +- .../show-external-mongo-credentials.tsx | 2 +- .../mongo/general/show-general-mongo.tsx | 2 +- .../show-internal-mongo-credentials.tsx | 1 - .../dashboard/monitoring/docker/show.tsx | 314 - .../container}/docker-block-chart.tsx | 10 +- .../container}/docker-cpu-chart.tsx | 8 +- .../container}/docker-disk-chart.tsx | 2 +- .../container}/docker-memory-chart.tsx | 14 +- .../container}/docker-network-chart.tsx | 15 +- .../show-free-compose-monitoring.tsx | 130 + .../show-free-container-monitoring.tsx | 310 + .../paid/container/container-block-chart.tsx | 181 + .../paid/container/container-cpu-chart.tsx | 128 + .../paid/container/container-memory-chart.tsx | 149 + .../container/container-network-chart.tsx | 186 + .../show-paid-compose-monitoring.tsx} | 33 +- .../show-paid-container-monitoring.tsx | 258 + .../monitoring/paid/servers/cpu-chart.tsx | 115 + .../monitoring/paid/servers/disk-chart.tsx | 120 + .../monitoring/paid/servers/memory-chart.tsx | 128 + .../monitoring/paid/servers/network-chart.tsx | 145 + .../paid/servers/show-paid-monitoring.tsx | 275 + .../dashboard/monitoring/web-server/show.tsx | 10 - .../show-external-mysql-credentials.tsx | 2 +- .../mysql/general/show-general-mysql.tsx | 2 +- .../show-internal-mysql-credentials.tsx | 1 - .../dashboard/mysql/update-mysql.tsx | 2 +- .../organization/handle-organization.tsx | 182 + .../postgres/advanced/show-custom-command.tsx | 4 +- .../show-external-postgres-credentials.tsx | 2 +- .../general/show-general-postgres.tsx | 2 +- .../show-internal-postgres-credentials.tsx | 1 - .../dashboard/postgres/update-postgres.tsx | 2 +- .../dashboard/project/add-application.tsx | 13 +- .../dashboard/project/add-compose.tsx | 10 +- .../dashboard/project/add-database.tsx | 14 +- .../dashboard/project/add-template.tsx | 24 +- .../dashboard/projects/handle-project.tsx | 14 +- .../projects/project-environment.tsx | 3 +- .../components/dashboard/projects/show.tsx | 134 +- .../show-external-redis-credentials.tsx | 4 +- .../redis/general/show-general-redis.tsx | 3 +- .../show-internal-redis-credentials.tsx | 1 - .../dashboard/redis/update-redis.tsx | 2 +- .../components/dashboard/requests/columns.tsx | 3 +- .../dashboard/requests/requests-table.tsx | 4 +- .../dashboard/requests/show-requests.tsx | 1 - .../components/dashboard/search-command.tsx | 14 +- .../dashboard/settings/api/add-api-key.tsx | 468 ++ .../dashboard/settings/api/show-api-keys.tsx | 142 + .../settings/billing/show-billing.tsx | 20 +- .../settings/billing/show-welcome-dokploy.tsx | 9 +- .../settings/certificates/add-certificate.tsx | 11 +- .../certificates/show-certificates.tsx | 2 +- .../settings/cluster/nodes/show-nodes.tsx | 4 +- .../cluster/registry/handle-registry.tsx | 2 +- .../git/bitbucket/add-bitbucket-provider.tsx | 12 +- .../git/bitbucket/edit-bitbucket-provider.tsx | 2 +- .../git/github/add-github-provider.tsx | 10 +- .../git/gitlab/add-gitlab-provider.tsx | 2 +- .../git/gitlab/edit-gitlab-provider.tsx | 2 +- .../settings/git/show-git-providers.tsx | 2 +- .../notifications/handle-notifications.tsx | 60 +- .../notifications/show-notifications.tsx | 4 +- .../settings/profile/disable-2fa.tsx | 132 +- .../dashboard/settings/profile/enable-2fa.tsx | 360 +- .../settings/profile/generate-token.tsx | 77 - .../settings/profile/profile-form.tsx | 23 +- .../settings/profile/remove-self-account.tsx | 138 - .../servers/actions/show-dokploy-actions.tsx | 1 - .../servers/actions/show-storage-actions.tsx | 3 +- .../servers/actions/show-traefik-actions.tsx | 14 +- .../servers/actions/toggle-docker-cleanup.tsx | 6 +- .../settings/servers/edit-script.tsx | 2 +- .../settings/servers/gpu-support.tsx | 5 +- .../settings/servers/handle-servers.tsx | 2 +- .../settings/servers/security-audit.tsx | 11 +- .../settings/servers/setup-monitoring.tsx | 634 +++ .../settings/servers/setup-server.tsx | 24 +- .../servers/show-docker-containers-modal.tsx | 8 +- .../servers/show-monitoring-modal.tsx | 31 + .../settings/servers/show-servers.tsx | 11 + .../servers/show-swarm-overview-modal.tsx | 9 +- .../settings/servers/validate-server.tsx | 2 +- .../servers/welcome-stripe/create-server.tsx | 6 +- .../servers/welcome-stripe/create-ssh-key.tsx | 1 + .../servers/welcome-stripe/verify.tsx | 9 - .../settings/ssh-keys/handle-ssh-keys.tsx | 59 +- .../{add-user.tsx => add-invitation.tsx} | 93 +- .../settings/users/add-permissions.tsx | 6 +- .../settings/users/show-invitations.tsx | 208 + .../dashboard/settings/users/show-users.tsx | 195 +- .../dashboard/settings/web-domain.tsx | 14 +- .../dashboard/settings/web-server.tsx | 11 +- .../web-server/local-server-config.tsx | 1 - .../web-server/manage-traefik-ports.tsx | 2 +- .../settings/web-server/show-modal-logs.tsx | 1 - .../settings/web-server/terminal.tsx | 6 +- .../settings/web-server/update-server-ip.tsx | 13 +- .../settings/web-server/update-server.tsx | 2 - .../dashboard/swarm/applications/columns.tsx | 3 +- .../swarm/applications/data-table.tsx | 2 +- .../swarm/applications/show-applications.tsx | 1 - .../dashboard/swarm/details/details-card.tsx | 2 +- .../swarm/details/show-node-config.tsx | 2 +- .../dashboard/swarm/monitoring-card.tsx | 2 +- .../components/icons/data-tools-icons.tsx | 1 - .../components/layouts/dashboard-layout.tsx | 6 +- .../components/layouts/onboarding-layout.tsx | 25 +- .../components/layouts/project-layout.tsx | 6 +- apps/dokploy/components/layouts/side.tsx | 1103 ++-- .../components/layouts/update-server.tsx | 2 +- apps/dokploy/components/layouts/user-nav.tsx | 69 +- .../components/shared/breadcrumb-sidebar.tsx | 6 +- .../components/shared/dialog-action.tsx | 1 - .../dokploy/components/shared/drawer-logs.tsx | 11 +- apps/dokploy/components/shared/logo.tsx | 15 +- apps/dokploy/components/ui/chart.tsx | 2 +- apps/dokploy/components/ui/file-tree.tsx | 2 +- apps/dokploy/components/ui/modeToggle.tsx | 1 - apps/dokploy/components/ui/sidebar.tsx | 4 +- .../drizzle/0057_tricky_living_tribunal.sql | 3 + .../drizzle/0058_brown_sharon_carter.sql | 1 + .../drizzle/0059_striped_bill_hollister.sql | 1 + .../drizzle/0060_disable-aggressive-cache.sql | 3 + apps/dokploy/drizzle/0061_many_molten_man.sql | 4 + .../drizzle/0062_slippery_white_tiger.sql | 2 + .../drizzle/0063_panoramic_dreadnoughts.sql | 2 + .../drizzle/0064_previous_agent_brand.sql | 1 + apps/dokploy/drizzle/0065_daily_zaladane.sql | 1 + apps/dokploy/drizzle/0066_yielding_echo.sql | 688 +++ .../drizzle/0067_condemned_sugar_man.sql | 1 + apps/dokploy/drizzle/meta/0000_snapshot.json | 108 +- apps/dokploy/drizzle/meta/0001_snapshot.json | 108 +- apps/dokploy/drizzle/meta/0002_snapshot.json | 108 +- apps/dokploy/drizzle/meta/0003_snapshot.json | 108 +- apps/dokploy/drizzle/meta/0004_snapshot.json | 108 +- apps/dokploy/drizzle/meta/0005_snapshot.json | 113 +- apps/dokploy/drizzle/meta/0006_snapshot.json | 337 +- apps/dokploy/drizzle/meta/0007_snapshot.json | 337 +- apps/dokploy/drizzle/meta/0008_snapshot.json | 337 +- apps/dokploy/drizzle/meta/0009_snapshot.json | 337 +- apps/dokploy/drizzle/meta/0010_snapshot.json | 337 +- apps/dokploy/drizzle/meta/0011_snapshot.json | 337 +- apps/dokploy/drizzle/meta/0012_snapshot.json | 337 +- apps/dokploy/drizzle/meta/0013_snapshot.json | 337 +- apps/dokploy/drizzle/meta/0014_snapshot.json | 360 +- apps/dokploy/drizzle/meta/0015_snapshot.json | 360 +- apps/dokploy/drizzle/meta/0016_snapshot.json | 360 +- apps/dokploy/drizzle/meta/0017_snapshot.json | 360 +- apps/dokploy/drizzle/meta/0018_snapshot.json | 360 +- apps/dokploy/drizzle/meta/0019_snapshot.json | 409 +- apps/dokploy/drizzle/meta/0020_snapshot.json | 409 +- apps/dokploy/drizzle/meta/0021_snapshot.json | 409 +- apps/dokploy/drizzle/meta/0022_snapshot.json | 409 +- apps/dokploy/drizzle/meta/0023_snapshot.json | 409 +- apps/dokploy/drizzle/meta/0024_snapshot.json | 409 +- apps/dokploy/drizzle/meta/0025_snapshot.json | 409 +- apps/dokploy/drizzle/meta/0026_snapshot.json | 426 +- apps/dokploy/drizzle/meta/0027_snapshot.json | 426 +- apps/dokploy/drizzle/meta/0028_snapshot.json | 426 +- apps/dokploy/drizzle/meta/0029_snapshot.json | 426 +- apps/dokploy/drizzle/meta/0030_snapshot.json | 426 +- apps/dokploy/drizzle/meta/0031_snapshot.json | 432 +- apps/dokploy/drizzle/meta/0032_snapshot.json | 432 +- apps/dokploy/drizzle/meta/0033_snapshot.json | 512 +- apps/dokploy/drizzle/meta/0034_snapshot.json | 512 +- apps/dokploy/drizzle/meta/0035_snapshot.json | 512 +- apps/dokploy/drizzle/meta/0036_snapshot.json | 512 +- apps/dokploy/drizzle/meta/0037_snapshot.json | 577 +- apps/dokploy/drizzle/meta/0038_snapshot.json | 577 +- apps/dokploy/drizzle/meta/0039_snapshot.json | 589 +- apps/dokploy/drizzle/meta/0040_snapshot.json | 601 +- apps/dokploy/drizzle/meta/0041_snapshot.json | 601 +- apps/dokploy/drizzle/meta/0042_snapshot.json | 601 +- apps/dokploy/drizzle/meta/0043_snapshot.json | 601 +- apps/dokploy/drizzle/meta/0044_snapshot.json | 601 +- apps/dokploy/drizzle/meta/0045_snapshot.json | 601 +- apps/dokploy/drizzle/meta/0046_snapshot.json | 601 +- apps/dokploy/drizzle/meta/0047_snapshot.json | 601 +- apps/dokploy/drizzle/meta/0048_snapshot.json | 601 +- apps/dokploy/drizzle/meta/0049_snapshot.json | 634 ++- apps/dokploy/drizzle/meta/0050_snapshot.json | 634 ++- apps/dokploy/drizzle/meta/0051_snapshot.json | 634 ++- apps/dokploy/drizzle/meta/0052_snapshot.json | 634 ++- apps/dokploy/drizzle/meta/0053_snapshot.json | 634 ++- apps/dokploy/drizzle/meta/0054_snapshot.json | 634 ++- apps/dokploy/drizzle/meta/0055_snapshot.json | 634 ++- apps/dokploy/drizzle/meta/0056_snapshot.json | 645 ++- apps/dokploy/drizzle/meta/0057_snapshot.json | 737 +-- apps/dokploy/drizzle/meta/0058_snapshot.json | 4450 +++++++++++++++ apps/dokploy/drizzle/meta/0059_snapshot.json | 4450 +++++++++++++++ apps/dokploy/drizzle/meta/0060_snapshot.json | 4450 +++++++++++++++ apps/dokploy/drizzle/meta/0061_snapshot.json | 4478 +++++++++++++++ apps/dokploy/drizzle/meta/0062_snapshot.json | 4478 +++++++++++++++ apps/dokploy/drizzle/meta/0063_snapshot.json | 4478 +++++++++++++++ apps/dokploy/drizzle/meta/0064_snapshot.json | 4485 +++++++++++++++ apps/dokploy/drizzle/meta/0065_snapshot.json | 4485 +++++++++++++++ apps/dokploy/drizzle/meta/0066_snapshot.json | 5037 ++++++++++++++++ apps/dokploy/drizzle/meta/0067_snapshot.json | 5042 +++++++++++++++++ apps/dokploy/drizzle/meta/_journal.json | 74 +- apps/dokploy/hooks/useLocalStorage.tsx | 33 + apps/dokploy/lib/auth-client.ts | 9 + apps/dokploy/lib/languages.ts | 2 + apps/dokploy/lib/utils.ts | 15 + apps/dokploy/migrate.ts | 149 + apps/dokploy/package.json | 26 +- apps/dokploy/pages/_error.tsx | 2 +- .../accept-invitation/[accept-invitation].tsx | 30 + apps/dokploy/pages/api/[...trpc].ts | 10 +- apps/dokploy/pages/api/auth/[...all].ts | 7 + apps/dokploy/pages/api/deploy/github.ts | 154 +- apps/dokploy/pages/api/health.ts | 2 +- .../pages/api/providers/github/setup.ts | 25 +- apps/dokploy/pages/api/stripe/webhook.ts | 116 +- apps/dokploy/pages/confirm-email.tsx | 96 - apps/dokploy/pages/dashboard/docker.tsx | 22 +- apps/dokploy/pages/dashboard/monitoring.tsx | 85 +- .../pages/dashboard/project/[projectId].tsx | 345 +- .../services/application/[applicationId].tsx | 136 +- .../services/compose/[composeId].tsx | 128 +- .../services/mariadb/[mariadbId].tsx | 129 +- .../[projectId]/services/mongo/[mongoId].tsx | 126 +- .../[projectId]/services/mysql/[mysqlId].tsx | 127 +- .../services/postgres/[postgresId].tsx | 126 +- .../[projectId]/services/redis/[redisId].tsx | 125 +- apps/dokploy/pages/dashboard/projects.tsx | 11 +- apps/dokploy/pages/dashboard/requests.tsx | 6 +- .../pages/dashboard/settings/billing.tsx | 15 +- .../pages/dashboard/settings/certificates.tsx | 12 +- .../pages/dashboard/settings/cluster.tsx | 12 +- .../pages/dashboard/settings/destinations.tsx | 12 +- .../dashboard/settings/git-providers.tsx | 22 +- .../pages/dashboard/settings/index.tsx | 219 + .../dashboard/settings/notifications.tsx | 12 +- .../pages/dashboard/settings/profile.tsx | 34 +- .../pages/dashboard/settings/registry.tsx | 12 +- .../pages/dashboard/settings/server.tsx | 56 +- .../pages/dashboard/settings/servers.tsx | 12 +- .../pages/dashboard/settings/ssh-keys.tsx | 21 +- .../pages/dashboard/settings/users.tsx | 15 +- apps/dokploy/pages/dashboard/swarm.tsx | 26 +- apps/dokploy/pages/dashboard/traefik.tsx | 22 +- apps/dokploy/pages/index.tsx | 425 +- apps/dokploy/pages/invitation.tsx | 328 +- apps/dokploy/pages/register.tsx | 73 +- apps/dokploy/pages/reset-password.tsx | 85 +- apps/dokploy/pages/send-reset-password.tsx | 52 +- apps/dokploy/pages/swagger.tsx | 50 +- apps/dokploy/public/locales/ml/common.json | 1 + apps/dokploy/public/locales/ml/settings.json | 58 + apps/dokploy/public/locales/ru/settings.json | 24 +- apps/dokploy/public/locales/uk/common.json | 1 + apps/dokploy/public/locales/uk/settings.json | 58 + apps/dokploy/public/templates/alist.svg | 10 + apps/dokploy/public/templates/answer.png | Bin 0 -> 3775 bytes apps/dokploy/public/templates/appwrite.svg | 9 + apps/dokploy/public/templates/convex.svg | 5 + apps/dokploy/public/templates/erpnext.svg | 5 + .../dokploy/public/templates/evolutionapi.png | Bin 0 -> 17605 bytes apps/dokploy/public/templates/formbricks.png | Bin 0 -> 74620 bytes apps/dokploy/public/templates/frappe-hr.svg | 5 + apps/dokploy/public/templates/glance.png | Bin 0 -> 7946 bytes apps/dokploy/public/templates/homarr.png | Bin 0 -> 3408 bytes apps/dokploy/public/templates/linkwarden.png | Bin 0 -> 80831 bytes apps/dokploy/public/templates/mailpit.svg | 6 + apps/dokploy/public/templates/maybe.svg | 17 + apps/dokploy/public/templates/outline.png | Bin 0 -> 2158 bytes apps/dokploy/public/templates/pocket-id.svg | 1 + apps/dokploy/public/templates/registry.png | Bin 0 -> 28962 bytes apps/dokploy/public/templates/shlink.svg | 8 + apps/dokploy/public/templates/spacedrive.png | Bin 0 -> 326880 bytes apps/dokploy/public/templates/superset.svg | 9 + apps/dokploy/public/templates/trilium.png | Bin 0 -> 24381 bytes apps/dokploy/public/templates/twenty.svg | 16 +- apps/dokploy/public/templates/wikijs.svg | 119 + apps/dokploy/reset-password.ts | 13 +- apps/dokploy/server/api/root.ts | 3 +- apps/dokploy/server/api/routers/admin.ts | 124 +- .../dokploy/server/api/routers/application.ts | 111 +- apps/dokploy/server/api/routers/auth.ts | 835 ++- apps/dokploy/server/api/routers/backup.ts | 33 +- apps/dokploy/server/api/routers/bitbucket.ts | 41 +- .../dokploy/server/api/routers/certificate.ts | 9 +- apps/dokploy/server/api/routers/cluster.ts | 4 +- apps/dokploy/server/api/routers/compose.ts | 112 +- apps/dokploy/server/api/routers/deployment.ts | 8 +- .../dokploy/server/api/routers/destination.ts | 17 +- apps/dokploy/server/api/routers/domain.ts | 43 +- .../server/api/routers/git-provider.ts | 18 +- apps/dokploy/server/api/routers/github.ts | 42 +- apps/dokploy/server/api/routers/gitlab.ts | 45 +- apps/dokploy/server/api/routers/mariadb.ts | 64 +- apps/dokploy/server/api/routers/mongo.ts | 65 +- apps/dokploy/server/api/routers/mysql.ts | 65 +- .../server/api/routers/notification.ts | 138 +- .../server/api/routers/organization.ts | 148 + apps/dokploy/server/api/routers/port.ts | 8 +- apps/dokploy/server/api/routers/postgres.ts | 94 +- .../server/api/routers/preview-deployment.ts | 14 +- apps/dokploy/server/api/routers/project.ts | 82 +- apps/dokploy/server/api/routers/redirects.ts | 16 +- apps/dokploy/server/api/routers/redis.ts | 60 +- apps/dokploy/server/api/routers/registry.ts | 18 +- apps/dokploy/server/api/routers/security.ts | 16 +- apps/dokploy/server/api/routers/server.ts | 165 +- apps/dokploy/server/api/routers/settings.ts | 101 +- apps/dokploy/server/api/routers/ssh-key.ts | 15 +- apps/dokploy/server/api/routers/stripe.ts | 74 +- apps/dokploy/server/api/routers/user.ts | 342 +- apps/dokploy/server/api/trpc.ts | 51 +- apps/dokploy/server/db/seed.ts | 8 +- apps/dokploy/server/utils/backup.ts | 22 + apps/dokploy/server/utils/docker.ts | 2 +- .../server/wss/docker-container-logs.ts | 4 +- .../server/wss/docker-container-terminal.ts | 14 +- apps/dokploy/server/wss/docker-stats.ts | 19 +- apps/dokploy/server/wss/drawer-logs.ts | 9 +- apps/dokploy/server/wss/listen-deployment.ts | 6 +- apps/dokploy/server/wss/terminal.ts | 18 +- apps/dokploy/styles/globals.css | 7 + .../templates/activepieces/docker-compose.yml | 9 +- .../templates/alist/docker-compose.yml | 14 + apps/dokploy/templates/alist/index.ts | 22 + .../templates/answer/docker-compose.yml | 30 + apps/dokploy/templates/answer/index.ts | 33 + apps/dokploy/templates/appsmith/index.ts | 2 +- .../templates/appwrite/docker-compose.yml | 887 +++ apps/dokploy/templates/appwrite/index.ts | 153 + .../templates/aptabase/docker-compose.yml | 6 +- apps/dokploy/templates/blender/index.ts | 2 +- .../templates/budibase/docker-compose.yml | 21 +- .../templates/calcom/docker-compose.yml | 3 +- .../templates/chatwoot/docker-compose.yml | 6 +- .../templates/checkmate/docker-compose.yml | 11 +- apps/dokploy/templates/cloudflared/index.ts | 2 +- .../templates/coder/docker-compose.yml | 6 +- .../templates/convex/docker-compose.yml | 37 + apps/dokploy/templates/convex/index.ts | 38 + .../templates/directus/docker-compose.yml | 6 +- .../discord-tickets/docker-compose.yml | 6 +- .../templates/discourse/docker-compose.yml | 12 +- .../templates/docmost/docker-compose.yml | 9 +- .../templates/documenso/docker-compose.yml | 3 +- .../templates/drawio/docker-compose.yml | 9 +- apps/dokploy/templates/drawio/index.ts | 2 +- .../templates/erpnext/docker-compose.yml | 354 ++ apps/dokploy/templates/erpnext/index.ts | 39 + .../templates/evolutionapi/docker-compose.yml | 58 + apps/dokploy/templates/evolutionapi/index.ts | 59 + .../templates/excalidraw/docker-compose.yml | 3 +- apps/dokploy/templates/excalidraw/index.ts | 1 - .../templates/formbricks/docker-compose.yml | 37 + apps/dokploy/templates/formbricks/index.ts | 38 + .../templates/frappe-hr/docker-compose.yml | 354 ++ apps/dokploy/templates/frappe-hr/index.ts | 39 + .../templates/ghost/docker-compose.yml | 3 +- apps/dokploy/templates/ghost/index.ts | 1 - .../templates/gitea/docker-compose.yml | 6 +- .../templates/glance/docker-compose.yml | 11 + apps/dokploy/templates/glance/index.ts | 108 + .../templates/glitchtip/docker-compose.yml | 12 +- .../dokploy/templates/glpi/docker-compose.yml | 6 +- .../templates/hi-events/docker-compose.yml | 3 +- .../templates/homarr/docker-compose.yml | 11 + apps/dokploy/templates/homarr/index.ts | 27 + .../dokploy/templates/huly/docker-compose.yml | 36 +- .../templates/immich/docker-compose.yml | 12 +- apps/dokploy/templates/immich/index.ts | 2 +- .../templates/infisical/docker-compose.yml | 12 +- .../templates/invoiceshelf/docker-compose.yml | 6 +- .../templates/kimai/docker-compose.yml | 6 +- .../templates/langflow/docker-compose.yml | 6 +- .../templates/linkwarden/docker-compose.yml | 40 + apps/dokploy/templates/linkwarden/index.ts | 33 + .../templates/listmonk/docker-compose.yml | 14 +- apps/dokploy/templates/listmonk/index.ts | 7 +- .../templates/logto/docker-compose.yml | 6 +- .../templates/mailpit/docker-compose.yml | 25 + apps/dokploy/templates/mailpit/index.ts | 31 + .../templates/maybe/docker-compose.yml | 36 + apps/dokploy/templates/maybe/index.ts | 43 + .../templates/metabase/docker-compose.yml | 3 +- .../nextcloud-aio/docker-compose.yml | 6 +- .../templates/nocodb/docker-compose.yml | 3 +- .../dokploy/templates/odoo/docker-compose.yml | 3 +- .../templates/open-webui/docker-compose.yml | 3 +- .../templates/outline/docker-compose.yml | 57 + apps/dokploy/templates/outline/index.ts | 90 + .../templates/penpot/docker-compose.yml | 18 +- apps/dokploy/templates/penpot/index.ts | 2 - .../templates/peppermint/docker-compose.yml | 6 +- .../templates/photoprism/docker-compose.yml | 6 +- apps/dokploy/templates/photoprism/index.ts | 1 - .../templates/phpmyadmin/docker-compose.yml | 3 +- .../templates/plausible/docker-compose.yml | 9 +- .../templates/pocket-id/docker-compose.yml | 21 + apps/dokploy/templates/pocket-id/index.ts | 29 + .../templates/portainer/docker-compose.yml | 3 +- .../templates/postiz/docker-compose.yml | 9 +- .../templates/registry/docker-compose.yml | 19 + apps/dokploy/templates/registry/index.ts | 35 + .../templates/rocketchat/docker-compose.yml | 3 +- .../templates/roundcube/docker-compose.yml | 3 +- .../dokploy/templates/ryot/docker-compose.yml | 6 +- .../templates/shlink/docker-compose.yml | 29 + apps/dokploy/templates/shlink/index.ts | 35 + .../templates/slash/docker-compose.yml | 6 +- .../templates/spacedrive/docker-compose.yml | 9 + apps/dokploy/templates/spacedrive/index.ts | 28 + .../templates/supabase/docker-compose.yml | 36 +- .../templates/superset/docker-compose.yml | 87 + apps/dokploy/templates/superset/index.ts | 77 + .../templates/teable/docker-compose.yml | 8 +- apps/dokploy/templates/templates.ts | 344 +- apps/dokploy/templates/triggerdotdev/index.ts | 1 - .../templates/trilium/docker-compose.yml | 14 + apps/dokploy/templates/trilium/index.ts | 22 + .../templates/twenty/docker-compose.yml | 15 +- .../templates/typebot/docker-compose.yml | 3 +- .../templates/umami/docker-compose.yml | 5 +- .../templates/unifi/docker-compose.yml | 6 +- apps/dokploy/templates/unifi/index.ts | 2 +- .../templates/unsend/docker-compose.yml | 13 +- apps/dokploy/templates/unsend/index.ts | 1 - apps/dokploy/templates/utils/index.ts | 4 +- .../templates/wikijs/docker-compose.yml | 31 + apps/dokploy/templates/wikijs/index.ts | 35 + .../templates/windmill/docker-compose.yml | 18 +- .../templates/wordpress/docker-compose.yml | 2 - .../templates/yourls/docker-compose.yml | 6 +- .../templates/zipline/docker-compose.yml | 3 +- apps/monitoring/.gitignore | 1 + apps/monitoring/LICENSE.md | 0 apps/monitoring/README.md | 154 + apps/monitoring/config/metrics.go | 57 + apps/monitoring/containers/config.go | 61 + apps/monitoring/containers/monitor.go | 270 + apps/monitoring/containers/types.go | 48 + apps/monitoring/database/cleanup.go | 52 + apps/monitoring/database/containers.go | 160 + apps/monitoring/database/db.go | 47 + apps/monitoring/database/server.go | 115 + apps/monitoring/go.mod | 34 + apps/monitoring/go.sum | 61 + apps/monitoring/main.go | 164 + apps/monitoring/middleware/auth.go | 39 + apps/monitoring/monitoring/monitor.go | 261 + apps/schedules/package.json | 2 +- apps/schedules/tsconfig.json | 3 +- biome.json | 5 +- lefthook.yml | 4 +- packages/server/auth-schema.ts | 133 + packages/server/package.json | 9 +- packages/server/src/auth/auth.ts | 117 - packages/server/src/auth/token.ts | 99 - packages/server/src/db/schema/account.ts | 194 + packages/server/src/db/schema/admin.ts | 121 - packages/server/src/db/schema/application.ts | 1 - packages/server/src/db/schema/auth.ts | 130 - packages/server/src/db/schema/bitbucket.ts | 2 +- packages/server/src/db/schema/certificate.ts | 29 +- packages/server/src/db/schema/compose.ts | 1 + packages/server/src/db/schema/dbml.ts | 7 + packages/server/src/db/schema/deployment.ts | 3 +- packages/server/src/db/schema/destination.ts | 13 +- packages/server/src/db/schema/git-provider.ts | 16 +- packages/server/src/db/schema/index.ts | 3 +- packages/server/src/db/schema/notification.ts | 32 +- packages/server/src/db/schema/project.ts | 14 +- packages/server/src/db/schema/registry.ts | 14 +- packages/server/src/db/schema/schema.dbml | 872 +++ packages/server/src/db/schema/server.ts | 105 +- packages/server/src/db/schema/session.ts | 19 +- packages/server/src/db/schema/source.ts | 27 - packages/server/src/db/schema/ssh-key.ts | 16 +- packages/server/src/db/schema/user.ts | 329 +- .../server/src/emails/emails/build-failed.tsx | 1 - .../src/emails/emails/build-success.tsx | 1 - .../src/emails/emails/database-backup.tsx | 1 - .../src/emails/emails/docker-cleanup.tsx | 2 - .../src/emails/emails/dokploy-restart.tsx | 1 - .../src/emails/emails/notion-magic-link.tsx | 1 - .../emails/emails/plaid-verify-identity.tsx | 1 - .../src/emails/emails/stripe-welcome.tsx | 1 - .../src/emails/emails/vercel-invite-user.tsx | 1 - packages/server/src/index.ts | 11 +- packages/server/src/lib/auth.ts | 304 + .../src/monitoring/{utilts.ts => utils.ts} | 116 +- packages/server/src/services/admin.ts | 162 +- packages/server/src/services/application.ts | 65 +- packages/server/src/services/auth.ts | 184 - packages/server/src/services/backup.ts | 19 +- packages/server/src/services/bitbucket.ts | 8 +- packages/server/src/services/certificate.ts | 4 +- packages/server/src/services/compose.ts | 40 +- packages/server/src/services/deployment.ts | 43 +- packages/server/src/services/destination.ts | 10 +- packages/server/src/services/docker.ts | 26 +- packages/server/src/services/domain.ts | 7 +- packages/server/src/services/github.ts | 6 +- packages/server/src/services/gitlab.ts | 6 +- packages/server/src/services/mariadb.ts | 2 +- packages/server/src/services/mongo.ts | 2 +- packages/server/src/services/mount.ts | 10 +- packages/server/src/services/notification.ts | 40 +- packages/server/src/services/postgres.ts | 2 +- .../server/src/services/preview-deployment.ts | 28 +- packages/server/src/services/project.ts | 4 +- packages/server/src/services/redirect.ts | 6 +- packages/server/src/services/redis.ts | 2 +- packages/server/src/services/registry.ts | 14 +- packages/server/src/services/security.ts | 8 +- packages/server/src/services/server.ts | 25 +- packages/server/src/services/settings.ts | 34 +- packages/server/src/services/user.ts | 236 +- packages/server/src/setup/monitoring-setup.ts | 148 + packages/server/src/setup/postgres-setup.ts | 12 +- packages/server/src/setup/redis-setup.ts | 11 +- packages/server/src/setup/server-audit.ts | 2 +- packages/server/src/setup/server-validate.ts | 2 +- packages/server/src/setup/setup.ts | 4 +- packages/server/src/setup/traefik-setup.ts | 22 +- packages/server/src/types/with.ts | 2 +- .../server/src/utils/access-log/handler.ts | 13 +- packages/server/src/utils/backups/index.ts | 8 +- packages/server/src/utils/backups/mariadb.ts | 4 +- packages/server/src/utils/backups/mongo.ts | 4 +- packages/server/src/utils/backups/mysql.ts | 5 +- packages/server/src/utils/backups/postgres.ts | 4 +- packages/server/src/utils/backups/utils.ts | 2 +- packages/server/src/utils/builders/compose.ts | 58 +- packages/server/src/utils/builders/index.ts | 2 +- .../server/src/utils/builders/nixpacks.ts | 2 +- .../server/src/utils/databases/mariadb.ts | 2 +- packages/server/src/utils/databases/mongo.ts | 2 +- packages/server/src/utils/databases/mysql.ts | 2 +- packages/server/src/utils/databases/redis.ts | 2 +- packages/server/src/utils/docker/collision.ts | 46 + .../utils/docker/collision/root-network.ts | 62 + packages/server/src/utils/docker/domain.ts | 47 +- packages/server/src/utils/docker/utils.ts | 41 +- packages/server/src/utils/gpu-setup.ts | 4 +- .../src/utils/notifications/build-error.ts | 6 +- .../src/utils/notifications/build-success.ts | 6 +- .../utils/notifications/database-backup.ts | 7 +- .../src/utils/notifications/docker-cleanup.ts | 4 +- .../utils/notifications/server-threshold.ts | 155 + .../server/src/utils/notifications/utils.ts | 1 + .../server/src/utils/process/execAsync.ts | 2 +- .../server/src/utils/providers/bitbucket.ts | 1 - packages/server/src/utils/providers/git.ts | 14 +- packages/server/src/utils/providers/gitlab.ts | 15 +- .../server/src/utils/traefik/application.ts | 8 +- packages/server/src/utils/traefik/domain.ts | 16 +- .../server/src/utils/traefik/middleware.ts | 2 +- .../server/src/utils/traefik/web-server.ts | 6 +- .../verification/send-verification-email.tsx | 51 + packages/server/tsconfig.server.json | 1 + pnpm-lock.yaml | 1301 +++-- pnpm-workspace.yaml | 1 + 639 files changed, 82888 insertions(+), 17188 deletions(-) delete mode 100644 .circleci/config.yml create mode 100644 .github/sponsors/openalternative.png create mode 100644 .github/sponsors/synexa.png create mode 100644 .github/workflows/create-pr.yml create mode 100644 .github/workflows/dokploy.yml create mode 100644 .github/workflows/monitoring.yml create mode 100644 Dockerfile.monitoring delete mode 100644 apps/dokploy/components/auth/login-2fa.tsx rename apps/dokploy/components/dashboard/compose/{delete-compose.tsx => delete-service.tsx} (61%) create mode 100644 apps/dokploy/components/dashboard/compose/general/isolated-deployment.tsx create mode 100644 apps/dokploy/components/dashboard/compose/general/show-utilities.tsx delete mode 100644 apps/dokploy/components/dashboard/monitoring/docker/show.tsx rename apps/dokploy/components/dashboard/monitoring/{docker => free/container}/docker-block-chart.tsx (88%) rename apps/dokploy/components/dashboard/monitoring/{docker => free/container}/docker-cpu-chart.tsx (88%) rename apps/dokploy/components/dashboard/monitoring/{docker => free/container}/docker-disk-chart.tsx (97%) rename apps/dokploy/components/dashboard/monitoring/{docker => free/container}/docker-memory-chart.tsx (80%) rename apps/dokploy/components/dashboard/monitoring/{docker => free/container}/docker-network-chart.tsx (84%) create mode 100644 apps/dokploy/components/dashboard/monitoring/free/container/show-free-compose-monitoring.tsx create mode 100644 apps/dokploy/components/dashboard/monitoring/free/container/show-free-container-monitoring.tsx create mode 100644 apps/dokploy/components/dashboard/monitoring/paid/container/container-block-chart.tsx create mode 100644 apps/dokploy/components/dashboard/monitoring/paid/container/container-cpu-chart.tsx create mode 100644 apps/dokploy/components/dashboard/monitoring/paid/container/container-memory-chart.tsx create mode 100644 apps/dokploy/components/dashboard/monitoring/paid/container/container-network-chart.tsx rename apps/dokploy/components/dashboard/{compose/monitoring/show.tsx => monitoring/paid/container/show-paid-compose-monitoring.tsx} (80%) create mode 100644 apps/dokploy/components/dashboard/monitoring/paid/container/show-paid-container-monitoring.tsx create mode 100644 apps/dokploy/components/dashboard/monitoring/paid/servers/cpu-chart.tsx create mode 100644 apps/dokploy/components/dashboard/monitoring/paid/servers/disk-chart.tsx create mode 100644 apps/dokploy/components/dashboard/monitoring/paid/servers/memory-chart.tsx create mode 100644 apps/dokploy/components/dashboard/monitoring/paid/servers/network-chart.tsx create mode 100644 apps/dokploy/components/dashboard/monitoring/paid/servers/show-paid-monitoring.tsx delete mode 100644 apps/dokploy/components/dashboard/monitoring/web-server/show.tsx create mode 100644 apps/dokploy/components/dashboard/organization/handle-organization.tsx create mode 100644 apps/dokploy/components/dashboard/settings/api/add-api-key.tsx create mode 100644 apps/dokploy/components/dashboard/settings/api/show-api-keys.tsx delete mode 100644 apps/dokploy/components/dashboard/settings/profile/generate-token.tsx delete mode 100644 apps/dokploy/components/dashboard/settings/profile/remove-self-account.tsx create mode 100644 apps/dokploy/components/dashboard/settings/servers/setup-monitoring.tsx create mode 100644 apps/dokploy/components/dashboard/settings/servers/show-monitoring-modal.tsx rename apps/dokploy/components/dashboard/settings/users/{add-user.tsx => add-invitation.tsx} (52%) create mode 100644 apps/dokploy/components/dashboard/settings/users/show-invitations.tsx create mode 100644 apps/dokploy/drizzle/0057_tricky_living_tribunal.sql create mode 100644 apps/dokploy/drizzle/0058_brown_sharon_carter.sql create mode 100644 apps/dokploy/drizzle/0059_striped_bill_hollister.sql create mode 100644 apps/dokploy/drizzle/0060_disable-aggressive-cache.sql create mode 100644 apps/dokploy/drizzle/0061_many_molten_man.sql create mode 100644 apps/dokploy/drizzle/0062_slippery_white_tiger.sql create mode 100644 apps/dokploy/drizzle/0063_panoramic_dreadnoughts.sql create mode 100644 apps/dokploy/drizzle/0064_previous_agent_brand.sql create mode 100644 apps/dokploy/drizzle/0065_daily_zaladane.sql create mode 100644 apps/dokploy/drizzle/0066_yielding_echo.sql create mode 100644 apps/dokploy/drizzle/0067_condemned_sugar_man.sql create mode 100644 apps/dokploy/drizzle/meta/0058_snapshot.json create mode 100644 apps/dokploy/drizzle/meta/0059_snapshot.json create mode 100644 apps/dokploy/drizzle/meta/0060_snapshot.json create mode 100644 apps/dokploy/drizzle/meta/0061_snapshot.json create mode 100644 apps/dokploy/drizzle/meta/0062_snapshot.json create mode 100644 apps/dokploy/drizzle/meta/0063_snapshot.json create mode 100644 apps/dokploy/drizzle/meta/0064_snapshot.json create mode 100644 apps/dokploy/drizzle/meta/0065_snapshot.json create mode 100644 apps/dokploy/drizzle/meta/0066_snapshot.json create mode 100644 apps/dokploy/drizzle/meta/0067_snapshot.json create mode 100644 apps/dokploy/hooks/useLocalStorage.tsx create mode 100644 apps/dokploy/lib/auth-client.ts create mode 100644 apps/dokploy/migrate.ts create mode 100644 apps/dokploy/pages/accept-invitation/[accept-invitation].tsx create mode 100644 apps/dokploy/pages/api/auth/[...all].ts delete mode 100644 apps/dokploy/pages/confirm-email.tsx create mode 100644 apps/dokploy/pages/dashboard/settings/index.tsx create mode 100644 apps/dokploy/public/locales/ml/common.json create mode 100644 apps/dokploy/public/locales/ml/settings.json create mode 100644 apps/dokploy/public/locales/uk/common.json create mode 100644 apps/dokploy/public/locales/uk/settings.json create mode 100644 apps/dokploy/public/templates/alist.svg create mode 100644 apps/dokploy/public/templates/answer.png create mode 100644 apps/dokploy/public/templates/appwrite.svg create mode 100644 apps/dokploy/public/templates/convex.svg create mode 100644 apps/dokploy/public/templates/erpnext.svg create mode 100644 apps/dokploy/public/templates/evolutionapi.png create mode 100644 apps/dokploy/public/templates/formbricks.png create mode 100644 apps/dokploy/public/templates/frappe-hr.svg create mode 100644 apps/dokploy/public/templates/glance.png create mode 100644 apps/dokploy/public/templates/homarr.png create mode 100644 apps/dokploy/public/templates/linkwarden.png create mode 100644 apps/dokploy/public/templates/mailpit.svg create mode 100644 apps/dokploy/public/templates/maybe.svg create mode 100644 apps/dokploy/public/templates/outline.png create mode 100644 apps/dokploy/public/templates/pocket-id.svg create mode 100644 apps/dokploy/public/templates/registry.png create mode 100644 apps/dokploy/public/templates/shlink.svg create mode 100644 apps/dokploy/public/templates/spacedrive.png create mode 100644 apps/dokploy/public/templates/superset.svg create mode 100644 apps/dokploy/public/templates/trilium.png create mode 100644 apps/dokploy/public/templates/wikijs.svg create mode 100644 apps/dokploy/server/api/routers/organization.ts create mode 100644 apps/dokploy/templates/alist/docker-compose.yml create mode 100644 apps/dokploy/templates/alist/index.ts create mode 100644 apps/dokploy/templates/answer/docker-compose.yml create mode 100644 apps/dokploy/templates/answer/index.ts create mode 100644 apps/dokploy/templates/appwrite/docker-compose.yml create mode 100644 apps/dokploy/templates/appwrite/index.ts create mode 100644 apps/dokploy/templates/convex/docker-compose.yml create mode 100644 apps/dokploy/templates/convex/index.ts create mode 100644 apps/dokploy/templates/erpnext/docker-compose.yml create mode 100644 apps/dokploy/templates/erpnext/index.ts create mode 100644 apps/dokploy/templates/evolutionapi/docker-compose.yml create mode 100644 apps/dokploy/templates/evolutionapi/index.ts create mode 100644 apps/dokploy/templates/formbricks/docker-compose.yml create mode 100644 apps/dokploy/templates/formbricks/index.ts create mode 100644 apps/dokploy/templates/frappe-hr/docker-compose.yml create mode 100644 apps/dokploy/templates/frappe-hr/index.ts create mode 100644 apps/dokploy/templates/glance/docker-compose.yml create mode 100644 apps/dokploy/templates/glance/index.ts create mode 100644 apps/dokploy/templates/homarr/docker-compose.yml create mode 100644 apps/dokploy/templates/homarr/index.ts create mode 100644 apps/dokploy/templates/linkwarden/docker-compose.yml create mode 100644 apps/dokploy/templates/linkwarden/index.ts create mode 100644 apps/dokploy/templates/mailpit/docker-compose.yml create mode 100644 apps/dokploy/templates/mailpit/index.ts create mode 100644 apps/dokploy/templates/maybe/docker-compose.yml create mode 100644 apps/dokploy/templates/maybe/index.ts create mode 100644 apps/dokploy/templates/outline/docker-compose.yml create mode 100644 apps/dokploy/templates/outline/index.ts create mode 100644 apps/dokploy/templates/pocket-id/docker-compose.yml create mode 100644 apps/dokploy/templates/pocket-id/index.ts create mode 100644 apps/dokploy/templates/registry/docker-compose.yml create mode 100644 apps/dokploy/templates/registry/index.ts create mode 100644 apps/dokploy/templates/shlink/docker-compose.yml create mode 100644 apps/dokploy/templates/shlink/index.ts create mode 100644 apps/dokploy/templates/spacedrive/docker-compose.yml create mode 100644 apps/dokploy/templates/spacedrive/index.ts create mode 100644 apps/dokploy/templates/superset/docker-compose.yml create mode 100644 apps/dokploy/templates/superset/index.ts create mode 100644 apps/dokploy/templates/trilium/docker-compose.yml create mode 100644 apps/dokploy/templates/trilium/index.ts create mode 100644 apps/dokploy/templates/wikijs/docker-compose.yml create mode 100644 apps/dokploy/templates/wikijs/index.ts create mode 100644 apps/monitoring/.gitignore create mode 100644 apps/monitoring/LICENSE.md create mode 100644 apps/monitoring/README.md create mode 100644 apps/monitoring/config/metrics.go create mode 100644 apps/monitoring/containers/config.go create mode 100644 apps/monitoring/containers/monitor.go create mode 100644 apps/monitoring/containers/types.go create mode 100644 apps/monitoring/database/cleanup.go create mode 100644 apps/monitoring/database/containers.go create mode 100644 apps/monitoring/database/db.go create mode 100644 apps/monitoring/database/server.go create mode 100644 apps/monitoring/go.mod create mode 100644 apps/monitoring/go.sum create mode 100644 apps/monitoring/main.go create mode 100644 apps/monitoring/middleware/auth.go create mode 100644 apps/monitoring/monitoring/monitor.go create mode 100644 packages/server/auth-schema.ts delete mode 100644 packages/server/src/auth/auth.ts delete mode 100644 packages/server/src/auth/token.ts create mode 100644 packages/server/src/db/schema/account.ts delete mode 100644 packages/server/src/db/schema/admin.ts delete mode 100644 packages/server/src/db/schema/auth.ts create mode 100644 packages/server/src/db/schema/dbml.ts create mode 100644 packages/server/src/db/schema/schema.dbml delete mode 100644 packages/server/src/db/schema/source.ts create mode 100644 packages/server/src/lib/auth.ts rename packages/server/src/monitoring/{utilts.ts => utils.ts} (52%) delete mode 100644 packages/server/src/services/auth.ts create mode 100644 packages/server/src/setup/monitoring-setup.ts create mode 100644 packages/server/src/utils/docker/collision.ts create mode 100644 packages/server/src/utils/docker/collision/root-network.ts create mode 100644 packages/server/src/utils/notifications/server-threshold.ts create mode 100644 packages/server/src/verification/send-verification-email.tsx diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index ba405c22..00000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,119 +0,0 @@ -version: 2.1 - -jobs: - build-amd64: - machine: - image: ubuntu-2004:current - steps: - - checkout - - run: - name: Prepare .env file - command: | - cp apps/dokploy/.env.production.example .env.production - cp apps/dokploy/.env.production.example apps/dokploy/.env.production - - - run: - name: Build and push AMD64 image - command: | - docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_TOKEN - if [ "${CIRCLE_BRANCH}" == "main" ]; then - TAG="latest" - elif [ "${CIRCLE_BRANCH}" == "canary" ]; then - TAG="canary" - else - TAG="feature" - fi - docker build --platform linux/amd64 -t dokploy/dokploy:${TAG}-amd64 . - docker push dokploy/dokploy:${TAG}-amd64 - - build-arm64: - machine: - image: ubuntu-2004:current - resource_class: arm.large - steps: - - checkout - - run: - name: Prepare .env file - command: | - cp apps/dokploy/.env.production.example .env.production - cp apps/dokploy/.env.production.example apps/dokploy/.env.production - - run: - name: Build and push ARM64 image - command: | - docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_TOKEN - if [ "${CIRCLE_BRANCH}" == "main" ]; then - TAG="latest" - elif [ "${CIRCLE_BRANCH}" == "canary" ]; then - TAG="canary" - else - TAG="feature" - fi - docker build --platform linux/arm64 -t dokploy/dokploy:${TAG}-arm64 . - docker push dokploy/dokploy:${TAG}-arm64 - - combine-manifests: - docker: - - image: cimg/node:20.9.0 - steps: - - checkout - - setup_remote_docker - - run: - name: Create and push multi-arch manifest - command: | - docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_TOKEN - - if [ "${CIRCLE_BRANCH}" == "main" ]; then - VERSION=$(node -p "require('./apps/dokploy/package.json').version") - echo $VERSION - TAG="latest" - - docker manifest create dokploy/dokploy:${TAG} \ - dokploy/dokploy:${TAG}-amd64 \ - dokploy/dokploy:${TAG}-arm64 - docker manifest push dokploy/dokploy:${TAG} - - docker manifest create dokploy/dokploy:${VERSION} \ - dokploy/dokploy:${TAG}-amd64 \ - dokploy/dokploy:${TAG}-arm64 - docker manifest push dokploy/dokploy:${VERSION} - elif [ "${CIRCLE_BRANCH}" == "canary" ]; then - TAG="canary" - docker manifest create dokploy/dokploy:${TAG} \ - dokploy/dokploy:${TAG}-amd64 \ - dokploy/dokploy:${TAG}-arm64 - docker manifest push dokploy/dokploy:${TAG} - else - TAG="feature" - docker manifest create dokploy/dokploy:${TAG} \ - dokploy/dokploy:${TAG}-amd64 \ - dokploy/dokploy:${TAG}-arm64 - docker manifest push dokploy/dokploy:${TAG} - fi - -workflows: - build-all: - jobs: - - build-amd64: - filters: - branches: - only: - - main - - canary - - feat/add-sidebar - - build-arm64: - filters: - branches: - only: - - main - - canary - - feat/add-sidebar - - combine-manifests: - requires: - - build-amd64 - - build-arm64 - filters: - branches: - only: - - main - - canary - - feat/add-sidebar diff --git a/.github/sponsors/openalternative.png b/.github/sponsors/openalternative.png new file mode 100644 index 0000000000000000000000000000000000000000..e7b899ec3aac3bcb40011a54d709a801038d0463 GIT binary patch literal 4170 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 literal 0 HcmV?d00001 diff --git a/.github/sponsors/synexa.png b/.github/sponsors/synexa.png new file mode 100644 index 0000000000000000000000000000000000000000..737ccd57629252cf86562ba3b5cee74128a889be GIT binary patch literal 42254 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 $GITHUB_ENV + + - name: Get latest GitHub tag + id: latest_tag + run: | + LATEST_TAG=$(git ls-remote --tags origin | awk -F'/' '{print $3}' | sort -V | tail -n1) + echo "LATEST_TAG=$LATEST_TAG" >> $GITHUB_ENV + echo $LATEST_TAG + - name: Compare versions + id: compare_versions + run: | + if [ "${{ env.VERSION }}" != "${{ env.LATEST_TAG }}" ]; then + VERSION_CHANGED="true" + else + VERSION_CHANGED="false" + fi + echo "VERSION_CHANGED=$VERSION_CHANGED" >> $GITHUB_ENV + echo "Comparing versions:" + echo "Current version: ${{ env.VERSION }}" + echo "Latest tag: ${{ env.LATEST_TAG }}" + echo "Version changed: $VERSION_CHANGED" + - name: Check if a PR already exists + id: check_pr + run: | + PR_EXISTS=$(gh pr list --state open --base main --head canary --json number --jq '. | length') + echo "PR_EXISTS=$PR_EXISTS" >> $GITHUB_ENV + env: + GH_TOKEN: ${{ secrets.GH_PAT }} + + - name: Create Pull Request + if: env.VERSION_CHANGED == 'true' && env.PR_EXISTS == '0' + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" + + git fetch origin main + git checkout canary + git push origin canary + + gh pr create \ + --title "🚀 Release ${{ env.VERSION }}" \ + --body ' + This PR promotes changes from `canary` to `main` for version ${{ env.VERSION }}. + + ### 🔍 Changes Include: + - Version bump to ${{ env.VERSION }} + - All changes from canary branch + + ### ✅ Pre-merge Checklist: + - [ ] All tests passing + - [ ] Documentation updated + - [ ] Docker images built and tested + + > 🤖 This PR was automatically generated by [GitHub Actions](https://github.com/actions)' \ + --base main \ + --head canary \ + --label "release" --label "automated pr" || true \ + --reviewer siumauricio \ + --assignee siumauricio + env: + GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 892e8ea1..bb772146 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -2,7 +2,7 @@ name: Build Docker images on: push: - branches: ["canary", "main"] + branches: ["canary", "main", "feat/monitoring"] jobs: build-and-push-cloud-image: @@ -17,7 +17,7 @@ jobs: with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - + - name: Build and push Docker image uses: docker/build-push-action@v4 with: @@ -53,8 +53,7 @@ jobs: push: true tags: | siumauricio/schedule:${{ github.ref_name == 'main' && 'latest' || 'canary' }} - platforms: linux/amd64 - + platforms: linux/amd64 build-and-push-server-image: runs-on: ubuntu-latest @@ -77,4 +76,4 @@ jobs: push: true tags: | siumauricio/server:${{ github.ref_name == 'main' && 'latest' || 'canary' }} - platforms: linux/amd64 \ No newline at end of file + platforms: linux/amd64 diff --git a/.github/workflows/dokploy.yml b/.github/workflows/dokploy.yml new file mode 100644 index 00000000..adcb1bb5 --- /dev/null +++ b/.github/workflows/dokploy.yml @@ -0,0 +1,161 @@ +name: Dokploy Docker Build + +on: + push: + branches: [main, canary, "feat/better-auth-2"] + +env: + IMAGE_NAME: dokploy/dokploy + +jobs: + docker-amd: + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Set tag and version + id: meta + run: | + if [ "${{ github.ref }}" = "refs/heads/main" ]; then + TAG="latest" + VERSION=$(node -p "require('./apps/dokploy/package.json').version") + elif [ "${{ github.ref }}" = "refs/heads/canary" ]; then + TAG="canary" + else + TAG="feature" + fi + echo "tags=${IMAGE_NAME}:${TAG}-amd64" >> $GITHUB_OUTPUT + + - name: Prepare env file + run: | + cp apps/dokploy/.env.production.example .env.production + cp apps/dokploy/.env.production.example apps/dokploy/.env.production + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + platforms: linux/amd64 + push: true + tags: ${{ steps.meta.outputs.tags }} + docker-arm: + runs-on: ubuntu-24.04-arm + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Set tag and version + id: meta + run: | + VERSION=$(node -p "require('./apps/dokploy/package.json').version") + if [ "${{ github.ref }}" = "refs/heads/main" ]; then + TAG="latest" + VERSION=$(node -p "require('./apps/dokploy/package.json').version") + elif [ "${{ github.ref }}" = "refs/heads/canary" ]; then + TAG="canary" + else + TAG="feature" + fi + echo "tags=${IMAGE_NAME}:${TAG}-arm64" >> $GITHUB_OUTPUT + + - name: Prepare env file + run: | + cp apps/dokploy/.env.production.example .env.production + cp apps/dokploy/.env.production.example apps/dokploy/.env.production + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + platforms: linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + + combine-manifests: + needs: [docker-amd, docker-arm] + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Create and push manifests + run: | + if [ "${{ github.ref }}" = "refs/heads/main" ]; then + VERSION=$(node -p "require('./apps/dokploy/package.json').version") + TAG="latest" + + docker buildx imagetools create -t ${IMAGE_NAME}:${TAG} \ + ${IMAGE_NAME}:${TAG}-amd64 \ + ${IMAGE_NAME}:${TAG}-arm64 + + docker buildx imagetools create -t ${IMAGE_NAME}:${VERSION} \ + ${IMAGE_NAME}:${TAG}-amd64 \ + ${IMAGE_NAME}:${TAG}-arm64 + + elif [ "${{ github.ref }}" = "refs/heads/canary" ]; then + TAG="canary" + docker buildx imagetools create -t ${IMAGE_NAME}:${TAG} \ + ${IMAGE_NAME}:${TAG}-amd64 \ + ${IMAGE_NAME}:${TAG}-arm64 + + else + TAG="feature" + docker buildx imagetools create -t ${IMAGE_NAME}:${TAG} \ + ${IMAGE_NAME}:${TAG}-amd64 \ + ${IMAGE_NAME}:${TAG}-arm64 + fi + + generate-release: + needs: [combine-manifests] + if: github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Get version + id: get_version + run: | + VERSION=$(node -p "require('./apps/dokploy/package.json').version") + echo "version=$VERSION" >> $GITHUB_OUTPUT + + - name: Create Release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ steps.get_version.outputs.version }} + name: ${{ steps.get_version.outputs.version }} + generate_release_notes: true + draft: false + prerelease: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/monitoring.yml b/.github/workflows/monitoring.yml new file mode 100644 index 00000000..378b019d --- /dev/null +++ b/.github/workflows/monitoring.yml @@ -0,0 +1,118 @@ +name: Dokploy Monitoring Build + +on: + push: + branches: [main, canary] + +env: + IMAGE_NAME: dokploy/monitoring + +jobs: + docker-amd: + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Set tag + id: meta + run: | + if [ "${{ github.ref }}" = "refs/heads/main" ]; then + TAG="latest" + elif [ "${{ github.ref }}" = "refs/heads/canary" ]; then + TAG="canary" + else + TAG="feature" + fi + echo "tags=${IMAGE_NAME}:${TAG}-amd64" >> $GITHUB_OUTPUT + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile.monitoring + platforms: linux/amd64 + push: true + tags: ${{ steps.meta.outputs.tags }} + docker-arm: + runs-on: ubuntu-24.04-arm + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Set + id: meta + run: | + if [ "${{ github.ref }}" = "refs/heads/main" ]; then + TAG="latest" + elif [ "${{ github.ref }}" = "refs/heads/canary" ]; then + TAG="canary" + else + TAG="feature" + fi + echo "tags=${IMAGE_NAME}:${TAG}-arm64" >> $GITHUB_OUTPUT + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile.monitoring + platforms: linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + + combine-manifests: + needs: [docker-amd, docker-arm] + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Create and push manifests + run: | + if [ "${{ github.ref }}" = "refs/heads/main" ]; then + TAG="latest" + + docker buildx imagetools create -t ${IMAGE_NAME}:${TAG} \ + ${IMAGE_NAME}:${TAG}-amd64 \ + ${IMAGE_NAME}:${TAG}-arm64 + + elif [ "${{ github.ref }}" = "refs/heads/canary" ]; then + TAG="canary" + docker buildx imagetools create -t ${IMAGE_NAME}:${TAG} \ + ${IMAGE_NAME}:${TAG}-amd64 \ + ${IMAGE_NAME}:${TAG}-arm64 + + else + TAG="feature" + docker buildx imagetools create -t ${IMAGE_NAME}:${TAG} \ + ${IMAGE_NAME}:${TAG}-amd64 \ + ${IMAGE_NAME}:${TAG}-arm64 + fi diff --git a/.gitignore b/.gitignore index b96c9e37..5e6e4eb3 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,6 @@ yarn-error.log* # Misc .DS_Store *.pem + + +.db \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 986ceb59..48bbb877 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:20-slim AS base +FROM node:20.9-slim AS base ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN corepack enable diff --git a/Dockerfile.cloud b/Dockerfile.cloud index 2cc05002..c1b66796 100644 --- a/Dockerfile.cloud +++ b/Dockerfile.cloud @@ -1,4 +1,4 @@ -FROM node:20-slim AS base +FROM node:20.9-slim AS base ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN corepack enable diff --git a/Dockerfile.monitoring b/Dockerfile.monitoring new file mode 100644 index 00000000..814625db --- /dev/null +++ b/Dockerfile.monitoring @@ -0,0 +1,41 @@ +# Build stage +FROM golang:1.21-alpine3.19 AS builder + +# Instalar dependencias necesarias +RUN apk add --no-cache gcc musl-dev sqlite-dev + +# Establecer el directorio de trabajo +WORKDIR /app + +# Copiar todo el código fuente primero +COPY . . + +# Movernos al directorio de la aplicación golang +WORKDIR /app/apps/monitoring + +# Descargar dependencias +RUN go mod download + +# Compilar la aplicación +RUN CGO_ENABLED=1 GOOS=linux go build -o main main.go + +# Etapa final +FROM alpine:3.19 + +# Instalar SQLite y otras dependencias necesarias +RUN apk add --no-cache sqlite-libs docker-cli + +WORKDIR /app + +# Copiar el binario compilado y el archivo monitor.go +COPY --from=builder /app/apps/monitoring/main ./main +COPY --from=builder /app/apps/monitoring/main.go ./monitor.go + +# COPY --from=builder /app/apps/golang/.env ./.env + +# Exponer el puerto +ENV PORT=3001 +EXPOSE 3001 + +# Ejecutar la aplicación +CMD ["./main"] \ No newline at end of file diff --git a/Dockerfile.schedule b/Dockerfile.schedule index d04af70f..eba08f7b 100644 --- a/Dockerfile.schedule +++ b/Dockerfile.schedule @@ -1,4 +1,4 @@ -FROM node:20-slim AS base +FROM node:20.9-slim AS base ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN corepack enable diff --git a/Dockerfile.server b/Dockerfile.server index 98f74966..8fef5142 100644 --- a/Dockerfile.server +++ b/Dockerfile.server @@ -1,4 +1,4 @@ -FROM node:20-slim AS base +FROM node:20.9-slim AS base ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN corepack enable diff --git a/README.md b/README.md index ca48852c..9246cf55 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,8 @@ For detailed documentation, visit [docs.dokploy.com](https://docs.dokploy.com). Lightnode + + ### Premium Supporters 🥇 @@ -93,8 +95,11 @@ For detailed documentation, visit [docs.dokploy.com](https://docs.dokploy.com). Cloudblast.io Startupfame Itsdb-center +Openalternative +Synexa + ### Community Backers 🤝
diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index 4b405e9c..0db56599 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -28,7 +28,7 @@ app.use(async (c, next) => { app.post("/deploy", zValidator("json", deployJobSchema), (c) => { const data = c.req.valid("json"); - const res = queue.add(data, { groupName: data.serverId }); + queue.add(data, { groupName: data.serverId }); return c.json( { message: "Deployment Added", diff --git a/apps/api/src/utils.ts b/apps/api/src/utils.ts index d919f29e..3f3c9698 100644 --- a/apps/api/src/utils.ts +++ b/apps/api/src/utils.ts @@ -64,7 +64,7 @@ export const deploy = async (job: DeployJob) => { } } } - } catch (error) { + } catch (_) { if (job.applicationType === "application") { await updateApplicationStatus(job.applicationId, "error"); } else if (job.applicationType === "compose") { diff --git a/apps/dokploy/__test__/compose/config/config.test.ts b/apps/dokploy/__test__/compose/config/config.test.ts index 3f98525a..aed3350f 100644 --- a/apps/dokploy/__test__/compose/config/config.test.ts +++ b/apps/dokploy/__test__/compose/config/config.test.ts @@ -1,5 +1,5 @@ import { generateRandomHash } from "@dokploy/server"; -import { addSuffixToAllConfigs, addSuffixToConfigsRoot } from "@dokploy/server"; +import { addSuffixToAllConfigs } from "@dokploy/server"; import type { ComposeSpecification } from "@dokploy/server"; import { load } from "js-yaml"; import { expect, test } from "vitest"; diff --git a/apps/dokploy/__test__/compose/network/network-root.test.ts b/apps/dokploy/__test__/compose/network/network-root.test.ts index 7e06a9f0..980502ff 100644 --- a/apps/dokploy/__test__/compose/network/network-root.test.ts +++ b/apps/dokploy/__test__/compose/network/network-root.test.ts @@ -293,29 +293,6 @@ networks: dokploy-network: `; -const expectedComposeFile7 = ` -version: "3.8" - -services: - web: - image: nginx:latest - networks: - - dokploy-network - -networks: - dokploy-network: - driver: bridge - driver_opts: - com.docker.network.driver.mtu: 1200 - - backend: - driver: bridge - attachable: true - - external_network: - external: true - name: dokploy-network -`; test("It shoudn't add suffix to dokploy-network", () => { const composeData = load(composeFile7) as ComposeSpecification; diff --git a/apps/dokploy/__test__/compose/secrets/secret-root.test.ts b/apps/dokploy/__test__/compose/secrets/secret-root.test.ts index 2bd91b58..1b1898c5 100644 --- a/apps/dokploy/__test__/compose/secrets/secret-root.test.ts +++ b/apps/dokploy/__test__/compose/secrets/secret-root.test.ts @@ -1,7 +1,7 @@ import { generateRandomHash } from "@dokploy/server"; import { addSuffixToSecretsRoot } from "@dokploy/server"; import type { ComposeSpecification } from "@dokploy/server"; -import { dump, load } from "js-yaml"; +import { load } from "js-yaml"; import { expect, test } from "vitest"; test("Generate random hash with 8 characters", () => { diff --git a/apps/dokploy/__test__/compose/volume/volume.test.ts b/apps/dokploy/__test__/compose/volume/volume.test.ts index d4623aeb..6c434476 100644 --- a/apps/dokploy/__test__/compose/volume/volume.test.ts +++ b/apps/dokploy/__test__/compose/volume/volume.test.ts @@ -1,8 +1,4 @@ -import { generateRandomHash } from "@dokploy/server"; -import { - addSuffixToAllVolumes, - addSuffixToVolumesInServices, -} from "@dokploy/server"; +import { addSuffixToAllVolumes } from "@dokploy/server"; import type { ComposeSpecification } from "@dokploy/server"; import { load } from "js-yaml"; import { expect, test } from "vitest"; diff --git a/apps/dokploy/__test__/drop/drop.test.test.ts b/apps/dokploy/__test__/drop/drop.test.test.ts index c4b2ba8d..4e6f20d3 100644 --- a/apps/dokploy/__test__/drop/drop.test.test.ts +++ b/apps/dokploy/__test__/drop/drop.test.test.ts @@ -45,7 +45,7 @@ const baseApp: ApplicationNested = { previewWildcard: "", project: { env: "", - adminId: "", + organizationId: "", name: "", description: "", createdAt: "", diff --git a/apps/dokploy/__test__/traefik/server/update-server-config.test.ts b/apps/dokploy/__test__/traefik/server/update-server-config.test.ts index c966748a..c72d7254 100644 --- a/apps/dokploy/__test__/traefik/server/update-server-config.test.ts +++ b/apps/dokploy/__test__/traefik/server/update-server-config.test.ts @@ -5,7 +5,7 @@ vi.mock("node:fs", () => ({ default: fs, })); -import type { Admin, FileConfig } from "@dokploy/server"; +import type { FileConfig, User } from "@dokploy/server"; import { createDefaultServerTraefikConfig, loadOrCreateConfig, @@ -13,10 +13,34 @@ import { } from "@dokploy/server"; import { beforeEach, expect, test, vi } from "vitest"; -const baseAdmin: Admin = { - createdAt: "", - authId: "", - adminId: "string", +const baseAdmin: User = { + enablePaidFeatures: false, + metricsConfig: { + containers: { + refreshRate: 20, + services: { + include: [], + exclude: [], + }, + }, + server: { + type: "Dokploy", + cronJob: "", + port: 4500, + refreshRate: 20, + retentionDays: 2, + token: "", + thresholds: { + cpu: 0, + memory: 0, + }, + urlCallback: "", + }, + }, + cleanupCacheApplications: false, + cleanupCacheOnCompose: false, + cleanupCacheOnPreviews: false, + createdAt: new Date(), serverIp: null, certificateType: "none", host: null, @@ -27,6 +51,19 @@ const baseAdmin: Admin = { serversQuantity: 0, stripeCustomerId: "", stripeSubscriptionId: "", + banExpires: new Date(), + banned: true, + banReason: "", + email: "", + expirationDate: "", + id: "", + isRegistered: false, + name: "", + createdAt2: new Date().toISOString(), + emailVerified: false, + image: "", + updatedAt: new Date(), + twoFactorEnabled: false, }; beforeEach(() => { @@ -77,8 +114,6 @@ test("Should not touch config without host", () => { }); test("Should remove websecure if https rollback to http", () => { - const originalConfig: FileConfig = loadOrCreateConfig("dokploy"); - updateServerTraefik( { ...baseAdmin, certificateType: "letsencrypt" }, "example.com", diff --git a/apps/dokploy/__test__/traefik/traefik.test.ts b/apps/dokploy/__test__/traefik/traefik.test.ts index d05dda81..955103de 100644 --- a/apps/dokploy/__test__/traefik/traefik.test.ts +++ b/apps/dokploy/__test__/traefik/traefik.test.ts @@ -26,7 +26,7 @@ const baseApp: ApplicationNested = { previewWildcard: "", project: { env: "", - adminId: "", + organizationId: "", name: "", description: "", createdAt: "", diff --git a/apps/dokploy/components/auth/login-2fa.tsx b/apps/dokploy/components/auth/login-2fa.tsx deleted file mode 100644 index 6a11268e..00000000 --- a/apps/dokploy/components/auth/login-2fa.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import { Button } from "@/components/ui/button"; -import { - Form, - FormControl, - FormDescription, - FormField, - FormItem, - FormLabel, - FormMessage, -} from "@/components/ui/form"; - -import { CardTitle } from "@/components/ui/card"; -import { - InputOTP, - InputOTPGroup, - InputOTPSeparator, - InputOTPSlot, -} from "@/components/ui/input-otp"; -import { api } from "@/utils/api"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { REGEXP_ONLY_DIGITS } from "input-otp"; -import { AlertTriangle } from "lucide-react"; -import { useRouter } from "next/router"; -import { useEffect } from "react"; -import { useForm } from "react-hook-form"; -import { toast } from "sonner"; -import { z } from "zod"; - -const Login2FASchema = z.object({ - pin: z.string().min(6, { - message: "Pin is required", - }), -}); - -type Login2FA = z.infer; - -interface Props { - authId: string; -} - -export const Login2FA = ({ authId }: Props) => { - const { push } = useRouter(); - - const { mutateAsync, isLoading, isError, error } = - api.auth.verifyLogin2FA.useMutation(); - - const form = useForm({ - defaultValues: { - pin: "", - }, - resolver: zodResolver(Login2FASchema), - }); - - useEffect(() => { - form.reset({ - pin: "", - }); - }, [form, form.reset, form.formState.isSubmitSuccessful]); - - const onSubmit = async (data: Login2FA) => { - await mutateAsync({ - pin: data.pin, - id: authId, - }) - .then(() => { - toast.success("Signin successfully", { - duration: 2000, - }); - - push("/dashboard/projects"); - }) - .catch(() => { - toast.error("Signin failed", { - duration: 2000, - }); - }); - }; - return ( -
- - {isError && ( -
- - - {error?.message} - -
- )} - 2FA Login - - ( - - Pin - -
- - - - - - - - - - -
-
- - Please enter the 6 digits code provided by your authenticator - app. - - -
- )} - /> - - - - ); -}; diff --git a/apps/dokploy/components/dashboard/application/advanced/cluster/modify-swarm-settings.tsx b/apps/dokploy/components/dashboard/application/advanced/cluster/modify-swarm-settings.tsx index 9b71a042..95a559f6 100644 --- a/apps/dokploy/components/dashboard/application/advanced/cluster/modify-swarm-settings.tsx +++ b/apps/dokploy/components/dashboard/application/advanced/cluster/modify-swarm-settings.tsx @@ -130,7 +130,7 @@ const createStringToJSONSchema = (schema: z.ZodTypeAny) => { } try { return JSON.parse(str); - } catch (e) { + } catch (_e) { ctx.addIssue({ code: "custom", message: "Invalid JSON format" }); return z.NEVER; } diff --git a/apps/dokploy/components/dashboard/application/advanced/cluster/show-cluster-settings.tsx b/apps/dokploy/components/dashboard/application/advanced/cluster/show-cluster-settings.tsx index cf7314cf..1eadf8ba 100644 --- a/apps/dokploy/components/dashboard/application/advanced/cluster/show-cluster-settings.tsx +++ b/apps/dokploy/components/dashboard/application/advanced/cluster/show-cluster-settings.tsx @@ -29,7 +29,6 @@ import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; import { Server } from "lucide-react"; import Link from "next/link"; -import React from "react"; import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; diff --git a/apps/dokploy/components/dashboard/application/advanced/general/add-command.tsx b/apps/dokploy/components/dashboard/application/advanced/general/add-command.tsx index 4cd839a1..50e36ad7 100644 --- a/apps/dokploy/components/dashboard/application/advanced/general/add-command.tsx +++ b/apps/dokploy/components/dashboard/application/advanced/general/add-command.tsx @@ -17,7 +17,6 @@ import { import { Input } from "@/components/ui/input"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; -import React from "react"; import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; diff --git a/apps/dokploy/components/dashboard/application/advanced/ports/show-port.tsx b/apps/dokploy/components/dashboard/application/advanced/ports/show-port.tsx index a2c6ddcf..4cd29a36 100644 --- a/apps/dokploy/components/dashboard/application/advanced/ports/show-port.tsx +++ b/apps/dokploy/components/dashboard/application/advanced/ports/show-port.tsx @@ -10,7 +10,6 @@ import { } from "@/components/ui/card"; import { api } from "@/utils/api"; import { Rss, Trash2 } from "lucide-react"; -import React from "react"; import { toast } from "sonner"; import { HandlePorts } from "./handle-ports"; interface Props { diff --git a/apps/dokploy/components/dashboard/application/advanced/redirects/show-redirects.tsx b/apps/dokploy/components/dashboard/application/advanced/redirects/show-redirects.tsx index 4ee59791..5c2c5943 100644 --- a/apps/dokploy/components/dashboard/application/advanced/redirects/show-redirects.tsx +++ b/apps/dokploy/components/dashboard/application/advanced/redirects/show-redirects.tsx @@ -9,7 +9,6 @@ import { } from "@/components/ui/card"; import { api } from "@/utils/api"; import { Split, Trash2 } from "lucide-react"; -import React from "react"; import { toast } from "sonner"; import { HandleRedirect } from "./handle-redirect"; diff --git a/apps/dokploy/components/dashboard/application/advanced/security/show-security.tsx b/apps/dokploy/components/dashboard/application/advanced/security/show-security.tsx index 33022c09..92439f51 100644 --- a/apps/dokploy/components/dashboard/application/advanced/security/show-security.tsx +++ b/apps/dokploy/components/dashboard/application/advanced/security/show-security.tsx @@ -9,7 +9,6 @@ import { } from "@/components/ui/card"; import { api } from "@/utils/api"; import { LockKeyhole, Trash2 } from "lucide-react"; -import React from "react"; import { toast } from "sonner"; import { HandleSecurity } from "./handle-security"; diff --git a/apps/dokploy/components/dashboard/application/advanced/show-resources.tsx b/apps/dokploy/components/dashboard/application/advanced/show-resources.tsx index bcf0ccbd..3d26716f 100644 --- a/apps/dokploy/components/dashboard/application/advanced/show-resources.tsx +++ b/apps/dokploy/components/dashboard/application/advanced/show-resources.tsx @@ -25,7 +25,7 @@ import { import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; import { InfoIcon } from "lucide-react"; -import React, { useEffect } from "react"; +import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; @@ -144,38 +144,6 @@ export const ShowResources = ({ id, type }: Props) => { className="grid w-full gap-8 " >
- ( - -
- Memory Reservation - - - - - - -

- Memory soft limit in bytes. Example: 256MB = - 268435456 bytes -

-
-
-
-
- - - - -
- )} - /> - { ); }} /> + ( + +
+ Memory Reservation + + + + + + +

+ Memory soft limit in bytes. Example: 256MB = + 268435456 bytes +

+
+
+
+
+ + + + +
+ )} + /> {
Volumes - If you want to persist data in this postgres database use the - following config to setup the volumes + If you want to persist data in this service use the following config + to setup the volumes
@@ -100,7 +99,7 @@ export const ShowVolumes = ({ id, type }: Props) => { {mount.type === "file" && (
Content - + {mount.content}
@@ -113,12 +112,21 @@ export const ShowVolumes = ({ id, type }: Props) => {
)} -
- Mount Path - - {mount.mountPath} - -
+ {mount.type === "file" ? ( +
+ File Path + + {mount.filePath} + +
+ ) : ( +
+ Mount Path + + {mount.mountPath} + +
+ )}
{ const [isOpen, setIsOpen] = useState(false); - const utils = api.useUtils(); + const _utils = api.useUtils(); const { data } = api.mounts.one.useQuery( { mountId, diff --git a/apps/dokploy/components/dashboard/application/deployments/refresh-token.tsx b/apps/dokploy/components/dashboard/application/deployments/refresh-token.tsx index c268e6d5..b80450f9 100644 --- a/apps/dokploy/components/dashboard/application/deployments/refresh-token.tsx +++ b/apps/dokploy/components/dashboard/application/deployments/refresh-token.tsx @@ -11,7 +11,6 @@ import { } from "@/components/ui/alert-dialog"; import { api } from "@/utils/api"; import { RefreshCcw } from "lucide-react"; -import React from "react"; import { toast } from "sonner"; interface Props { diff --git a/apps/dokploy/components/dashboard/application/deployments/show-deployment.tsx b/apps/dokploy/components/dashboard/application/deployments/show-deployment.tsx index 39b09d0c..e6fdb38b 100644 --- a/apps/dokploy/components/dashboard/application/deployments/show-deployment.tsx +++ b/apps/dokploy/components/dashboard/application/deployments/show-deployment.tsx @@ -17,8 +17,15 @@ interface Props { open: boolean; onClose: () => void; serverId?: string; + errorMessage?: string; } -export const ShowDeployment = ({ logPath, open, onClose, serverId }: Props) => { +export const ShowDeployment = ({ + logPath, + open, + onClose, + serverId, + errorMessage, +}: Props) => { const [data, setData] = useState(""); const [showExtraLogs, setShowExtraLogs] = useState(false); const [filteredLogs, setFilteredLogs] = useState([]); @@ -99,6 +106,8 @@ export const ShowDeployment = ({ logPath, open, onClose, serverId }: Props) => { } }, [filteredLogs, autoScroll]); + const optionalErrors = parseLogs(errorMessage || ""); + return ( { )) ) : ( -
- -
+ <> + {optionalErrors.length > 0 ? ( + optionalErrors.map((log: LogLine, index: number) => ( + + )) + ) : ( +
+ +
+ )} + )}
diff --git a/apps/dokploy/components/dashboard/application/deployments/show-deployments.tsx b/apps/dokploy/components/dashboard/application/deployments/show-deployments.tsx index a767350f..d33936f5 100644 --- a/apps/dokploy/components/dashboard/application/deployments/show-deployments.tsx +++ b/apps/dokploy/components/dashboard/application/deployments/show-deployments.tsx @@ -8,7 +8,7 @@ import { CardHeader, CardTitle, } from "@/components/ui/card"; -import { api } from "@/utils/api"; +import { type RouterOutputs, api } from "@/utils/api"; import { RocketIcon } from "lucide-react"; import React, { useEffect, useState } from "react"; import { CancelQueues } from "./cancel-queues"; @@ -18,8 +18,11 @@ import { ShowDeployment } from "./show-deployment"; interface Props { applicationId: string; } + export const ShowDeployments = ({ applicationId }: Props) => { - const [activeLog, setActiveLog] = useState(null); + const [activeLog, setActiveLog] = useState< + RouterOutputs["deployment"]["all"][number] | null + >(null); const { data } = api.application.one.useQuery({ applicationId }); const { data: deployments } = api.deployment.all.useQuery( { applicationId }, @@ -100,7 +103,7 @@ export const ShowDeployments = ({ applicationId }: Props) => { - - -
- - - - { - await deleteDomain({ - domainId: item.domainId, - }) - .then((data) => { - refetch(); - toast.success("Domain deleted successfully"); - }) - .catch(() => { - toast.error("Error deleting domain"); - }); - }} - > - - + + + { + await deleteDomain({ + domainId: item.domainId, + }) + .then(() => { + refetch(); + toast.success("Domain deleted successfully"); + }) + .catch(() => { + toast.error("Error deleting domain"); + }); + }} + > + + +
); diff --git a/apps/dokploy/components/dashboard/application/environment/show-enviroment.tsx b/apps/dokploy/components/dashboard/application/environment/show-enviroment.tsx index b65a1816..ba20db31 100644 --- a/apps/dokploy/components/dashboard/application/environment/show-enviroment.tsx +++ b/apps/dokploy/components/dashboard/application/environment/show-enviroment.tsx @@ -18,7 +18,7 @@ import { Toggle } from "@/components/ui/toggle"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; import { EyeIcon, EyeOffIcon } from "lucide-react"; -import React, { type CSSProperties, useEffect, useState } from "react"; +import { type CSSProperties, useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; diff --git a/apps/dokploy/components/dashboard/application/environment/show.tsx b/apps/dokploy/components/dashboard/application/environment/show.tsx index 7200f2a7..d97c39e2 100644 --- a/apps/dokploy/components/dashboard/application/environment/show.tsx +++ b/apps/dokploy/components/dashboard/application/environment/show.tsx @@ -1,5 +1,5 @@ import { Button } from "@/components/ui/button"; -import { Card, CardContent } from "@/components/ui/card"; +import { Card } from "@/components/ui/card"; import { Form } from "@/components/ui/form"; import { Secrets } from "@/components/ui/secrets"; import { api } from "@/utils/api"; diff --git a/apps/dokploy/components/dashboard/application/general/generic/save-bitbucket-provider.tsx b/apps/dokploy/components/dashboard/application/general/generic/save-bitbucket-provider.tsx index a487452b..9af040b7 100644 --- a/apps/dokploy/components/dashboard/application/general/generic/save-bitbucket-provider.tsx +++ b/apps/dokploy/components/dashboard/application/general/generic/save-bitbucket-provider.tsx @@ -84,7 +84,6 @@ export const SaveBitbucketProvider = ({ applicationId }: Props) => { data: repositories, isLoading: isLoadingRepositories, error, - isError, } = api.bitbucket.getBitbucketRepositories.useQuery( { bitbucketId, @@ -235,7 +234,7 @@ export const SaveBitbucketProvider = ({ applicationId }: Props) => { {repositories?.map((repo) => ( { form.setValue("repository", { @@ -245,7 +244,12 @@ export const SaveBitbucketProvider = ({ applicationId }: Props) => { form.setValue("branch", ""); }} > - {repo.name} + + {repo.name} + + {repo.owner.username} + + { {repositories?.map((repo) => ( { form.setValue("repository", { @@ -236,7 +236,12 @@ export const SaveGithubProvider = ({ applicationId }: Props) => { form.setValue("branch", ""); }} > - {repo.name} + + {repo.name} + + {repo.owner.login} + + { {repositories?.map((repo) => { return ( { form.setValue("repository", { @@ -260,7 +260,12 @@ export const SaveGitlabProvider = ({ applicationId }: Props) => { form.setValue("branch", ""); }} > - {repo.name} + + {repo.name} + + {repo.owner.username} + + { const { mutateAsync: stop, isLoading: isStopping } = api.application.stop.useMutation(); - const { mutateAsync: deploy, isLoading: isDeploying } = - api.application.deploy.useMutation(); + const { mutateAsync: deploy } = api.application.deploy.useMutation(); const { mutateAsync: reload, isLoading: isReloading } = api.application.reload.useMutation(); diff --git a/apps/dokploy/components/dashboard/application/preview-deployments/show-preview-builds.tsx b/apps/dokploy/components/dashboard/application/preview-deployments/show-preview-builds.tsx index 527d76cc..90800f75 100644 --- a/apps/dokploy/components/dashboard/application/preview-deployments/show-preview-builds.tsx +++ b/apps/dokploy/components/dashboard/application/preview-deployments/show-preview-builds.tsx @@ -5,7 +5,6 @@ import { Dialog, DialogContent, DialogDescription, - DialogFooter, DialogHeader, DialogTitle, DialogTrigger, @@ -26,7 +25,9 @@ export const ShowPreviewBuilds = ({ serverId, trigger, }: Props) => { - const [activeLog, setActiveLog] = useState(null); + const [activeLog, setActiveLog] = useState< + RouterOutputs["deployment"]["all"][number] | null + >(null); const [isOpen, setIsOpen] = useState(false); return ( @@ -77,7 +78,7 @@ export const ShowPreviewBuilds = ({ ); diff --git a/apps/dokploy/components/dashboard/application/preview-deployments/show-preview-deployments.tsx b/apps/dokploy/components/dashboard/application/preview-deployments/show-preview-deployments.tsx index 371276bd..ec3680f1 100644 --- a/apps/dokploy/components/dashboard/application/preview-deployments/show-preview-deployments.tsx +++ b/apps/dokploy/components/dashboard/application/preview-deployments/show-preview-deployments.tsx @@ -22,7 +22,6 @@ import { RocketIcon, Trash2, } from "lucide-react"; -import React from "react"; import { toast } from "sonner"; import { ShowModalLogs } from "../../settings/web-server/show-modal-logs"; import { AddPreviewDomain } from "./add-preview-domain"; diff --git a/apps/dokploy/components/dashboard/application/preview-deployments/show-preview-settings.tsx b/apps/dokploy/components/dashboard/application/preview-deployments/show-preview-settings.tsx index fec61ca6..9d53f31d 100644 --- a/apps/dokploy/components/dashboard/application/preview-deployments/show-preview-settings.tsx +++ b/apps/dokploy/components/dashboard/application/preview-deployments/show-preview-settings.tsx @@ -279,7 +279,7 @@ export const ShowPreviewSettings = ({ applicationId }: Props) => { ( + render={() => ( ; interface Props { - composeId: string; + id: string; + type: ServiceType | "application"; } -export const DeleteCompose = ({ composeId }: Props) => { +export const DeleteService = ({ id, type }: Props) => { const [isOpen, setIsOpen] = useState(false); - const { mutateAsync, isLoading } = api.compose.delete.useMutation(); - const { data } = api.compose.one.useQuery( - { composeId }, - { enabled: !!composeId }, - ); + + const queryMap = { + postgres: () => + api.postgres.one.useQuery({ postgresId: id }, { enabled: !!id }), + redis: () => api.redis.one.useQuery({ redisId: id }, { enabled: !!id }), + mysql: () => api.mysql.one.useQuery({ mysqlId: id }, { enabled: !!id }), + mariadb: () => + api.mariadb.one.useQuery({ mariadbId: id }, { enabled: !!id }), + application: () => + api.application.one.useQuery({ applicationId: id }, { enabled: !!id }), + mongo: () => api.mongo.one.useQuery({ mongoId: id }, { enabled: !!id }), + compose: () => + api.compose.one.useQuery({ composeId: id }, { enabled: !!id }), + }; + const { data } = queryMap[type] + ? queryMap[type]() + : api.mongo.one.useQuery({ mongoId: id }, { enabled: !!id }); + + const mutationMap = { + postgres: () => api.postgres.remove.useMutation(), + redis: () => api.redis.remove.useMutation(), + mysql: () => api.mysql.remove.useMutation(), + mariadb: () => api.mariadb.remove.useMutation(), + application: () => api.application.delete.useMutation(), + mongo: () => api.mongo.remove.useMutation(), + compose: () => api.compose.delete.useMutation(), + }; + const { mutateAsync, isLoading } = mutationMap[type] + ? mutationMap[type]() + : api.mongo.remove.useMutation(); const { push } = useRouter(); const form = useForm({ defaultValues: { @@ -62,14 +89,23 @@ export const DeleteCompose = ({ composeId }: Props) => { const expectedName = `${data?.name}/${data?.appName}`; if (formData.projectName === expectedName) { const { deleteVolumes } = formData; - await mutateAsync({ composeId, deleteVolumes }) + await mutateAsync({ + mongoId: id || "", + postgresId: id || "", + redisId: id || "", + mysqlId: id || "", + mariadbId: id || "", + applicationId: id || "", + composeId: id || "", + deleteVolumes, + }) .then((result) => { push(`/dashboard/project/${result?.projectId}`); - toast.success("Compose deleted successfully"); + toast.success("deleted successfully"); setIsOpen(false); }) .catch(() => { - toast.error("Error deleting the compose"); + toast.error("Error deleting the service"); }); } else { form.setError("projectName", { @@ -95,8 +131,8 @@ export const DeleteCompose = ({ composeId }: Props) => { Are you absolutely sure? This action cannot be undone. This will permanently delete the - compose. If you are sure please enter the compose name to delete - this compose. + service. If you are sure please enter the service name to delete + this service.
@@ -119,9 +155,7 @@ export const DeleteCompose = ({ composeId }: Props) => { variant="outline" onClick={() => { if (data?.name && data?.appName) { - navigator.clipboard.writeText( - `${data.name}/${data.appName}`, - ); + copy(`${data.name}/${data.appName}`); toast.success("Copied to clipboard. Be careful!"); } }} @@ -142,27 +176,29 @@ export const DeleteCompose = ({ composeId }: Props) => { )} /> - ( - -
- - - + {type === "compose" && ( + ( + +
+ + + - - Delete volumes associated with this compose - -
- -
- )} - /> + + Delete volumes associated with this compose + +
+ +
+ )} + /> + )}
diff --git a/apps/dokploy/components/dashboard/compose/deployments/refresh-token-compose.tsx b/apps/dokploy/components/dashboard/compose/deployments/refresh-token-compose.tsx index 95fafaab..b062b099 100644 --- a/apps/dokploy/components/dashboard/compose/deployments/refresh-token-compose.tsx +++ b/apps/dokploy/components/dashboard/compose/deployments/refresh-token-compose.tsx @@ -11,7 +11,6 @@ import { } from "@/components/ui/alert-dialog"; import { api } from "@/utils/api"; import { RefreshCcw } from "lucide-react"; -import React from "react"; import { toast } from "sonner"; interface Props { diff --git a/apps/dokploy/components/dashboard/compose/deployments/show-deployment-compose.tsx b/apps/dokploy/components/dashboard/compose/deployments/show-deployment-compose.tsx index 45869ed2..7c191a14 100644 --- a/apps/dokploy/components/dashboard/compose/deployments/show-deployment-compose.tsx +++ b/apps/dokploy/components/dashboard/compose/deployments/show-deployment-compose.tsx @@ -17,12 +17,14 @@ interface Props { serverId?: string; open: boolean; onClose: () => void; + errorMessage?: string; } export const ShowDeploymentCompose = ({ logPath, open, onClose, serverId, + errorMessage, }: Props) => { const [data, setData] = useState(""); const [filteredLogs, setFilteredLogs] = useState([]); @@ -105,6 +107,8 @@ export const ShowDeploymentCompose = ({ } }, [filteredLogs, autoScroll]); + const optionalErrors = parseLogs(errorMessage || ""); + return ( )) ) : ( -
- -
+ <> + {optionalErrors.length > 0 ? ( + optionalErrors.map((log: LogLine, index: number) => ( + + )) + ) : ( +
+ +
+ )} + )} diff --git a/apps/dokploy/components/dashboard/compose/deployments/show-deployments-compose.tsx b/apps/dokploy/components/dashboard/compose/deployments/show-deployments-compose.tsx index 54c0ad2e..fce4f33f 100644 --- a/apps/dokploy/components/dashboard/compose/deployments/show-deployments-compose.tsx +++ b/apps/dokploy/components/dashboard/compose/deployments/show-deployments-compose.tsx @@ -8,7 +8,7 @@ import { CardHeader, CardTitle, } from "@/components/ui/card"; -import { api } from "@/utils/api"; +import { type RouterOutputs, api } from "@/utils/api"; import { RocketIcon } from "lucide-react"; import React, { useEffect, useState } from "react"; import { CancelQueuesCompose } from "./cancel-queues-compose"; @@ -19,7 +19,9 @@ interface Props { composeId: string; } export const ShowDeploymentsCompose = ({ composeId }: Props) => { - const [activeLog, setActiveLog] = useState(null); + const [activeLog, setActiveLog] = useState< + RouterOutputs["deployment"]["all"][number] | null + >(null); const { data } = api.compose.one.useQuery({ composeId }); const { data: deployments } = api.deployment.allByCompose.useQuery( { composeId }, @@ -100,7 +102,7 @@ export const ShowDeploymentsCompose = ({ composeId }: Props) => { - - - - -
- + + {item.serviceName} + + + - - - { - await deleteDomain({ - domainId: item.domainId, - }) - .then((data) => { - refetch(); - toast.success("Domain deleted successfully"); - }) - .catch(() => { - toast.error("Error deleting domain"); - }); - }} - > -
+ +
+
+ {item.path} + {item.port} + {item.https ? "HTTPS" : "HTTP"} +
+ +
+ - - - + + + { + await deleteDomain({ + domainId: item.domainId, + }) + .then((_data) => { + refetch(); + toast.success("Domain deleted successfully"); + }) + .catch(() => { + toast.error("Error deleting domain"); + }); + }} + > + + +
); diff --git a/apps/dokploy/components/dashboard/compose/general/compose-file-editor.tsx b/apps/dokploy/components/dashboard/compose/general/compose-file-editor.tsx index b368aafc..72589582 100644 --- a/apps/dokploy/components/dashboard/compose/general/compose-file-editor.tsx +++ b/apps/dokploy/components/dashboard/compose/general/compose-file-editor.tsx @@ -14,7 +14,7 @@ import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; import { validateAndFormatYAML } from "../../application/advanced/traefik/update-traefik-config"; -import { RandomizeCompose } from "./randomize-compose"; +import { ShowUtilities } from "./show-utilities"; interface Props { composeId: string; @@ -35,8 +35,7 @@ export const ComposeFileEditor = ({ composeId }: Props) => { { enabled: !!composeId }, ); - const { mutateAsync, isLoading, error, isError } = - api.compose.update.useMutation(); + const { mutateAsync, isLoading } = api.compose.update.useMutation(); const form = useForm({ defaultValues: { @@ -76,7 +75,7 @@ export const ComposeFileEditor = ({ composeId }: Props) => { composeId, }); }) - .catch((e) => { + .catch((_e) => { toast.error("Error updating the Compose config"); }); }; @@ -125,7 +124,7 @@ services:
- +
+
+ +
+ +
+							
+						
+
+ + + + ); +}; diff --git a/apps/dokploy/components/dashboard/compose/general/randomize-compose.tsx b/apps/dokploy/components/dashboard/compose/general/randomize-compose.tsx index 59233acf..4cc877fd 100644 --- a/apps/dokploy/components/dashboard/compose/general/randomize-compose.tsx +++ b/apps/dokploy/components/dashboard/compose/general/randomize-compose.tsx @@ -1,14 +1,10 @@ import { AlertBlock } from "@/components/shared/alert-block"; import { CodeEditor } from "@/components/shared/code-editor"; import { Button } from "@/components/ui/button"; -import { CardTitle } from "@/components/ui/card"; import { - Dialog, - DialogContent, DialogDescription, DialogHeader, DialogTitle, - DialogTrigger, } from "@/components/ui/dialog"; import { Form, @@ -20,15 +16,10 @@ import { FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; -import { - InputOTP, - InputOTPGroup, - InputOTPSlot, -} from "@/components/ui/input-otp"; import { Switch } from "@/components/ui/switch"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; -import { AlertTriangle, Dices } from "lucide-react"; +import { AlertTriangle } from "lucide-react"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; @@ -48,7 +39,7 @@ type Schema = z.infer; export const RandomizeCompose = ({ composeId }: Props) => { const utils = api.useUtils(); const [compose, setCompose] = useState(""); - const [isOpen, setIsOpen] = useState(false); + const [_isOpen, _setIsOpen] = useState(false); const { mutateAsync, error, isError } = api.compose.randomizeCompose.useMutation(); @@ -70,6 +61,7 @@ export const RandomizeCompose = ({ composeId }: Props) => { const suffix = form.watch("suffix"); useEffect(() => { + randomizeCompose(); if (data) { form.reset({ suffix: data?.suffix || "", @@ -84,7 +76,7 @@ export const RandomizeCompose = ({ composeId }: Props) => { suffix: formData?.suffix || "", randomize: formData?.randomize || false, }) - .then(async (data) => { + .then(async (_data) => { randomizeCompose(); refetch(); toast.success("Compose updated"); @@ -110,126 +102,117 @@ export const RandomizeCompose = ({ composeId }: Props) => { }; return ( - - randomizeCompose()}> - - - - - Randomize Compose (Experimental) - - Use this in case you want to deploy the same compose file and you - have conflicts with some property like volumes, networks, etc. - - -
- - This will randomize the compose file and will add a suffix to the - property to avoid conflicts - -
    -
  • volumes
  • -
  • networks
  • -
  • services
  • -
  • configs
  • -
  • secrets
  • -
- - When you activate this option, we will include a env - `COMPOSE_PREFIX` variable to the compose file so you can use it in - your compose file. - -
- {isError && {error?.message}} -
- - {isError && ( -
- - - {error?.message} - -
- )} - -
-
- ( - - Suffix - - - - - - )} - /> - ( - -
- Apply Randomize - - Apply randomize to the compose file. - -
- - - -
- )} - /> -
- -
- - -
+
+ + Randomize Compose (Experimental) + + Use this in case you want to deploy the same compose file and you have + conflicts with some property like volumes, networks, etc. + + +
+ + This will randomize the compose file and will add a suffix to the + property to avoid conflicts + +
    +
  • volumes
  • +
  • networks
  • +
  • services
  • +
  • configs
  • +
  • secrets
  • +
+ + When you activate this option, we will include a env `COMPOSE_PREFIX` + variable to the compose file so you can use it in your compose file. + +
+ {isError && {error?.message}} + + + {isError && ( +
+ + + {error?.message} +
-
-							
+						
+ ( + + Suffix + + + + + + )} /> -
- - - -
+ ( + +
+ Apply Randomize + + Apply randomize to the compose file. + +
+ + + +
+ )} + /> + + +
+ + +
+ +
+						
+					
+ + + ); }; diff --git a/apps/dokploy/components/dashboard/compose/general/show-converted-compose.tsx b/apps/dokploy/components/dashboard/compose/general/show-converted-compose.tsx index 8a2186d9..49606645 100644 --- a/apps/dokploy/components/dashboard/compose/general/show-converted-compose.tsx +++ b/apps/dokploy/components/dashboard/compose/general/show-converted-compose.tsx @@ -40,7 +40,7 @@ export const ShowConvertedCompose = ({ composeId }: Props) => { .then(() => { refetch(); }) - .catch((err) => {}); + .catch((_err) => {}); } }, [isOpen]); diff --git a/apps/dokploy/components/dashboard/compose/general/show-utilities.tsx b/apps/dokploy/components/dashboard/compose/general/show-utilities.tsx new file mode 100644 index 00000000..214102ce --- /dev/null +++ b/apps/dokploy/components/dashboard/compose/general/show-utilities.tsx @@ -0,0 +1,46 @@ +import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { useState } from "react"; +import { IsolatedDeployment } from "./isolated-deployment"; +import { RandomizeCompose } from "./randomize-compose"; + +interface Props { + composeId: string; +} + +export const ShowUtilities = ({ composeId }: Props) => { + const [isOpen, setIsOpen] = useState(false); + return ( + + + + + + + Utilities + Modify the application data + + + + Isolated Deployment + Randomize Compose + + + + + + + + + + + ); +}; diff --git a/apps/dokploy/components/dashboard/compose/general/show.tsx b/apps/dokploy/components/dashboard/compose/general/show.tsx index d002b409..71752525 100644 --- a/apps/dokploy/components/dashboard/compose/general/show.tsx +++ b/apps/dokploy/components/dashboard/compose/general/show.tsx @@ -7,7 +7,6 @@ import { CardTitle, } from "@/components/ui/card"; import { api } from "@/utils/api"; -import React from "react"; import { ComposeActions } from "./actions"; import { ShowProviderFormCompose } from "./generic/show"; interface Props { diff --git a/apps/dokploy/components/dashboard/compose/logs/show.tsx b/apps/dokploy/components/dashboard/compose/logs/show.tsx index 4530e0dd..57119054 100644 --- a/apps/dokploy/components/dashboard/compose/logs/show.tsx +++ b/apps/dokploy/components/dashboard/compose/logs/show.tsx @@ -18,7 +18,7 @@ import { SelectValue, } from "@/components/ui/select"; import { api } from "@/utils/api"; -import { Loader, Loader2 } from "lucide-react"; +import { Loader2 } from "lucide-react"; import dynamic from "next/dynamic"; import { useEffect, useState } from "react"; export const DockerLogs = dynamic( diff --git a/apps/dokploy/components/dashboard/database/backups/show-backups.tsx b/apps/dokploy/components/dashboard/database/backups/show-backups.tsx index 9e493529..6619ceae 100644 --- a/apps/dokploy/components/dashboard/database/backups/show-backups.tsx +++ b/apps/dokploy/components/dashboard/database/backups/show-backups.tsx @@ -16,7 +16,6 @@ import { import { api } from "@/utils/api"; import { DatabaseBackup, Play, Trash2 } from "lucide-react"; import Link from "next/link"; -import React from "react"; import { toast } from "sonner"; import type { ServiceType } from "../../application/advanced/show-resources"; import { AddBackup } from "./add-backup"; @@ -75,7 +74,7 @@ export const ShowBackups = ({ id, type }: Props) => { {data?.length === 0 ? (
- + To create a backup it is required to set at least 1 provider. Please, go to{" "} ]*)>([^<]*)<\/span>/g, - (match, attrs, content) => { - const searchRegex = new RegExp(`(${escapeRegExp(term)})`, "gi"); - if (!content.match(searchRegex)) return match; - - const segments = content.split(searchRegex); - const wrappedSegments = segments - .map((segment: string) => - segment.toLowerCase() === term.toLowerCase() - ? `${segment}` - : segment, - ) - .join(""); - - return `${wrappedSegments}`; - }, + searchRegex, + (match) => + `${match}`, ); return ( diff --git a/apps/dokploy/components/dashboard/docker/logs/utils.ts b/apps/dokploy/components/dashboard/docker/logs/utils.ts index cf0b30bb..5e97edfe 100644 --- a/apps/dokploy/components/dashboard/docker/logs/utils.ts +++ b/apps/dokploy/components/dashboard/docker/logs/utils.ts @@ -43,7 +43,7 @@ const LOG_STYLES: Record = { export function parseLogs(logString: string): LogLine[] { // Regex to match the log line format - // Exemple of return : + // Example of return : // 1 2024-12-10T10:00:00.000Z The server is running on port 8080 // Should return : // { timestamp: new Date("2024-12-10T10:00:00.000Z"), @@ -63,18 +63,10 @@ export function parseLogs(logString: string): LogLine[] { if (!message?.trim()) return null; - // Delete other timestamps and keep only the one from --timestamps - const cleanedMessage = message - ?.replace( - /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z|\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3} UTC/g, - "", - ) - .trim(); - return { rawTimestamp: timestamp ?? null, timestamp: timestamp ? new Date(timestamp.replace(" UTC", "Z")) : null, - message: cleanedMessage, + message: message.trim(), }; }) .filter((log) => log !== null); diff --git a/apps/dokploy/components/dashboard/docker/show/colums.tsx b/apps/dokploy/components/dashboard/docker/show/colums.tsx index 3feae176..1cf0200f 100644 --- a/apps/dokploy/components/dashboard/docker/show/colums.tsx +++ b/apps/dokploy/components/dashboard/docker/show/colums.tsx @@ -1,6 +1,5 @@ import type { ColumnDef } from "@tanstack/react-table"; import { ArrowUpDown, MoreHorizontal } from "lucide-react"; -import * as React from "react"; import { Button } from "@/components/ui/button"; import { diff --git a/apps/dokploy/components/dashboard/docker/show/show-containers.tsx b/apps/dokploy/components/dashboard/docker/show/show-containers.tsx index c66c9b9b..024b0061 100644 --- a/apps/dokploy/components/dashboard/docker/show/show-containers.tsx +++ b/apps/dokploy/components/dashboard/docker/show/show-containers.tsx @@ -1,18 +1,3 @@ -import { - type ColumnFiltersState, - type SortingState, - type VisibilityState, - flexRender, - getCoreRowModel, - getFilteredRowModel, - getPaginationRowModel, - getSortedRowModel, - useReactTable, -} from "@tanstack/react-table"; -import { ChevronDown, Container } from "lucide-react"; -import * as React from "react"; - -import { AlertBlock } from "@/components/shared/alert-block"; import { Button } from "@/components/ui/button"; import { Card, @@ -37,6 +22,19 @@ import { TableRow, } from "@/components/ui/table"; import { type RouterOutputs, api } from "@/utils/api"; +import { + type ColumnFiltersState, + type SortingState, + type VisibilityState, + flexRender, + getCoreRowModel, + getFilteredRowModel, + getPaginationRowModel, + getSortedRowModel, + useReactTable, +} from "@tanstack/react-table"; +import { ChevronDown, Container } from "lucide-react"; +import * as React from "react"; import { columns } from "./colums"; export type Container = NonNullable< RouterOutputs["docker"]["getContainers"] diff --git a/apps/dokploy/components/dashboard/file-system/show-traefik-system.tsx b/apps/dokploy/components/dashboard/file-system/show-traefik-system.tsx index ed2ed197..c9272f29 100644 --- a/apps/dokploy/components/dashboard/file-system/show-traefik-system.tsx +++ b/apps/dokploy/components/dashboard/file-system/show-traefik-system.tsx @@ -7,9 +7,8 @@ import { CardTitle, } from "@/components/ui/card"; import { Tree } from "@/components/ui/file-tree"; -import { cn } from "@/lib/utils"; import { api } from "@/utils/api"; -import { FileIcon, Folder, Link, Loader2, Workflow } from "lucide-react"; +import { FileIcon, Folder, Loader2, Workflow } from "lucide-react"; import React from "react"; import { ShowTraefikFile } from "./show-traefik-file"; diff --git a/apps/dokploy/components/dashboard/mariadb/general/show-external-mariadb-credentials.tsx b/apps/dokploy/components/dashboard/mariadb/general/show-external-mariadb-credentials.tsx index f2044917..4a5c43a2 100644 --- a/apps/dokploy/components/dashboard/mariadb/general/show-external-mariadb-credentials.tsx +++ b/apps/dokploy/components/dashboard/mariadb/general/show-external-mariadb-credentials.tsx @@ -19,7 +19,7 @@ import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; diff --git a/apps/dokploy/components/dashboard/mariadb/general/show-general-mariadb.tsx b/apps/dokploy/components/dashboard/mariadb/general/show-general-mariadb.tsx index 98773685..ad6b1164 100644 --- a/apps/dokploy/components/dashboard/mariadb/general/show-general-mariadb.tsx +++ b/apps/dokploy/components/dashboard/mariadb/general/show-general-mariadb.tsx @@ -4,7 +4,7 @@ import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { api } from "@/utils/api"; import { Ban, CheckCircle2, RefreshCcw, Terminal } from "lucide-react"; -import React, { useState } from "react"; +import { useState } from "react"; import { toast } from "sonner"; import { type LogLine, parseLogs } from "../../docker/logs/utils"; import { DockerTerminalModal } from "../../settings/web-server/docker-terminal-modal"; diff --git a/apps/dokploy/components/dashboard/mariadb/general/show-internal-mariadb-credentials.tsx b/apps/dokploy/components/dashboard/mariadb/general/show-internal-mariadb-credentials.tsx index b409ac4d..17026926 100644 --- a/apps/dokploy/components/dashboard/mariadb/general/show-internal-mariadb-credentials.tsx +++ b/apps/dokploy/components/dashboard/mariadb/general/show-internal-mariadb-credentials.tsx @@ -3,7 +3,6 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { api } from "@/utils/api"; -import React from "react"; interface Props { mariadbId: string; diff --git a/apps/dokploy/components/dashboard/mariadb/update-mariadb.tsx b/apps/dokploy/components/dashboard/mariadb/update-mariadb.tsx index 4c9be090..48d94489 100644 --- a/apps/dokploy/components/dashboard/mariadb/update-mariadb.tsx +++ b/apps/dokploy/components/dashboard/mariadb/update-mariadb.tsx @@ -21,7 +21,7 @@ import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; -import { AlertTriangle, PenBoxIcon, SquarePen } from "lucide-react"; +import { PenBoxIcon } from "lucide-react"; import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; diff --git a/apps/dokploy/components/dashboard/mongo/general/show-external-mongo-credentials.tsx b/apps/dokploy/components/dashboard/mongo/general/show-external-mongo-credentials.tsx index 6dd2e919..9fe6e713 100644 --- a/apps/dokploy/components/dashboard/mongo/general/show-external-mongo-credentials.tsx +++ b/apps/dokploy/components/dashboard/mongo/general/show-external-mongo-credentials.tsx @@ -19,7 +19,7 @@ import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; diff --git a/apps/dokploy/components/dashboard/mongo/general/show-general-mongo.tsx b/apps/dokploy/components/dashboard/mongo/general/show-general-mongo.tsx index df01e36d..a20d4637 100644 --- a/apps/dokploy/components/dashboard/mongo/general/show-general-mongo.tsx +++ b/apps/dokploy/components/dashboard/mongo/general/show-general-mongo.tsx @@ -4,7 +4,7 @@ import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { api } from "@/utils/api"; import { Ban, CheckCircle2, RefreshCcw, Terminal } from "lucide-react"; -import React, { useState } from "react"; +import { useState } from "react"; import { toast } from "sonner"; import { type LogLine, parseLogs } from "../../docker/logs/utils"; import { DockerTerminalModal } from "../../settings/web-server/docker-terminal-modal"; diff --git a/apps/dokploy/components/dashboard/mongo/general/show-internal-mongo-credentials.tsx b/apps/dokploy/components/dashboard/mongo/general/show-internal-mongo-credentials.tsx index 6636688d..e66ea8c3 100644 --- a/apps/dokploy/components/dashboard/mongo/general/show-internal-mongo-credentials.tsx +++ b/apps/dokploy/components/dashboard/mongo/general/show-internal-mongo-credentials.tsx @@ -3,7 +3,6 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { api } from "@/utils/api"; -import React from "react"; interface Props { mongoId: string; diff --git a/apps/dokploy/components/dashboard/monitoring/docker/show.tsx b/apps/dokploy/components/dashboard/monitoring/docker/show.tsx deleted file mode 100644 index 2e5eecef..00000000 --- a/apps/dokploy/components/dashboard/monitoring/docker/show.tsx +++ /dev/null @@ -1,314 +0,0 @@ -import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from "@/components/ui/card"; -import { Progress } from "@/components/ui/progress"; -import { api } from "@/utils/api"; -import React, { useEffect, useState } from "react"; -import { DockerBlockChart } from "./docker-block-chart"; -import { DockerCpuChart } from "./docker-cpu-chart"; -import { DockerDiskChart } from "./docker-disk-chart"; -import { DockerMemoryChart } from "./docker-memory-chart"; -import { DockerNetworkChart } from "./docker-network-chart"; - -const defaultData = { - cpu: { - value: 0, - time: "", - }, - memory: { - value: { - used: 0, - free: 0, - usedPercentage: 0, - total: 0, - }, - time: "", - }, - block: { - value: { - readMb: 0, - writeMb: 0, - }, - time: "", - }, - network: { - value: { - inputMb: 0, - outputMb: 0, - }, - time: "", - }, - disk: { - value: { diskTotal: 0, diskUsage: 0, diskUsedPercentage: 0, diskFree: 0 }, - time: "", - }, -}; - -interface Props { - appName: string; - appType?: "application" | "stack" | "docker-compose"; -} -export interface DockerStats { - cpu: { - value: number; - time: string; - }; - memory: { - value: { - used: number; - free: number; - usedPercentage: number; - total: number; - }; - time: string; - }; - block: { - value: { - readMb: number; - writeMb: number; - }; - time: string; - }; - network: { - value: { - inputMb: number; - outputMb: number; - }; - time: string; - }; - disk: { - value: { - diskTotal: number; - diskUsage: number; - diskUsedPercentage: number; - diskFree: number; - }; - - time: string; - }; -} - -export type DockerStatsJSON = { - cpu: DockerStats["cpu"][]; - memory: DockerStats["memory"][]; - block: DockerStats["block"][]; - network: DockerStats["network"][]; - disk: DockerStats["disk"][]; -}; - -export const DockerMonitoring = ({ - appName, - appType = "application", -}: Props) => { - const { data } = api.application.readAppMonitoring.useQuery( - { appName }, - { - refetchOnWindowFocus: false, - }, - ); - const [acummulativeData, setAcummulativeData] = useState({ - cpu: [], - memory: [], - block: [], - network: [], - disk: [], - }); - const [currentData, setCurrentData] = useState(defaultData); - - useEffect(() => { - setCurrentData(defaultData); - - setAcummulativeData({ - cpu: [], - memory: [], - block: [], - network: [], - disk: [], - }); - }, [appName]); - - useEffect(() => { - if (!data) return; - - setCurrentData({ - cpu: data.cpu[data.cpu.length - 1] ?? currentData.cpu, - memory: data.memory[data.memory.length - 1] ?? currentData.memory, - block: data.block[data.block.length - 1] ?? currentData.block, - network: data.network[data.network.length - 1] ?? currentData.network, - disk: data.disk[data.disk.length - 1] ?? currentData.disk, - }); - setAcummulativeData({ - block: data?.block || [], - cpu: data?.cpu || [], - disk: data?.disk || [], - memory: data?.memory || [], - network: data?.network || [], - }); - }, [data]); - - useEffect(() => { - const protocol = window.location.protocol === "https:" ? "wss:" : "ws:"; - const wsUrl = `${protocol}//${window.location.host}/listen-docker-stats-monitoring?appName=${appName}&appType=${appType}`; - const ws = new WebSocket(wsUrl); - - ws.onmessage = (e) => { - const value = JSON.parse(e.data); - if (!value) return; - - const data = { - cpu: value.data.cpu ?? currentData.cpu, - memory: value.data.memory ?? currentData.memory, - block: value.data.block ?? currentData.block, - disk: value.data.disk ?? currentData.disk, - network: value.data.network ?? currentData.network, - }; - - setCurrentData(data); - - setAcummulativeData((prevData) => ({ - cpu: [...prevData.cpu, data.cpu], - memory: [...prevData.memory, data.memory], - block: [...prevData.block, data.block], - network: [...prevData.network, data.network], - disk: [...prevData.disk, data.disk], - })); - }; - - ws.onclose = (e) => { - console.log(e.reason); - }; - - return () => ws.close(); - }, [appName]); - - return ( -
- -
-
-
-

- Monitoring -

-

- Watch the usage of your server in the current app -

-
-
- -
- - - CPU Usage - - -
- - Used: {currentData.cpu.value.toFixed(2)}% - - - -
-
-
- - - - - Memory Usage - - - -
- - {`Used: ${(currentData.memory.value.used / 1024 ** 3).toFixed(2)} GB / Limit: ${(currentData.memory.value.total / 1024 ** 3).toFixed(2)} GB`} - - - -
-
-
- - {appName === "dokploy" && ( - - - - Disk Space - - - -
- - {`Used: ${currentData.disk.value.diskUsage} GB / Limit: ${currentData.disk.value.diskTotal} GB`} - - - -
-
-
- )} - - - - Block I/O - - -
- - {`Read: ${currentData.block.value.readMb.toFixed( - 2, - )} MB / Write: ${currentData.block.value.writeMb.toFixed( - 3, - )} MB`} - - -
-
-
- - - - - Network I/O - - - -
- - {`In MB: ${currentData.network.value.inputMb.toFixed( - 2, - )} MB / Out MB: ${currentData.network.value.outputMb.toFixed( - 2, - )} MB`} - - -
-
-
-
-
-
-
- ); -}; diff --git a/apps/dokploy/components/dashboard/monitoring/docker/docker-block-chart.tsx b/apps/dokploy/components/dashboard/monitoring/free/container/docker-block-chart.tsx similarity index 88% rename from apps/dokploy/components/dashboard/monitoring/docker/docker-block-chart.tsx rename to apps/dokploy/components/dashboard/monitoring/free/container/docker-block-chart.tsx index 57a3cbe2..718ddafa 100644 --- a/apps/dokploy/components/dashboard/monitoring/docker/docker-block-chart.tsx +++ b/apps/dokploy/components/dashboard/monitoring/free/container/docker-block-chart.tsx @@ -8,7 +8,7 @@ import { Tooltip, YAxis, } from "recharts"; -import type { DockerStatsJSON } from "./show"; +import type { DockerStatsJSON } from "./show-free-container-monitoring"; interface Props { acummulativeData: DockerStatsJSON["block"]; @@ -90,9 +90,11 @@ const CustomTooltip = ({ active, payload }: CustomTooltipProps) => { if (active && payload && payload.length && payload[0]) { return (
-

{`Date: ${format(new Date(payload[0].payload.time), "PPpp")}`}

-

{`Read ${payload[0].payload.readMb.toFixed(2)} MB`}

-

{`Write: ${payload[0].payload.writeMb.toFixed(3)} MB`}

+ {payload[0].payload.time && ( +

{`Date: ${format(new Date(payload[0].payload.time), "PPpp")}`}

+ )} +

{`Read ${payload[0].payload.readMb} `}

+

{`Write: ${payload[0].payload.writeMb} `}

); } diff --git a/apps/dokploy/components/dashboard/monitoring/docker/docker-cpu-chart.tsx b/apps/dokploy/components/dashboard/monitoring/free/container/docker-cpu-chart.tsx similarity index 88% rename from apps/dokploy/components/dashboard/monitoring/docker/docker-cpu-chart.tsx rename to apps/dokploy/components/dashboard/monitoring/free/container/docker-cpu-chart.tsx index 41f20f8f..c24a6363 100644 --- a/apps/dokploy/components/dashboard/monitoring/docker/docker-cpu-chart.tsx +++ b/apps/dokploy/components/dashboard/monitoring/free/container/docker-cpu-chart.tsx @@ -8,7 +8,7 @@ import { Tooltip, YAxis, } from "recharts"; -import type { DockerStatsJSON } from "./show"; +import type { DockerStatsJSON } from "./show-free-container-monitoring"; interface Props { acummulativeData: DockerStatsJSON["cpu"]; @@ -19,7 +19,7 @@ export const DockerCpuChart = ({ acummulativeData }: Props) => { return { name: `Point ${index + 1}`, time: item.time, - usage: item.value.toFixed(2), + usage: item.value.toString().split("%")[0], }; }); return ( @@ -75,7 +75,9 @@ const CustomTooltip = ({ active, payload }: CustomTooltipProps) => { if (active && payload && payload.length && payload[0]) { return (
-

{`Date: ${format(new Date(payload[0].payload.time), "PPpp")}`}

+ {payload[0].payload.time && ( +

{`Date: ${format(new Date(payload[0].payload.time), "PPpp")}`}

+ )}

{`CPU Usage: ${payload[0].payload.usage}%`}

); diff --git a/apps/dokploy/components/dashboard/monitoring/docker/docker-disk-chart.tsx b/apps/dokploy/components/dashboard/monitoring/free/container/docker-disk-chart.tsx similarity index 97% rename from apps/dokploy/components/dashboard/monitoring/docker/docker-disk-chart.tsx rename to apps/dokploy/components/dashboard/monitoring/free/container/docker-disk-chart.tsx index a97fcfed..5fe62154 100644 --- a/apps/dokploy/components/dashboard/monitoring/docker/docker-disk-chart.tsx +++ b/apps/dokploy/components/dashboard/monitoring/free/container/docker-disk-chart.tsx @@ -8,7 +8,7 @@ import { Tooltip, YAxis, } from "recharts"; -import type { DockerStatsJSON } from "./show"; +import type { DockerStatsJSON } from "./show-free-container-monitoring"; interface Props { acummulativeData: DockerStatsJSON["disk"]; diff --git a/apps/dokploy/components/dashboard/monitoring/docker/docker-memory-chart.tsx b/apps/dokploy/components/dashboard/monitoring/free/container/docker-memory-chart.tsx similarity index 80% rename from apps/dokploy/components/dashboard/monitoring/docker/docker-memory-chart.tsx rename to apps/dokploy/components/dashboard/monitoring/free/container/docker-memory-chart.tsx index 36f1edb8..82a1ff3d 100644 --- a/apps/dokploy/components/dashboard/monitoring/docker/docker-memory-chart.tsx +++ b/apps/dokploy/components/dashboard/monitoring/free/container/docker-memory-chart.tsx @@ -8,8 +8,8 @@ import { Tooltip, YAxis, } from "recharts"; -import type { DockerStatsJSON } from "./show"; - +import type { DockerStatsJSON } from "./show-free-container-monitoring"; +import { convertMemoryToBytes } from "./show-free-container-monitoring"; interface Props { acummulativeData: DockerStatsJSON["memory"]; memoryLimitGB: number; @@ -23,7 +23,8 @@ export const DockerMemoryChart = ({ return { time: item.time, name: `Point ${index + 1}`, - usage: (item.value.used / 1024 ** 3).toFixed(2), + // @ts-ignore + usage: (convertMemoryToBytes(item.value.used) / 1024 ** 3).toFixed(2), }; }); return ( @@ -75,10 +76,13 @@ interface CustomTooltipProps { } const CustomTooltip = ({ active, payload }: CustomTooltipProps) => { - if (active && payload && payload.length && payload[0]) { + if (active && payload && payload.length && payload[0] && payload[0].payload) { return (
-

{`Date: ${format(new Date(payload[0].payload.time), "PPpp")}`}

+ {payload[0].payload.time && ( +

{`Date: ${format(new Date(payload[0].payload.time), "PPpp")}`}

+ )} +

{`Memory usage: ${payload[0].payload.usage} GB`}

); diff --git a/apps/dokploy/components/dashboard/monitoring/docker/docker-network-chart.tsx b/apps/dokploy/components/dashboard/monitoring/free/container/docker-network-chart.tsx similarity index 84% rename from apps/dokploy/components/dashboard/monitoring/docker/docker-network-chart.tsx rename to apps/dokploy/components/dashboard/monitoring/free/container/docker-network-chart.tsx index b522603d..cd6b7dfd 100644 --- a/apps/dokploy/components/dashboard/monitoring/docker/docker-network-chart.tsx +++ b/apps/dokploy/components/dashboard/monitoring/free/container/docker-network-chart.tsx @@ -8,8 +8,7 @@ import { Tooltip, YAxis, } from "recharts"; -import type { DockerStatsJSON } from "./show"; -1; +import type { DockerStatsJSON } from "./show-free-container-monitoring"; interface Props { acummulativeData: DockerStatsJSON["network"]; } @@ -19,8 +18,8 @@ export const DockerNetworkChart = ({ acummulativeData }: Props) => { return { time: item.time, name: `Point ${index + 1}`, - inMB: item.value.inputMb.toFixed(2), - outMB: item.value.outputMb.toFixed(2), + inMB: item.value.inputMb, + outMB: item.value.outputMb, }; }); return ( @@ -86,9 +85,11 @@ const CustomTooltip = ({ active, payload }: CustomTooltipProps) => { if (active && payload && payload.length && payload[0]) { return (
-

{`Date: ${format(new Date(payload[0].payload.time), "PPpp")}`}

-

{`In MB Usage: ${payload[0].payload.inMB} MB`}

-

{`Out MB Usage: ${payload[0].payload.outMB} MB`}

+ {payload[0].payload.time && ( +

{`Date: ${format(new Date(payload[0].payload.time), "PPpp")}`}

+ )} +

{`In Usage: ${payload[0].payload.inMB} `}

+

{`Out Usage: ${payload[0].payload.outMB} `}

); } diff --git a/apps/dokploy/components/dashboard/monitoring/free/container/show-free-compose-monitoring.tsx b/apps/dokploy/components/dashboard/monitoring/free/container/show-free-compose-monitoring.tsx new file mode 100644 index 00000000..84510154 --- /dev/null +++ b/apps/dokploy/components/dashboard/monitoring/free/container/show-free-compose-monitoring.tsx @@ -0,0 +1,130 @@ +import { badgeStateColor } from "@/components/dashboard/application/logs/show"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { Label } from "@/components/ui/label"; +import { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectLabel, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { api } from "@/utils/api"; +import { Loader2 } from "lucide-react"; +import { useEffect, useState } from "react"; +import { toast } from "sonner"; +import { ContainerFreeMonitoring } from "./show-free-container-monitoring"; + +interface Props { + appName: string; + serverId?: string; + appType: "stack" | "docker-compose"; +} + +export const ComposeFreeMonitoring = ({ + appName, + appType = "stack", + serverId, +}: Props) => { + const { data, isLoading } = api.docker.getContainersByAppNameMatch.useQuery( + { + appName: appName, + appType, + serverId, + }, + { + enabled: !!appName, + }, + ); + + const [containerAppName, setContainerAppName] = useState< + string | undefined + >(); + + const [containerId, setContainerId] = useState(); + + const { mutateAsync: restart, isLoading: isRestarting } = + api.docker.restartContainer.useMutation(); + + useEffect(() => { + if (data && data?.length > 0) { + setContainerAppName(data[0]?.name); + setContainerId(data[0]?.containerId); + } + }, [data]); + + return ( + <> + + Monitoring + Watch the usage of your compose + + + +
+ + +
+ +
+ + ); +}; diff --git a/apps/dokploy/components/dashboard/monitoring/free/container/show-free-container-monitoring.tsx b/apps/dokploy/components/dashboard/monitoring/free/container/show-free-container-monitoring.tsx new file mode 100644 index 00000000..278e0936 --- /dev/null +++ b/apps/dokploy/components/dashboard/monitoring/free/container/show-free-container-monitoring.tsx @@ -0,0 +1,310 @@ +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { Progress } from "@/components/ui/progress"; +import { api } from "@/utils/api"; +import { useEffect, useState } from "react"; +import { DockerBlockChart } from "./docker-block-chart"; +import { DockerCpuChart } from "./docker-cpu-chart"; +import { DockerDiskChart } from "./docker-disk-chart"; +import { DockerMemoryChart } from "./docker-memory-chart"; +import { DockerNetworkChart } from "./docker-network-chart"; + +const defaultData = { + cpu: { + value: 0, + time: "", + }, + memory: { + value: { + used: 0, + total: 0, + }, + time: "", + }, + block: { + value: { + readMb: 0, + writeMb: 0, + }, + time: "", + }, + network: { + value: { + inputMb: 0, + outputMb: 0, + }, + time: "", + }, + disk: { + value: { diskTotal: 0, diskUsage: 0, diskUsedPercentage: 0, diskFree: 0 }, + time: "", + }, +}; + +interface Props { + appName: string; + appType?: "application" | "stack" | "docker-compose"; +} +export interface DockerStats { + cpu: { + value: number; + time: string; + }; + memory: { + value: { + used: number; + total: number; + }; + time: string; + }; + block: { + value: { + readMb: number; + writeMb: number; + }; + time: string; + }; + network: { + value: { + inputMb: number; + outputMb: number; + }; + time: string; + }; + disk: { + value: { + diskTotal: number; + diskUsage: number; + diskUsedPercentage: number; + diskFree: number; + }; + + time: string; + }; +} + +export type DockerStatsJSON = { + cpu: DockerStats["cpu"][]; + memory: DockerStats["memory"][]; + block: DockerStats["block"][]; + network: DockerStats["network"][]; + disk: DockerStats["disk"][]; +}; + +export const convertMemoryToBytes = ( + memoryString: string | undefined, +): number => { + if (!memoryString || typeof memoryString !== "string") { + return 0; + } + + const value = Number.parseFloat(memoryString) || 0; + const unit = memoryString.replace(/[0-9.]/g, "").trim(); + + switch (unit) { + case "KiB": + return value * 1024; + case "MiB": + return value * 1024 * 1024; + case "GiB": + return value * 1024 * 1024 * 1024; + case "TiB": + return value * 1024 * 1024 * 1024 * 1024; + default: + return value; + } +}; + +export const ContainerFreeMonitoring = ({ + appName, + appType = "application", +}: Props) => { + const { data } = api.application.readAppMonitoring.useQuery( + { appName }, + { + refetchOnWindowFocus: false, + }, + ); + const [acummulativeData, setAcummulativeData] = useState({ + cpu: [], + memory: [], + block: [], + network: [], + disk: [], + }); + const [currentData, setCurrentData] = useState(defaultData); + + useEffect(() => { + setCurrentData(defaultData); + + setAcummulativeData({ + cpu: [], + memory: [], + block: [], + network: [], + disk: [], + }); + }, [appName]); + + useEffect(() => { + if (!data) return; + + setCurrentData({ + cpu: data.cpu[data.cpu.length - 1] ?? currentData.cpu, + memory: data.memory[data.memory.length - 1] ?? currentData.memory, + block: data.block[data.block.length - 1] ?? currentData.block, + network: data.network[data.network.length - 1] ?? currentData.network, + disk: data.disk[data.disk.length - 1] ?? currentData.disk, + }); + setAcummulativeData({ + block: data?.block || [], + cpu: data?.cpu || [], + disk: data?.disk || [], + memory: data?.memory || [], + network: data?.network || [], + }); + }, [data]); + + useEffect(() => { + const protocol = window.location.protocol === "https:" ? "wss:" : "ws:"; + const wsUrl = `${protocol}//${window.location.host}/listen-docker-stats-monitoring?appName=${appName}&appType=${appType}`; + const ws = new WebSocket(wsUrl); + + ws.onmessage = (e) => { + const value = JSON.parse(e.data); + if (!value) return; + + const data = { + cpu: value.data.cpu ?? currentData.cpu, + memory: value.data.memory ?? currentData.memory, + block: value.data.block ?? currentData.block, + disk: value.data.disk ?? currentData.disk, + network: value.data.network ?? currentData.network, + }; + + setCurrentData(data); + + setAcummulativeData((prevData) => ({ + cpu: [...prevData.cpu, data.cpu], + memory: [...prevData.memory, data.memory], + block: [...prevData.block, data.block], + network: [...prevData.network, data.network], + disk: [...prevData.disk, data.disk], + })); + }; + + ws.onclose = (e) => { + console.log(e.reason); + }; + + return () => ws.close(); + }, [appName]); + + return ( +
+
+
+

Monitoring

+

+ Watch the usage of your server in the current app +

+
+
+ +
+ + + CPU Usage + + +
+ + Used: {currentData.cpu.value}% + + + +
+
+
+ + + Memory Usage + + +
+ + {`Used: ${currentData.memory.value.used} / Limit: ${currentData.memory.value.total} `} + + + +
+
+
+ {appName === "dokploy" && ( + + + Disk Space + + +
+ + {`Used: ${currentData.disk.value.diskUsage} GB / Limit: ${currentData.disk.value.diskTotal} GB`} + + + +
+
+
+ )} + + + + Block I/O + + +
+ + {`Read: ${currentData.block.value.readMb} / Write: ${currentData.block.value.writeMb} `} + + +
+
+
+ + + Network I/O + + +
+ + {`In MB: ${currentData.network.value.inputMb} / Out MB: ${currentData.network.value.outputMb} `} + + +
+
+
+
+
+ ); +}; diff --git a/apps/dokploy/components/dashboard/monitoring/paid/container/container-block-chart.tsx b/apps/dokploy/components/dashboard/monitoring/paid/container/container-block-chart.tsx new file mode 100644 index 00000000..12af6b91 --- /dev/null +++ b/apps/dokploy/components/dashboard/monitoring/paid/container/container-block-chart.tsx @@ -0,0 +1,181 @@ +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { + type ChartConfig, + ChartContainer, + ChartLegend, + ChartLegendContent, + ChartTooltip, +} from "@/components/ui/chart"; +import { formatTimestamp } from "@/lib/utils"; +import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from "recharts"; + +interface ContainerMetric { + timestamp: string; + BlockIO: { + read: number; + write: number; + readUnit: string; + writeUnit: string; + }; +} + +interface Props { + data: ContainerMetric[]; +} + +const chartConfig = { + read: { + label: "Read", + color: "hsl(217, 91%, 60%)", // Azul brillante + }, + write: { + label: "Write", + color: "hsl(142, 71%, 45%)", // Verde brillante + }, +} satisfies ChartConfig; + +export const ContainerBlockChart = ({ data }: Props) => { + const formattedData = data.map((metric) => ({ + timestamp: metric.timestamp, + read: metric.BlockIO.read, + write: metric.BlockIO.write, + readUnit: metric.BlockIO.readUnit, + writeUnit: metric.BlockIO.writeUnit, + })); + + const latestData = formattedData[formattedData.length - 1] || { + timestamp: "", + read: 0, + write: 0, + readUnit: "B", + writeUnit: "B", + }; + + return ( + + + Block I/O + + Read: {latestData.read} + {latestData.readUnit} / Write: {latestData.write} + {latestData.writeUnit} + + + + + + + + + + + + + + + + + formatTimestamp(value)} + /> + + { + if (active && payload && payload.length) { + const data = payload?.[0]?.payload; + return ( +
+
+
+ + Time + + + {formatTimestamp(label)} + +
+
+ + Read + + + {data.read} + {data.readUnit} + +
+
+ + Write + + + {data.write} + {data.writeUnit} + +
+
+
+ ); + } + return null; + }} + /> + + + } + verticalAlign="bottom" + align="center" + /> +
+
+
+
+ ); +}; diff --git a/apps/dokploy/components/dashboard/monitoring/paid/container/container-cpu-chart.tsx b/apps/dokploy/components/dashboard/monitoring/paid/container/container-cpu-chart.tsx new file mode 100644 index 00000000..445e03e1 --- /dev/null +++ b/apps/dokploy/components/dashboard/monitoring/paid/container/container-cpu-chart.tsx @@ -0,0 +1,128 @@ +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { + type ChartConfig, + ChartContainer, + ChartLegend, + ChartLegendContent, + ChartTooltip, +} from "@/components/ui/chart"; +import { formatTimestamp } from "@/lib/utils"; +import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from "recharts"; + +interface ContainerMetric { + timestamp: string; + CPU: number; +} + +interface Props { + data: ContainerMetric[]; +} + +const chartConfig = { + cpu: { + label: "CPU", + color: "hsl(var(--chart-1))", + }, +} satisfies ChartConfig; + +export const ContainerCPUChart = ({ data }: Props) => { + const formattedData = data.map((metric) => ({ + timestamp: metric.timestamp, + cpu: metric.CPU, + })); + + const latestData = formattedData[formattedData.length - 1] || { + timestamp: "", + cpu: 0, + }; + + return ( + + + CPU + CPU Usage: {latestData.cpu}% + + + + + + + + + + + + formatTimestamp(value)} + /> + `${value}%`} domain={[0, 100]} /> + { + if (active && payload && payload.length) { + const data = payload?.[0]?.payload; + return ( +
+
+
+ + Time + + + {formatTimestamp(label)} + +
+
+ + CPU + + {data.cpu}% +
+
+
+ ); + } + return null; + }} + /> + + } + verticalAlign="bottom" + align="center" + /> +
+
+
+
+ ); +}; diff --git a/apps/dokploy/components/dashboard/monitoring/paid/container/container-memory-chart.tsx b/apps/dokploy/components/dashboard/monitoring/paid/container/container-memory-chart.tsx new file mode 100644 index 00000000..4da86428 --- /dev/null +++ b/apps/dokploy/components/dashboard/monitoring/paid/container/container-memory-chart.tsx @@ -0,0 +1,149 @@ +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { + type ChartConfig, + ChartContainer, + ChartLegend, + ChartLegendContent, + ChartTooltip, +} from "@/components/ui/chart"; +import { formatTimestamp } from "@/lib/utils"; +import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from "recharts"; + +interface ContainerMetric { + timestamp: string; + Memory: { + percentage: number; + used: number; + total: number; + usedUnit: string; + totalUnit: string; + }; +} + +interface Props { + data: ContainerMetric[]; +} + +const chartConfig = { + memory: { + label: "Memory", + color: "hsl(var(--chart-2))", + }, +} satisfies ChartConfig; + +const formatMemoryValue = (value: number) => { + return value.toLocaleString("en-US", { + minimumFractionDigits: 1, + maximumFractionDigits: 2, + }); +}; + +export const ContainerMemoryChart = ({ data }: Props) => { + const formattedData = data.map((metric) => ({ + timestamp: metric.timestamp, + memory: metric.Memory.percentage, + usage: `${formatMemoryValue(metric.Memory.used)}${metric.Memory.usedUnit} / ${formatMemoryValue(metric.Memory.total)}${metric.Memory.totalUnit}`, + })); + + const latestData = formattedData[formattedData.length - 1] || { + timestamp: "", + memory: 0, + usage: "0 / 0 B", + }; + + return ( + + + Memory + Memory Usage: {latestData.usage} + + + + + + + + + + + + formatTimestamp(value)} + /> + `${value}%`} domain={[0, 100]} /> + { + if (active && payload && payload.length) { + const data = payload?.[0]?.payload; + return ( +
+
+
+ + Time + + + {formatTimestamp(label)} + +
+
+ + Memory + + {data.memory}% +
+
+ + Usage + + {data.usage} +
+
+
+ ); + } + return null; + }} + /> + + } + verticalAlign="bottom" + align="center" + /> +
+
+
+
+ ); +}; diff --git a/apps/dokploy/components/dashboard/monitoring/paid/container/container-network-chart.tsx b/apps/dokploy/components/dashboard/monitoring/paid/container/container-network-chart.tsx new file mode 100644 index 00000000..d51e8968 --- /dev/null +++ b/apps/dokploy/components/dashboard/monitoring/paid/container/container-network-chart.tsx @@ -0,0 +1,186 @@ +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { + type ChartConfig, + ChartContainer, + ChartLegend, + ChartLegendContent, + ChartTooltip, +} from "@/components/ui/chart"; +import { formatTimestamp } from "@/lib/utils"; +import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from "recharts"; + +interface ContainerMetric { + timestamp: string; + Network: { + input: number; + output: number; + inputUnit: string; + outputUnit: string; + }; +} + +interface Props { + data: ContainerMetric[]; +} + +interface FormattedMetric { + timestamp: string; + input: number; + output: number; + inputUnit: string; + outputUnit: string; +} + +const chartConfig = { + input: { + label: "Input", + color: "hsl(var(--chart-3))", + }, + output: { + label: "Output", + color: "hsl(var(--chart-4))", + }, +} satisfies ChartConfig; + +export const ContainerNetworkChart = ({ data }: Props) => { + const formattedData: FormattedMetric[] = data.map((metric) => ({ + timestamp: metric.timestamp, + input: metric.Network.input, + output: metric.Network.output, + inputUnit: metric.Network.inputUnit, + outputUnit: metric.Network.outputUnit, + })); + + const latestData = formattedData[formattedData.length - 1] || { + input: 0, + output: 0, + inputUnit: "B", + outputUnit: "B", + }; + + return ( + + + Network I/O + + Input: {latestData.input} + {latestData.inputUnit} / Output: {latestData.output} + {latestData.outputUnit} + + + + + + + + + + + + + + + + + formatTimestamp(value)} + /> + + { + if (active && payload && payload.length) { + const data = payload?.[0]?.payload; + return ( +
+
+
+ + Time + + + {formatTimestamp(label)} + +
+
+ + Input + + + {data.input} + {data.inputUnit} + +
+
+ + Output + + + {data.output} + {data.outputUnit} + +
+
+
+ ); + } + return null; + }} + /> + + + } + verticalAlign="bottom" + align="center" + /> +
+
+
+
+ ); +}; diff --git a/apps/dokploy/components/dashboard/compose/monitoring/show.tsx b/apps/dokploy/components/dashboard/monitoring/paid/container/show-paid-compose-monitoring.tsx similarity index 80% rename from apps/dokploy/components/dashboard/compose/monitoring/show.tsx rename to apps/dokploy/components/dashboard/monitoring/paid/container/show-paid-compose-monitoring.tsx index 898af8ec..4ca461c2 100644 --- a/apps/dokploy/components/dashboard/compose/monitoring/show.tsx +++ b/apps/dokploy/components/dashboard/monitoring/paid/container/show-paid-compose-monitoring.tsx @@ -1,3 +1,5 @@ +import { badgeStateColor } from "@/components/dashboard/application/logs/show"; +import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, @@ -20,18 +22,22 @@ import { api } from "@/utils/api"; import { Loader2 } from "lucide-react"; import { useEffect, useState } from "react"; import { toast } from "sonner"; -import { DockerMonitoring } from "../../monitoring/docker/show"; +import { ContainerPaidMonitoring } from "./show-paid-container-monitoring"; interface Props { appName: string; serverId?: string; appType: "stack" | "docker-compose"; + baseUrl: string; + token: string; } -export const ShowMonitoringCompose = ({ +export const ComposePaidMonitoring = ({ appName, appType = "stack", serverId, + baseUrl, + token, }: Props) => { const { data, isLoading } = api.docker.getContainersByAppNameMatch.useQuery( { @@ -44,9 +50,9 @@ export const ShowMonitoringCompose = ({ }, ); - const [containerAppName, setContainerAppName] = useState< - string | undefined - >(); + const [containerAppName, setContainerAppName] = useState( + "", + ); const [containerId, setContainerId] = useState(); @@ -62,7 +68,7 @@ export const ShowMonitoringCompose = ({ return (
- + Monitoring Watch the usage of your compose @@ -98,7 +104,9 @@ export const ShowMonitoringCompose = ({ value={container.name} > {container.name} ({container.containerId}){" "} - {container.state} + + {container.state} + ))} Containers ({data?.length}) @@ -118,10 +126,13 @@ export const ShowMonitoringCompose = ({ Restart
- +
+ +
diff --git a/apps/dokploy/components/dashboard/monitoring/paid/container/show-paid-container-monitoring.tsx b/apps/dokploy/components/dashboard/monitoring/paid/container/show-paid-container-monitoring.tsx new file mode 100644 index 00000000..3b189c2a --- /dev/null +++ b/apps/dokploy/components/dashboard/monitoring/paid/container/show-paid-container-monitoring.tsx @@ -0,0 +1,258 @@ +import { Card } from "@/components/ui/card"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { api } from "@/utils/api"; +import { Cpu, HardDrive, Loader2, MemoryStick, Network } from "lucide-react"; +import { useEffect, useState } from "react"; +import { ContainerBlockChart } from "./container-block-chart"; +import { ContainerCPUChart } from "./container-cpu-chart"; +import { ContainerMemoryChart } from "./container-memory-chart"; +import { ContainerNetworkChart } from "./container-network-chart"; + +const REFRESH_INTERVALS = { + "5000": "5 Seconds", + "10000": "10 Seconds", + "20000": "20 Seconds", + "30000": "30 Seconds", +} as const; + +const DATA_POINTS_OPTIONS = { + "50": "50 points", + "200": "200 points", + "500": "500 points", + "800": "800 points", + "1200": "1200 points", + "1600": "1600 points", + "2000": "2000 points", + all: "All points", +} as const; + +interface ContainerMetric { + timestamp: string; + CPU: number; + Memory: { + percentage: number; + used: number; + total: number; + unit: string; + usedUnit: string; + totalUnit: string; + }; + Network: { + input: number; + output: number; + inputUnit: string; + outputUnit: string; + }; + BlockIO: { + read: number; + write: number; + readUnit: string; + writeUnit: string; + }; + Container: string; + ID: string; + Name: string; +} + +interface Props { + appName: string; + baseUrl: string; + token: string; +} + +export const ContainerPaidMonitoring = ({ appName, baseUrl, token }: Props) => { + const [historicalData, setHistoricalData] = useState([]); + const [metrics, setMetrics] = useState( + {} as ContainerMetric, + ); + const [dataPoints, setDataPoints] = + useState("50"); + const [refreshInterval, setRefreshInterval] = useState("5000"); + + const { + data, + isLoading, + error: queryError, + } = api.user.getContainerMetrics.useQuery( + { + url: baseUrl, + token, + dataPoints, + appName, + }, + { + refetchInterval: + dataPoints === "all" ? undefined : Number.parseInt(refreshInterval), + enabled: !!appName, + }, + ); + + useEffect(() => { + if (!data) return; + + // @ts-ignore + setHistoricalData(data); + // @ts-ignore + setMetrics(data[data.length - 1]); + }, [data]); + + if (isLoading) { + return ( +
+ +
+ ); + } + + if (queryError) { + return ( +
+
+

+ Error fetching metrics for{" "} + {appName} +

+

+ {queryError instanceof Error + ? queryError.message + : "Failed to fetch metrics, Please check your monitoring Instance is Configured correctly."} +

+

URL: {baseUrl}

+
+
+ ); + } + + return ( + <> +
+

+ Container Monitoring +

+
+
+ Data points: + +
+ +
+ + Refresh interval: + + +
+
+
+ + {/* Stats Cards */} +
+ +
+ +

CPU Usage

+
+

{metrics.CPU}%

+
+ + +
+ +

Memory Usage

+
+

+ {metrics?.Memory?.percentage}% +

+

+ {metrics?.Memory?.used} {metrics?.Memory?.unit} /{" "} + {metrics?.Memory?.total} {metrics?.Memory?.unit} +

+
+ + +
+ +

Network I/O

+
+

+ {metrics?.Network?.input} {metrics?.Network?.inputUnit} /{" "} + {metrics?.Network?.output} {metrics?.Network?.outputUnit} +

+
+ + +
+ +

Block I/O

+
+

+ {metrics?.BlockIO?.read} {metrics?.BlockIO?.readUnit} /{" "} + {metrics?.BlockIO?.write} {metrics?.BlockIO?.writeUnit} +

+
+
+ + {/* Container Information */} + +

Container Information

+
+
+

+ Container ID +

+

{metrics.ID}

+
+
+

Name

+

{metrics.Name}

+
+
+
+ + {/* Charts Grid */} +
+ + + + +
+ + ); +}; diff --git a/apps/dokploy/components/dashboard/monitoring/paid/servers/cpu-chart.tsx b/apps/dokploy/components/dashboard/monitoring/paid/servers/cpu-chart.tsx new file mode 100644 index 00000000..8c9602ee --- /dev/null +++ b/apps/dokploy/components/dashboard/monitoring/paid/servers/cpu-chart.tsx @@ -0,0 +1,115 @@ +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { + type ChartConfig, + ChartContainer, + ChartLegend, + ChartLegendContent, + ChartTooltip, +} from "@/components/ui/chart"; +import { formatTimestamp } from "@/lib/utils"; +import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from "recharts"; + +interface CPUChartProps { + data: any[]; +} + +const chartConfig = { + cpu: { + label: "CPU", + color: "hsl(var(--chart-1))", + }, +} satisfies ChartConfig; + +export function CPUChart({ data }: CPUChartProps) { + const latestData = data[data.length - 1] || {}; + + return ( + + + CPU + CPU Usage: {latestData.cpu}% + + + + + + + + + + + + formatTimestamp(value)} + /> + `${value}%`} domain={[0, 100]} /> + { + if (active && payload && payload.length) { + const data = payload?.[0]?.payload; + return ( +
+
+
+ + Time + + + {formatTimestamp(label)} + +
+
+ + CPU + + {data.cpu}% +
+
+
+ ); + } + return null; + }} + /> + + } + verticalAlign="bottom" + align="center" + /> +
+
+
+
+ ); +} diff --git a/apps/dokploy/components/dashboard/monitoring/paid/servers/disk-chart.tsx b/apps/dokploy/components/dashboard/monitoring/paid/servers/disk-chart.tsx new file mode 100644 index 00000000..3a81526c --- /dev/null +++ b/apps/dokploy/components/dashboard/monitoring/paid/servers/disk-chart.tsx @@ -0,0 +1,120 @@ +import { HardDrive } from "lucide-react"; +import { + Label, + PolarGrid, + PolarRadiusAxis, + RadialBar, + RadialBarChart, +} from "recharts"; + +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { type ChartConfig, ChartContainer } from "@/components/ui/chart"; + +interface RadialChartProps { + data: any; +} + +export function DiskChart({ data }: RadialChartProps) { + const diskUsed = Number.parseFloat(data.diskUsed || 0); + const totalDiskGB = Number.parseFloat(data.totalDisk || 0); + const usedDiskGB = (totalDiskGB * diskUsed) / 100; + + const chartData = [ + { + disk: 25, + fill: "hsl(var(--chart-2))", + }, + ]; + + const chartConfig = { + disk: { + label: "Disk", + color: "hsl(var(--chart-2))", + }, + } satisfies ChartConfig; + + const endAngle = (diskUsed * 360) / 100; + + return ( + + + Disk + Storage Space + + + + + + + + + + + + +
+ {usedDiskGB.toFixed(1)} GB used +
+
+ Of {totalDiskGB.toFixed(1)} GB total +
+
+
+ ); +} diff --git a/apps/dokploy/components/dashboard/monitoring/paid/servers/memory-chart.tsx b/apps/dokploy/components/dashboard/monitoring/paid/servers/memory-chart.tsx new file mode 100644 index 00000000..f4079c46 --- /dev/null +++ b/apps/dokploy/components/dashboard/monitoring/paid/servers/memory-chart.tsx @@ -0,0 +1,128 @@ +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { + type ChartConfig, + ChartContainer, + ChartTooltip, +} from "@/components/ui/chart"; +import { formatTimestamp } from "@/lib/utils"; +import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from "recharts"; + +interface MemoryChartProps { + data: any[]; +} + +const chartConfig = { + Memory: { + label: "Memory", + color: "hsl(var(--chart-2))", + }, +} satisfies ChartConfig; + +export function MemoryChart({ data }: MemoryChartProps) { + const latestData = data[data.length - 1] || {}; + + return ( + + + Memory + + Memory Usage: {latestData.memUsedGB} GB of {latestData.memTotal} GB ( + {latestData.memUsed}%) + + + + + + + + + + + + + formatTimestamp(value)} + /> + `${value}%`} + domain={[0, 100]} + /> + `${value.toFixed(1)} GB`} + domain={[ + 0, + Math.ceil(Number.parseFloat(latestData.memTotal || "0")), + ]} + /> + { + if (active && payload && payload.length) { + const data = payload?.[0]?.payload; + return ( +
+
+
+ + Time + + + {formatTimestamp(label)} + +
+
+ + Memory + + + {data.memUsed}% ({data.memUsedGB} GB) + +
+
+
+ ); + } + return null; + }} + /> + +
+
+
+
+ ); +} diff --git a/apps/dokploy/components/dashboard/monitoring/paid/servers/network-chart.tsx b/apps/dokploy/components/dashboard/monitoring/paid/servers/network-chart.tsx new file mode 100644 index 00000000..b84af095 --- /dev/null +++ b/apps/dokploy/components/dashboard/monitoring/paid/servers/network-chart.tsx @@ -0,0 +1,145 @@ +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { + type ChartConfig, + ChartContainer, + ChartLegend, + ChartLegendContent, + ChartTooltip, +} from "@/components/ui/chart"; +import { formatTimestamp } from "@/lib/utils"; +import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from "recharts"; + +interface NetworkChartProps { + data: any[]; +} + +const chartConfig = { + networkIn: { + label: "Network In", + color: "hsl(var(--chart-3))", + }, + networkOut: { + label: "Network Out", + color: "hsl(var(--chart-4))", + }, +} satisfies ChartConfig; + +export function NetworkChart({ data }: NetworkChartProps) { + const latestData = data[data.length - 1] || {}; + + return ( + + + Network + + Network Traffic: ↑ {latestData.networkOut} KB/s ↓{" "} + {latestData.networkIn} KB/s + + + + + + + + + + + + + + + + + formatTimestamp(value)} + /> + `${value} KB/s`} /> + { + if (active && payload && payload.length) { + const data = payload?.[0]?.payload; + return ( +
+
+
+ + Time + + + {formatTimestamp(label)} + +
+
+ + Network + + + ↑ {data.networkOut} KB/s +
↓ {data.networkIn} KB/s +
+
+
+
+ ); + } + return null; + }} + /> + + + } + verticalAlign="bottom" + align="center" + /> +
+
+
+
+ ); +} diff --git a/apps/dokploy/components/dashboard/monitoring/paid/servers/show-paid-monitoring.tsx b/apps/dokploy/components/dashboard/monitoring/paid/servers/show-paid-monitoring.tsx new file mode 100644 index 00000000..e92ce03f --- /dev/null +++ b/apps/dokploy/components/dashboard/monitoring/paid/servers/show-paid-monitoring.tsx @@ -0,0 +1,275 @@ +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { api } from "@/utils/api"; +import { Clock, Cpu, HardDrive, Loader2, MemoryStick } from "lucide-react"; +import { useEffect, useState } from "react"; +import { CPUChart } from "./cpu-chart"; +import { DiskChart } from "./disk-chart"; +import { MemoryChart } from "./memory-chart"; +import { NetworkChart } from "./network-chart"; + +const REFRESH_INTERVALS = { + "5000": "5 Seconds", + "10000": "10 Seconds", + "20000": "20 Seconds", + "30000": "30 Seconds", +} as const; + +const DATA_POINTS_OPTIONS = { + "50": "50 points", + "200": "200 points", + "500": "500 points", + "800": "800 points", + "1200": "1200 points", + "1600": "1600 points", + "2000": "2000 points", + all: "All points", +} as const; + +interface SystemMetrics { + cpu: string; + cpuModel: string; + cpuCores: number; + cpuPhysicalCores: number; + cpuSpeed: number; + os: string; + distro: string; + kernel: string; + arch: string; + memUsed: string; + memUsedGB: string; + memTotal: string; + uptime: number; + diskUsed: string; + totalDisk: string; + networkIn: string; + networkOut: string; + timestamp: string; +} + +interface Props { + BASE_URL?: string; + token?: string; +} + +export const ShowPaidMonitoring = ({ + BASE_URL = process.env.NEXT_PUBLIC_METRICS_URL || + "http://localhost:3001/metrics", + token = process.env.NEXT_PUBLIC_METRICS_TOKEN || "my-token", +}: Props) => { + const [historicalData, setHistoricalData] = useState([]); + const [metrics, setMetrics] = useState({} as SystemMetrics); + const [dataPoints, setDataPoints] = + useState("50"); + const [refreshInterval, setRefreshInterval] = useState("5000"); + + const { + data, + isLoading, + error: queryError, + } = api.server.getServerMetrics.useQuery( + { + url: BASE_URL, + token, + dataPoints, + }, + { + refetchInterval: + dataPoints === "all" ? undefined : Number.parseInt(refreshInterval), + enabled: true, + }, + ); + + useEffect(() => { + if (!data) return; + + const formattedData = data.map((metric: SystemMetrics) => ({ + timestamp: metric.timestamp, + cpu: Number.parseFloat(metric.cpu), + cpuModel: metric.cpuModel, + cpuCores: metric.cpuCores, + cpuPhysicalCores: metric.cpuPhysicalCores, + cpuSpeed: metric.cpuSpeed, + os: metric.os, + distro: metric.distro, + kernel: metric.kernel, + arch: metric.arch, + memUsed: Number.parseFloat(metric.memUsed), + memUsedGB: Number.parseFloat(metric.memUsedGB), + memTotal: Number.parseFloat(metric.memTotal), + networkIn: Number.parseFloat(metric.networkIn), + networkOut: Number.parseFloat(metric.networkOut), + diskUsed: Number.parseFloat(metric.diskUsed), + totalDisk: Number.parseFloat(metric.totalDisk), + uptime: metric.uptime, + })); + + // @ts-ignore + setHistoricalData(formattedData); + // @ts-ignore + setMetrics(formattedData[formattedData.length - 1] || {}); + }, [data]); + + const formatUptime = (seconds: number): string => { + const days = Math.floor(seconds / (24 * 60 * 60)); + const hours = Math.floor((seconds % (24 * 60 * 60)) / (60 * 60)); + const minutes = Math.floor((seconds % (60 * 60)) / 60); + + return `${days}d ${hours}h ${minutes}m`; + }; + + if (isLoading) { + return ( +
+ +
+ ); + } + + if (queryError) { + return ( +
+
+

+ Error fetching metrics{" "} +

+

+ {queryError instanceof Error + ? queryError.message + : "Failed to fetch metrics, Please check your monitoring Instance is Configured correctly."} +

+

URL: {BASE_URL}

+
+
+ ); + } + + return ( +
+
+

System Monitoring

+
+
+ Data points: + +
+ +
+ + Refresh interval: + + +
+
+
+ + {/* Stats Cards */} +
+
+
+ +

Uptime

+
+

+ {formatUptime(metrics.uptime || 0)} +

+
+ +
+
+ +

CPU Usage

+
+

{metrics.cpu}%

+
+ +
+
+ +

Memory Usage

+
+

+ {metrics.memUsedGB} GB / {metrics.memTotal} GB +

+
+ +
+
+ +

Disk Usage

+
+

{metrics.diskUsed}%

+
+
+ + {/* System Information */} +
+

System Information

+
+
+

CPU

+

{metrics.cpuModel}

+

+ {metrics.cpuPhysicalCores} Physical Cores ({metrics.cpuCores}{" "} + Threads) @ {metrics.cpuSpeed}GHz +

+
+
+

+ Operating System +

+

{metrics.distro}

+

+ Kernel: {metrics.kernel} ({metrics.arch}) +

+
+
+
+ + {/* Charts Grid */} +
+ + + + +
+
+ ); +}; diff --git a/apps/dokploy/components/dashboard/monitoring/web-server/show.tsx b/apps/dokploy/components/dashboard/monitoring/web-server/show.tsx deleted file mode 100644 index d6f15057..00000000 --- a/apps/dokploy/components/dashboard/monitoring/web-server/show.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from "react"; -import { DockerMonitoring } from "../docker/show"; - -export const ShowMonitoring = () => { - return ( -
- -
- ); -}; diff --git a/apps/dokploy/components/dashboard/mysql/general/show-external-mysql-credentials.tsx b/apps/dokploy/components/dashboard/mysql/general/show-external-mysql-credentials.tsx index dc1ca3a7..7a0527b1 100644 --- a/apps/dokploy/components/dashboard/mysql/general/show-external-mysql-credentials.tsx +++ b/apps/dokploy/components/dashboard/mysql/general/show-external-mysql-credentials.tsx @@ -19,7 +19,7 @@ import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; diff --git a/apps/dokploy/components/dashboard/mysql/general/show-general-mysql.tsx b/apps/dokploy/components/dashboard/mysql/general/show-general-mysql.tsx index 56a191ce..13f46cae 100644 --- a/apps/dokploy/components/dashboard/mysql/general/show-general-mysql.tsx +++ b/apps/dokploy/components/dashboard/mysql/general/show-general-mysql.tsx @@ -4,7 +4,7 @@ import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { api } from "@/utils/api"; import { Ban, CheckCircle2, RefreshCcw, Terminal } from "lucide-react"; -import React, { useState } from "react"; +import { useState } from "react"; import { toast } from "sonner"; import { type LogLine, parseLogs } from "../../docker/logs/utils"; import { DockerTerminalModal } from "../../settings/web-server/docker-terminal-modal"; diff --git a/apps/dokploy/components/dashboard/mysql/general/show-internal-mysql-credentials.tsx b/apps/dokploy/components/dashboard/mysql/general/show-internal-mysql-credentials.tsx index 2c09efb8..3f187237 100644 --- a/apps/dokploy/components/dashboard/mysql/general/show-internal-mysql-credentials.tsx +++ b/apps/dokploy/components/dashboard/mysql/general/show-internal-mysql-credentials.tsx @@ -3,7 +3,6 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { api } from "@/utils/api"; -import React from "react"; interface Props { mysqlId: string; diff --git a/apps/dokploy/components/dashboard/mysql/update-mysql.tsx b/apps/dokploy/components/dashboard/mysql/update-mysql.tsx index 645575cd..efe1eb11 100644 --- a/apps/dokploy/components/dashboard/mysql/update-mysql.tsx +++ b/apps/dokploy/components/dashboard/mysql/update-mysql.tsx @@ -21,7 +21,7 @@ import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; -import { AlertTriangle, PenBoxIcon, SquarePen } from "lucide-react"; +import { PenBoxIcon } from "lucide-react"; import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; diff --git a/apps/dokploy/components/dashboard/organization/handle-organization.tsx b/apps/dokploy/components/dashboard/organization/handle-organization.tsx new file mode 100644 index 00000000..014c37df --- /dev/null +++ b/apps/dokploy/components/dashboard/organization/handle-organization.tsx @@ -0,0 +1,182 @@ +import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import { DropdownMenuItem } from "@/components/ui/dropdown-menu"; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { api } from "@/utils/api"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { PenBoxIcon, Plus } from "lucide-react"; +import { useEffect, useState } from "react"; +import { useForm } from "react-hook-form"; +import { toast } from "sonner"; +import { z } from "zod"; + +const organizationSchema = z.object({ + name: z.string().min(1, { + message: "Organization name is required", + }), + logo: z.string().optional(), +}); + +type OrganizationFormValues = z.infer; + +interface Props { + organizationId?: string; + children?: React.ReactNode; +} + +export function AddOrganization({ organizationId }: Props) { + const [open, setOpen] = useState(false); + const utils = api.useUtils(); + const { data: organization } = api.organization.one.useQuery( + { + organizationId: organizationId ?? "", + }, + { + enabled: !!organizationId, + }, + ); + const { mutateAsync, isLoading } = organizationId + ? api.organization.update.useMutation() + : api.organization.create.useMutation(); + + const form = useForm({ + resolver: zodResolver(organizationSchema), + defaultValues: { + name: "", + logo: "", + }, + }); + + useEffect(() => { + if (organization) { + form.reset({ + name: organization.name, + logo: organization.logo || "", + }); + } + }, [organization, form]); + + const onSubmit = async (values: OrganizationFormValues) => { + await mutateAsync({ + name: values.name, + logo: values.logo, + organizationId: organizationId ?? "", + }) + .then(() => { + form.reset(); + toast.success( + `Organization ${organizationId ? "updated" : "created"} successfully`, + ); + utils.organization.all.invalidate(); + setOpen(false); + }) + .catch((error) => { + console.error(error); + toast.error( + `Failed to ${organizationId ? "update" : "create"} organization`, + ); + }); + }; + + return ( + + + {organizationId ? ( + e.preventDefault()} + > + + + ) : ( + e.preventDefault()} + > +
+ +
+
+ Add organization +
+
+ )} +
+ + + + {organizationId ? "Update organization" : "Add organization"} + + + {organizationId + ? "Update the organization name and logo" + : "Create a new organization to manage your projects."} + + +
+ + ( + + Name + + + + + + )} + /> + ( + + Logo URL + + + + + + )} + /> + + + + + +
+
+ ); +} diff --git a/apps/dokploy/components/dashboard/postgres/advanced/show-custom-command.tsx b/apps/dokploy/components/dashboard/postgres/advanced/show-custom-command.tsx index 6e912db9..40e84844 100644 --- a/apps/dokploy/components/dashboard/postgres/advanced/show-custom-command.tsx +++ b/apps/dokploy/components/dashboard/postgres/advanced/show-custom-command.tsx @@ -11,7 +11,7 @@ import { import { Input } from "@/components/ui/input"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; -import React, { useEffect } from "react"; +import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; @@ -53,7 +53,7 @@ export const ShowCustomCommand = ({ id, type }: Props) => { mongo: () => api.mongo.update.useMutation(), }; - const { mutateAsync, isLoading } = mutationMap[type] + const { mutateAsync } = mutationMap[type] ? mutationMap[type]() : api.mongo.update.useMutation(); diff --git a/apps/dokploy/components/dashboard/postgres/general/show-external-postgres-credentials.tsx b/apps/dokploy/components/dashboard/postgres/general/show-external-postgres-credentials.tsx index e8fff7dc..dbd57d0b 100644 --- a/apps/dokploy/components/dashboard/postgres/general/show-external-postgres-credentials.tsx +++ b/apps/dokploy/components/dashboard/postgres/general/show-external-postgres-credentials.tsx @@ -19,7 +19,7 @@ import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; diff --git a/apps/dokploy/components/dashboard/postgres/general/show-general-postgres.tsx b/apps/dokploy/components/dashboard/postgres/general/show-general-postgres.tsx index 43c3f432..89d27523 100644 --- a/apps/dokploy/components/dashboard/postgres/general/show-general-postgres.tsx +++ b/apps/dokploy/components/dashboard/postgres/general/show-general-postgres.tsx @@ -4,7 +4,7 @@ import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { api } from "@/utils/api"; import { Ban, CheckCircle2, RefreshCcw, Terminal } from "lucide-react"; -import React, { useState } from "react"; +import { useState } from "react"; import { toast } from "sonner"; import { type LogLine, parseLogs } from "../../docker/logs/utils"; import { DockerTerminalModal } from "../../settings/web-server/docker-terminal-modal"; diff --git a/apps/dokploy/components/dashboard/postgres/general/show-internal-postgres-credentials.tsx b/apps/dokploy/components/dashboard/postgres/general/show-internal-postgres-credentials.tsx index e0122610..545150f8 100644 --- a/apps/dokploy/components/dashboard/postgres/general/show-internal-postgres-credentials.tsx +++ b/apps/dokploy/components/dashboard/postgres/general/show-internal-postgres-credentials.tsx @@ -3,7 +3,6 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { api } from "@/utils/api"; -import React from "react"; interface Props { postgresId: string; diff --git a/apps/dokploy/components/dashboard/postgres/update-postgres.tsx b/apps/dokploy/components/dashboard/postgres/update-postgres.tsx index 54ad5bce..7be6908f 100644 --- a/apps/dokploy/components/dashboard/postgres/update-postgres.tsx +++ b/apps/dokploy/components/dashboard/postgres/update-postgres.tsx @@ -21,7 +21,7 @@ import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; -import { AlertTriangle, PenBoxIcon, SquarePen } from "lucide-react"; +import { PenBoxIcon } from "lucide-react"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; diff --git a/apps/dokploy/components/dashboard/project/add-application.tsx b/apps/dokploy/components/dashboard/project/add-application.tsx index 2c30df8d..16c56917 100644 --- a/apps/dokploy/components/dashboard/project/add-application.tsx +++ b/apps/dokploy/components/dashboard/project/add-application.tsx @@ -70,7 +70,7 @@ interface Props { export const AddApplication = ({ projectId, projectName }: Props) => { const utils = api.useUtils(); - + const { data: isCloud } = api.settings.isCloud.useQuery(); const [visible, setVisible] = useState(false); const slug = slugify(projectName); const { data: servers } = api.server.withSSHKey.useQuery(); @@ -103,7 +103,7 @@ export const AddApplication = ({ projectId, projectName }: Props) => { projectId, }); }) - .catch((e) => { + .catch((_e) => { toast.error("Error creating the service"); }); }; @@ -166,7 +166,7 @@ export const AddApplication = ({ projectId, projectName }: Props) => { - Select a Server (Optional) + Select a Server {!isCloud ? "(Optional)" : ""} @@ -197,7 +197,12 @@ export const AddApplication = ({ projectId, projectName }: Props) => { key={server.serverId} value={server.serverId} > - {server.name} + + {server.name} + + {server.ipAddress} + + ))} Servers ({servers?.length}) diff --git a/apps/dokploy/components/dashboard/project/add-compose.tsx b/apps/dokploy/components/dashboard/project/add-compose.tsx index dc753e94..ea8690a8 100644 --- a/apps/dokploy/components/dashboard/project/add-compose.tsx +++ b/apps/dokploy/components/dashboard/project/add-compose.tsx @@ -73,6 +73,7 @@ export const AddCompose = ({ projectId, projectName }: Props) => { const utils = api.useUtils(); const [visible, setVisible] = useState(false); const slug = slugify(projectName); + const { data: isCloud } = api.settings.isCloud.useQuery(); const { data: servers } = api.server.withSSHKey.useQuery(); const { mutateAsync, isLoading, error, isError } = api.compose.create.useMutation(); @@ -173,7 +174,7 @@ export const AddCompose = ({ projectId, projectName }: Props) => { - Select a Server (Optional) + Select a Server {!isCloud ? "(Optional)" : ""} @@ -204,7 +205,12 @@ export const AddCompose = ({ projectId, projectName }: Props) => { key={server.serverId} value={server.serverId} > - {server.name} + + {server.name} + + {server.ipAddress} + + ))} Servers ({servers?.length}) diff --git a/apps/dokploy/components/dashboard/project/add-database.tsx b/apps/dokploy/components/dashboard/project/add-database.tsx index fc86d253..b14e2cfa 100644 --- a/apps/dokploy/components/dashboard/project/add-database.tsx +++ b/apps/dokploy/components/dashboard/project/add-database.tsx @@ -18,7 +18,6 @@ import { DropdownMenuItem } from "@/components/ui/dropdown-menu"; import { Form, FormControl, - FormDescription, FormField, FormItem, FormLabel, @@ -49,7 +48,6 @@ import { z } from "zod"; type DbType = typeof mySchema._type.type; -// TODO: Change to a real docker images const dockerImageDefaultPlaceholder: Record = { mongo: "mongo:6", mariadb: "mariadb:11", @@ -89,7 +87,7 @@ const mySchema = z.discriminatedUnion("type", [ z .object({ type: z.literal("postgres"), - databaseName: z.string().min(1, "Database name required"), + databaseName: z.string().default("postgres"), databaseUser: z.string().default("postgres"), }) .merge(baseDatabaseSchema), @@ -110,7 +108,7 @@ const mySchema = z.discriminatedUnion("type", [ type: z.literal("mysql"), databaseRootPassword: z.string().default(""), databaseUser: z.string().default("mysql"), - databaseName: z.string().min(1, "Database name required"), + databaseName: z.string().default("mysql"), }) .merge(baseDatabaseSchema), z @@ -119,7 +117,7 @@ const mySchema = z.discriminatedUnion("type", [ dockerImage: z.string().default("mariadb:4"), databaseRootPassword: z.string().default(""), databaseUser: z.string().default("mariadb"), - databaseName: z.string().min(1, "Database name required"), + databaseName: z.string().default("mariadb"), }) .merge(baseDatabaseSchema), ]); @@ -206,7 +204,7 @@ export const AddDatabase = ({ projectId, projectName }: Props) => { promise = postgresMutation.mutateAsync({ ...commonParams, databasePassword: data.databasePassword, - databaseName: data.databaseName, + databaseName: data.databaseName || "postgres", databaseUser: data.databaseUser || databasesUserDefaultPlaceholder[data.type], @@ -233,7 +231,7 @@ export const AddDatabase = ({ projectId, projectName }: Props) => { ...commonParams, databasePassword: data.databasePassword, databaseRootPassword: data.databaseRootPassword, - databaseName: data.databaseName, + databaseName: data.databaseName || "mariadb", databaseUser: data.databaseUser || databasesUserDefaultPlaceholder[data.type], serverId: data.serverId, @@ -242,7 +240,7 @@ export const AddDatabase = ({ projectId, projectName }: Props) => { promise = mysqlMutation.mutateAsync({ ...commonParams, databasePassword: data.databasePassword, - databaseName: data.databaseName, + databaseName: data.databaseName || "mysql", databaseUser: data.databaseUser || databasesUserDefaultPlaceholder[data.type], databaseRootPassword: data.databaseRootPassword, diff --git a/apps/dokploy/components/dashboard/project/add-template.tsx b/apps/dokploy/components/dashboard/project/add-template.tsx index 90d17364..5363e6f3 100644 --- a/apps/dokploy/components/dashboard/project/add-template.tsx +++ b/apps/dokploy/components/dashboard/project/add-template.tsx @@ -57,7 +57,6 @@ import { BookText, CheckIcon, ChevronsUpDown, - Code, Github, Globe, HelpCircle, @@ -80,6 +79,7 @@ export const AddTemplate = ({ projectId }: Props) => { const [viewMode, setViewMode] = useState<"detailed" | "icon">("detailed"); const [selectedTags, setSelectedTags] = useState([]); const { data } = api.compose.templates.useQuery(); + const { data: isCloud } = api.settings.isCloud.useQuery(); const { data: servers } = api.server.withSSHKey.useQuery(); const { data: tags, isLoading: isLoadingTags } = api.compose.getTags.useQuery(); @@ -226,7 +226,11 @@ export const AddTemplate = ({ projectId }: Props) => {
- {isError && {error?.message}} + {isError && ( + + {error?.message} + + )} {templates.length === 0 ? (
@@ -304,7 +308,7 @@ export const AddTemplate = ({ projectId }: Props) => { {/* Create Button */}
{ @@ -401,7 +406,12 @@ export const AddTemplate = ({ projectId }: Props) => { key={server.serverId} value={server.serverId} > - {server.name} + + {server.name} + + {server.ipAddress} + + ))} @@ -424,14 +434,14 @@ export const AddTemplate = ({ projectId }: Props) => { }); toast.promise(promise, { loading: "Setting up...", - success: (data) => { + success: (_data) => { utils.project.one.invalidate({ projectId, }); setOpen(false); return `${template.name} template created successfully`; }, - error: (err) => { + error: (_err) => { return `An error ocurred deploying ${template.name} template`; }, }); diff --git a/apps/dokploy/components/dashboard/projects/handle-project.tsx b/apps/dokploy/components/dashboard/projects/handle-project.tsx index cf38c57c..f5d62dfc 100644 --- a/apps/dokploy/components/dashboard/projects/handle-project.tsx +++ b/apps/dokploy/components/dashboard/projects/handle-project.tsx @@ -97,6 +97,18 @@ export const HandleProject = ({ projectId }: Props) => { ); }); }; + // useEffect(() => { + // const getUsers = async () => { + // const users = await authClient.admin.listUsers({ + // query: { + // limit: 100, + // }, + // }); + // console.log(users); + // }; + + // getUsers(); + // }); return ( @@ -118,7 +130,7 @@ export const HandleProject = ({ projectId }: Props) => { - Add a project + {projectId ? "Update" : "Add a"} project The home of something big! {isError && {error?.message}} diff --git a/apps/dokploy/components/dashboard/projects/project-environment.tsx b/apps/dokploy/components/dashboard/projects/project-environment.tsx index 493813dc..e43d1af8 100644 --- a/apps/dokploy/components/dashboard/projects/project-environment.tsx +++ b/apps/dokploy/components/dashboard/projects/project-environment.tsx @@ -99,8 +99,7 @@ export const ProjectEnvironment = ({ projectId, children }: Props) => { Project Environment Update the env Environment variables that are accessible to all - services of this project. Use this syntax to reference project-level - variables in your service environments: + services of this project. {isError && {error?.message}} diff --git a/apps/dokploy/components/dashboard/projects/show.tsx b/apps/dokploy/components/dashboard/projects/show.tsx index 16f842ed..188ee60d 100644 --- a/apps/dokploy/components/dashboard/projects/show.tsx +++ b/apps/dokploy/components/dashboard/projects/show.tsx @@ -1,5 +1,6 @@ import { BreadcrumbSidebar } from "@/components/shared/breadcrumb-sidebar"; import { DateTooltip } from "@/components/shared/date-tooltip"; +import { StatusTooltip } from "@/components/shared/status-tooltip"; import { AlertDialog, AlertDialogAction, @@ -23,8 +24,10 @@ import { import { DropdownMenu, DropdownMenuContent, + DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, + DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Input } from "@/components/ui/input"; @@ -48,15 +51,7 @@ import { ProjectEnvironment } from "./project-environment"; export const ShowProjects = () => { const utils = api.useUtils(); const { data, isLoading } = api.project.all.useQuery(); - const { data: auth } = api.auth.get.useQuery(); - const { data: user } = api.user.byAuthId.useQuery( - { - authId: auth?.id || "", - }, - { - enabled: !!auth?.id && auth?.rol === "user", - }, - ); + const { data: auth } = api.user.get.useQuery(); const { mutateAsync } = api.project.remove.useMutation(); const [searchQuery, setSearchQuery] = useState(""); @@ -77,8 +72,8 @@ export const ShowProjects = () => {
-
- +
+ Projects @@ -87,9 +82,12 @@ export const ShowProjects = () => { Create and manage your projects -
- -
+ + {(auth?.role === "owner" || auth?.canCreateProjects) && ( +
+ +
+ )}
@@ -146,14 +144,97 @@ export const ShowProjects = () => { href={`/dashboard/project/${project.projectId}`} > - - + {project.applications.length > 0 || + project.compose.length > 0 ? ( + + + + + e.stopPropagation()} + > + {project.applications.length > 0 && ( + + + Applications + + {project.applications.map((app) => ( +
+ + + + {app.name} + + + + {app.domains.map((domain) => ( + + + {domain.host} + + + + ))} + +
+ ))} +
+ )} + {project.compose.length > 0 && ( + + + Compose + + {project.compose.map((comp) => ( +
+ + + + {comp.name} + + + + {comp.domains.map((domain) => ( + + + {domain.host} + + + + ))} + +
+ ))} +
+ )} +
+
+ ) : null} @@ -179,7 +260,10 @@ export const ShowProjects = () => { - + e.stopPropagation()} + > Actions @@ -201,8 +285,8 @@ export const ShowProjects = () => {
e.stopPropagation()} > - {(auth?.rol === "admin" || - user?.canDeleteProjects) && ( + {(auth?.role === "owner" || + auth?.canDeleteProjects) && ( { useEffect(() => { const buildConnectionUrl = () => { - const hostname = window.location.hostname; + const _hostname = window.location.hostname; const port = form.watch("externalPort") || data?.externalPort; return `redis://default:${data?.databasePassword}@${getIp}:${port}`; diff --git a/apps/dokploy/components/dashboard/redis/general/show-general-redis.tsx b/apps/dokploy/components/dashboard/redis/general/show-general-redis.tsx index 8e265b9d..e309ef49 100644 --- a/apps/dokploy/components/dashboard/redis/general/show-general-redis.tsx +++ b/apps/dokploy/components/dashboard/redis/general/show-general-redis.tsx @@ -4,7 +4,7 @@ import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { api } from "@/utils/api"; import { Ban, CheckCircle2, RefreshCcw, Terminal } from "lucide-react"; -import React, { useState } from "react"; +import { useState } from "react"; import { toast } from "sonner"; import { type LogLine, parseLogs } from "../../docker/logs/utils"; import { DockerTerminalModal } from "../../settings/web-server/docker-terminal-modal"; @@ -168,6 +168,7 @@ export const ShowGeneralRedis = ({ redisId }: Props) => { setIsDrawerOpen(false); setFilteredLogs([]); setIsDeploying(false); + refetch(); }} filteredLogs={filteredLogs} /> diff --git a/apps/dokploy/components/dashboard/redis/general/show-internal-redis-credentials.tsx b/apps/dokploy/components/dashboard/redis/general/show-internal-redis-credentials.tsx index 09200674..47ad0df0 100644 --- a/apps/dokploy/components/dashboard/redis/general/show-internal-redis-credentials.tsx +++ b/apps/dokploy/components/dashboard/redis/general/show-internal-redis-credentials.tsx @@ -3,7 +3,6 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { api } from "@/utils/api"; -import React from "react"; interface Props { redisId: string; diff --git a/apps/dokploy/components/dashboard/redis/update-redis.tsx b/apps/dokploy/components/dashboard/redis/update-redis.tsx index c3557bee..193aec3b 100644 --- a/apps/dokploy/components/dashboard/redis/update-redis.tsx +++ b/apps/dokploy/components/dashboard/redis/update-redis.tsx @@ -21,7 +21,7 @@ import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; -import { AlertTriangle, PenBoxIcon, SquarePen } from "lucide-react"; +import { PenBoxIcon } from "lucide-react"; import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; diff --git a/apps/dokploy/components/dashboard/requests/columns.tsx b/apps/dokploy/components/dashboard/requests/columns.tsx index 529d64a4..2c0391f8 100644 --- a/apps/dokploy/components/dashboard/requests/columns.tsx +++ b/apps/dokploy/components/dashboard/requests/columns.tsx @@ -3,7 +3,6 @@ import { Button } from "@/components/ui/button"; import type { ColumnDef } from "@tanstack/react-table"; import { format } from "date-fns"; import { ArrowUpDown } from "lucide-react"; -import * as React from "react"; import type { LogEntry } from "./show-requests"; export const getStatusColor = (status: number) => { @@ -25,7 +24,7 @@ export const getStatusColor = (status: number) => { export const columns: ColumnDef[] = [ { accessorKey: "level", - header: ({ column }) => { + header: () => { return ; }, cell: ({ row }) => { diff --git a/apps/dokploy/components/dashboard/requests/requests-table.tsx b/apps/dokploy/components/dashboard/requests/requests-table.tsx index cd2949c3..4926ce4e 100644 --- a/apps/dokploy/components/dashboard/requests/requests-table.tsx +++ b/apps/dokploy/components/dashboard/requests/requests-table.tsx @@ -92,7 +92,7 @@ export const RequestsTable = () => { pageSize: 10, }); - const { data: statsLogs, isLoading } = api.settings.readStatsLogs.useQuery( + const { data: statsLogs } = api.settings.readStatsLogs.useQuery( { sort: sorting[0], page: pagination, @@ -300,7 +300,7 @@ export const RequestsTable = () => {
setSelectedRow(undefined)} + onOpenChange={(_open) => setSelectedRow(undefined)} > diff --git a/apps/dokploy/components/dashboard/requests/show-requests.tsx b/apps/dokploy/components/dashboard/requests/show-requests.tsx index 05ba6e51..c3d92dd6 100644 --- a/apps/dokploy/components/dashboard/requests/show-requests.tsx +++ b/apps/dokploy/components/dashboard/requests/show-requests.tsx @@ -11,7 +11,6 @@ import { import { type RouterOutputs, api } from "@/utils/api"; import { ArrowDownUp } from "lucide-react"; import Link from "next/link"; -import * as React from "react"; import { toast } from "sonner"; import { RequestDistributionChart } from "./request-distribution-chart"; import { RequestsTable } from "./requests-table"; diff --git a/apps/dokploy/components/dashboard/search-command.tsx b/apps/dokploy/components/dashboard/search-command.tsx index 4d3c75f9..b3670303 100644 --- a/apps/dokploy/components/dashboard/search-command.tsx +++ b/apps/dokploy/components/dashboard/search-command.tsx @@ -7,9 +7,7 @@ import { PostgresqlIcon, RedisIcon, } from "@/components/icons/data-tools-icons"; -import { Badge } from "@/components/ui/badge"; import { - Command, CommandDialog, CommandEmpty, CommandGroup, @@ -18,26 +16,26 @@ import { CommandList, CommandSeparator, } from "@/components/ui/command"; +import { authClient } from "@/lib/auth-client"; import { type Services, extractServices, } from "@/pages/dashboard/project/[projectId]"; import { api } from "@/utils/api"; -import type { findProjectById } from "@dokploy/server/services/project"; import { BookIcon, CircuitBoard, GlobeIcon } from "lucide-react"; import { useRouter } from "next/router"; import React from "react"; import { StatusTooltip } from "../shared/status-tooltip"; -type Project = Awaited>; - export const SearchCommand = () => { const router = useRouter(); const [open, setOpen] = React.useState(false); const [search, setSearch] = React.useState(""); - - const { data } = api.project.all.useQuery(); - const { data: isCloud, isLoading } = api.settings.isCloud.useQuery(); + const { data: session } = authClient.useSession(); + const { data } = api.project.all.useQuery(undefined, { + enabled: !!session, + }); + const { data: isCloud } = api.settings.isCloud.useQuery(); React.useEffect(() => { const down = (e: KeyboardEvent) => { diff --git a/apps/dokploy/components/dashboard/settings/api/add-api-key.tsx b/apps/dokploy/components/dashboard/settings/api/add-api-key.tsx new file mode 100644 index 00000000..a82a9b35 --- /dev/null +++ b/apps/dokploy/components/dashboard/settings/api/add-api-key.tsx @@ -0,0 +1,468 @@ +import { Button } from "@/components/ui/button"; +import { api } from "@/utils/api"; +import { toast } from "sonner"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogTrigger, + DialogDescription, +} from "@/components/ui/dialog"; +import { Input } from "@/components/ui/input"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { useState } from "react"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { z } from "zod"; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, + FormDescription, +} from "@/components/ui/form"; +import { Switch } from "@/components/ui/switch"; + +const formSchema = z.object({ + name: z.string().min(1, "Name is required"), + prefix: z.string().optional(), + expiresIn: z.number().nullable(), + organizationId: z.string().min(1, "Organization is required"), + // Rate limiting fields + rateLimitEnabled: z.boolean().optional(), + rateLimitTimeWindow: z.number().nullable(), + rateLimitMax: z.number().nullable(), + // Request limiting fields + remaining: z.number().nullable().optional(), + refillAmount: z.number().nullable().optional(), + refillInterval: z.number().nullable().optional(), +}); + +type FormValues = z.infer; + +const EXPIRATION_OPTIONS = [ + { label: "Never", value: "0" }, + { label: "1 day", value: String(60 * 60 * 24) }, + { label: "7 days", value: String(60 * 60 * 24 * 7) }, + { label: "30 days", value: String(60 * 60 * 24 * 30) }, + { label: "90 days", value: String(60 * 60 * 24 * 90) }, + { label: "1 year", value: String(60 * 60 * 24 * 365) }, +]; + +const TIME_WINDOW_OPTIONS = [ + { label: "1 minute", value: String(60 * 1000) }, + { label: "5 minutes", value: String(5 * 60 * 1000) }, + { label: "15 minutes", value: String(15 * 60 * 1000) }, + { label: "30 minutes", value: String(30 * 60 * 1000) }, + { label: "1 hour", value: String(60 * 60 * 1000) }, + { label: "1 day", value: String(24 * 60 * 60 * 1000) }, +]; + +const REFILL_INTERVAL_OPTIONS = [ + { label: "1 hour", value: String(60 * 60 * 1000) }, + { label: "6 hours", value: String(6 * 60 * 60 * 1000) }, + { label: "12 hours", value: String(12 * 60 * 60 * 1000) }, + { label: "1 day", value: String(24 * 60 * 60 * 1000) }, + { label: "7 days", value: String(7 * 24 * 60 * 60 * 1000) }, + { label: "30 days", value: String(30 * 24 * 60 * 60 * 1000) }, +]; + +export const AddApiKey = () => { + const [open, setOpen] = useState(false); + const [showSuccessModal, setShowSuccessModal] = useState(false); + const [newApiKey, setNewApiKey] = useState(""); + const { refetch } = api.user.get.useQuery(); + const { data: organizations } = api.organization.all.useQuery(); + const createApiKey = api.user.createApiKey.useMutation({ + onSuccess: (data) => { + if (!data) return; + + setNewApiKey(data.key); + setOpen(false); + setShowSuccessModal(true); + form.reset(); + void refetch(); + }, + onError: () => { + toast.error("Failed to generate API key"); + }, + }); + + const form = useForm({ + resolver: zodResolver(formSchema), + defaultValues: { + name: "", + prefix: "", + expiresIn: null, + organizationId: "", + rateLimitEnabled: false, + rateLimitTimeWindow: null, + rateLimitMax: null, + remaining: null, + refillAmount: null, + refillInterval: null, + }, + }); + + const rateLimitEnabled = form.watch("rateLimitEnabled"); + + const onSubmit = async (values: FormValues) => { + createApiKey.mutate({ + name: values.name, + expiresIn: values.expiresIn || undefined, + prefix: values.prefix || undefined, + metadata: { + organizationId: values.organizationId, + }, + // Rate limiting + rateLimitEnabled: values.rateLimitEnabled, + rateLimitTimeWindow: values.rateLimitTimeWindow || undefined, + rateLimitMax: values.rateLimitMax || undefined, + // Request limiting + remaining: values.remaining || undefined, + refillAmount: values.refillAmount || undefined, + refillInterval: values.refillInterval || undefined, + }); + }; + + return ( + <> + + + + + + + Generate API Key + + Create a new API key for accessing the API. You can set an + expiration date and a custom prefix for better organization. + + +
+ + ( + + Name + + + + + + )} + /> + ( + + Prefix + + + + + + )} + /> + ( + + Expiration + + + + )} + /> + ( + + Organization + + + + )} + /> + + {/* Rate Limiting Section */} +
+

Rate Limiting

+ ( + +
+ Enable Rate Limiting + + Limit the number of requests within a time window + +
+ + + +
+ )} + /> + + {rateLimitEnabled && ( + <> + ( + + Time Window + + + The duration in which requests are counted + + + + )} + /> + ( + + Maximum Requests + + + field.onChange( + e.target.value + ? Number.parseInt(e.target.value, 10) + : null, + ) + } + /> + + + Maximum number of requests allowed within the time + window + + + + )} + /> + + )} +
+ + {/* Request Limiting Section */} +
+

Request Limiting

+ ( + + Total Request Limit + + + field.onChange( + e.target.value + ? Number.parseInt(e.target.value, 10) + : null, + ) + } + /> + + + Total number of requests allowed (leave empty for + unlimited) + + + + )} + /> + + ( + + Refill Amount + + + field.onChange( + e.target.value + ? Number.parseInt(e.target.value, 10) + : null, + ) + } + /> + + + Number of requests to add on each refill + + + + )} + /> + + ( + + Refill Interval + + + How often to refill the request limit + + + + )} + /> +
+ +
+ + +
+ + +
+
+ + + + + API Key Generated Successfully + + Please copy your API key now. You won't be able to see it again! + + +
+
+ {newApiKey} +
+
+ + +
+
+
+
+ + ); +}; diff --git a/apps/dokploy/components/dashboard/settings/api/show-api-keys.tsx b/apps/dokploy/components/dashboard/settings/api/show-api-keys.tsx new file mode 100644 index 00000000..6744f1de --- /dev/null +++ b/apps/dokploy/components/dashboard/settings/api/show-api-keys.tsx @@ -0,0 +1,142 @@ +import { Button } from "@/components/ui/button"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { api } from "@/utils/api"; +import { ExternalLinkIcon, KeyIcon, Trash2, Clock, Tag } from "lucide-react"; +import Link from "next/link"; +import { toast } from "sonner"; +import { formatDistanceToNow } from "date-fns"; +import { DialogAction } from "@/components/shared/dialog-action"; +import { AddApiKey } from "./add-api-key"; +import { Badge } from "@/components/ui/badge"; + +export const ShowApiKeys = () => { + const { data, refetch } = api.user.get.useQuery(); + const { mutateAsync: deleteApiKey, isLoading: isLoadingDelete } = + api.user.deleteApiKey.useMutation(); + + return ( +
+ +
+ +
+ + + API/CLI Keys + + + Generate and manage API keys to access the API/CLI + +
+
+ + Swagger API: + + + View + + +
+
+ +
+ {data?.user.apiKeys && data.user.apiKeys.length > 0 ? ( + data.user.apiKeys.map((apiKey) => ( +
+
+
+ {apiKey.name} +
+ + + Created{" "} + {formatDistanceToNow(new Date(apiKey.createdAt))}{" "} + ago + + {apiKey.prefix && ( + + + {apiKey.prefix} + + )} + {apiKey.expiresAt && ( + + + Expires in{" "} + {formatDistanceToNow( + new Date(apiKey.expiresAt), + )}{" "} + + )} +
+
+ { + try { + await deleteApiKey({ + apiKeyId: apiKey.id, + }); + await refetch(); + toast.success("API key deleted successfully"); + } catch (error) { + toast.error( + error instanceof Error + ? error.message + : "Error deleting API key", + ); + } + }} + > + + +
+
+ )) + ) : ( +
+ + + No API keys found + +
+ )} +
+ + {/* Generate new API key */} +
+ +
+
+
+
+
+ ); +}; diff --git a/apps/dokploy/components/dashboard/settings/billing/show-billing.tsx b/apps/dokploy/components/dashboard/settings/billing/show-billing.tsx index 9f3430de..2c20bb81 100644 --- a/apps/dokploy/components/dashboard/settings/billing/show-billing.tsx +++ b/apps/dokploy/components/dashboard/settings/billing/show-billing.tsx @@ -23,7 +23,7 @@ import { PlusIcon, } from "lucide-react"; import Link from "next/link"; -import React, { useState } from "react"; +import { useState } from "react"; const stripePromise = loadStripe( process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY!, @@ -38,8 +38,8 @@ export const calculatePrice = (count: number, isAnnual = false) => { return count * 3.5; }; export const ShowBilling = () => { - const { data: servers } = api.server.all.useQuery(undefined); - const { data: admin } = api.admin.one.useQuery(); + const { data: servers } = api.server.count.useQuery(); + const { data: admin } = api.user.get.useQuery(); const { data, isLoading } = api.stripe.getProducts.useQuery(); const { mutateAsync: createCheckoutSession } = api.stripe.createCheckoutSession.useMutation(); @@ -70,8 +70,8 @@ export const ShowBilling = () => { return isAnnual ? interval === "year" : interval === "month"; }); - const maxServers = admin?.serversQuantity ?? 1; - const percentage = ((servers?.length ?? 0) / maxServers) * 100; + const maxServers = admin?.user.serversQuantity ?? 1; + const percentage = ((servers ?? 0) / maxServers) * 100; const safePercentage = Math.min(percentage, 100); return ( @@ -98,17 +98,17 @@ export const ShowBilling = () => { Annual - {admin?.stripeSubscriptionId && ( + {admin?.user.stripeSubscriptionId && (

Servers Plan

- You have {servers?.length} server on your plan of{" "} - {admin?.serversQuantity} servers + You have {servers} server on your plan of{" "} + {admin?.user.serversQuantity} servers

- {admin && admin.serversQuantity! <= servers?.length! && ( + {admin && admin.user.serversQuantity! <= (servers ?? 0) && (
@@ -279,7 +279,7 @@ export const ShowBilling = () => { "flex flex-row items-center gap-2 mt-4", )} > - {admin?.stripeCustomerId && ( + {admin?.user.stripeCustomerId && (
@@ -980,6 +1035,7 @@ export const HandleNotifications = ({ notificationId }: Props) => { await testTelegramConnection({ botToken: form.getValues("botToken"), chatId: form.getValues("chatId"), + messageThreadId: form.getValues("messageThreadId") || "", }); } else if (type === "discord") { await testDiscordConnection({ @@ -1004,7 +1060,7 @@ export const HandleNotifications = ({ notificationId }: Props) => { }); } toast.success("Connection Success"); - } catch (err) { + } catch (_err) { toast.error("Error testing the provider"); } }} diff --git a/apps/dokploy/components/dashboard/settings/notifications/show-notifications.tsx b/apps/dokploy/components/dashboard/settings/notifications/show-notifications.tsx index 77fb8858..782b9241 100644 --- a/apps/dokploy/components/dashboard/settings/notifications/show-notifications.tsx +++ b/apps/dokploy/components/dashboard/settings/notifications/show-notifications.tsx @@ -47,7 +47,7 @@ export const ShowNotifications = () => { {data?.length === 0 ? (
- + To send notifications it is required to set at least 1 provider. @@ -56,7 +56,7 @@ export const ShowNotifications = () => { ) : (
- {data?.map((notification, index) => ( + {data?.map((notification, _index) => (
; export const Disable2FA = () => { const utils = api.useUtils(); - const { mutateAsync, isLoading } = api.auth.disable2FA.useMutation(); + const [isOpen, setIsOpen] = useState(false); + const [isLoading, setIsLoading] = useState(false); + + const form = useForm({ + resolver: zodResolver(PasswordSchema), + defaultValues: { + password: "", + }, + }); + + const handleSubmit = async (formData: PasswordForm) => { + setIsLoading(true); + try { + const result = await authClient.twoFactor.disable({ + password: formData.password, + }); + + if (result.error) { + form.setError("password", { + message: result.error.message, + }); + toast.error(result.error.message); + return; + } + + toast.success("2FA disabled successfully"); + utils.user.get.invalidate(); + setIsOpen(false); + } catch (_error) { + form.setError("password", { + message: "Connection error. Please try again.", + }); + toast.error("Connection error. Please try again."); + } finally { + setIsLoading(false); + } + }; + return ( - + - + Are you absolutely sure? - This action cannot be undone. This will permanently delete the 2FA + This action cannot be undone. This will permanently disable + Two-Factor Authentication for your account. - - Cancel - { - await mutateAsync() - .then(() => { - utils.auth.get.invalidate(); - toast.success("2FA Disabled"); - }) - .catch(() => { - toast.error("Error disabling 2FA"); - }); - }} + +
+ - Confirm - - + ( + + Password + + + + + Enter your password to disable 2FA + + + + )} + /> +
+ + +
+ +
); diff --git a/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx b/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx index cf5910b8..f47c8d9c 100644 --- a/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx +++ b/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx @@ -3,7 +3,6 @@ import { Dialog, DialogContent, DialogDescription, - DialogFooter, DialogHeader, DialogTitle, DialogTrigger, @@ -17,144 +16,309 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; import { InputOTP, InputOTPGroup, InputOTPSlot, } from "@/components/ui/input-otp"; +import { authClient } from "@/lib/auth-client"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; -import { AlertTriangle, Fingerprint } from "lucide-react"; -import { useEffect } from "react"; +import { Fingerprint, QrCode } from "lucide-react"; +import QRCode from "qrcode"; +import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; -const Enable2FASchema = z.object({ +const PasswordSchema = z.object({ + password: z.string().min(8, { + message: "Password is required", + }), +}); + +const PinSchema = z.object({ pin: z.string().min(6, { message: "Pin is required", }), }); -type Enable2FA = z.infer; +type TwoFactorSetupData = { + qrCodeUrl: string; + secret: string; + totpURI: string; +}; + +type PasswordForm = z.infer; +type PinForm = z.infer; export const Enable2FA = () => { const utils = api.useUtils(); + const [data, setData] = useState(null); + const [backupCodes, setBackupCodes] = useState([]); + const [isDialogOpen, setIsDialogOpen] = useState(false); + const [step, setStep] = useState<"password" | "verify">("password"); + const [isPasswordLoading, setIsPasswordLoading] = useState(false); - const { data } = api.auth.generate2FASecret.useQuery(undefined, { - refetchOnWindowFocus: false, + const handlePasswordSubmit = async (formData: PasswordForm) => { + setIsPasswordLoading(true); + try { + const { data: enableData } = await authClient.twoFactor.enable({ + password: formData.password, + }); + + if (!enableData) { + throw new Error("No data received from server"); + } + + if (enableData.backupCodes) { + setBackupCodes(enableData.backupCodes); + } + + if (enableData.totpURI) { + const qrCodeUrl = await QRCode.toDataURL(enableData.totpURI); + + setData({ + qrCodeUrl, + secret: enableData.totpURI.split("secret=")[1]?.split("&")[0] || "", + totpURI: enableData.totpURI, + }); + + setStep("verify"); + toast.success("Scan the QR code with your authenticator app"); + } else { + throw new Error("No TOTP URI received from server"); + } + } catch (error) { + toast.error( + error instanceof Error ? error.message : "Error setting up 2FA", + ); + passwordForm.setError("password", { + message: "Error verifying password", + }); + } finally { + setIsPasswordLoading(false); + } + }; + + const handleVerifySubmit = async (formData: PinForm) => { + try { + const result = await authClient.twoFactor.verifyTotp({ + code: formData.pin, + }); + + if (result.error) { + if (result.error.code === "INVALID_TWO_FACTOR_AUTHENTICATION") { + pinForm.setError("pin", { + message: "Invalid code. Please try again.", + }); + toast.error("Invalid verification code"); + return; + } + + throw result.error; + } + + if (!result.data) { + throw new Error("No response received from server"); + } + + toast.success("2FA configured successfully"); + utils.user.get.invalidate(); + setIsDialogOpen(false); + } catch (error) { + if (error instanceof Error) { + const errorMessage = + error.message === "Failed to fetch" + ? "Connection error. Please check your internet connection." + : error.message; + + pinForm.setError("pin", { + message: errorMessage, + }); + toast.error(errorMessage); + } else { + pinForm.setError("pin", { + message: "Error verifying code", + }); + toast.error("Error verifying 2FA code"); + } + } + }; + + const passwordForm = useForm({ + resolver: zodResolver(PasswordSchema), + defaultValues: { + password: "", + }, }); - const { mutateAsync, isLoading, error, isError } = - api.auth.verify2FASetup.useMutation(); - - const form = useForm({ + const pinForm = useForm({ + resolver: zodResolver(PinSchema), defaultValues: { pin: "", }, - resolver: zodResolver(Enable2FASchema), }); useEffect(() => { - form.reset({ - pin: "", - }); - }, [form, form.reset, form.formState.isSubmitSuccessful]); + if (!isDialogOpen) { + setStep("password"); + setData(null); + setBackupCodes([]); + passwordForm.reset(); + pinForm.reset(); + } + }, [isDialogOpen, passwordForm, pinForm]); - const onSubmit = async (formData: Enable2FA) => { - await mutateAsync({ - pin: formData.pin, - secret: data?.secret || "", - }) - .then(async () => { - toast.success("2FA Verified"); - utils.auth.get.invalidate(); - }) - .catch(() => { - toast.error("Error verifying the 2FA"); - }); - }; return ( - + - + 2FA Setup - Add a 2FA to your account + + {step === "password" + ? "Enter your password to begin 2FA setup" + : "Scan the QR code and verify with your authenticator app"} + - {isError && ( -
- - - {error?.message} - -
- )} -
- -
- - {data?.qrCodeUrl ? "Scan the QR code to add 2FA" : ""} - - qrCode -
- - {data?.secret ? `Secret: ${data?.secret}` : ""} - -
-
- ( - - Pin - - - - - - - - - - - - - - Please enter the 6 digits code provided by your - authenticator app. - - - - )} - /> - - - - - - + ( + + Password + + + + + Enter your password to enable 2FA + + + + )} + /> + + + + ) : ( +
+ +
+ {data?.qrCodeUrl ? ( + <> +
+ + + Scan this QR code with your authenticator app + + 2FA QR Code +
+ + Can't scan the QR code? + + + {data.secret} + +
+
+ + {backupCodes && backupCodes.length > 0 && ( +
+

Backup Codes

+
+ {backupCodes.map((code, index) => ( + + {code} + + ))} +
+

+ Save these backup codes in a secure place. You can use + them to access your account if you lose access to your + authenticator device. +

+
+ )} + + ) : ( +
+ +
+ )} +
+ + ( + + Verification Code + + + + + + + + + + + + + + Enter the 6-digit code from your authenticator app + + + + )} + /> + + + + + )}
); diff --git a/apps/dokploy/components/dashboard/settings/profile/generate-token.tsx b/apps/dokploy/components/dashboard/settings/profile/generate-token.tsx deleted file mode 100644 index 66486c33..00000000 --- a/apps/dokploy/components/dashboard/settings/profile/generate-token.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import { ToggleVisibilityInput } from "@/components/shared/toggle-visibility-input"; -import { Button } from "@/components/ui/button"; -import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from "@/components/ui/card"; -import { Label } from "@/components/ui/label"; -import { api } from "@/utils/api"; -import { ExternalLinkIcon } from "lucide-react"; -import Link from "next/link"; -import { toast } from "sonner"; - -export const GenerateToken = () => { - const { data, refetch } = api.auth.get.useQuery(); - - const { mutateAsync: generateToken, isLoading: isLoadingToken } = - api.auth.generateToken.useMutation(); - - return ( -
- -
- -
- API/CLI - - Generate a token to access the API/CLI - -
-
- - Swagger API: - - - View - - -
-
- -
-
-
- - -
-
- -
-
-
-
-
- ); -}; diff --git a/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx b/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx index 9ae140c6..32179378 100644 --- a/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx +++ b/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx @@ -54,13 +54,14 @@ const randomImages = [ ]; export const ProfileForm = () => { - const { data, refetch, isLoading } = api.auth.get.useQuery(); + const _utils = api.useUtils(); + const { data, refetch, isLoading } = api.user.get.useQuery(); const { mutateAsync, isLoading: isUpdating, isError, error, - } = api.auth.update.useMutation(); + } = api.user.update.useMutation(); const { t } = useTranslation("settings"); const [gravatarHash, setGravatarHash] = useState(null); @@ -73,9 +74,9 @@ export const ProfileForm = () => { const form = useForm({ defaultValues: { - email: data?.email || "", + email: data?.user?.email || "", password: "", - image: data?.image || "", + image: data?.user?.image || "", currentPassword: "", }, resolver: zodResolver(profileSchema), @@ -84,14 +85,14 @@ export const ProfileForm = () => { useEffect(() => { if (data) { form.reset({ - email: data?.email || "", + email: data?.user?.email || "", password: "", - image: data?.image || "", + image: data?.user?.image || "", currentPassword: "", }); - if (data.email) { - generateSHA256Hash(data.email).then((hash) => { + if (data.user.email) { + generateSHA256Hash(data.user.email).then((hash) => { setGravatarHash(hash); }); } @@ -102,9 +103,9 @@ export const ProfileForm = () => { const onSubmit = async (values: Profile) => { await mutateAsync({ email: values.email.toLowerCase(), - password: values.password, + password: values.password || undefined, image: values.image, - currentPassword: values.currentPassword, + currentPassword: values.currentPassword || undefined, }) .then(async () => { await refetch(); @@ -130,7 +131,7 @@ export const ProfileForm = () => { {t("settings.profile.description")}
- {!data?.is2FAEnabled ? : } + {!data?.user.twoFactorEnabled ? : } diff --git a/apps/dokploy/components/dashboard/settings/profile/remove-self-account.tsx b/apps/dokploy/components/dashboard/settings/profile/remove-self-account.tsx deleted file mode 100644 index cff9db54..00000000 --- a/apps/dokploy/components/dashboard/settings/profile/remove-self-account.tsx +++ /dev/null @@ -1,138 +0,0 @@ -import { AlertBlock } from "@/components/shared/alert-block"; -import { DialogAction } from "@/components/shared/dialog-action"; -import { Button } from "@/components/ui/button"; -import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from "@/components/ui/card"; -import { - Form, - FormControl, - FormField, - FormItem, - FormLabel, - FormMessage, -} from "@/components/ui/form"; -import { Input } from "@/components/ui/input"; -import { api } from "@/utils/api"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { useTranslation } from "next-i18next"; -import { useRouter } from "next/router"; -import { useEffect } from "react"; -import { useForm } from "react-hook-form"; -import { toast } from "sonner"; -import { z } from "zod"; - -const profileSchema = z.object({ - password: z.string().min(1, { - message: "Password is required", - }), -}); - -type Profile = z.infer; - -export const RemoveSelfAccount = () => { - const { data } = api.auth.get.useQuery(); - const { mutateAsync, isLoading, error, isError } = - api.auth.removeSelfAccount.useMutation(); - const { t } = useTranslation("settings"); - const router = useRouter(); - - const form = useForm({ - defaultValues: { - password: "", - }, - resolver: zodResolver(profileSchema), - }); - - useEffect(() => { - if (data) { - form.reset({ - password: "", - }); - } - form.reset(); - }, [form, form.reset, data]); - - const onSubmit = async (values: Profile) => { - await mutateAsync({ - password: values.password, - }) - .then(async () => { - toast.success("Profile Deleted"); - router.push("/"); - }) - .catch(() => {}); - }; - - return ( -
- -
- -
- Remove Self Account - - If you want to remove your account, you can do it here - -
-
- - {isError && {error?.message}} - -
- e.preventDefault()} - onKeyDown={(e) => { - if (e.key === "Enter") { - e.preventDefault(); - } - }} - className="grid gap-4" - > -
- ( - - {t("settings.profile.password")} - - - - - - )} - /> -
-
- -
- form.handleSubmit(onSubmit)()} - > - - -
-
-
-
-
- ); -}; diff --git a/apps/dokploy/components/dashboard/settings/servers/actions/show-dokploy-actions.tsx b/apps/dokploy/components/dashboard/settings/servers/actions/show-dokploy-actions.tsx index 3a1af206..f57dad3c 100644 --- a/apps/dokploy/components/dashboard/settings/servers/actions/show-dokploy-actions.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/actions/show-dokploy-actions.tsx @@ -1,5 +1,4 @@ import { Button } from "@/components/ui/button"; -import React from "react"; import { UpdateServerIp } from "@/components/dashboard/settings/web-server/update-server-ip"; import { diff --git a/apps/dokploy/components/dashboard/settings/servers/actions/show-storage-actions.tsx b/apps/dokploy/components/dashboard/settings/servers/actions/show-storage-actions.tsx index c45c0c8b..3492ba7c 100644 --- a/apps/dokploy/components/dashboard/settings/servers/actions/show-storage-actions.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/actions/show-storage-actions.tsx @@ -1,5 +1,4 @@ import { Button } from "@/components/ui/button"; -import React from "react"; import { DropdownMenu, @@ -27,7 +26,7 @@ export const ShowStorageActions = ({ serverId }: Props) => { isLoading: cleanDockerBuilderIsLoading, } = api.settings.cleanDockerBuilder.useMutation(); - const { mutateAsync: cleanMonitoring, isLoading: cleanMonitoringIsLoading } = + const { mutateAsync: cleanMonitoring } = api.settings.cleanMonitoring.useMutation(); const { mutateAsync: cleanUnusedImages, diff --git a/apps/dokploy/components/dashboard/settings/servers/actions/show-traefik-actions.tsx b/apps/dokploy/components/dashboard/settings/servers/actions/show-traefik-actions.tsx index 17a6ae75..0968931d 100644 --- a/apps/dokploy/components/dashboard/settings/servers/actions/show-traefik-actions.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/actions/show-traefik-actions.tsx @@ -1,14 +1,4 @@ import { Button } from "@/components/ui/button"; -import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from "@/components/ui/card"; -import { Label } from "@/components/ui/label"; -import { Switch } from "@/components/ui/switch"; -import React from "react"; import { DropdownMenu, @@ -20,10 +10,8 @@ import { DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { api } from "@/utils/api"; -import { toast } from "sonner"; - -import { cn } from "@/lib/utils"; import { useTranslation } from "next-i18next"; +import { toast } from "sonner"; import { EditTraefikEnv } from "../../web-server/edit-traefik-env"; import { ManageTraefikPorts } from "../../web-server/manage-traefik-ports"; import { ShowModalLogs } from "../../web-server/show-modal-logs"; diff --git a/apps/dokploy/components/dashboard/settings/servers/actions/toggle-docker-cleanup.tsx b/apps/dokploy/components/dashboard/settings/servers/actions/toggle-docker-cleanup.tsx index 78ad1236..12e27942 100644 --- a/apps/dokploy/components/dashboard/settings/servers/actions/toggle-docker-cleanup.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/actions/toggle-docker-cleanup.tsx @@ -7,7 +7,7 @@ interface Props { serverId?: string; } export const ToggleDockerCleanup = ({ serverId }: Props) => { - const { data, refetch } = api.admin.one.useQuery(undefined, { + const { data, refetch } = api.user.get.useQuery(undefined, { enabled: !serverId, }); @@ -20,7 +20,7 @@ export const ToggleDockerCleanup = ({ serverId }: Props) => { }, ); - const enabled = data?.enableDockerCleanup || server?.enableDockerCleanup; + const enabled = data?.user.enableDockerCleanup || server?.enableDockerCleanup; const { mutateAsync } = api.settings.updateDockerCleanup.useMutation(); @@ -36,7 +36,7 @@ export const ToggleDockerCleanup = ({ serverId }: Props) => { await refetch(); } toast.success("Docker Cleanup updated"); - } catch (error) { + } catch (_error) { toast.error("Docker Cleanup Error"); } }; diff --git a/apps/dokploy/components/dashboard/settings/servers/edit-script.tsx b/apps/dokploy/components/dashboard/settings/servers/edit-script.tsx index 0a22220e..6225ee77 100644 --- a/apps/dokploy/components/dashboard/settings/servers/edit-script.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/edit-script.tsx @@ -82,7 +82,7 @@ export const EditScript = ({ serverId }: Props) => { command: formData.command || "", serverId, }) - .then((data) => { + .then((_data) => { toast.success("Script modified successfully"); }) .catch(() => { diff --git a/apps/dokploy/components/dashboard/settings/servers/gpu-support.tsx b/apps/dokploy/components/dashboard/settings/servers/gpu-support.tsx index 3cda7e80..c24440a6 100644 --- a/apps/dokploy/components/dashboard/settings/servers/gpu-support.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/gpu-support.tsx @@ -9,7 +9,6 @@ import { CardTitle, } from "@/components/ui/card"; import { api } from "@/utils/api"; -import { TRPCClientError } from "@trpc/client"; import { CheckCircle2, Cpu, Loader2, RefreshCw, XCircle } from "lucide-react"; import { useEffect, useState } from "react"; import { toast } from "sonner"; @@ -57,7 +56,7 @@ export function GPUSupport({ serverId }: GPUSupportProps) { try { await utils.settings.checkGPUStatus.invalidate({ serverId }); await refetch(); - } catch (error) { + } catch (_error) { toast.error("Failed to refresh GPU status"); } finally { setIsRefreshing(false); @@ -75,7 +74,7 @@ export function GPUSupport({ serverId }: GPUSupportProps) { try { await setupGPU.mutateAsync({ serverId }); - } catch (error) { + } catch (_error) { // Error handling is done in mutation's onError } }; diff --git a/apps/dokploy/components/dashboard/settings/servers/handle-servers.tsx b/apps/dokploy/components/dashboard/settings/servers/handle-servers.tsx index be71d836..97994145 100644 --- a/apps/dokploy/components/dashboard/settings/servers/handle-servers.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/handle-servers.tsx @@ -118,7 +118,7 @@ export const HandleServers = ({ serverId }: Props) => { sshKeyId: data.sshKeyId || "", serverId: serverId || "", }) - .then(async (data) => { + .then(async (_data) => { await utils.server.all.invalidate(); refetchServer(); toast.success(serverId ? "Server Updated" : "Server Created"); diff --git a/apps/dokploy/components/dashboard/settings/servers/security-audit.tsx b/apps/dokploy/components/dashboard/settings/servers/security-audit.tsx index 475f2b8f..8cce306a 100644 --- a/apps/dokploy/components/dashboard/settings/servers/security-audit.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/security-audit.tsx @@ -25,7 +25,7 @@ export const SecurityAudit = ({ serverId }: Props) => { enabled: !!serverId, }, ); - const utils = api.useUtils(); + const _utils = api.useUtils(); return (
@@ -145,15 +145,6 @@ export const SecurityAudit = ({ serverId }: Props) => { : "Enabled (Password Authentication should be disabled)" } /> - ; + +export const SetupMonitoring = ({ serverId }: Props) => { + const { data } = serverId + ? api.server.one.useQuery( + { + serverId: serverId || "", + }, + { + enabled: !!serverId, + }, + ) + : api.user.getServerMetrics.useQuery(); + + const url = useUrl(); + + const { data: projects } = api.project.all.useQuery(); + + const extractServicesFromProjects = (projects: any[] | undefined) => { + if (!projects) return []; + + const allServices = projects.flatMap((project) => { + const services = extractServices(project); + return serverId + ? services + .filter((service) => service.serverId === serverId) + .map((service) => service.appName) + : services.map((service) => service.appName); + }); + + return [...new Set(allServices)]; + }; + + const services = extractServicesFromProjects(projects); + + const form = useForm({ + resolver: zodResolver(Schema), + defaultValues: { + metricsConfig: { + server: { + refreshRate: 20, + port: 4500, + token: "", + urlCallback: `${url}/api/trpc/notification.receiveNotification`, + retentionDays: 7, + thresholds: { + cpu: 0, + memory: 0, + }, + cronJob: "", + }, + containers: { + refreshRate: 20, + services: { + include: [], + exclude: [], + }, + }, + }, + }, + }); + + useEffect(() => { + if (data) { + form.reset({ + metricsConfig: { + server: { + refreshRate: data?.metricsConfig?.server?.refreshRate, + port: data?.metricsConfig?.server?.port, + token: data?.metricsConfig?.server?.token || generateToken(), + urlCallback: + data?.metricsConfig?.server?.urlCallback || + `${url}/api/trpc/notification.receiveNotification`, + retentionDays: data?.metricsConfig?.server?.retentionDays || 5, + thresholds: { + cpu: data?.metricsConfig?.server?.thresholds?.cpu, + memory: data?.metricsConfig?.server?.thresholds?.memory, + }, + cronJob: data?.metricsConfig?.server?.cronJob || "0 0 * * *", + }, + containers: { + refreshRate: data?.metricsConfig?.containers?.refreshRate, + services: { + include: data?.metricsConfig?.containers?.services?.include, + exclude: data?.metricsConfig?.containers?.services?.exclude, + }, + }, + }, + }); + } + }, [data, url]); + + const [search, setSearch] = useState(""); + const [searchExclude, setSearchExclude] = useState(""); + const [showToken, setShowToken] = useState(false); + + const availableServices = services?.filter( + (service) => + !form + .watch("metricsConfig.containers.services.include") + ?.some((s) => s === service) && + !form + .watch("metricsConfig.containers.services.exclude") + ?.includes(service) && + service.toLowerCase().includes(search.toLowerCase()), + ); + + const availableServicesToExclude = [ + ...(services?.filter( + (service) => + !form + .watch("metricsConfig.containers.services.exclude") + ?.includes(service) && + !form + .watch("metricsConfig.containers.services.include") + ?.some((s) => s === service) && + service.toLowerCase().includes(searchExclude.toLowerCase()), + ) ?? []), + ...(!form.watch("metricsConfig.containers.services.exclude")?.includes("*") + ? ["*"] + : []), + ]; + + const { mutateAsync } = serverId + ? api.server.setupMonitoring.useMutation() + : api.admin.setupMonitoring.useMutation(); + + const generateToken = () => { + const array = new Uint8Array(64); + crypto.getRandomValues(array); + return Array.from(array, (byte) => byte.toString(16).padStart(2, "0")).join( + "", + ); + }; + + const onSubmit = async (values: Schema) => { + await mutateAsync({ + serverId: serverId || "", + metricsConfig: values.metricsConfig, + }) + .then(() => { + toast.success("Server updated successfully"); + }) + .catch(() => { + toast.error("Error updating the server"); + }); + }; + + return ( + <> + + + + Monitoring + + + Monitor your servers and containers in realtime with notifications + when they reach their thresholds. + + + +
+ + + Using a lower refresh rate will make your CPU and memory usage + higher, we recommend 30-60 seconds + +
+ ( + + Server Refresh Rate + + + + + Please set the refresh rate for the server in seconds + + + + )} + /> + + ( + + Container Refresh Rate + + + + + Please set the refresh rate for the containers in seconds + + + + )} + /> + + ( + + Cron Job + + + + + Cron job for cleaning up metrics + + + + )} + /> + + ( + + Server Retention Days + + + + + Number of days to retain server metrics data + + + + )} + /> + ( + + Port + + + + + Please set the port for the metrics server + + + + )} + /> + ( + + Include Services + +
+
+ + + + + + + + {availableServices?.length === 0 ? ( +
+ No services available. +
+ ) : ( + <> + + No service found. + + + {availableServices?.map((service) => ( + { + field.onChange([ + ...(field.value ?? []), + service, + ]); + setSearch(""); + }} + > + {service} + + ))} + + + )} +
+
+
+
+
+ {field.value?.map((service) => ( + + {service} + + + ))} + + Services to monitor. + +
+
+
+ +
+ )} + /> + + ( + + Exclude Services + +
+
+ + + + + + + + {availableServicesToExclude?.length === 0 ? ( +
+ No services available. +
+ ) : ( + <> + + No service found. + + + {availableServicesToExclude.map( + (service) => ( + { + field.onChange([ + ...(field.value ?? []), + service, + ]); + setSearchExclude(""); + }} + > + {service} + + ), + )} + + + )} +
+
+
+
+
+ {field.value?.map((service, index) => ( + + {service} + + + ))} + + Services to exclude from monitoring + +
+
+
+ + +
+ )} + /> + + ( + + CPU Threshold (%) + + + + + Alert when CPU usage exceeds this percentage + + + + )} + /> + + ( + + Memory Threshold (%) + + + + + Alert when memory usage exceeds this percentage + + + + )} + /> + + ( + + Metrics Token + +
+
+ + +
+ +
+
+ + Token for authenticating metrics requests + + +
+ )} + /> + + ( + + Metrics Callback URL + + + + + URL where metrics will be sent + + + + )} + /> +
+
+ +
+
+ +
+ + ); +}; diff --git a/apps/dokploy/components/dashboard/settings/servers/setup-server.tsx b/apps/dokploy/components/dashboard/settings/servers/setup-server.tsx index a96fac1f..751167a4 100644 --- a/apps/dokploy/components/dashboard/settings/servers/setup-server.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/setup-server.tsx @@ -19,6 +19,7 @@ import { } from "@/components/ui/dialog"; import { DropdownMenuItem } from "@/components/ui/dropdown-menu"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { cn } from "@/lib/utils"; import { api } from "@/utils/api"; import copy from "copy-to-clipboard"; import { CopyIcon, ExternalLinkIcon, ServerIcon } from "lucide-react"; @@ -30,6 +31,7 @@ import { type LogLine, parseLogs } from "../../docker/logs/utils"; import { EditScript } from "./edit-script"; import { GPUSupport } from "./gpu-support"; import { SecurityAudit } from "./security-audit"; +import { SetupMonitoring } from "./setup-monitoring"; import { ValidateServer } from "./validate-server"; interface Props { @@ -48,7 +50,7 @@ export const SetupServer = ({ serverId }: Props) => { ); const [activeLog, setActiveLog] = useState(null); - + const { data: isCloud } = api.settings.isCloud.useQuery(); const [isDrawerOpen, setIsDrawerOpen] = useState(false); const [filteredLogs, setFilteredLogs] = useState([]); const [isDeploying, setIsDeploying] = useState(false); @@ -112,11 +114,19 @@ export const SetupServer = ({ serverId }: Props) => { - + SSH Keys Deployments Validate Security + {isCloud && ( + Monitoring + )} GPU Setup {
+ +
+
+ +
+
+
{ + const [isOpen, setIsOpen] = useState(false); + + return ( + + + e.preventDefault()} + > + Show Monitoring + + + +
+ +
+
+
+ ); +}; diff --git a/apps/dokploy/components/dashboard/settings/servers/show-servers.tsx b/apps/dokploy/components/dashboard/settings/servers/show-servers.tsx index f3b0526b..3f3ff4e9 100644 --- a/apps/dokploy/components/dashboard/settings/servers/show-servers.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/show-servers.tsx @@ -38,6 +38,7 @@ import { ShowServerActions } from "./actions/show-server-actions"; import { HandleServers } from "./handle-servers"; import { SetupServer } from "./setup-server"; import { ShowDockerContainersModal } from "./show-docker-containers-modal"; +import { ShowMonitoringModal } from "./show-monitoring-modal"; import { ShowSwarmOverviewModal } from "./show-swarm-overview-modal"; import { ShowTraefikFileSystemModal } from "./show-traefik-file-system-modal"; import { WelcomeSuscription } from "./welcome-stripe/welcome-suscription"; @@ -314,6 +315,16 @@ export const ShowServers = () => { + {isCloud && ( + + )} + diff --git a/apps/dokploy/components/dashboard/settings/servers/show-swarm-overview-modal.tsx b/apps/dokploy/components/dashboard/settings/servers/show-swarm-overview-modal.tsx index a47005d0..b8631184 100644 --- a/apps/dokploy/components/dashboard/settings/servers/show-swarm-overview-modal.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/show-swarm-overview-modal.tsx @@ -1,12 +1,5 @@ -import { - Dialog, - DialogContent, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "@/components/ui/dialog"; +import { Dialog, DialogContent, DialogTrigger } from "@/components/ui/dialog"; import { DropdownMenuItem } from "@/components/ui/dropdown-menu"; -import { ContainerIcon } from "lucide-react"; import { useState } from "react"; import SwarmMonitorCard from "../../swarm/monitoring-card"; diff --git a/apps/dokploy/components/dashboard/settings/servers/validate-server.tsx b/apps/dokploy/components/dashboard/settings/servers/validate-server.tsx index db4f17b7..0632b97c 100644 --- a/apps/dokploy/components/dashboard/settings/servers/validate-server.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/validate-server.tsx @@ -25,7 +25,7 @@ export const ValidateServer = ({ serverId }: Props) => { enabled: !!serverId, }, ); - const utils = api.useUtils(); + const _utils = api.useUtils(); return (
diff --git a/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/create-server.tsx b/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/create-server.tsx index a025ad37..24d01553 100644 --- a/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/create-server.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/create-server.tsx @@ -52,10 +52,10 @@ interface Props { export const CreateServer = ({ stepper }: Props) => { const { data: sshKeys } = api.sshKey.all.useQuery(); - const [isOpen, setIsOpen] = useState(false); + const [isOpen, _setIsOpen] = useState(false); const { data: canCreateMoreServers, refetch } = api.stripe.canCreateMoreServers.useQuery(); - const { mutateAsync, error, isError } = api.server.create.useMutation(); + const { mutateAsync } = api.server.create.useMutation(); const cloudSSHKey = sshKeys?.find( (sshKey) => sshKey.name === "dokploy-cloud-ssh-key", ); @@ -96,7 +96,7 @@ export const CreateServer = ({ stepper }: Props) => { username: data.username || "root", sshKeyId: data.sshKeyId || "", }) - .then(async (data) => { + .then(async (_data) => { toast.success("Server Created"); stepper.next(); }) diff --git a/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/create-ssh-key.tsx b/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/create-ssh-key.tsx index 37f8e017..b1a3f2d0 100644 --- a/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/create-ssh-key.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/create-ssh-key.tsx @@ -35,6 +35,7 @@ export const CreateSSHKey = () => { description: "Used on Dokploy Cloud", privateKey: keys.privateKey, publicKey: keys.publicKey, + organizationId: "", }); await refetch(); } catch (error) { diff --git a/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/verify.tsx b/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/verify.tsx index fe8c36c2..f7c2a987 100644 --- a/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/verify.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/verify.tsx @@ -37,15 +37,6 @@ export const Verify = () => { ); const [isRefreshing, setIsRefreshing] = useState(false); - const { data: server } = api.server.one.useQuery( - { - serverId, - }, - { - enabled: !!serverId, - }, - ); - return (
diff --git a/apps/dokploy/components/dashboard/settings/ssh-keys/handle-ssh-keys.tsx b/apps/dokploy/components/dashboard/settings/ssh-keys/handle-ssh-keys.tsx index 04c471aa..d82a05b0 100644 --- a/apps/dokploy/components/dashboard/settings/ssh-keys/handle-ssh-keys.tsx +++ b/apps/dokploy/components/dashboard/settings/ssh-keys/handle-ssh-keys.tsx @@ -22,7 +22,7 @@ import { Textarea } from "@/components/ui/textarea"; import { sshKeyCreate, type sshKeyType } from "@/server/db/validations"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; -import { PenBoxIcon, PlusIcon } from "lucide-react"; +import { DownloadIcon, PenBoxIcon, PlusIcon } from "lucide-react"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; @@ -78,6 +78,7 @@ export const HandleSSHKeys = ({ sshKeyId }: Props) => { const onSubmit = async (data: SSHKey) => { await mutateAsync({ ...data, + organizationId: "", sshKeyId: sshKeyId || "", }) .then(async () => { @@ -111,6 +112,26 @@ export const HandleSSHKeys = ({ sshKeyId }: Props) => { toast.error("Error generating the SSH Key"); }); + const downloadKey = ( + content: string, + defaultFilename: string, + keyType: "private" | "public", + ) => { + const keyName = form.watch("name"); + const filename = keyName + ? `${keyName}${sshKeyId ? `_${sshKeyId}` : ""}_${keyType}_${defaultFilename}` + : `${keyType}_${defaultFilename}`; + const blob = new Blob([content], { type: "text/plain" }); + const url = window.URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + window.URL.revokeObjectURL(url); + }; + return ( @@ -244,7 +265,41 @@ export const HandleSSHKeys = ({ sshKeyId }: Props) => { )} /> - + +
+ {form.watch("privateKey") && ( + + )} + {form.watch("publicKey") && ( + + )} +
diff --git a/apps/dokploy/components/dashboard/settings/users/add-user.tsx b/apps/dokploy/components/dashboard/settings/users/add-invitation.tsx similarity index 52% rename from apps/dokploy/components/dashboard/settings/users/add-user.tsx rename to apps/dokploy/components/dashboard/settings/users/add-invitation.tsx index 8fb6de27..d05409fb 100644 --- a/apps/dokploy/components/dashboard/settings/users/add-user.tsx +++ b/apps/dokploy/components/dashboard/settings/users/add-invitation.tsx @@ -19,6 +19,14 @@ import { FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { authClient } from "@/lib/auth-client"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; import { PlusIcon } from "lucide-react"; @@ -27,62 +35,70 @@ import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; -const addUser = z.object({ +const addInvitation = z.object({ email: z .string() .min(1, "Email is required") .email({ message: "Invalid email" }), + role: z.enum(["member", "admin"]), }); -type AddUser = z.infer; +type AddInvitation = z.infer; -export const AddUser = () => { +export const AddInvitation = () => { const [open, setOpen] = useState(false); const utils = api.useUtils(); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const { data: activeOrganization } = authClient.useActiveOrganization(); - const { mutateAsync, isError, error, isLoading } = - api.admin.createUserInvitation.useMutation(); - - const form = useForm({ + const form = useForm({ defaultValues: { email: "", + role: "member", }, - resolver: zodResolver(addUser), + resolver: zodResolver(addInvitation), }); useEffect(() => { form.reset(); }, [form, form.formState.isSubmitSuccessful, form.reset]); - const onSubmit = async (data: AddUser) => { - await mutateAsync({ + const onSubmit = async (data: AddInvitation) => { + setIsLoading(true); + const result = await authClient.organization.inviteMember({ email: data.email.toLowerCase(), - }) - .then(async () => { - toast.success("Invitation created"); - await utils.user.all.invalidate(); - setOpen(false); - }) - .catch(() => { - toast.error("Error creating the invitation"); - }); + role: data.role, + organizationId: activeOrganization?.id, + }); + + if (result.error) { + setError(result.error.message || ""); + } else { + toast.success("Invitation created"); + setError(null); + setOpen(false); + } + + utils.organization.allInvitations.invalidate(); + setIsLoading(false); }; return ( - Add User + Add Invitation Invite a new user - {isError && {error?.message}} + {error && {error}}
@@ -104,10 +120,39 @@ export const AddUser = () => { ); }} /> + + { + return ( + + Role + + + Select the role for the new user + + + + ); + }} + /> + +
+ )} +
+ ))} + {(user?.role === "owner" || isCloud) && ( + <> + + + + )} + + + -
-

Dokploy

-

- {dokployVersion} -

-
- + {/* Notification Bell */} + + + + + + + Pending Invitations +
+ {invitations && invitations.length > 0 ? ( + invitations.map((invitation) => ( +
+ e.preventDefault()} + > +
+ {invitation?.organization?.name} +
+
+ Expires:{" "} + {new Date(invitation.expiresAt).toLocaleString()} +
+
+ Role: {invitation.role} +
+
+ { + const { error } = + await authClient.organization.acceptInvitation({ + invitationId: invitation.id, + }); + + if (error) { + toast.error( + error.message || "Error accepting invitation", + ); + } else { + toast.success("Invitation accepted successfully"); + await refetchInvitations(); + await refetch(); + } + }} + > + + +
+ )) + ) : ( + + No pending invitations + + )} +
+
+
+
+ + )} + ); } export default function Page({ children }: Props) { + const [defaultOpen, setDefaultOpen] = useState( + undefined, + ); + const [isLoaded, setIsLoaded] = useState(false); + + useEffect(() => { + const cookieValue = document.cookie + .split("; ") + .find((row) => row.startsWith(`${SIDEBAR_COOKIE_NAME}=`)) + ?.split("=")[1]; + + setDefaultOpen(cookieValue === undefined ? true : cookieValue === "true"); + setIsLoaded(true); + }, []); + const router = useRouter(); const pathname = usePathname(); - const currentPath = router.pathname; - const { data: auth } = api.auth.get.useQuery(); - const { data: user } = api.user.byAuthId.useQuery( - { - authId: auth?.id || "", - }, - { - enabled: !!auth?.id && auth?.rol === "user", - }, - ); + const _currentPath = router.pathname; + const { data: auth } = api.user.get.useQuery(); const includesProjects = pathname?.includes("/dashboard/project"); - const { data: isCloud, isLoading } = api.settings.isCloud.useQuery(); - const isActiveRoute = (itemUrl: string) => { - const normalizedItemUrl = itemUrl?.replace("/projects", "/project"); - const normalizedPathname = pathname?.replace("/projects", "/project"); + const { data: isCloud } = api.settings.isCloud.useQuery(); - if (!normalizedPathname) return false; + const { + home: filteredHome, + settings: filteredSettings, + help, + } = createMenuForAuthUser({ auth, isCloud: !!isCloud }); - if (normalizedPathname === normalizedItemUrl) return true; + const activeItem = findActiveNavItem( + [...filteredHome, ...filteredSettings], + pathname, + ); - if (normalizedPathname.startsWith(normalizedItemUrl)) { - const nextChar = normalizedPathname.charAt(normalizedItemUrl.length); - return nextChar === "/"; - } - - return false; - }; - - let filteredHome = isCloud - ? data.home.filter( - (item) => - ![ - "/dashboard/monitoring", - "/dashboard/traefik", - "/dashboard/docker", - "/dashboard/swarm", - "/dashboard/requests", - ].includes(item.url), - ) - : data.home; - - let filteredSettings = isCloud - ? data.settings.filter( - (item) => - ![ - "/dashboard/settings/server", - "/dashboard/settings/cluster", - ].includes(item.url), - ) - : data.settings.filter( - (item) => !["/dashboard/settings/billing"].includes(item.url), - ); - - filteredHome = filteredHome.map((item) => ({ - ...item, - isActive: isActiveRoute(item.url), - })); - - filteredSettings = filteredSettings.map((item) => ({ - ...item, - isActive: isActiveRoute(item.url), - })); - - const activeItem = - filteredHome.find((item) => item.isActive) || - filteredSettings.find((item) => item.isActive); - - const showProjectsButton = - currentPath === "/dashboard/projects" && - (auth?.rol === "admin" || user?.canCreateProjects); + if (!isLoaded) { + return
; // Placeholder mientras se carga + } return ( { + setDefaultOpen(open); + + document.cookie = `${SIDEBAR_COOKIE_NAME}=${open}`; + }} style={ { "--sidebar-width": "19.5rem", @@ -461,184 +810,196 @@ export default function Page({ children }: Props) { > - - - + > */} + + {/* */} Home - {filteredHome.map((item) => ( - - - {item.isSingle ? ( - - - - {item.title} - - - ) : ( - <> - - - {item.icon && } + {filteredHome.map((item) => { + const isSingle = item.isSingle !== false; + const isActive = isSingle + ? isActiveRoute({ itemUrl: item.url, pathname }) + : item.items.some((item) => + isActiveRoute({ itemUrl: item.url, pathname }), + ); - {item.title} - {item.items?.length && ( - + return ( + + + {isSingle ? ( + + + {item.icon && ( + )} - - - - - {item.items?.map((subItem) => ( - - - {item.title} + + + ) : ( + <> + + + {item.icon && } + + {item.title} + {item.items?.length && ( + + )} + + + + + {item.items?.map((subItem) => ( + + - {subItem.icon && ( - - - - )} - {subItem.title} - - - - ))} - - - - )} - - - ))} + + {subItem.icon && ( + + + + )} + {subItem.title} + + + + ))} + + + + )} + + + ); + })} Settings - {filteredSettings.map((item) => ( - - - {item.isSingle ? ( - - - - {item.title} - - - ) : ( - <> - - - {item.icon && } + {filteredSettings.map((item) => { + const isSingle = item.isSingle !== false; + const isActive = isSingle + ? isActiveRoute({ itemUrl: item.url, pathname }) + : item.items.some((item) => + isActiveRoute({ itemUrl: item.url, pathname }), + ); - {item.title} - {item.items?.length && ( - + return ( + + + {isSingle ? ( + + + {item.icon && ( + )} - - - - - {item.items?.map((subItem) => ( - - - {item.title} + + + ) : ( + <> + + + {item.icon && } + + {item.title} + {item.items?.length && ( + + )} + + + + + {item.items?.map((subItem) => ( + + - {subItem.icon && ( - - - - )} - {subItem.title} - - - - ))} - - - - )} - - - ))} + + {subItem.icon && ( + + + + )} + {subItem.title} + + + + ))} + + + + )} + + + ); + })} Extra - {data.help.map((item: ExternalLink) => ( + {help.map((item: ExternalLink) => ( ))} - {!isCloud && ( + {!isCloud && auth?.role === "owner" && ( @@ -683,7 +1044,7 @@ export default function Page({ children }: Props) { - + - + {activeItem?.title} diff --git a/apps/dokploy/components/layouts/update-server.tsx b/apps/dokploy/components/layouts/update-server.tsx index fa748f84..5d797885 100644 --- a/apps/dokploy/components/layouts/update-server.tsx +++ b/apps/dokploy/components/layouts/update-server.tsx @@ -11,7 +11,7 @@ export const UpdateServerButton = () => { latestVersion: null, updateAvailable: false, }); - const router = useRouter(); + const _router = useRouter(); const { data: isCloud } = api.settings.isCloud.useQuery(); const { mutateAsync: getUpdateData } = api.settings.getUpdateData.useMutation(); diff --git a/apps/dokploy/components/layouts/user-nav.tsx b/apps/dokploy/components/layouts/user-nav.tsx index 4fe6b76b..4a9624de 100644 --- a/apps/dokploy/components/layouts/user-nav.tsx +++ b/apps/dokploy/components/layouts/user-nav.tsx @@ -15,32 +15,24 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; +import { authClient } from "@/lib/auth-client"; import { Languages } from "@/lib/languages"; import { api } from "@/utils/api"; import useLocale from "@/utils/hooks/use-locale"; import { ChevronsUpDown } from "lucide-react"; -import { useTranslation } from "next-i18next"; import { useRouter } from "next/router"; -import { useEffect, useRef, useState } from "react"; import { ModeToggle } from "../ui/modeToggle"; import { SidebarMenuButton } from "../ui/sidebar"; -const AUTO_CHECK_UPDATES_INTERVAL_MINUTES = 7; +const _AUTO_CHECK_UPDATES_INTERVAL_MINUTES = 7; export const UserNav = () => { const router = useRouter(); - const { data } = api.auth.get.useQuery(); + const { data } = api.user.get.useQuery(); const { data: isCloud } = api.settings.isCloud.useQuery(); - const { data: user } = api.user.byAuthId.useQuery( - { - authId: data?.id || "", - }, - { - enabled: !!data?.id && data?.rol === "user", - }, - ); + const { locale, setLocale } = useLocale(); - const { mutateAsync } = api.auth.logout.useMutation(); + // const { mutateAsync } = api.auth.logout.useMutation(); return ( @@ -50,12 +42,15 @@ export const UserNav = () => { className="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground" > - + CN
Account - {data?.email} + {data?.user?.email}
@@ -70,7 +65,7 @@ export const UserNav = () => { My Account - {data?.email} + {data?.user?.email} @@ -95,7 +90,7 @@ export const UserNav = () => { > Monitoring - {(data?.rol === "admin" || user?.canAccessToTraefikFiles) && ( + {(data?.role === "owner" || data?.canAccessToTraefikFiles) && ( { @@ -105,7 +100,7 @@ export const UserNav = () => { Traefik )} - {(data?.rol === "admin" || user?.canAccessToDocker) && ( + {(data?.role === "owner" || data?.canAccessToDocker) && ( { @@ -118,14 +113,16 @@ export const UserNav = () => { )} - { - router.push("/dashboard/settings/server"); - }} - > - Settings - + {data?.role === "owner" && ( + { + router.push("/dashboard/settings"); + }} + > + Settings + + )} ) : ( <> @@ -137,7 +134,7 @@ export const UserNav = () => { > Profile - {data?.rol === "admin" && ( + {data?.role === "owner" && ( { @@ -147,10 +144,21 @@ export const UserNav = () => { Servers )} + + {data?.role === "owner" && ( + { + router.push("/dashboard/settings"); + }} + > + Settings + + )} )} - {isCloud && data?.rol === "admin" && ( + {isCloud && data?.role === "owner" && ( { @@ -165,9 +173,12 @@ export const UserNav = () => { { - await mutateAsync().then(() => { + await authClient.signOut().then(() => { router.push("/"); }); + // await mutateAsync().then(() => { + // router.push("/"); + // }); }} > Log out diff --git a/apps/dokploy/components/shared/breadcrumb-sidebar.tsx b/apps/dokploy/components/shared/breadcrumb-sidebar.tsx index 214ddf40..74e9fdf6 100644 --- a/apps/dokploy/components/shared/breadcrumb-sidebar.tsx +++ b/apps/dokploy/components/shared/breadcrumb-sidebar.tsx @@ -26,9 +26,9 @@ export const BreadcrumbSidebar = ({ list }: Props) => { - {list.map((item, index) => ( + {list.map((item, _index) => ( - + {item.href ? ( {item.name} @@ -37,7 +37,7 @@ export const BreadcrumbSidebar = ({ list }: Props) => { )} - + ))} diff --git a/apps/dokploy/components/shared/dialog-action.tsx b/apps/dokploy/components/shared/dialog-action.tsx index 3724242d..444440a2 100644 --- a/apps/dokploy/components/shared/dialog-action.tsx +++ b/apps/dokploy/components/shared/dialog-action.tsx @@ -9,7 +9,6 @@ import { AlertDialogTitle, AlertDialogTrigger, } from "@/components/ui/alert-dialog"; -import { Button } from "../ui/button"; interface Props { title?: string | React.ReactNode; diff --git a/apps/dokploy/components/shared/drawer-logs.tsx b/apps/dokploy/components/shared/drawer-logs.tsx index f5a56cd6..d8d1affb 100644 --- a/apps/dokploy/components/shared/drawer-logs.tsx +++ b/apps/dokploy/components/shared/drawer-logs.tsx @@ -1,6 +1,3 @@ -import { DialogAction } from "@/components/shared/dialog-action"; -import { Button } from "@/components/ui/button"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Sheet, SheetContent, @@ -8,10 +5,8 @@ import { SheetHeader, SheetTitle, } from "@/components/ui/sheet"; -import { api } from "@/utils/api"; -import { Ban, CheckCircle2, Loader2, RefreshCcw, Terminal } from "lucide-react"; -import React, { useState, useEffect, useRef } from "react"; -import { toast } from "sonner"; +import { Loader2 } from "lucide-react"; +import { useEffect, useRef, useState } from "react"; import { TerminalLine } from "../dashboard/docker/logs/terminal-line"; import type { LogLine } from "../dashboard/docker/logs/utils"; @@ -48,7 +43,7 @@ export const DrawerLogs = ({ isOpen, onClose, filteredLogs }: Props) => { return ( { + onOpenChange={(_open) => { onClose(); }} > diff --git a/apps/dokploy/components/shared/logo.tsx b/apps/dokploy/components/shared/logo.tsx index 5d192cfd..a1c3acb7 100644 --- a/apps/dokploy/components/shared/logo.tsx +++ b/apps/dokploy/components/shared/logo.tsx @@ -1,10 +1,21 @@ -import React from "react"; +import { cn } from "@/lib/utils"; interface Props { className?: string; + logoUrl?: string; } -export const Logo = ({ className = "size-14" }: Props) => { +export const Logo = ({ className = "size-14", logoUrl }: Props) => { + if (logoUrl) { + return ( + Organization Logo + ); + } + return ( { const colorConfig = Object.entries(config).filter( - ([_, config]) => config.theme || config.color, + ([, config]) => config.theme || config.color, ); if (!colorConfig.length) { diff --git a/apps/dokploy/components/ui/file-tree.tsx b/apps/dokploy/components/ui/file-tree.tsx index 9db3786e..0f50d508 100644 --- a/apps/dokploy/components/ui/file-tree.tsx +++ b/apps/dokploy/components/ui/file-tree.tsx @@ -85,7 +85,7 @@ const Tree = React.forwardRef( return ids; }, [data, initialSlelectedItemId]); - const { ref: refRoot, width, height } = useResizeObserver(); + const { ref: refRoot } = useResizeObserver(); return (
diff --git a/apps/dokploy/components/ui/modeToggle.tsx b/apps/dokploy/components/ui/modeToggle.tsx index 7965a339..9b6ba27b 100644 --- a/apps/dokploy/components/ui/modeToggle.tsx +++ b/apps/dokploy/components/ui/modeToggle.tsx @@ -3,7 +3,6 @@ import { Button } from "@/components/ui/button"; import { Moon, Sun } from "lucide-react"; import { useTheme } from "next-themes"; -import * as React from "react"; export function ModeToggle() { const { theme, setTheme } = useTheme(); diff --git a/apps/dokploy/components/ui/sidebar.tsx b/apps/dokploy/components/ui/sidebar.tsx index a930da6d..40f84873 100644 --- a/apps/dokploy/components/ui/sidebar.tsx +++ b/apps/dokploy/components/ui/sidebar.tsx @@ -17,7 +17,7 @@ import { import { useIsMobile } from "@/hooks/use-mobile"; import { cn } from "@/lib/utils"; -const SIDEBAR_COOKIE_NAME = "sidebar:state"; +export const SIDEBAR_COOKIE_NAME = "sidebar:state"; const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7; const SIDEBAR_WIDTH = "16rem"; const SIDEBAR_WIDTH_MOBILE = "18rem"; @@ -329,7 +329,7 @@ const SidebarInset = React.forwardRef<
statement-breakpoint +ALTER TABLE "admin" ADD COLUMN "cleanupCacheOnPreviews" boolean DEFAULT false NOT NULL;--> statement-breakpoint +ALTER TABLE "admin" ADD COLUMN "cleanupCacheOnCompose" boolean DEFAULT false NOT NULL; \ No newline at end of file diff --git a/apps/dokploy/drizzle/0058_brown_sharon_carter.sql b/apps/dokploy/drizzle/0058_brown_sharon_carter.sql new file mode 100644 index 00000000..4cdc0c92 --- /dev/null +++ b/apps/dokploy/drizzle/0058_brown_sharon_carter.sql @@ -0,0 +1 @@ +ALTER TABLE "deployment" ADD COLUMN "errorMessage" text; \ No newline at end of file diff --git a/apps/dokploy/drizzle/0059_striped_bill_hollister.sql b/apps/dokploy/drizzle/0059_striped_bill_hollister.sql new file mode 100644 index 00000000..6653859b --- /dev/null +++ b/apps/dokploy/drizzle/0059_striped_bill_hollister.sql @@ -0,0 +1 @@ +ALTER TABLE "admin" ALTER COLUMN "cleanupCacheApplications" SET DEFAULT false; \ No newline at end of file diff --git a/apps/dokploy/drizzle/0060_disable-aggressive-cache.sql b/apps/dokploy/drizzle/0060_disable-aggressive-cache.sql new file mode 100644 index 00000000..33828cec --- /dev/null +++ b/apps/dokploy/drizzle/0060_disable-aggressive-cache.sql @@ -0,0 +1,3 @@ +-- Custom SQL migration file, put you code below! + +UPDATE "admin" SET "cleanupCacheApplications" = false; diff --git a/apps/dokploy/drizzle/0061_many_molten_man.sql b/apps/dokploy/drizzle/0061_many_molten_man.sql new file mode 100644 index 00000000..d0b9a48f --- /dev/null +++ b/apps/dokploy/drizzle/0061_many_molten_man.sql @@ -0,0 +1,4 @@ +ALTER TABLE "admin" ADD COLUMN "enablePaidFeatures" boolean DEFAULT false NOT NULL;--> statement-breakpoint +ALTER TABLE "admin" ADD COLUMN "metricsConfig" jsonb DEFAULT '{"server":{"refreshRate":20,"port":4500,"token":"","retentionDays":2,"cronJob":"","urlCallback":"","thresholds":{"cpu":0,"memory":0}},"containers":{"refreshRate":20,"services":{"include":[],"exclude":[]}}}'::jsonb NOT NULL;--> statement-breakpoint +ALTER TABLE "notification" ADD COLUMN "serverThreshold" boolean DEFAULT false NOT NULL;--> statement-breakpoint +ALTER TABLE "server" ADD COLUMN "metricsConfig" jsonb DEFAULT '{"server":{"refreshRate":20,"port":4500,"token":"","urlCallback":"","cronJob":"","retentionDays":2,"thresholds":{"cpu":0,"memory":0}},"containers":{"refreshRate":20,"services":{"include":[],"exclude":[]}}}'::jsonb NOT NULL; \ No newline at end of file diff --git a/apps/dokploy/drizzle/0062_slippery_white_tiger.sql b/apps/dokploy/drizzle/0062_slippery_white_tiger.sql new file mode 100644 index 00000000..742afe0c --- /dev/null +++ b/apps/dokploy/drizzle/0062_slippery_white_tiger.sql @@ -0,0 +1,2 @@ +ALTER TABLE "admin" ALTER COLUMN "metricsConfig" SET DEFAULT '{"server":{"type":"Dokploy","refreshRate":20,"port":4500,"token":"","retentionDays":2,"cronJob":"","urlCallback":"","thresholds":{"cpu":0,"memory":0}},"containers":{"refreshRate":20,"services":{"include":[],"exclude":[]}}}'::jsonb;--> statement-breakpoint +ALTER TABLE "server" ALTER COLUMN "metricsConfig" SET DEFAULT '{"server":{"type":"Remote","refreshRate":20,"port":4500,"token":"","urlCallback":"","cronJob":"","retentionDays":2,"thresholds":{"cpu":0,"memory":0}},"containers":{"refreshRate":20,"services":{"include":[],"exclude":[]}}}'::jsonb; \ No newline at end of file diff --git a/apps/dokploy/drizzle/0063_panoramic_dreadnoughts.sql b/apps/dokploy/drizzle/0063_panoramic_dreadnoughts.sql new file mode 100644 index 00000000..1b0b8396 --- /dev/null +++ b/apps/dokploy/drizzle/0063_panoramic_dreadnoughts.sql @@ -0,0 +1,2 @@ +ALTER TABLE "admin" ALTER COLUMN "metricsConfig" SET DEFAULT '{"server":{"type":"Dokploy","refreshRate":60,"port":4500,"token":"","retentionDays":2,"cronJob":"","urlCallback":"","thresholds":{"cpu":0,"memory":0}},"containers":{"refreshRate":60,"services":{"include":[],"exclude":[]}}}'::jsonb;--> statement-breakpoint +ALTER TABLE "server" ALTER COLUMN "metricsConfig" SET DEFAULT '{"server":{"type":"Remote","refreshRate":60,"port":4500,"token":"","urlCallback":"","cronJob":"","retentionDays":2,"thresholds":{"cpu":0,"memory":0}},"containers":{"refreshRate":60,"services":{"include":[],"exclude":[]}}}'::jsonb; \ No newline at end of file diff --git a/apps/dokploy/drizzle/0064_previous_agent_brand.sql b/apps/dokploy/drizzle/0064_previous_agent_brand.sql new file mode 100644 index 00000000..73ab1035 --- /dev/null +++ b/apps/dokploy/drizzle/0064_previous_agent_brand.sql @@ -0,0 +1 @@ +ALTER TABLE "compose" ADD COLUMN "deployable" boolean DEFAULT false NOT NULL; \ No newline at end of file diff --git a/apps/dokploy/drizzle/0065_daily_zaladane.sql b/apps/dokploy/drizzle/0065_daily_zaladane.sql new file mode 100644 index 00000000..dc5c0d14 --- /dev/null +++ b/apps/dokploy/drizzle/0065_daily_zaladane.sql @@ -0,0 +1 @@ +ALTER TABLE "compose" RENAME COLUMN "deployable" TO "isolatedDeployment"; \ No newline at end of file diff --git a/apps/dokploy/drizzle/0066_yielding_echo.sql b/apps/dokploy/drizzle/0066_yielding_echo.sql new file mode 100644 index 00000000..bb5c2511 --- /dev/null +++ b/apps/dokploy/drizzle/0066_yielding_echo.sql @@ -0,0 +1,688 @@ +CREATE TABLE "user_temp" ( + "id" text PRIMARY KEY NOT NULL, + "name" text DEFAULT '' NOT NULL, + "isRegistered" boolean DEFAULT false NOT NULL, + "expirationDate" text NOT NULL, + "createdAt" text NOT NULL, + "two_factor_enabled" boolean DEFAULT false NOT NULL, + "email" text NOT NULL, + "email_verified" boolean NOT NULL, + "image" text, + "banned" boolean, + "ban_reason" text, + "ban_expires" timestamp, + "updated_at" timestamp NOT NULL, + "serverIp" text, + "certificateType" "certificateType" DEFAULT 'none' NOT NULL, + "host" text, + "letsEncryptEmail" text, + "sshPrivateKey" text, + "enableDockerCleanup" boolean DEFAULT false NOT NULL, + "enableLogRotation" boolean DEFAULT false NOT NULL, + "enablePaidFeatures" boolean DEFAULT false NOT NULL, + "metricsConfig" jsonb DEFAULT '{"server":{"type":"Dokploy","refreshRate":60,"port":4500,"token":"","retentionDays":2,"cronJob":"","urlCallback":"","thresholds":{"cpu":0,"memory":0}},"containers":{"refreshRate":60,"services":{"include":[],"exclude":[]}}}'::jsonb NOT NULL, + "cleanupCacheApplications" boolean DEFAULT false NOT NULL, + "cleanupCacheOnPreviews" boolean DEFAULT false NOT NULL, + "cleanupCacheOnCompose" boolean DEFAULT false NOT NULL, + "stripeCustomerId" text, + "stripeSubscriptionId" text, + "serversQuantity" integer DEFAULT 0 NOT NULL, + CONSTRAINT "user_temp_email_unique" UNIQUE("email") +); +--> statement-breakpoint +CREATE TABLE "session_temp" ( + "id" text PRIMARY KEY NOT NULL, + "expires_at" timestamp NOT NULL, + "token" text NOT NULL, + "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, + CONSTRAINT "session_temp_token_unique" UNIQUE("token") +); +--> statement-breakpoint +CREATE TABLE "account" ( + "id" text PRIMARY KEY 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 DEFAULT false NOT NULL, + "created_at" timestamp NOT NULL, + "updated_at" timestamp NOT NULL, + "resetPasswordToken" text, + "resetPasswordExpiresAt" text, + "confirmationToken" text, + "confirmationExpiresAt" text +); +--> statement-breakpoint +CREATE TABLE "invitation" ( + "id" text PRIMARY KEY 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 +); +--> statement-breakpoint +CREATE TABLE "member" ( + "id" text PRIMARY KEY NOT NULL, + "organization_id" text NOT NULL, + "user_id" text NOT NULL, + "role" text NOT NULL, + "created_at" timestamp NOT NULL, + "canCreateProjects" boolean DEFAULT false NOT NULL, + "canAccessToSSHKeys" boolean DEFAULT false NOT NULL, + "canCreateServices" boolean DEFAULT false NOT NULL, + "canDeleteProjects" boolean DEFAULT false NOT NULL, + "canDeleteServices" boolean DEFAULT false NOT NULL, + "canAccessToDocker" boolean DEFAULT false NOT NULL, + "canAccessToAPI" boolean DEFAULT false NOT NULL, + "canAccessToGitProviders" boolean DEFAULT false NOT NULL, + "canAccessToTraefikFiles" boolean DEFAULT false NOT NULL, + "accesedProjects" text[] DEFAULT ARRAY[]::text[] NOT NULL, + "accesedServices" text[] DEFAULT ARRAY[]::text[] NOT NULL, + "team_id" text +); +--> statement-breakpoint +CREATE TABLE "organization" ( + "id" text PRIMARY KEY NOT NULL, + "name" text NOT NULL, + "slug" text, + "logo" text, + "created_at" timestamp NOT NULL, + "metadata" text, + "owner_id" text NOT NULL, + CONSTRAINT "organization_slug_unique" UNIQUE("slug") +); +--> statement-breakpoint +CREATE TABLE "verification" ( + "id" text PRIMARY KEY NOT NULL, + "identifier" text NOT NULL, + "value" text NOT NULL, + "expires_at" timestamp NOT NULL, + "created_at" timestamp, + "updated_at" timestamp +); + +CREATE TABLE "two_factor" ( + "id" text PRIMARY KEY NOT NULL, + "secret" text NOT NULL, + "backup_codes" text NOT NULL, + "user_id" text NOT NULL +); + +CREATE TABLE "apikey" ( + "id" text PRIMARY KEY 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 +); +--> statement-breakpoint +ALTER TABLE "certificate" ALTER COLUMN "adminId" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "notification" ALTER COLUMN "adminId" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "ssh-key" ALTER COLUMN "adminId" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "git_provider" ALTER COLUMN "adminId" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "session_temp" ADD CONSTRAINT "session_temp_user_id_user_temp_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user_temp"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "account" ADD CONSTRAINT "account_user_id_user_temp_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user_temp"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "invitation" ADD CONSTRAINT "invitation_organization_id_organization_id_fk" FOREIGN KEY ("organization_id") REFERENCES "public"."organization"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "invitation" ADD CONSTRAINT "invitation_inviter_id_user_temp_id_fk" FOREIGN KEY ("inviter_id") REFERENCES "public"."user_temp"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "member" ADD CONSTRAINT "member_organization_id_organization_id_fk" FOREIGN KEY ("organization_id") REFERENCES "public"."organization"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "member" ADD CONSTRAINT "member_user_id_user_temp_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user_temp"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "organization" ADD CONSTRAINT "organization_owner_id_user_temp_id_fk" FOREIGN KEY ("owner_id") REFERENCES "public"."user_temp"("id") ON DELETE no action ON UPDATE no action; +ALTER TABLE "two_factor" ADD CONSTRAINT "two_factor_user_id_user_temp_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user_temp"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "apikey" ADD CONSTRAINT "apikey_user_id_user_temp_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user_temp"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint + + +-- Data Migration + +-- Custom SQL migration file, put your code below! -- + +WITH inserted_users AS ( + -- Insertar usuarios desde admins + INSERT INTO user_temp ( + id, + email, + "email_verified", + "updated_at", + "serverIp", + image, + "certificateType", + host, + "letsEncryptEmail", + "sshPrivateKey", + "enableDockerCleanup", + "enableLogRotation", + "enablePaidFeatures", + "metricsConfig", + "cleanupCacheApplications", + "cleanupCacheOnPreviews", + "cleanupCacheOnCompose", + "stripeCustomerId", + "stripeSubscriptionId", + "serversQuantity", + "expirationDate", + "createdAt", + "isRegistered" + ) + SELECT + a."adminId", + auth.email, + true, + CURRENT_TIMESTAMP, + a."serverIp", + auth.image, + a."certificateType", + a.host, + a."letsEncryptEmail", + a."sshPrivateKey", + a."enableDockerCleanup", + a."enableLogRotation", + a."enablePaidFeatures", + a."metricsConfig", + a."cleanupCacheApplications", + a."cleanupCacheOnPreviews", + a."cleanupCacheOnCompose", + a."stripeCustomerId", + a."stripeSubscriptionId", + a."serversQuantity", + NOW() + INTERVAL '1 year', + NOW(), + true + FROM admin a + JOIN auth ON auth.id = a."authId" + RETURNING * +), +inserted_accounts AS ( + -- Insertar cuentas para los admins + INSERT INTO account ( + id, + "account_id", + "provider_id", + "user_id", + password, + "created_at", + "updated_at" + ) + SELECT + gen_random_uuid(), + gen_random_uuid(), + 'credential', + a."adminId", + auth.password, + NOW(), + NOW() + FROM admin a + JOIN auth ON auth.id = a."authId" + RETURNING * +), +inserted_orgs AS ( + -- Crear organizaciones para cada admin + INSERT INTO organization ( + id, + name, + slug, + "owner_id", + "created_at" + ) + SELECT + gen_random_uuid(), + 'My Organization', + -- Generamos un slug único usando una función de hash + encode(sha256((a."adminId" || CURRENT_TIMESTAMP)::bytea), 'hex'), + a."adminId", + NOW() + FROM admin a + RETURNING * +), +inserted_members AS ( + -- Insertar usuarios miembros + INSERT INTO user_temp ( + id, + email, + "email_verified", + "updated_at", + image, + "createdAt", + "expirationDate", + "isRegistered" + ) + SELECT + u."userId", + auth.email, + true, + CURRENT_TIMESTAMP, + auth.image, + NOW(), + NOW() + INTERVAL '1 year', + COALESCE(u."isRegistered", false) + FROM "user" u + JOIN admin a ON u."adminId" = a."adminId" + JOIN auth ON auth.id = u."authId" + RETURNING * +), +inserted_member_accounts AS ( + -- Insertar cuentas para los usuarios miembros + INSERT INTO account ( + id, + "account_id", + "provider_id", + "user_id", + password, + "created_at", + "updated_at" + ) + SELECT + gen_random_uuid(), + gen_random_uuid(), + 'credential', + u."userId", + auth.password, + NOW(), + NOW() + FROM "user" u + JOIN admin a ON u."adminId" = a."adminId" + JOIN auth ON auth.id = u."authId" + RETURNING * +), +inserted_admin_members AS ( + -- Insertar miembros en las organizaciones (admins como owners) + INSERT INTO member ( + id, + "organization_id", + "user_id", + role, + "created_at", + "canAccessToAPI", + "canAccessToDocker", + "canAccessToGitProviders", + "canAccessToSSHKeys", + "canAccessToTraefikFiles", + "canCreateProjects", + "canCreateServices", + "canDeleteProjects", + "canDeleteServices", + "accesedProjects", + "accesedServices" + ) + SELECT + gen_random_uuid(), + o.id, + a."adminId", + 'owner', + NOW(), + true, -- Los admins tienen todos los permisos por defecto + true, + true, + true, + true, + true, + true, + true, + true, + '{}', + '{}' + FROM admin a + JOIN inserted_orgs o ON o."owner_id" = a."adminId" + JOIN auth ON auth.id = a."authId" + RETURNING * +) +-- Insertar miembros regulares en las organizaciones +INSERT INTO member ( + id, + "organization_id", + "user_id", + role, + "created_at", + "canAccessToAPI", + "canAccessToDocker", + "canAccessToGitProviders", + "canAccessToSSHKeys", + "canAccessToTraefikFiles", + "canCreateProjects", + "canCreateServices", + "canDeleteProjects", + "canDeleteServices", + "accesedProjects", + "accesedServices" +) +SELECT + gen_random_uuid(), + o.id, + u."userId", + 'member', + NOW(), + COALESCE(u."canAccessToAPI", false), + COALESCE(u."canAccessToDocker", false), + COALESCE(u."canAccessToGitProviders", false), + COALESCE(u."canAccessToSSHKeys", false), + COALESCE(u."canAccessToTraefikFiles", false), + COALESCE(u."canCreateProjects", false), + COALESCE(u."canCreateServices", false), + COALESCE(u."canDeleteProjects", false), + COALESCE(u."canDeleteServices", false), + COALESCE(u."accesedProjects", '{}'), + COALESCE(u."accesedServices", '{}') +FROM "user" u +JOIN admin a ON u."adminId" = a."adminId" +JOIN inserted_orgs o ON o."owner_id" = a."adminId" +JOIN auth ON auth.id = u."authId"; + +-- Migrar tokens de auth a apikey +INSERT INTO apikey ( + id, + name, + key, + user_id, + enabled, + created_at, + updated_at +) +SELECT + gen_random_uuid(), + 'Legacy Token', + auth.token, +user_temp.id, + true, + NOW(), + NOW() +FROM auth +JOIN admin ON auth.id = admin."authId" +JOIN user_temp ON user_temp.id = admin."adminId" +WHERE auth.token IS NOT NULL AND auth.token != ''; + +-- Migration tables foreign keys + +ALTER TABLE "project" RENAME COLUMN "adminId" TO "userId";--> statement-breakpoint +ALTER TABLE "destination" RENAME COLUMN "adminId" TO "userId";--> statement-breakpoint +ALTER TABLE "certificate" RENAME COLUMN "adminId" TO "userId";--> statement-breakpoint +ALTER TABLE "registry" RENAME COLUMN "adminId" TO "userId";--> statement-breakpoint +ALTER TABLE "notification" RENAME COLUMN "adminId" TO "userId";--> statement-breakpoint +ALTER TABLE "ssh-key" RENAME COLUMN "adminId" TO "userId";--> statement-breakpoint +ALTER TABLE "git_provider" RENAME COLUMN "adminId" TO "userId";--> statement-breakpoint +ALTER TABLE "server" RENAME COLUMN "adminId" TO "userId";--> statement-breakpoint +ALTER TABLE "project" DROP CONSTRAINT "project_adminId_admin_adminId_fk"; +--> statement-breakpoint +ALTER TABLE "destination" DROP CONSTRAINT "destination_adminId_admin_adminId_fk"; +--> statement-breakpoint +ALTER TABLE "certificate" DROP CONSTRAINT "certificate_adminId_admin_adminId_fk"; +--> statement-breakpoint +ALTER TABLE "registry" DROP CONSTRAINT "registry_adminId_admin_adminId_fk"; +--> statement-breakpoint +ALTER TABLE "notification" DROP CONSTRAINT "notification_adminId_admin_adminId_fk"; +--> statement-breakpoint +ALTER TABLE "ssh-key" DROP CONSTRAINT "ssh-key_adminId_admin_adminId_fk"; +--> statement-breakpoint +ALTER TABLE "git_provider" DROP CONSTRAINT "git_provider_adminId_admin_adminId_fk"; +--> statement-breakpoint +ALTER TABLE "server" DROP CONSTRAINT "server_adminId_admin_adminId_fk"; +--> statement-breakpoint +ALTER TABLE "project" ADD CONSTRAINT "project_userId_user_temp_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user_temp"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "destination" ADD CONSTRAINT "destination_userId_user_temp_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user_temp"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "certificate" ADD CONSTRAINT "certificate_userId_user_temp_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user_temp"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "registry" ADD CONSTRAINT "registry_userId_user_temp_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user_temp"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "notification" ADD CONSTRAINT "notification_userId_user_temp_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user_temp"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "ssh-key" ADD CONSTRAINT "ssh-key_userId_user_temp_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user_temp"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "git_provider" ADD CONSTRAINT "git_provider_userId_user_temp_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user_temp"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "server" ADD CONSTRAINT "server_userId_user_temp_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user_temp"("id") ON DELETE cascade ON UPDATE no action; + + +ALTER TABLE "user_temp" ADD COLUMN "created_at" timestamp DEFAULT now(); + + +-- Add properties + +ALTER TABLE "project" ADD COLUMN "organizationId" text;--> statement-breakpoint +ALTER TABLE "destination" ADD COLUMN "organizationId" text;--> statement-breakpoint +ALTER TABLE "certificate" ADD COLUMN "organizationId" text;--> statement-breakpoint +ALTER TABLE "registry" ADD COLUMN "organizationId" text;--> statement-breakpoint +ALTER TABLE "notification" ADD COLUMN "organizationId" text;--> statement-breakpoint +ALTER TABLE "ssh-key" ADD COLUMN "organizationId" text;--> statement-breakpoint +ALTER TABLE "git_provider" ADD COLUMN "organizationId" text;--> statement-breakpoint +ALTER TABLE "server" ADD COLUMN "organizationId" text;--> statement-breakpoint +ALTER TABLE "project" ADD CONSTRAINT "project_organizationId_organization_id_fk" FOREIGN KEY ("organizationId") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "destination" ADD CONSTRAINT "destination_organizationId_organization_id_fk" FOREIGN KEY ("organizationId") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "certificate" ADD CONSTRAINT "certificate_organizationId_organization_id_fk" FOREIGN KEY ("organizationId") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "registry" ADD CONSTRAINT "registry_organizationId_organization_id_fk" FOREIGN KEY ("organizationId") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "notification" ADD CONSTRAINT "notification_organizationId_organization_id_fk" FOREIGN KEY ("organizationId") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "ssh-key" ADD CONSTRAINT "ssh-key_organizationId_organization_id_fk" FOREIGN KEY ("organizationId") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "git_provider" ADD CONSTRAINT "git_provider_organizationId_organization_id_fk" FOREIGN KEY ("organizationId") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "server" ADD CONSTRAINT "server_organizationId_organization_id_fk" FOREIGN KEY ("organizationId") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action; + + +-- Update tables to use organizationId + +-- Custom SQL migration file + +-- Actualizar projects +UPDATE "project" p +SET "organizationId" = ( + SELECT m."organization_id" + FROM "member" m + WHERE m."user_id" = p."userId" + AND m."role" = 'owner' + LIMIT 1 +) +WHERE p."organizationId" IS NULL; + +-- Actualizar servers +UPDATE "server" s +SET "organizationId" = ( + SELECT m."organization_id" + FROM "member" m + WHERE m."user_id" = s."userId" + AND m."role" = 'owner' + LIMIT 1 +) +WHERE s."organizationId" IS NULL; + +-- Actualizar ssh-keys +UPDATE "ssh-key" k +SET "organizationId" = ( + SELECT m."organization_id" + FROM "member" m + WHERE m."user_id" = k."userId" + AND m."role" = 'owner' + LIMIT 1 +) +WHERE k."organizationId" IS NULL; + +-- Actualizar destinations +UPDATE "destination" d +SET "organizationId" = ( + SELECT m."organization_id" + FROM "member" m + WHERE m."user_id" = d."userId" + AND m."role" = 'owner' + LIMIT 1 +) +WHERE d."organizationId" IS NULL; + +-- Actualizar registry +UPDATE "registry" r +SET "organizationId" = ( + SELECT m."organization_id" + FROM "member" m + WHERE m."user_id" = r."userId" + AND m."role" = 'owner' + LIMIT 1 +) +WHERE r."organizationId" IS NULL; + +-- Actualizar notifications +UPDATE "notification" n +SET "organizationId" = ( + SELECT m."organization_id" + FROM "member" m + WHERE m."user_id" = n."userId" + AND m."role" = 'owner' + LIMIT 1 +) +WHERE n."organizationId" IS NULL; + +-- Actualizar certificates +UPDATE "certificate" c +SET "organizationId" = ( + SELECT m."organization_id" + FROM "member" m + WHERE m."user_id" = c."userId" + AND m."role" = 'owner' + LIMIT 1 +) +WHERE c."organizationId" IS NULL; + +-- Actualizar git_provider +UPDATE "git_provider" g +SET "organizationId" = ( + SELECT m."organization_id" + FROM "member" m + WHERE m."user_id" = g."userId" + AND m."role" = 'owner' + LIMIT 1 +) +WHERE g."organizationId" IS NULL; + +-- Verificar que todos los recursos tengan una organización +DO $$ +BEGIN + IF EXISTS ( + SELECT 1 FROM "project" WHERE "organizationId" IS NULL + UNION ALL + SELECT 1 FROM "server" WHERE "organizationId" IS NULL + UNION ALL + SELECT 1 FROM "ssh-key" WHERE "organizationId" IS NULL + UNION ALL + SELECT 1 FROM "destination" WHERE "organizationId" IS NULL + UNION ALL + SELECT 1 FROM "registry" WHERE "organizationId" IS NULL + UNION ALL + SELECT 1 FROM "notification" WHERE "organizationId" IS NULL + UNION ALL + SELECT 1 FROM "certificate" WHERE "organizationId" IS NULL + UNION ALL + SELECT 1 FROM "git_provider" WHERE "organizationId" IS NULL + ) THEN + RAISE EXCEPTION 'Hay recursos sin organización asignada'; + END IF; +END $$; + +-- Hacer organization_id NOT NULL en todas las tablas +ALTER TABLE "project" ALTER COLUMN "organizationId" SET NOT NULL; +ALTER TABLE "server" ALTER COLUMN "organizationId" SET NOT NULL; +ALTER TABLE "ssh-key" ALTER COLUMN "organizationId" SET NOT NULL; +ALTER TABLE "destination" ALTER COLUMN "organizationId" SET NOT NULL; +ALTER TABLE "registry" ALTER COLUMN "organizationId" SET NOT NULL; +ALTER TABLE "notification" ALTER COLUMN "organizationId" SET NOT NULL; +ALTER TABLE "certificate" ALTER COLUMN "organizationId" SET NOT NULL; +ALTER TABLE "git_provider" ALTER COLUMN "organizationId" SET NOT NULL; + +-- Crear índices para mejorar el rendimiento de búsquedas por organización +CREATE INDEX IF NOT EXISTS "idx_project_organization" ON "project" ("organizationId"); +CREATE INDEX IF NOT EXISTS "idx_server_organization" ON "server" ("organizationId"); +CREATE INDEX IF NOT EXISTS "idx_sshkey_organization" ON "ssh-key" ("organizationId"); +CREATE INDEX IF NOT EXISTS "idx_destination_organization" ON "destination" ("organizationId"); +CREATE INDEX IF NOT EXISTS "idx_registry_organization" ON "registry" ("organizationId"); +CREATE INDEX IF NOT EXISTS "idx_notification_organization" ON "notification" ("organizationId"); +CREATE INDEX IF NOT EXISTS "idx_certificate_organization" ON "certificate" ("organizationId"); +CREATE INDEX IF NOT EXISTS "idx_git_provider_organization" ON "git_provider" ("organizationId"); + + + + + +-- Botar tablas de migración +ALTER TABLE "project" DROP CONSTRAINT "project_userId_user_temp_id_fk"; +--> statement-breakpoint +ALTER TABLE "destination" DROP CONSTRAINT "destination_userId_user_temp_id_fk"; +--> statement-breakpoint +ALTER TABLE "certificate" DROP CONSTRAINT "certificate_userId_user_temp_id_fk"; +--> statement-breakpoint +ALTER TABLE "registry" DROP CONSTRAINT "registry_userId_user_temp_id_fk"; +--> statement-breakpoint +ALTER TABLE "notification" DROP CONSTRAINT "notification_userId_user_temp_id_fk"; +--> statement-breakpoint +ALTER TABLE "ssh-key" DROP CONSTRAINT "ssh-key_userId_user_temp_id_fk"; +--> statement-breakpoint +ALTER TABLE "git_provider" DROP CONSTRAINT "git_provider_userId_user_temp_id_fk"; +--> statement-breakpoint +ALTER TABLE "server" DROP CONSTRAINT "server_userId_user_temp_id_fk"; +--> statement-breakpoint +ALTER TABLE "project" ALTER COLUMN "organizationId" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "destination" ALTER COLUMN "organizationId" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "certificate" ALTER COLUMN "organizationId" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "registry" ALTER COLUMN "organizationId" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "notification" ALTER COLUMN "organizationId" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "ssh-key" ALTER COLUMN "organizationId" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "git_provider" ALTER COLUMN "organizationId" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "server" ALTER COLUMN "organizationId" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "project" DROP COLUMN "userId";--> statement-breakpoint +ALTER TABLE "destination" DROP COLUMN "userId";--> statement-breakpoint +ALTER TABLE "certificate" DROP COLUMN "userId";--> statement-breakpoint +ALTER TABLE "registry" DROP COLUMN "userId";--> statement-breakpoint +ALTER TABLE "notification" DROP COLUMN "userId";--> statement-breakpoint +ALTER TABLE "ssh-key" DROP COLUMN "userId";--> statement-breakpoint +ALTER TABLE "git_provider" DROP COLUMN "userId";--> statement-breakpoint +ALTER TABLE "server" DROP COLUMN "userId"; + +-- Drop tables +DROP TABLE "user" CASCADE;--> statement-breakpoint +DROP TABLE "admin" CASCADE;--> statement-breakpoint +DROP TABLE "auth" CASCADE;--> statement-breakpoint +DROP TABLE "session" CASCADE;--> statement-breakpoint +DROP TYPE "public"."Roles"; + + +-- Drop tables +ALTER TABLE "account" DROP CONSTRAINT "account_user_id_user_temp_id_fk"; +--> statement-breakpoint +ALTER TABLE "invitation" DROP CONSTRAINT "invitation_organization_id_organization_id_fk"; +--> statement-breakpoint +ALTER TABLE "invitation" DROP CONSTRAINT "invitation_inviter_id_user_temp_id_fk"; +--> statement-breakpoint +ALTER TABLE "member" DROP CONSTRAINT "member_organization_id_organization_id_fk"; +--> statement-breakpoint +ALTER TABLE "member" DROP CONSTRAINT "member_user_id_user_temp_id_fk"; +--> statement-breakpoint +ALTER TABLE "organization" DROP CONSTRAINT "organization_owner_id_user_temp_id_fk"; +--> statement-breakpoint +ALTER TABLE "account" ADD CONSTRAINT "account_user_id_user_temp_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user_temp"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "invitation" ADD CONSTRAINT "invitation_organization_id_organization_id_fk" FOREIGN KEY ("organization_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "invitation" ADD CONSTRAINT "invitation_inviter_id_user_temp_id_fk" FOREIGN KEY ("inviter_id") REFERENCES "public"."user_temp"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "member" ADD CONSTRAINT "member_organization_id_organization_id_fk" FOREIGN KEY ("organization_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "member" ADD CONSTRAINT "member_user_id_user_temp_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user_temp"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "organization" ADD CONSTRAINT "organization_owner_id_user_temp_id_fk" FOREIGN KEY ("owner_id") REFERENCES "public"."user_temp"("id") ON DELETE cascade ON UPDATE no action; + + +-- Update references + +ALTER TABLE "session_temp" DROP CONSTRAINT "session_temp_user_id_user_temp_id_fk"; +--> statement-breakpoint +ALTER TABLE "session_temp" ADD CONSTRAINT "session_temp_user_id_user_temp_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user_temp"("id") ON DELETE cascade ON UPDATE no action; \ No newline at end of file diff --git a/apps/dokploy/drizzle/0067_condemned_sugar_man.sql b/apps/dokploy/drizzle/0067_condemned_sugar_man.sql new file mode 100644 index 00000000..9c74d7b7 --- /dev/null +++ b/apps/dokploy/drizzle/0067_condemned_sugar_man.sql @@ -0,0 +1 @@ +ALTER TABLE "telegram" ADD COLUMN "messageThreadId" text; \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0000_snapshot.json b/apps/dokploy/drizzle/meta/0000_snapshot.json index 28f27722..c32e80df 100644 --- a/apps/dokploy/drizzle/meta/0000_snapshot.json +++ b/apps/dokploy/drizzle/meta/0000_snapshot.json @@ -1,5 +1,5 @@ { - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -252,7 +252,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -393,7 +396,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -522,7 +528,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -638,7 +647,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -692,7 +704,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -746,7 +761,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -828,7 +846,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -975,7 +996,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1110,7 +1134,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1257,7 +1284,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1399,7 +1429,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1471,7 +1504,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1532,7 +1568,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1700,7 +1739,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1754,7 +1796,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1796,7 +1841,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -1863,7 +1911,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -1926,7 +1977,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -1980,7 +2034,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2109,7 +2166,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2214,5 +2274,9 @@ "columns": {} }, "id": "c6215051-7cd1-412d-b8df-b50d58acacff", - "prevId": "00000000-0000-0000-0000-000000000000" + "prevId": "00000000-0000-0000-0000-000000000000", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0001_snapshot.json b/apps/dokploy/drizzle/meta/0001_snapshot.json index 17cfe8ef..e40461e8 100644 --- a/apps/dokploy/drizzle/meta/0001_snapshot.json +++ b/apps/dokploy/drizzle/meta/0001_snapshot.json @@ -1,5 +1,5 @@ { - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -252,7 +252,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -393,7 +396,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -522,7 +528,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -638,7 +647,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -698,7 +710,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -752,7 +767,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -834,7 +852,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -981,7 +1002,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1116,7 +1140,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1263,7 +1290,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1405,7 +1435,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1477,7 +1510,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1538,7 +1574,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1706,7 +1745,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1760,7 +1802,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1802,7 +1847,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -1869,7 +1917,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -1932,7 +1983,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -1986,7 +2040,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2115,7 +2172,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2220,5 +2280,9 @@ "columns": {} }, "id": "3a4dfad7-ae33-4ae3-b60e-4f40f44f5652", - "prevId": "c6215051-7cd1-412d-b8df-b50d58acacff" + "prevId": "c6215051-7cd1-412d-b8df-b50d58acacff", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0002_snapshot.json b/apps/dokploy/drizzle/meta/0002_snapshot.json index 0f2f9870..a3c00e23 100644 --- a/apps/dokploy/drizzle/meta/0002_snapshot.json +++ b/apps/dokploy/drizzle/meta/0002_snapshot.json @@ -1,5 +1,5 @@ { - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -252,7 +252,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -393,7 +396,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -522,7 +528,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -638,7 +647,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -705,7 +717,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -759,7 +774,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -841,7 +859,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -988,7 +1009,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1123,7 +1147,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1270,7 +1297,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1412,7 +1442,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1484,7 +1517,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1545,7 +1581,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1713,7 +1752,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1767,7 +1809,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1809,7 +1854,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -1876,7 +1924,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -1939,7 +1990,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -1993,7 +2047,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2122,7 +2179,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2227,5 +2287,9 @@ "columns": {} }, "id": "665483bd-5123-4c2b-beef-bfa9b91b9356", - "prevId": "3a4dfad7-ae33-4ae3-b60e-4f40f44f5652" + "prevId": "3a4dfad7-ae33-4ae3-b60e-4f40f44f5652", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0003_snapshot.json b/apps/dokploy/drizzle/meta/0003_snapshot.json index de0fd49c..f6c5ee00 100644 --- a/apps/dokploy/drizzle/meta/0003_snapshot.json +++ b/apps/dokploy/drizzle/meta/0003_snapshot.json @@ -1,5 +1,5 @@ { - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -252,7 +252,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -393,7 +396,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -529,7 +535,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -645,7 +654,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -712,7 +724,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -766,7 +781,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -848,7 +866,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -995,7 +1016,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1130,7 +1154,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1277,7 +1304,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1419,7 +1449,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1491,7 +1524,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1552,7 +1588,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1720,7 +1759,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1774,7 +1816,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1816,7 +1861,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -1883,7 +1931,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -1946,7 +1997,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2000,7 +2054,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2129,7 +2186,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2234,5 +2294,9 @@ "columns": {} }, "id": "5a1d3f2b-9c31-4125-9645-015170550b51", - "prevId": "665483bd-5123-4c2b-beef-bfa9b91b9356" + "prevId": "665483bd-5123-4c2b-beef-bfa9b91b9356", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0004_snapshot.json b/apps/dokploy/drizzle/meta/0004_snapshot.json index 0e0cf457..f8d07def 100644 --- a/apps/dokploy/drizzle/meta/0004_snapshot.json +++ b/apps/dokploy/drizzle/meta/0004_snapshot.json @@ -1,5 +1,5 @@ { - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -228,7 +228,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -369,7 +372,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -505,7 +511,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -621,7 +630,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -688,7 +700,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -742,7 +757,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -824,7 +842,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -971,7 +992,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1106,7 +1130,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1253,7 +1280,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1395,7 +1425,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1467,7 +1500,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1528,7 +1564,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1696,7 +1735,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1750,7 +1792,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1792,7 +1837,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -1859,7 +1907,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -1922,7 +1973,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -1976,7 +2030,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2105,7 +2162,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2210,5 +2270,9 @@ "columns": {} }, "id": "7bb4bbcf-791c-4888-919e-f74bc0528b5f", - "prevId": "5a1d3f2b-9c31-4125-9645-015170550b51" + "prevId": "5a1d3f2b-9c31-4125-9645-015170550b51", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0005_snapshot.json b/apps/dokploy/drizzle/meta/0005_snapshot.json index 30ac2bb3..69c294fd 100644 --- a/apps/dokploy/drizzle/meta/0005_snapshot.json +++ b/apps/dokploy/drizzle/meta/0005_snapshot.json @@ -1,5 +1,5 @@ { - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -228,7 +228,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -369,7 +372,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -505,7 +511,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -621,7 +630,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -688,7 +700,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -742,7 +757,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -824,7 +842,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -971,7 +992,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1106,7 +1130,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1253,7 +1280,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1395,7 +1425,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1467,7 +1500,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1528,7 +1564,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1696,7 +1735,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1750,7 +1792,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1792,7 +1837,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -1859,7 +1907,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -1922,7 +1973,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -1976,7 +2030,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2105,7 +2162,10 @@ ], "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2178,7 +2238,10 @@ } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2291,5 +2354,9 @@ "columns": {} }, "id": "92c75e26-64ef-484f-a7d2-72a9422c119f", - "prevId": "7bb4bbcf-791c-4888-919e-f74bc0528b5f" + "prevId": "7bb4bbcf-791c-4888-919e-f74bc0528b5f", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0006_snapshot.json b/apps/dokploy/drizzle/meta/0006_snapshot.json index 37764831..44b1d685 100644 --- a/apps/dokploy/drizzle/meta/0006_snapshot.json +++ b/apps/dokploy/drizzle/meta/0006_snapshot.json @@ -1,7 +1,5 @@ { - "id": "8ca71247-d512-427d-b115-47a7287ac431", - "prevId": "92c75e26-64ef-484f-a7d2-72a9422c119f", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -219,40 +217,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -374,27 +375,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -505,32 +509,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -635,19 +642,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -710,12 +720,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -757,19 +770,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -840,19 +856,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -980,27 +999,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1116,27 +1138,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1264,27 +1289,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1363,71 +1391,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1487,19 +1518,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1549,19 +1583,22 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1654,84 +1691,87 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1780,12 +1820,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1815,19 +1858,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -1882,19 +1928,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -1936,28 +1985,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2000,19 +2052,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2122,27 +2177,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2204,19 +2262,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2324,8 +2385,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "8ca71247-d512-427d-b115-47a7287ac431", + "prevId": "92c75e26-64ef-484f-a7d2-72a9422c119f", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0007_snapshot.json b/apps/dokploy/drizzle/meta/0007_snapshot.json index a3292da0..0949a42f 100644 --- a/apps/dokploy/drizzle/meta/0007_snapshot.json +++ b/apps/dokploy/drizzle/meta/0007_snapshot.json @@ -1,7 +1,5 @@ { - "id": "80176730-273b-45e4-a7ca-760e29ad6d02", - "prevId": "8ca71247-d512-427d-b115-47a7287ac431", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -226,40 +224,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -381,27 +382,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -512,32 +516,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -642,19 +649,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -717,12 +727,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -764,19 +777,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -847,19 +863,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -987,27 +1006,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1123,27 +1145,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1271,27 +1296,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1370,71 +1398,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1494,19 +1525,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1556,19 +1590,22 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1661,84 +1698,87 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1787,12 +1827,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1822,19 +1865,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -1889,19 +1935,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -1943,28 +1992,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2007,19 +2059,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2129,27 +2184,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2211,19 +2269,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2331,8 +2392,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "80176730-273b-45e4-a7ca-760e29ad6d02", + "prevId": "8ca71247-d512-427d-b115-47a7287ac431", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0008_snapshot.json b/apps/dokploy/drizzle/meta/0008_snapshot.json index c09360d2..5e9d9c71 100644 --- a/apps/dokploy/drizzle/meta/0008_snapshot.json +++ b/apps/dokploy/drizzle/meta/0008_snapshot.json @@ -1,7 +1,5 @@ { - "id": "54b3cce8-c1ab-46ed-bef9-1bb945d965f9", - "prevId": "80176730-273b-45e4-a7ca-760e29ad6d02", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -226,40 +224,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -381,27 +382,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -512,32 +516,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -642,19 +649,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -717,12 +727,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -764,19 +777,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -847,19 +863,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -987,27 +1006,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1123,27 +1145,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1271,27 +1296,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1370,71 +1398,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1494,19 +1525,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1556,19 +1590,22 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1661,84 +1698,87 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1787,12 +1827,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1822,19 +1865,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -1889,19 +1935,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -1943,28 +1992,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2007,19 +2059,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2129,27 +2184,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2211,19 +2269,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2331,8 +2392,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "54b3cce8-c1ab-46ed-bef9-1bb945d965f9", + "prevId": "80176730-273b-45e4-a7ca-760e29ad6d02", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0009_snapshot.json b/apps/dokploy/drizzle/meta/0009_snapshot.json index 906bd91a..6a6ffec8 100644 --- a/apps/dokploy/drizzle/meta/0009_snapshot.json +++ b/apps/dokploy/drizzle/meta/0009_snapshot.json @@ -1,7 +1,5 @@ { - "id": "81eb82a8-2190-4dee-a6c8-416ea98e2547", - "prevId": "54b3cce8-c1ab-46ed-bef9-1bb945d965f9", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -226,40 +224,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -381,27 +382,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -512,32 +516,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -642,19 +649,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -717,12 +727,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -764,19 +777,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -847,19 +863,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -987,27 +1006,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1123,27 +1145,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1271,27 +1296,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1370,71 +1398,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1494,19 +1525,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1556,19 +1590,22 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1661,84 +1698,87 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1787,12 +1827,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1822,19 +1865,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -1889,19 +1935,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -1943,28 +1992,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2007,19 +2059,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2129,27 +2184,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2211,19 +2269,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2331,8 +2392,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "81eb82a8-2190-4dee-a6c8-416ea98e2547", + "prevId": "54b3cce8-c1ab-46ed-bef9-1bb945d965f9", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0010_snapshot.json b/apps/dokploy/drizzle/meta/0010_snapshot.json index 30db7913..ff5f0f2b 100644 --- a/apps/dokploy/drizzle/meta/0010_snapshot.json +++ b/apps/dokploy/drizzle/meta/0010_snapshot.json @@ -1,7 +1,5 @@ { - "id": "c4f34dc8-69d6-49f3-809d-be474f0f0fcf", - "prevId": "81eb82a8-2190-4dee-a6c8-416ea98e2547", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -226,40 +224,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -381,27 +382,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -512,32 +516,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -642,19 +649,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -717,12 +727,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -764,19 +777,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -847,19 +863,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -987,27 +1006,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1123,27 +1145,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1271,27 +1296,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1370,71 +1398,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1494,19 +1525,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1556,19 +1590,22 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1661,84 +1698,87 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1787,12 +1827,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1822,19 +1865,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -1889,19 +1935,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -1943,28 +1992,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2007,19 +2059,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2129,27 +2184,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2217,19 +2275,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2337,8 +2398,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "c4f34dc8-69d6-49f3-809d-be474f0f0fcf", + "prevId": "81eb82a8-2190-4dee-a6c8-416ea98e2547", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0011_snapshot.json b/apps/dokploy/drizzle/meta/0011_snapshot.json index 24dc3704..9a2215ee 100644 --- a/apps/dokploy/drizzle/meta/0011_snapshot.json +++ b/apps/dokploy/drizzle/meta/0011_snapshot.json @@ -1,7 +1,5 @@ { - "id": "9c6bb052-9f90-46fd-9382-67984e03f5b1", - "prevId": "c4f34dc8-69d6-49f3-809d-be474f0f0fcf", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -226,40 +224,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -381,27 +382,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -512,32 +516,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -642,19 +649,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -717,12 +727,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -764,19 +777,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -847,19 +863,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -987,27 +1006,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1123,27 +1145,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1271,27 +1296,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1370,71 +1398,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1494,19 +1525,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1556,19 +1590,22 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1661,84 +1698,87 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1787,12 +1827,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1822,19 +1865,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -1889,19 +1935,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -1943,28 +1992,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2007,19 +2059,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2129,27 +2184,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2217,19 +2275,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2337,8 +2398,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "9c6bb052-9f90-46fd-9382-67984e03f5b1", + "prevId": "c4f34dc8-69d6-49f3-809d-be474f0f0fcf", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0012_snapshot.json b/apps/dokploy/drizzle/meta/0012_snapshot.json index 78f211d7..4fe7766c 100644 --- a/apps/dokploy/drizzle/meta/0012_snapshot.json +++ b/apps/dokploy/drizzle/meta/0012_snapshot.json @@ -1,7 +1,5 @@ { - "id": "5e715d26-b9c1-4e9c-80b7-408d63832e85", - "prevId": "9c6bb052-9f90-46fd-9382-67984e03f5b1", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -268,40 +266,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -423,27 +424,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -554,32 +558,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -684,19 +691,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -759,12 +769,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -806,19 +819,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -889,19 +905,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1029,27 +1048,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1165,27 +1187,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1313,27 +1338,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1412,71 +1440,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1536,19 +1567,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1598,19 +1632,22 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1703,84 +1740,87 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1829,12 +1869,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1864,19 +1907,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -1931,19 +1977,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -1985,28 +2034,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2049,19 +2101,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2171,27 +2226,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2259,19 +2317,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2379,8 +2440,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "5e715d26-b9c1-4e9c-80b7-408d63832e85", + "prevId": "9c6bb052-9f90-46fd-9382-67984e03f5b1", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0013_snapshot.json b/apps/dokploy/drizzle/meta/0013_snapshot.json index 9a4f2eb1..2bf43ca0 100644 --- a/apps/dokploy/drizzle/meta/0013_snapshot.json +++ b/apps/dokploy/drizzle/meta/0013_snapshot.json @@ -1,7 +1,5 @@ { - "id": "5677e0b8-f22f-4565-9161-e97b381c0e1c", - "prevId": "5e715d26-b9c1-4e9c-80b7-408d63832e85", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -274,40 +272,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -429,27 +430,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -560,32 +564,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -690,19 +697,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -765,12 +775,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -812,19 +825,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -895,19 +911,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1035,27 +1054,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1171,27 +1193,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1319,27 +1344,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1418,71 +1446,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1542,19 +1573,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1604,19 +1638,22 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1709,84 +1746,87 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1835,12 +1875,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1870,19 +1913,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -1937,19 +1983,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -1991,28 +2040,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2055,19 +2107,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2177,27 +2232,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2265,19 +2323,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2385,8 +2446,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "5677e0b8-f22f-4565-9161-e97b381c0e1c", + "prevId": "5e715d26-b9c1-4e9c-80b7-408d63832e85", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0014_snapshot.json b/apps/dokploy/drizzle/meta/0014_snapshot.json index c25de1ff..4cf4832c 100644 --- a/apps/dokploy/drizzle/meta/0014_snapshot.json +++ b/apps/dokploy/drizzle/meta/0014_snapshot.json @@ -1,7 +1,5 @@ { - "id": "c204362f-e392-4d30-829a-2b9df39b3001", - "prevId": "5677e0b8-f22f-4565-9161-e97b381c0e1c", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -274,40 +272,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -429,27 +430,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -560,32 +564,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -690,19 +697,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -765,12 +775,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -812,19 +825,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -895,19 +911,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1035,27 +1054,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1171,27 +1193,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1319,27 +1344,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1418,71 +1446,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1542,19 +1573,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1610,32 +1644,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1734,97 +1771,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1873,12 +1913,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1908,19 +1951,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -1975,19 +2021,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2029,28 +2078,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2093,19 +2145,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2215,27 +2270,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2382,19 +2440,22 @@ "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2462,19 +2523,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2600,8 +2664,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "c204362f-e392-4d30-829a-2b9df39b3001", + "prevId": "5677e0b8-f22f-4565-9161-e97b381c0e1c", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0015_snapshot.json b/apps/dokploy/drizzle/meta/0015_snapshot.json index f0aa26b0..d5327cc3 100644 --- a/apps/dokploy/drizzle/meta/0015_snapshot.json +++ b/apps/dokploy/drizzle/meta/0015_snapshot.json @@ -1,7 +1,5 @@ { - "id": "c6534c4b-5da2-4694-bd77-235eaeecc60a", - "prevId": "c204362f-e392-4d30-829a-2b9df39b3001", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -274,40 +272,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -429,27 +430,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -560,32 +564,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -690,19 +697,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -771,12 +781,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -818,19 +831,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -901,19 +917,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1041,27 +1060,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1177,27 +1199,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1325,27 +1350,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1424,71 +1452,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1548,19 +1579,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1616,32 +1650,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1740,97 +1777,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1879,12 +1919,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1914,19 +1957,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -1981,19 +2027,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2035,28 +2084,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2099,19 +2151,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2221,27 +2276,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2388,19 +2446,22 @@ "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2468,19 +2529,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2606,8 +2670,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "c6534c4b-5da2-4694-bd77-235eaeecc60a", + "prevId": "c204362f-e392-4d30-829a-2b9df39b3001", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0016_snapshot.json b/apps/dokploy/drizzle/meta/0016_snapshot.json index 010de064..50dda612 100644 --- a/apps/dokploy/drizzle/meta/0016_snapshot.json +++ b/apps/dokploy/drizzle/meta/0016_snapshot.json @@ -1,7 +1,5 @@ { - "id": "2d8d7670-b942-4573-9c44-6e81d2a2fa16", - "prevId": "c6534c4b-5da2-4694-bd77-235eaeecc60a", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -274,40 +272,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -429,27 +430,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -567,32 +571,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -697,19 +704,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -778,12 +788,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -825,19 +838,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -908,19 +924,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1048,27 +1067,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1184,27 +1206,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1332,27 +1357,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1431,71 +1459,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1555,19 +1586,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1623,32 +1657,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1747,97 +1784,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1886,12 +1926,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1921,19 +1964,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -1988,19 +2034,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2042,28 +2091,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2106,19 +2158,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2228,27 +2283,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2395,19 +2453,22 @@ "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2475,19 +2536,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2613,8 +2677,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "2d8d7670-b942-4573-9c44-6e81d2a2fa16", + "prevId": "c6534c4b-5da2-4694-bd77-235eaeecc60a", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0017_snapshot.json b/apps/dokploy/drizzle/meta/0017_snapshot.json index afeb4aa3..2f7f638d 100644 --- a/apps/dokploy/drizzle/meta/0017_snapshot.json +++ b/apps/dokploy/drizzle/meta/0017_snapshot.json @@ -1,7 +1,5 @@ { - "id": "ec852f38-886a-43b4-9295-73984ed8ef45", - "prevId": "2d8d7670-b942-4573-9c44-6e81d2a2fa16", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -274,40 +272,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -429,27 +430,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -567,32 +571,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -697,19 +704,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -778,12 +788,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -825,19 +838,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -908,19 +924,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1048,27 +1067,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1184,27 +1206,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1332,27 +1357,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1431,71 +1459,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1555,19 +1586,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1629,32 +1663,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1753,97 +1790,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1892,12 +1932,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1927,19 +1970,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -1994,19 +2040,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2048,28 +2097,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2112,19 +2164,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2234,27 +2289,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2401,19 +2459,22 @@ "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2481,19 +2542,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2619,8 +2683,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "ec852f38-886a-43b4-9295-73984ed8ef45", + "prevId": "2d8d7670-b942-4573-9c44-6e81d2a2fa16", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0018_snapshot.json b/apps/dokploy/drizzle/meta/0018_snapshot.json index 220684c0..b158fa85 100644 --- a/apps/dokploy/drizzle/meta/0018_snapshot.json +++ b/apps/dokploy/drizzle/meta/0018_snapshot.json @@ -1,7 +1,5 @@ { - "id": "3d47456f-03b7-4b45-87f2-057df7e9cb0b", - "prevId": "ec852f38-886a-43b4-9295-73984ed8ef45", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -274,40 +272,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -429,27 +430,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -567,32 +571,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -703,19 +710,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -784,12 +794,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -831,19 +844,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -914,19 +930,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1054,27 +1073,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1190,27 +1212,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1338,27 +1363,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1437,71 +1465,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1561,19 +1592,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1635,32 +1669,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1759,97 +1796,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1898,12 +1938,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1933,19 +1976,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2000,19 +2046,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2054,28 +2103,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2118,19 +2170,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2240,27 +2295,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2407,19 +2465,22 @@ "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2487,19 +2548,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2625,8 +2689,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "3d47456f-03b7-4b45-87f2-057df7e9cb0b", + "prevId": "ec852f38-886a-43b4-9295-73984ed8ef45", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0019_snapshot.json b/apps/dokploy/drizzle/meta/0019_snapshot.json index 01b1b7e6..48965466 100644 --- a/apps/dokploy/drizzle/meta/0019_snapshot.json +++ b/apps/dokploy/drizzle/meta/0019_snapshot.json @@ -1,7 +1,5 @@ { - "id": "7c8f815f-4fec-4505-b9c7-c28bac3451f0", - "prevId": "3d47456f-03b7-4b45-87f2-057df7e9cb0b", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -274,40 +272,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -429,27 +430,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -567,32 +571,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -703,19 +710,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -784,12 +794,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -831,19 +844,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -914,19 +930,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1054,27 +1073,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1190,27 +1212,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1338,27 +1363,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1437,71 +1465,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1561,19 +1592,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1635,32 +1669,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1759,97 +1796,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1898,12 +1938,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1933,19 +1976,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2000,19 +2046,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2054,28 +2103,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2118,19 +2170,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2240,27 +2295,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2407,19 +2465,22 @@ "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2487,19 +2548,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2521,7 +2585,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -2573,7 +2640,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -2669,58 +2739,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -2748,7 +2821,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -2776,7 +2852,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2912,8 +2991,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "7c8f815f-4fec-4505-b9c7-c28bac3451f0", + "prevId": "3d47456f-03b7-4b45-87f2-057df7e9cb0b", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0020_snapshot.json b/apps/dokploy/drizzle/meta/0020_snapshot.json index 034ec039..0b9df302 100644 --- a/apps/dokploy/drizzle/meta/0020_snapshot.json +++ b/apps/dokploy/drizzle/meta/0020_snapshot.json @@ -1,7 +1,5 @@ { - "id": "cbe2b41d-26b6-4ca5-b40d-0e37faa56f39", - "prevId": "7c8f815f-4fec-4505-b9c7-c28bac3451f0", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -274,40 +272,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -429,27 +430,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -567,32 +571,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -703,19 +710,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -784,12 +794,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -831,19 +844,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -914,19 +930,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1054,27 +1073,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1190,27 +1212,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1338,27 +1363,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1437,71 +1465,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1561,19 +1592,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1635,32 +1669,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1759,97 +1796,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1898,12 +1938,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1933,19 +1976,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2000,19 +2046,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2054,28 +2103,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2118,19 +2170,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2240,27 +2295,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2407,19 +2465,22 @@ "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2487,19 +2548,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2521,7 +2585,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -2573,7 +2640,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -2676,58 +2746,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -2755,7 +2828,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -2783,7 +2859,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2919,8 +2998,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "cbe2b41d-26b6-4ca5-b40d-0e37faa56f39", + "prevId": "7c8f815f-4fec-4505-b9c7-c28bac3451f0", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0021_snapshot.json b/apps/dokploy/drizzle/meta/0021_snapshot.json index 58bf0e51..0aa3ae98 100644 --- a/apps/dokploy/drizzle/meta/0021_snapshot.json +++ b/apps/dokploy/drizzle/meta/0021_snapshot.json @@ -1,7 +1,5 @@ { - "id": "10f88c8f-bc1e-4dc4-99a5-327469c0da70", - "prevId": "cbe2b41d-26b6-4ca5-b40d-0e37faa56f39", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -274,40 +272,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -429,27 +430,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -567,32 +571,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -703,19 +710,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -784,12 +794,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -831,19 +844,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -914,19 +930,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1054,27 +1073,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1190,27 +1212,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1338,27 +1363,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1437,71 +1465,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1561,19 +1592,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1635,32 +1669,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1759,97 +1796,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1898,12 +1938,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1933,19 +1976,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2000,19 +2046,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2054,28 +2103,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2118,19 +2170,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2240,27 +2295,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2407,19 +2465,22 @@ "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2487,19 +2548,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2521,7 +2585,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -2573,7 +2640,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -2669,58 +2739,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -2748,7 +2821,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -2776,7 +2852,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2912,8 +2991,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "10f88c8f-bc1e-4dc4-99a5-327469c0da70", + "prevId": "cbe2b41d-26b6-4ca5-b40d-0e37faa56f39", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0022_snapshot.json b/apps/dokploy/drizzle/meta/0022_snapshot.json index 3a08e1f4..dfad80d9 100644 --- a/apps/dokploy/drizzle/meta/0022_snapshot.json +++ b/apps/dokploy/drizzle/meta/0022_snapshot.json @@ -1,7 +1,5 @@ { - "id": "86052343-0056-486c-9168-fa84186b4323", - "prevId": "10f88c8f-bc1e-4dc4-99a5-327469c0da70", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -274,40 +272,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -429,27 +430,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -567,32 +571,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -703,19 +710,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -784,12 +794,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -831,19 +844,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -914,19 +930,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1054,27 +1073,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1190,27 +1212,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1338,27 +1363,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1437,71 +1465,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1561,19 +1592,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1635,32 +1669,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1759,97 +1796,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1898,12 +1938,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1933,19 +1976,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2000,19 +2046,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2054,28 +2103,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2118,19 +2170,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2240,27 +2295,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2407,19 +2465,22 @@ "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2487,19 +2548,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2521,7 +2585,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -2573,7 +2640,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -2669,58 +2739,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -2748,7 +2821,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -2776,7 +2852,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2913,8 +2992,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "86052343-0056-486c-9168-fa84186b4323", + "prevId": "10f88c8f-bc1e-4dc4-99a5-327469c0da70", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0023_snapshot.json b/apps/dokploy/drizzle/meta/0023_snapshot.json index 287ff439..3ea3eb7e 100644 --- a/apps/dokploy/drizzle/meta/0023_snapshot.json +++ b/apps/dokploy/drizzle/meta/0023_snapshot.json @@ -1,7 +1,5 @@ { - "id": "730bfb9e-42e2-42de-a939-5cfe5ffe54b2", - "prevId": "86052343-0056-486c-9168-fa84186b4323", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -280,40 +278,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -435,27 +436,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -573,32 +577,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -709,19 +716,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -790,12 +800,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -837,19 +850,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -920,19 +936,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1060,27 +1079,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1196,27 +1218,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1344,27 +1369,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1443,71 +1471,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1567,19 +1598,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1641,32 +1675,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1765,97 +1802,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1904,12 +1944,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1939,19 +1982,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2006,19 +2052,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2060,28 +2109,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2124,19 +2176,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2246,27 +2301,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2413,19 +2471,22 @@ "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2493,19 +2554,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2527,7 +2591,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -2579,7 +2646,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -2675,58 +2745,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -2754,7 +2827,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -2782,7 +2858,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2919,8 +2998,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "730bfb9e-42e2-42de-a939-5cfe5ffe54b2", + "prevId": "86052343-0056-486c-9168-fa84186b4323", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0024_snapshot.json b/apps/dokploy/drizzle/meta/0024_snapshot.json index d34b38f6..2ec9dd4e 100644 --- a/apps/dokploy/drizzle/meta/0024_snapshot.json +++ b/apps/dokploy/drizzle/meta/0024_snapshot.json @@ -1,7 +1,5 @@ { - "id": "2c69b31b-ecee-4e20-9959-6dc0c76656fb", - "prevId": "730bfb9e-42e2-42de-a939-5cfe5ffe54b2", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -280,40 +278,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -435,27 +436,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -573,32 +577,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -709,19 +716,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -790,12 +800,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -837,19 +850,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -920,19 +936,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1060,27 +1079,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1196,27 +1218,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1344,27 +1369,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1443,71 +1471,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1567,19 +1598,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1641,32 +1675,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1771,97 +1808,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1910,12 +1950,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1945,19 +1988,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2012,19 +2058,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2066,28 +2115,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2130,19 +2182,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2252,27 +2307,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2419,19 +2477,22 @@ "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2499,19 +2560,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2533,7 +2597,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -2585,7 +2652,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -2681,58 +2751,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -2760,7 +2833,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -2788,7 +2864,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2925,8 +3004,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "2c69b31b-ecee-4e20-9959-6dc0c76656fb", + "prevId": "730bfb9e-42e2-42de-a939-5cfe5ffe54b2", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0025_snapshot.json b/apps/dokploy/drizzle/meta/0025_snapshot.json index 15ba3294..098162fe 100644 --- a/apps/dokploy/drizzle/meta/0025_snapshot.json +++ b/apps/dokploy/drizzle/meta/0025_snapshot.json @@ -1,7 +1,5 @@ { - "id": "771c1412-7931-4f79-a789-055b0f51cf0f", - "prevId": "2c69b31b-ecee-4e20-9959-6dc0c76656fb", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -286,40 +284,43 @@ "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -441,27 +442,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -579,32 +583,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -715,19 +722,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -796,12 +806,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -843,19 +856,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -926,19 +942,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1066,27 +1085,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1202,27 +1224,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1350,27 +1375,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1449,71 +1477,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1573,19 +1604,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1647,32 +1681,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1777,97 +1814,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1916,12 +1956,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1951,19 +1994,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2018,19 +2064,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2072,28 +2121,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2136,19 +2188,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2258,27 +2313,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2425,19 +2483,22 @@ "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2505,19 +2566,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2539,7 +2603,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -2591,7 +2658,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -2687,58 +2757,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -2766,7 +2839,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -2794,7 +2870,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -2931,8 +3010,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "771c1412-7931-4f79-a789-055b0f51cf0f", + "prevId": "2c69b31b-ecee-4e20-9959-6dc0c76656fb", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0026_snapshot.json b/apps/dokploy/drizzle/meta/0026_snapshot.json index b863fb02..a3cb4bf3 100644 --- a/apps/dokploy/drizzle/meta/0026_snapshot.json +++ b/apps/dokploy/drizzle/meta/0026_snapshot.json @@ -1,7 +1,5 @@ { - "id": "3dff4fa9-1d03-4748-b3ee-908c34324171", - "prevId": "771c1412-7931-4f79-a789-055b0f51cf0f", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -286,53 +284,56 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -454,27 +455,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -592,32 +596,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -728,19 +735,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -809,12 +819,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -856,19 +869,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -939,19 +955,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1079,27 +1098,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1215,27 +1237,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1363,27 +1388,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1462,71 +1490,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1586,19 +1617,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1660,32 +1694,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1790,97 +1827,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1929,12 +1969,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1964,19 +2007,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2031,19 +2077,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2085,28 +2134,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2149,19 +2201,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2271,27 +2326,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2438,32 +2496,35 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2531,19 +2592,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2565,7 +2629,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -2617,7 +2684,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -2713,58 +2783,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -2792,7 +2865,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -2820,7 +2896,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -2866,7 +2945,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3003,8 +3085,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "3dff4fa9-1d03-4748-b3ee-908c34324171", + "prevId": "771c1412-7931-4f79-a789-055b0f51cf0f", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0027_snapshot.json b/apps/dokploy/drizzle/meta/0027_snapshot.json index 97811b25..f0e490ac 100644 --- a/apps/dokploy/drizzle/meta/0027_snapshot.json +++ b/apps/dokploy/drizzle/meta/0027_snapshot.json @@ -1,7 +1,5 @@ { - "id": "4dd1240c-ad28-4dd3-9b5c-52dba32b8d24", - "prevId": "3dff4fa9-1d03-4748-b3ee-908c34324171", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -292,53 +290,56 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -460,27 +461,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -598,32 +602,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -734,19 +741,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -815,12 +825,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -862,19 +875,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -945,19 +961,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1085,27 +1104,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1221,27 +1243,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1369,27 +1394,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1468,71 +1496,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1592,19 +1623,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1666,32 +1700,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1796,97 +1833,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1935,12 +1975,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1970,19 +2013,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2037,19 +2083,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2091,28 +2140,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2155,19 +2207,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2277,27 +2332,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2444,32 +2502,35 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2537,19 +2598,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2571,7 +2635,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -2623,7 +2690,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -2719,58 +2789,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -2798,7 +2871,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -2826,7 +2902,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -2872,7 +2951,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3009,8 +3091,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "4dd1240c-ad28-4dd3-9b5c-52dba32b8d24", + "prevId": "3dff4fa9-1d03-4748-b3ee-908c34324171", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0028_snapshot.json b/apps/dokploy/drizzle/meta/0028_snapshot.json index 6a36c0a8..4d8bb382 100644 --- a/apps/dokploy/drizzle/meta/0028_snapshot.json +++ b/apps/dokploy/drizzle/meta/0028_snapshot.json @@ -1,7 +1,5 @@ { - "id": "cbcfd076-035f-4ca2-9643-b8ba8f2b6f03", - "prevId": "4dd1240c-ad28-4dd3-9b5c-52dba32b8d24", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -292,53 +290,56 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -460,27 +461,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -598,32 +602,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -734,19 +741,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -815,12 +825,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -862,19 +875,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -945,19 +961,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1085,27 +1104,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1221,27 +1243,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1369,27 +1394,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1468,71 +1496,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1592,19 +1623,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1666,32 +1700,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1796,97 +1833,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1935,12 +1975,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1970,19 +2013,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2037,19 +2083,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2091,28 +2140,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2155,19 +2207,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2277,27 +2332,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2444,32 +2502,35 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2537,19 +2598,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2571,7 +2635,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -2623,7 +2690,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -2719,58 +2789,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -2798,7 +2871,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -2826,7 +2902,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -2872,7 +2951,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3010,8 +3092,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "cbcfd076-035f-4ca2-9643-b8ba8f2b6f03", + "prevId": "4dd1240c-ad28-4dd3-9b5c-52dba32b8d24", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0029_snapshot.json b/apps/dokploy/drizzle/meta/0029_snapshot.json index f8e6f868..4d7a8715 100644 --- a/apps/dokploy/drizzle/meta/0029_snapshot.json +++ b/apps/dokploy/drizzle/meta/0029_snapshot.json @@ -1,7 +1,5 @@ { - "id": "270dbc4c-104d-4630-b5f3-6c02f0afae49", - "prevId": "cbcfd076-035f-4ca2-9643-b8ba8f2b6f03", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -298,53 +296,56 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -466,27 +467,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -604,32 +608,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -740,19 +747,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -821,12 +831,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -868,19 +881,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -951,19 +967,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1091,27 +1110,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1227,27 +1249,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1375,27 +1400,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1474,71 +1502,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1598,19 +1629,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1672,32 +1706,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1802,97 +1839,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1941,12 +1981,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1976,19 +2019,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2043,19 +2089,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2097,28 +2146,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2161,19 +2213,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2283,27 +2338,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2450,32 +2508,35 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2543,19 +2604,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2577,7 +2641,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -2629,7 +2696,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -2725,58 +2795,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -2804,7 +2877,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -2832,7 +2908,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -2878,7 +2957,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3016,8 +3098,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "270dbc4c-104d-4630-b5f3-6c02f0afae49", + "prevId": "cbcfd076-035f-4ca2-9643-b8ba8f2b6f03", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0030_snapshot.json b/apps/dokploy/drizzle/meta/0030_snapshot.json index 78a898cc..c9378bcc 100644 --- a/apps/dokploy/drizzle/meta/0030_snapshot.json +++ b/apps/dokploy/drizzle/meta/0030_snapshot.json @@ -1,7 +1,5 @@ { - "id": "8dc242b9-6fa9-4372-9ecd-86ae90dd7d0d", - "prevId": "270dbc4c-104d-4630-b5f3-6c02f0afae49", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -298,53 +296,56 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -466,27 +467,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -611,32 +615,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -747,19 +754,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -828,12 +838,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -875,19 +888,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -958,19 +974,22 @@ "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1098,27 +1117,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1234,27 +1256,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1382,27 +1407,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1481,71 +1509,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1605,19 +1636,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1679,32 +1713,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1809,97 +1846,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1948,12 +1988,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -1983,19 +2026,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2050,19 +2096,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2104,28 +2153,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2168,19 +2220,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2290,27 +2345,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2457,32 +2515,35 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2550,19 +2611,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2584,7 +2648,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -2636,7 +2703,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -2732,58 +2802,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -2811,7 +2884,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -2839,7 +2915,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -2885,7 +2964,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3023,8 +3105,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "8dc242b9-6fa9-4372-9ecd-86ae90dd7d0d", + "prevId": "270dbc4c-104d-4630-b5f3-6c02f0afae49", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0031_snapshot.json b/apps/dokploy/drizzle/meta/0031_snapshot.json index 3330e336..a4fd4e14 100644 --- a/apps/dokploy/drizzle/meta/0031_snapshot.json +++ b/apps/dokploy/drizzle/meta/0031_snapshot.json @@ -1,7 +1,5 @@ { - "id": "86b27966-a431-493d-9cbc-2291e280f8f2", - "prevId": "8dc242b9-6fa9-4372-9ecd-86ae90dd7d0d", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -298,53 +296,56 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -466,27 +467,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -611,32 +615,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -747,19 +754,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -828,12 +838,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -875,19 +888,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -978,32 +994,35 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1131,27 +1150,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1267,27 +1289,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1415,27 +1440,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1514,71 +1542,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1638,19 +1669,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1712,32 +1746,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1842,97 +1879,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1981,12 +2021,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2016,19 +2059,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2083,19 +2129,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2137,28 +2186,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2201,19 +2253,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2323,27 +2378,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2490,32 +2548,35 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2583,19 +2644,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2617,7 +2681,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -2669,7 +2736,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -2765,58 +2835,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -2844,7 +2917,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -2872,7 +2948,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -2918,7 +2997,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3064,8 +3146,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "86b27966-a431-493d-9cbc-2291e280f8f2", + "prevId": "8dc242b9-6fa9-4372-9ecd-86ae90dd7d0d", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0032_snapshot.json b/apps/dokploy/drizzle/meta/0032_snapshot.json index aed88197..587e446a 100644 --- a/apps/dokploy/drizzle/meta/0032_snapshot.json +++ b/apps/dokploy/drizzle/meta/0032_snapshot.json @@ -1,7 +1,5 @@ { - "id": "ce8a8861-2970-4889-ac2e-3cfe60d12736", - "prevId": "86b27966-a431-493d-9cbc-2291e280f8f2", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -298,53 +296,56 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -466,27 +467,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -611,32 +615,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -747,19 +754,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -828,12 +838,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -875,19 +888,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -978,32 +994,35 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1131,27 +1150,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1267,27 +1289,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1415,27 +1440,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1514,71 +1542,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1638,19 +1669,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1712,32 +1746,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1842,97 +1879,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -1981,12 +2021,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2016,19 +2059,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2083,19 +2129,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2137,28 +2186,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2201,19 +2253,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2323,27 +2378,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2490,32 +2548,35 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2583,19 +2644,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2617,7 +2681,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -2669,7 +2736,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -2765,58 +2835,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -2844,7 +2917,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -2872,7 +2948,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -2918,7 +2997,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3064,8 +3146,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "ce8a8861-2970-4889-ac2e-3cfe60d12736", + "prevId": "86b27966-a431-493d-9cbc-2291e280f8f2", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0033_snapshot.json b/apps/dokploy/drizzle/meta/0033_snapshot.json index 40c6d300..35509ce9 100644 --- a/apps/dokploy/drizzle/meta/0033_snapshot.json +++ b/apps/dokploy/drizzle/meta/0033_snapshot.json @@ -1,7 +1,5 @@ { - "id": "4b757666-9e18-454e-9cfa-762d03bf378f", - "prevId": "ce8a8861-2970-4889-ac2e-3cfe60d12736", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -378,92 +376,95 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -585,27 +586,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -737,32 +741,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -831,19 +838,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -912,12 +922,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -959,19 +972,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1062,32 +1078,35 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1215,27 +1234,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1351,27 +1373,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1499,27 +1524,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1598,71 +1626,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1722,19 +1753,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1796,32 +1830,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1926,97 +1963,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2065,12 +2105,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2100,19 +2143,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2167,19 +2213,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2221,28 +2270,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2285,19 +2337,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2407,27 +2462,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2640,71 +2698,74 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2772,19 +2833,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2806,7 +2870,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -2858,7 +2925,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -2954,58 +3024,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3033,7 +3106,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3061,7 +3137,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3107,7 +3186,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3151,19 +3233,22 @@ "git_provider_authId_auth_id_fk": { "name": "git_provider_authId_auth_id_fk", "tableFrom": "git_provider", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3205,19 +3290,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3283,19 +3371,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3361,19 +3452,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3532,8 +3626,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "4b757666-9e18-454e-9cfa-762d03bf378f", + "prevId": "ce8a8861-2970-4889-ac2e-3cfe60d12736", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0034_snapshot.json b/apps/dokploy/drizzle/meta/0034_snapshot.json index 2dd3e13f..c6a78481 100644 --- a/apps/dokploy/drizzle/meta/0034_snapshot.json +++ b/apps/dokploy/drizzle/meta/0034_snapshot.json @@ -1,7 +1,5 @@ { - "id": "6a7ce86e-f628-4786-ab30-e160dcdb0a39", - "prevId": "4b757666-9e18-454e-9cfa-762d03bf378f", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -384,92 +382,95 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -591,27 +592,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -743,32 +747,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -837,19 +844,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -918,12 +928,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -965,19 +978,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1068,32 +1084,35 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1221,27 +1240,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1357,27 +1379,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1505,27 +1530,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1604,71 +1632,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1728,19 +1759,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1802,32 +1836,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1932,97 +1969,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2071,12 +2111,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2106,19 +2149,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2173,19 +2219,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2227,28 +2276,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2291,19 +2343,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2413,27 +2468,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2646,71 +2704,74 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2778,19 +2839,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2812,7 +2876,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -2864,7 +2931,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -2960,58 +3030,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3039,7 +3112,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3067,7 +3143,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3113,7 +3192,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3157,19 +3239,22 @@ "git_provider_authId_auth_id_fk": { "name": "git_provider_authId_auth_id_fk", "tableFrom": "git_provider", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3211,19 +3296,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3289,19 +3377,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3367,19 +3458,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3538,8 +3632,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "6a7ce86e-f628-4786-ab30-e160dcdb0a39", + "prevId": "4b757666-9e18-454e-9cfa-762d03bf378f", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0035_snapshot.json b/apps/dokploy/drizzle/meta/0035_snapshot.json index 970edd40..501f634b 100644 --- a/apps/dokploy/drizzle/meta/0035_snapshot.json +++ b/apps/dokploy/drizzle/meta/0035_snapshot.json @@ -1,7 +1,5 @@ { - "id": "bb060896-7fc0-4bf3-b579-65f118769de0", - "prevId": "6a7ce86e-f628-4786-ab30-e160dcdb0a39", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -384,92 +382,95 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -591,27 +592,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -743,32 +747,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -837,19 +844,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -918,12 +928,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -965,19 +978,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1068,32 +1084,35 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1221,27 +1240,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1357,27 +1379,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1505,27 +1530,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1604,71 +1632,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1728,19 +1759,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1802,32 +1836,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1932,97 +1969,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2071,12 +2111,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2106,19 +2149,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2173,19 +2219,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2227,28 +2276,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2291,19 +2343,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2413,27 +2468,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2660,71 +2718,74 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2792,19 +2853,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2826,7 +2890,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -2878,7 +2945,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -2974,58 +3044,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3053,7 +3126,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3081,7 +3157,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3127,7 +3206,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3171,19 +3253,22 @@ "git_provider_authId_auth_id_fk": { "name": "git_provider_authId_auth_id_fk", "tableFrom": "git_provider", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3225,19 +3310,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3303,19 +3391,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3381,19 +3472,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3552,8 +3646,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "bb060896-7fc0-4bf3-b579-65f118769de0", + "prevId": "6a7ce86e-f628-4786-ab30-e160dcdb0a39", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0036_snapshot.json b/apps/dokploy/drizzle/meta/0036_snapshot.json index a5f102a6..92d16f9e 100644 --- a/apps/dokploy/drizzle/meta/0036_snapshot.json +++ b/apps/dokploy/drizzle/meta/0036_snapshot.json @@ -1,7 +1,5 @@ { - "id": "74cd1475-b79c-4226-b4e6-e5ddb9576025", - "prevId": "bb060896-7fc0-4bf3-b579-65f118769de0", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -384,92 +382,95 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -591,27 +592,30 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -743,32 +747,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -844,19 +851,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -925,12 +935,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -972,19 +985,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1075,32 +1091,35 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1228,27 +1247,30 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1364,27 +1386,30 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1512,27 +1537,30 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1611,71 +1639,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1735,19 +1766,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1809,32 +1843,35 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -1939,97 +1976,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2078,12 +2118,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2113,19 +2156,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2180,19 +2226,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2234,28 +2283,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2298,19 +2350,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2420,27 +2475,30 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2667,71 +2725,74 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2799,19 +2860,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2833,7 +2897,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -2885,7 +2952,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -2981,58 +3051,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3060,7 +3133,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3088,7 +3164,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3134,7 +3213,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3178,19 +3260,22 @@ "git_provider_authId_auth_id_fk": { "name": "git_provider_authId_auth_id_fk", "tableFrom": "git_provider", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3232,19 +3317,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3310,19 +3398,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3388,19 +3479,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3559,8 +3653,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "74cd1475-b79c-4226-b4e6-e5ddb9576025", + "prevId": "bb060896-7fc0-4bf3-b579-65f118769de0", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0037_snapshot.json b/apps/dokploy/drizzle/meta/0037_snapshot.json index 5ca60d26..b952fff6 100644 --- a/apps/dokploy/drizzle/meta/0037_snapshot.json +++ b/apps/dokploy/drizzle/meta/0037_snapshot.json @@ -1,7 +1,5 @@ { - "id": "19a70a39-f719-400b-b61e-6ddf1bcc6ac5", - "prevId": "74cd1475-b79c-4226-b4e6-e5ddb9576025", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -390,105 +388,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -616,40 +617,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -781,32 +785,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -882,19 +889,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -963,12 +973,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1010,19 +1023,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1113,32 +1129,35 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1272,40 +1291,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1427,40 +1449,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1594,40 +1619,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1706,71 +1734,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1830,19 +1861,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1910,45 +1944,48 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2053,97 +2090,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2192,12 +2232,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2227,19 +2270,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2294,19 +2340,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2348,28 +2397,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2412,19 +2464,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2540,40 +2595,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2806,84 +2864,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2951,19 +3012,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2985,7 +3049,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3037,7 +3104,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3133,58 +3203,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3212,7 +3285,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3240,7 +3316,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3286,7 +3365,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3330,19 +3412,22 @@ "git_provider_authId_auth_id_fk": { "name": "git_provider_authId_auth_id_fk", "tableFrom": "git_provider", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3384,19 +3469,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3462,19 +3550,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3540,19 +3631,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3632,32 +3726,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3816,8 +3913,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "19a70a39-f719-400b-b61e-6ddf1bcc6ac5", + "prevId": "74cd1475-b79c-4226-b4e6-e5ddb9576025", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0038_snapshot.json b/apps/dokploy/drizzle/meta/0038_snapshot.json index 4eb2b5ec..59a3abcd 100644 --- a/apps/dokploy/drizzle/meta/0038_snapshot.json +++ b/apps/dokploy/drizzle/meta/0038_snapshot.json @@ -1,7 +1,5 @@ { - "id": "8ffdfaff-f166-42dc-ac77-4fd9309d736a", - "prevId": "19a70a39-f719-400b-b61e-6ddf1bcc6ac5", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -390,105 +388,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -616,40 +617,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -781,32 +785,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -882,19 +889,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -963,12 +973,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1010,19 +1023,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1113,32 +1129,35 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1272,40 +1291,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1427,40 +1449,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1594,40 +1619,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1706,71 +1734,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1830,19 +1861,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1910,45 +1944,48 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2053,97 +2090,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2192,12 +2232,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2227,19 +2270,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2294,19 +2340,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2348,28 +2397,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2412,19 +2464,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2540,40 +2595,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2806,84 +2864,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2952,19 +3013,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2986,7 +3050,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3038,7 +3105,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3134,58 +3204,61 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3213,7 +3286,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3241,7 +3317,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3287,7 +3366,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3331,19 +3413,22 @@ "git_provider_authId_auth_id_fk": { "name": "git_provider_authId_auth_id_fk", "tableFrom": "git_provider", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3385,19 +3470,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3463,19 +3551,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3541,19 +3632,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3633,32 +3727,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3817,8 +3914,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "8ffdfaff-f166-42dc-ac77-4fd9309d736a", + "prevId": "19a70a39-f719-400b-b61e-6ddf1bcc6ac5", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0039_snapshot.json b/apps/dokploy/drizzle/meta/0039_snapshot.json index 3d931bf3..90831ed9 100644 --- a/apps/dokploy/drizzle/meta/0039_snapshot.json +++ b/apps/dokploy/drizzle/meta/0039_snapshot.json @@ -1,7 +1,5 @@ { - "id": "cf3531ac-cd41-49b6-99d0-a0e377f28115", - "prevId": "8ffdfaff-f166-42dc-ac77-4fd9309d736a", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -390,105 +388,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -616,40 +617,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -781,32 +785,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -882,19 +889,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -963,12 +973,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1010,19 +1023,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1113,32 +1129,35 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1272,40 +1291,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1427,40 +1449,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1594,40 +1619,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1706,71 +1734,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1830,19 +1861,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1910,45 +1944,48 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2053,97 +2090,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2192,12 +2232,15 @@ "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2227,19 +2270,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2294,19 +2340,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2348,28 +2397,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2412,19 +2464,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2540,40 +2595,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2806,84 +2864,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2952,19 +3013,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -2986,7 +3050,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3038,7 +3105,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3140,71 +3210,74 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_adminId_admin_adminId_fk": { "name": "notification_adminId_admin_adminId_fk", "tableFrom": "notification", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3232,7 +3305,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3260,7 +3336,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3321,19 +3400,22 @@ "ssh-key_adminId_admin_adminId_fk": { "name": "ssh-key_adminId_admin_adminId_fk", "tableFrom": "ssh-key", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3377,19 +3459,22 @@ "git_provider_adminId_admin_adminId_fk": { "name": "git_provider_adminId_admin_adminId_fk", "tableFrom": "git_provider", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3431,19 +3516,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3509,19 +3597,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3587,19 +3678,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3679,32 +3773,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3863,8 +3960,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "cf3531ac-cd41-49b6-99d0-a0e377f28115", + "prevId": "8ffdfaff-f166-42dc-ac77-4fd9309d736a", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0040_snapshot.json b/apps/dokploy/drizzle/meta/0040_snapshot.json index e2a97898..a3768cf5 100644 --- a/apps/dokploy/drizzle/meta/0040_snapshot.json +++ b/apps/dokploy/drizzle/meta/0040_snapshot.json @@ -1,7 +1,5 @@ { - "id": "22cf0495-c3f3-4601-8653-9fb9a66bb72d", - "prevId": "cf3531ac-cd41-49b6-99d0-a0e377f28115", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -390,105 +388,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -616,40 +617,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -781,32 +785,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -882,19 +889,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -963,12 +973,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1010,19 +1023,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1113,32 +1129,35 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1272,40 +1291,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1427,40 +1449,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1594,40 +1619,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1706,71 +1734,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1830,19 +1861,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1910,45 +1944,48 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2053,97 +2090,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2203,40 +2243,43 @@ "certificate_adminId_admin_adminId_fk": { "name": "certificate_adminId_admin_adminId_fk", "tableFrom": "certificate", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "certificate_serverId_server_serverId_fk": { "name": "certificate_serverId_server_serverId_fk", "tableFrom": "certificate", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2266,19 +2309,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2333,19 +2379,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2387,28 +2436,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2451,19 +2503,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2579,40 +2634,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2845,84 +2903,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -2991,19 +3052,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -3025,7 +3089,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3077,7 +3144,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3179,71 +3249,74 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_adminId_admin_adminId_fk": { "name": "notification_adminId_admin_adminId_fk", "tableFrom": "notification", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3271,7 +3344,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3299,7 +3375,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3360,19 +3439,22 @@ "ssh-key_adminId_admin_adminId_fk": { "name": "ssh-key_adminId_admin_adminId_fk", "tableFrom": "ssh-key", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3416,19 +3498,22 @@ "git_provider_adminId_admin_adminId_fk": { "name": "git_provider_adminId_admin_adminId_fk", "tableFrom": "git_provider", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3470,19 +3555,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3548,19 +3636,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3626,19 +3717,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3718,32 +3812,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3902,8 +3999,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "22cf0495-c3f3-4601-8653-9fb9a66bb72d", + "prevId": "cf3531ac-cd41-49b6-99d0-a0e377f28115", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0041_snapshot.json b/apps/dokploy/drizzle/meta/0041_snapshot.json index fccae6ca..e9ff0304 100644 --- a/apps/dokploy/drizzle/meta/0041_snapshot.json +++ b/apps/dokploy/drizzle/meta/0041_snapshot.json @@ -1,7 +1,5 @@ { - "id": "9933f3e8-77a2-40e6-b579-922fe6bb2cb6", - "prevId": "22cf0495-c3f3-4601-8653-9fb9a66bb72d", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -390,105 +388,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -616,40 +617,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -781,32 +785,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -901,19 +908,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -994,12 +1004,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1041,19 +1054,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1144,32 +1160,35 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1303,40 +1322,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1458,40 +1480,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1625,40 +1650,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1737,71 +1765,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1861,19 +1892,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1941,45 +1975,48 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2084,97 +2121,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2234,40 +2274,43 @@ "certificate_adminId_admin_adminId_fk": { "name": "certificate_adminId_admin_adminId_fk", "tableFrom": "certificate", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "certificate_serverId_server_serverId_fk": { "name": "certificate_serverId_server_serverId_fk", "tableFrom": "certificate", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2297,19 +2340,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2364,19 +2410,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2418,28 +2467,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2482,19 +2534,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2610,40 +2665,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2876,84 +2934,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -3022,19 +3083,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -3056,7 +3120,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3108,7 +3175,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3210,71 +3280,74 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_adminId_admin_adminId_fk": { "name": "notification_adminId_admin_adminId_fk", "tableFrom": "notification", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3302,7 +3375,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3330,7 +3406,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3391,19 +3470,22 @@ "ssh-key_adminId_admin_adminId_fk": { "name": "ssh-key_adminId_admin_adminId_fk", "tableFrom": "ssh-key", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3447,19 +3529,22 @@ "git_provider_adminId_admin_adminId_fk": { "name": "git_provider_adminId_admin_adminId_fk", "tableFrom": "git_provider", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3501,19 +3586,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3579,19 +3667,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3657,19 +3748,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3757,32 +3851,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3949,8 +4046,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "9933f3e8-77a2-40e6-b579-922fe6bb2cb6", + "prevId": "22cf0495-c3f3-4601-8653-9fb9a66bb72d", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0042_snapshot.json b/apps/dokploy/drizzle/meta/0042_snapshot.json index 9d8f76ef..7ffa4a62 100644 --- a/apps/dokploy/drizzle/meta/0042_snapshot.json +++ b/apps/dokploy/drizzle/meta/0042_snapshot.json @@ -1,7 +1,5 @@ { - "id": "24bfb192-237f-4297-83d1-27988dcb6be2", - "prevId": "9933f3e8-77a2-40e6-b579-922fe6bb2cb6", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -390,105 +388,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -616,40 +617,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -781,32 +785,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -901,19 +908,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -1006,12 +1016,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1053,19 +1066,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1156,32 +1172,35 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1315,40 +1334,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1470,40 +1492,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1637,40 +1662,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1749,71 +1777,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1873,19 +1904,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1953,45 +1987,48 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2096,97 +2133,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2246,40 +2286,43 @@ "certificate_adminId_admin_adminId_fk": { "name": "certificate_adminId_admin_adminId_fk", "tableFrom": "certificate", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "certificate_serverId_server_serverId_fk": { "name": "certificate_serverId_server_serverId_fk", "tableFrom": "certificate", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2309,19 +2352,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2376,19 +2422,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2430,28 +2479,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2494,19 +2546,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2622,40 +2677,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2888,84 +2946,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -3034,19 +3095,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -3068,7 +3132,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3120,7 +3187,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3222,71 +3292,74 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_adminId_admin_adminId_fk": { "name": "notification_adminId_admin_adminId_fk", "tableFrom": "notification", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3314,7 +3387,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3342,7 +3418,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3403,19 +3482,22 @@ "ssh-key_adminId_admin_adminId_fk": { "name": "ssh-key_adminId_admin_adminId_fk", "tableFrom": "ssh-key", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3459,19 +3541,22 @@ "git_provider_adminId_admin_adminId_fk": { "name": "git_provider_adminId_admin_adminId_fk", "tableFrom": "git_provider", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3513,19 +3598,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3591,19 +3679,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3669,19 +3760,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3769,32 +3863,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3961,8 +4058,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "24bfb192-237f-4297-83d1-27988dcb6be2", + "prevId": "9933f3e8-77a2-40e6-b579-922fe6bb2cb6", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0043_snapshot.json b/apps/dokploy/drizzle/meta/0043_snapshot.json index c93e4aa1..87351af3 100644 --- a/apps/dokploy/drizzle/meta/0043_snapshot.json +++ b/apps/dokploy/drizzle/meta/0043_snapshot.json @@ -1,7 +1,5 @@ { - "id": "6e07937b-292a-4a59-9a3c-0fae18a1e976", - "prevId": "24bfb192-237f-4297-83d1-27988dcb6be2", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -390,105 +388,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -616,40 +617,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -781,32 +785,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -908,19 +915,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -1013,12 +1023,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1067,19 +1080,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1170,32 +1186,35 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1329,40 +1348,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1484,40 +1506,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1651,40 +1676,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1763,71 +1791,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1887,19 +1918,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1967,45 +2001,48 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2110,97 +2147,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2260,40 +2300,43 @@ "certificate_adminId_admin_adminId_fk": { "name": "certificate_adminId_admin_adminId_fk", "tableFrom": "certificate", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "certificate_serverId_server_serverId_fk": { "name": "certificate_serverId_server_serverId_fk", "tableFrom": "certificate", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2323,19 +2366,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2390,19 +2436,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2444,28 +2493,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2508,19 +2560,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2636,40 +2691,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2902,84 +2960,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -3048,19 +3109,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -3082,7 +3146,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3134,7 +3201,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3236,71 +3306,74 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_adminId_admin_adminId_fk": { "name": "notification_adminId_admin_adminId_fk", "tableFrom": "notification", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3328,7 +3401,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3356,7 +3432,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3417,19 +3496,22 @@ "ssh-key_adminId_admin_adminId_fk": { "name": "ssh-key_adminId_admin_adminId_fk", "tableFrom": "ssh-key", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3473,19 +3555,22 @@ "git_provider_adminId_admin_adminId_fk": { "name": "git_provider_adminId_admin_adminId_fk", "tableFrom": "git_provider", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3527,19 +3612,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3605,19 +3693,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3683,19 +3774,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3783,32 +3877,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3975,8 +4072,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "6e07937b-292a-4a59-9a3c-0fae18a1e976", + "prevId": "24bfb192-237f-4297-83d1-27988dcb6be2", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0044_snapshot.json b/apps/dokploy/drizzle/meta/0044_snapshot.json index dd628799..2deb8913 100644 --- a/apps/dokploy/drizzle/meta/0044_snapshot.json +++ b/apps/dokploy/drizzle/meta/0044_snapshot.json @@ -1,7 +1,5 @@ { - "id": "172ee8c6-ba83-460b-83e1-b61ba19f450b", - "prevId": "6e07937b-292a-4a59-9a3c-0fae18a1e976", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -390,105 +388,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -616,40 +617,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -781,32 +785,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -901,19 +908,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -1006,12 +1016,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1060,19 +1073,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1163,32 +1179,35 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1322,40 +1341,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1477,40 +1499,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1644,40 +1669,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1756,71 +1784,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1880,19 +1911,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1960,45 +1994,48 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2103,97 +2140,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2253,40 +2293,43 @@ "certificate_adminId_admin_adminId_fk": { "name": "certificate_adminId_admin_adminId_fk", "tableFrom": "certificate", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "certificate_serverId_server_serverId_fk": { "name": "certificate_serverId_server_serverId_fk", "tableFrom": "certificate", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2316,19 +2359,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2383,19 +2429,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2437,28 +2486,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2501,19 +2553,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2629,40 +2684,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2895,84 +2953,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -3041,19 +3102,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -3075,7 +3139,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3127,7 +3194,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3229,71 +3299,74 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_adminId_admin_adminId_fk": { "name": "notification_adminId_admin_adminId_fk", "tableFrom": "notification", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3321,7 +3394,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3349,7 +3425,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3410,19 +3489,22 @@ "ssh-key_adminId_admin_adminId_fk": { "name": "ssh-key_adminId_admin_adminId_fk", "tableFrom": "ssh-key", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3466,19 +3548,22 @@ "git_provider_adminId_admin_adminId_fk": { "name": "git_provider_adminId_admin_adminId_fk", "tableFrom": "git_provider", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3520,19 +3605,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3598,19 +3686,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3676,19 +3767,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3776,32 +3870,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3968,8 +4065,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "172ee8c6-ba83-460b-83e1-b61ba19f450b", + "prevId": "6e07937b-292a-4a59-9a3c-0fae18a1e976", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0045_snapshot.json b/apps/dokploy/drizzle/meta/0045_snapshot.json index 2109eb71..d0e822dc 100644 --- a/apps/dokploy/drizzle/meta/0045_snapshot.json +++ b/apps/dokploy/drizzle/meta/0045_snapshot.json @@ -1,7 +1,5 @@ { - "id": "dc1aa20f-26c0-474b-a37a-07be670f9aae", - "prevId": "172ee8c6-ba83-460b-83e1-b61ba19f450b", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -390,105 +388,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -616,40 +617,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -781,32 +785,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -901,19 +908,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -1006,12 +1016,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1060,19 +1073,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1163,32 +1179,35 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1322,40 +1341,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1477,40 +1499,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1644,40 +1669,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1756,71 +1784,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1886,19 +1917,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1966,45 +2000,48 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2109,97 +2146,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2259,40 +2299,43 @@ "certificate_adminId_admin_adminId_fk": { "name": "certificate_adminId_admin_adminId_fk", "tableFrom": "certificate", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "certificate_serverId_server_serverId_fk": { "name": "certificate_serverId_server_serverId_fk", "tableFrom": "certificate", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2322,19 +2365,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2389,19 +2435,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2443,28 +2492,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2507,19 +2559,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2635,40 +2690,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2901,84 +2959,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -3047,19 +3108,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -3081,7 +3145,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3133,7 +3200,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3235,71 +3305,74 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_adminId_admin_adminId_fk": { "name": "notification_adminId_admin_adminId_fk", "tableFrom": "notification", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3327,7 +3400,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3355,7 +3431,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3416,19 +3495,22 @@ "ssh-key_adminId_admin_adminId_fk": { "name": "ssh-key_adminId_admin_adminId_fk", "tableFrom": "ssh-key", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3472,19 +3554,22 @@ "git_provider_adminId_admin_adminId_fk": { "name": "git_provider_adminId_admin_adminId_fk", "tableFrom": "git_provider", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3526,19 +3611,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3604,19 +3692,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3682,19 +3773,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3782,32 +3876,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3974,8 +4071,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "dc1aa20f-26c0-474b-a37a-07be670f9aae", + "prevId": "172ee8c6-ba83-460b-83e1-b61ba19f450b", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0046_snapshot.json b/apps/dokploy/drizzle/meta/0046_snapshot.json index 4d5ef1fd..5feb98ff 100644 --- a/apps/dokploy/drizzle/meta/0046_snapshot.json +++ b/apps/dokploy/drizzle/meta/0046_snapshot.json @@ -1,7 +1,5 @@ { - "id": "d70bcec5-e7af-4872-b2eb-f0a22ae2e3e8", - "prevId": "dc1aa20f-26c0-474b-a37a-07be670f9aae", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -396,105 +394,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -622,40 +623,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -787,32 +791,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -907,19 +914,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -1012,12 +1022,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1066,19 +1079,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1169,32 +1185,35 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1328,40 +1347,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1483,40 +1505,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1650,40 +1675,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1762,71 +1790,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1892,19 +1923,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1972,45 +2006,48 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2115,97 +2152,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2265,40 +2305,43 @@ "certificate_adminId_admin_adminId_fk": { "name": "certificate_adminId_admin_adminId_fk", "tableFrom": "certificate", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "certificate_serverId_server_serverId_fk": { "name": "certificate_serverId_server_serverId_fk", "tableFrom": "certificate", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2328,19 +2371,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2395,19 +2441,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2449,28 +2498,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2513,19 +2565,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2641,40 +2696,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2907,84 +2965,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -3053,19 +3114,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -3087,7 +3151,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3139,7 +3206,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3241,71 +3311,74 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_adminId_admin_adminId_fk": { "name": "notification_adminId_admin_adminId_fk", "tableFrom": "notification", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3333,7 +3406,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3361,7 +3437,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3422,19 +3501,22 @@ "ssh-key_adminId_admin_adminId_fk": { "name": "ssh-key_adminId_admin_adminId_fk", "tableFrom": "ssh-key", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3478,19 +3560,22 @@ "git_provider_adminId_admin_adminId_fk": { "name": "git_provider_adminId_admin_adminId_fk", "tableFrom": "git_provider", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3532,19 +3617,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3610,19 +3698,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3688,19 +3779,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3788,32 +3882,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3980,8 +4077,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "d70bcec5-e7af-4872-b2eb-f0a22ae2e3e8", + "prevId": "dc1aa20f-26c0-474b-a37a-07be670f9aae", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0047_snapshot.json b/apps/dokploy/drizzle/meta/0047_snapshot.json index 9e9defbe..4eb04a61 100644 --- a/apps/dokploy/drizzle/meta/0047_snapshot.json +++ b/apps/dokploy/drizzle/meta/0047_snapshot.json @@ -1,7 +1,5 @@ { - "id": "16ee50a9-7cbc-46a4-af70-c3c85ed45466", - "prevId": "d70bcec5-e7af-4872-b2eb-f0a22ae2e3e8", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -402,105 +400,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -628,40 +629,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -793,32 +797,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -913,19 +920,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -1018,12 +1028,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1072,19 +1085,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1175,32 +1191,35 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1334,40 +1353,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1489,40 +1511,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1656,40 +1681,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1768,71 +1796,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1898,19 +1929,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1978,45 +2012,48 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2121,97 +2158,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2271,40 +2311,43 @@ "certificate_adminId_admin_adminId_fk": { "name": "certificate_adminId_admin_adminId_fk", "tableFrom": "certificate", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "certificate_serverId_server_serverId_fk": { "name": "certificate_serverId_server_serverId_fk", "tableFrom": "certificate", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2334,19 +2377,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2401,19 +2447,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2455,28 +2504,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2519,19 +2571,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2647,40 +2702,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2913,84 +2971,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -3059,19 +3120,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -3093,7 +3157,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3145,7 +3212,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3247,71 +3317,74 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_adminId_admin_adminId_fk": { "name": "notification_adminId_admin_adminId_fk", "tableFrom": "notification", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3339,7 +3412,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3367,7 +3443,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3428,19 +3507,22 @@ "ssh-key_adminId_admin_adminId_fk": { "name": "ssh-key_adminId_admin_adminId_fk", "tableFrom": "ssh-key", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3484,19 +3566,22 @@ "git_provider_adminId_admin_adminId_fk": { "name": "git_provider_adminId_admin_adminId_fk", "tableFrom": "git_provider", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3538,19 +3623,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3616,19 +3704,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3694,19 +3785,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3794,32 +3888,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3986,8 +4083,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "16ee50a9-7cbc-46a4-af70-c3c85ed45466", + "prevId": "d70bcec5-e7af-4872-b2eb-f0a22ae2e3e8", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0048_snapshot.json b/apps/dokploy/drizzle/meta/0048_snapshot.json index d78854ca..e5a2fb1b 100644 --- a/apps/dokploy/drizzle/meta/0048_snapshot.json +++ b/apps/dokploy/drizzle/meta/0048_snapshot.json @@ -1,7 +1,5 @@ { - "id": "928417c8-2e7b-43ba-bc19-44b4d70107f1", - "prevId": "16ee50a9-7cbc-46a4-af70-c3c85ed45466", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -403,105 +401,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -629,40 +630,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -794,32 +798,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -914,19 +921,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -1019,12 +1029,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1073,19 +1086,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1176,32 +1192,35 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1335,40 +1354,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1490,40 +1512,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1657,40 +1682,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1769,71 +1797,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1899,19 +1930,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -1979,45 +2013,48 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2122,97 +2159,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2272,40 +2312,43 @@ "certificate_adminId_admin_adminId_fk": { "name": "certificate_adminId_admin_adminId_fk", "tableFrom": "certificate", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "certificate_serverId_server_serverId_fk": { "name": "certificate_serverId_server_serverId_fk", "tableFrom": "certificate", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2335,19 +2378,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2402,19 +2448,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2456,28 +2505,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2520,19 +2572,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2648,40 +2703,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -2914,84 +2972,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -3060,19 +3121,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -3094,7 +3158,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3146,7 +3213,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3248,71 +3318,74 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_adminId_admin_adminId_fk": { "name": "notification_adminId_admin_adminId_fk", "tableFrom": "notification", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3340,7 +3413,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3368,7 +3444,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3429,19 +3508,22 @@ "ssh-key_adminId_admin_adminId_fk": { "name": "ssh-key_adminId_admin_adminId_fk", "tableFrom": "ssh-key", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3485,19 +3567,22 @@ "git_provider_adminId_admin_adminId_fk": { "name": "git_provider_adminId_admin_adminId_fk", "tableFrom": "git_provider", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3539,19 +3624,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3617,19 +3705,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3695,19 +3786,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3795,32 +3889,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -3987,8 +4084,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "928417c8-2e7b-43ba-bc19-44b4d70107f1", + "prevId": "16ee50a9-7cbc-46a4-af70-c3c85ed45466", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0049_snapshot.json b/apps/dokploy/drizzle/meta/0049_snapshot.json index 7ef4e679..731bf165 100644 --- a/apps/dokploy/drizzle/meta/0049_snapshot.json +++ b/apps/dokploy/drizzle/meta/0049_snapshot.json @@ -1,7 +1,5 @@ { - "id": "db518175-259d-4f4a-b6d0-fe95067bba61", - "prevId": "928417c8-2e7b-43ba-bc19-44b4d70107f1", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -464,105 +462,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -690,40 +691,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -855,32 +859,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -975,19 +982,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -1080,12 +1090,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1134,19 +1147,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1243,45 +1259,48 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk", "tableFrom": "domain", - "tableTo": "preview_deployments", "columnsFrom": [ "previewDeploymentId" ], + "tableTo": "preview_deployments", "columnsTo": [ "previewDeploymentId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1415,40 +1434,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1570,40 +1592,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1737,40 +1762,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1849,71 +1877,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1979,19 +2010,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -2072,58 +2106,61 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk", "tableFrom": "deployment", - "tableTo": "preview_deployments", "columnsFrom": [ "previewDeploymentId" ], + "tableTo": "preview_deployments", "columnsTo": [ "previewDeploymentId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2228,97 +2265,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2378,40 +2418,43 @@ "certificate_adminId_admin_adminId_fk": { "name": "certificate_adminId_admin_adminId_fk", "tableFrom": "certificate", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "certificate_serverId_server_serverId_fk": { "name": "certificate_serverId_server_serverId_fk", "tableFrom": "certificate", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2441,19 +2484,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2508,19 +2554,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2562,28 +2611,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2626,19 +2678,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2754,40 +2809,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -3020,84 +3078,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -3166,19 +3227,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -3200,7 +3264,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3252,7 +3319,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3354,71 +3424,74 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_adminId_admin_adminId_fk": { "name": "notification_adminId_admin_adminId_fk", "tableFrom": "notification", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3446,7 +3519,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3474,7 +3550,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3535,19 +3614,22 @@ "ssh-key_adminId_admin_adminId_fk": { "name": "ssh-key_adminId_admin_adminId_fk", "tableFrom": "ssh-key", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3591,19 +3673,22 @@ "git_provider_adminId_admin_adminId_fk": { "name": "git_provider_adminId_admin_adminId_fk", "tableFrom": "git_provider", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3645,19 +3730,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3723,19 +3811,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3801,19 +3892,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3901,32 +3995,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.preview_deployments": { "name": "preview_deployments", @@ -4018,40 +4115,43 @@ "preview_deployments_applicationId_application_applicationId_fk": { "name": "preview_deployments_applicationId_application_applicationId_fk", "tableFrom": "preview_deployments", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "preview_deployments_domainId_domain_domainId_fk": { "name": "preview_deployments_domainId_domain_domainId_fk", "tableFrom": "preview_deployments", - "tableTo": "domain", "columnsFrom": [ "domainId" ], + "tableTo": "domain", "columnsTo": [ "domainId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "preview_deployments_appName_unique": { "name": "preview_deployments_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -4219,8 +4319,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "db518175-259d-4f4a-b6d0-fe95067bba61", + "prevId": "928417c8-2e7b-43ba-bc19-44b4d70107f1", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0050_snapshot.json b/apps/dokploy/drizzle/meta/0050_snapshot.json index 88cecd27..b7e60856 100644 --- a/apps/dokploy/drizzle/meta/0050_snapshot.json +++ b/apps/dokploy/drizzle/meta/0050_snapshot.json @@ -1,7 +1,5 @@ { - "id": "89b9d2ac-25d4-46ea-8050-74a96a330cd4", - "prevId": "db518175-259d-4f4a-b6d0-fe95067bba61", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -464,105 +462,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -690,40 +691,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -855,32 +859,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -975,19 +982,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -1080,12 +1090,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1134,19 +1147,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1243,45 +1259,48 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk", "tableFrom": "domain", - "tableTo": "preview_deployments", "columnsFrom": [ "previewDeploymentId" ], + "tableTo": "preview_deployments", "columnsTo": [ "previewDeploymentId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1415,40 +1434,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1570,40 +1592,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1737,40 +1762,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1849,71 +1877,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1979,19 +2010,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -2072,58 +2106,61 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk", "tableFrom": "deployment", - "tableTo": "preview_deployments", "columnsFrom": [ "previewDeploymentId" ], + "tableTo": "preview_deployments", "columnsTo": [ "previewDeploymentId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2228,97 +2265,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2378,40 +2418,43 @@ "certificate_adminId_admin_adminId_fk": { "name": "certificate_adminId_admin_adminId_fk", "tableFrom": "certificate", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "certificate_serverId_server_serverId_fk": { "name": "certificate_serverId_server_serverId_fk", "tableFrom": "certificate", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2441,19 +2484,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2508,19 +2554,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2562,28 +2611,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2626,19 +2678,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2754,40 +2809,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -3020,84 +3078,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -3166,19 +3227,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -3200,7 +3264,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3252,7 +3319,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3354,71 +3424,74 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_adminId_admin_adminId_fk": { "name": "notification_adminId_admin_adminId_fk", "tableFrom": "notification", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3446,7 +3519,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3474,7 +3550,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3535,19 +3614,22 @@ "ssh-key_adminId_admin_adminId_fk": { "name": "ssh-key_adminId_admin_adminId_fk", "tableFrom": "ssh-key", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3591,19 +3673,22 @@ "git_provider_adminId_admin_adminId_fk": { "name": "git_provider_adminId_admin_adminId_fk", "tableFrom": "git_provider", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3645,19 +3730,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3723,19 +3811,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3808,19 +3899,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3908,32 +4002,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.preview_deployments": { "name": "preview_deployments", @@ -4025,40 +4122,43 @@ "preview_deployments_applicationId_application_applicationId_fk": { "name": "preview_deployments_applicationId_application_applicationId_fk", "tableFrom": "preview_deployments", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "preview_deployments_domainId_domain_domainId_fk": { "name": "preview_deployments_domainId_domain_domainId_fk", "tableFrom": "preview_deployments", - "tableTo": "domain", "columnsFrom": [ "domainId" ], + "tableTo": "domain", "columnsTo": [ "domainId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "preview_deployments_appName_unique": { "name": "preview_deployments_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -4226,8 +4326,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "89b9d2ac-25d4-46ea-8050-74a96a330cd4", + "prevId": "db518175-259d-4f4a-b6d0-fe95067bba61", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0051_snapshot.json b/apps/dokploy/drizzle/meta/0051_snapshot.json index 037eb34e..beacfa0d 100644 --- a/apps/dokploy/drizzle/meta/0051_snapshot.json +++ b/apps/dokploy/drizzle/meta/0051_snapshot.json @@ -1,7 +1,5 @@ { - "id": "0f21aab4-69a8-4ca9-91fa-7a819774e5ea", - "prevId": "89b9d2ac-25d4-46ea-8050-74a96a330cd4", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -464,105 +462,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -690,40 +691,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -855,32 +859,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -975,19 +982,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -1080,12 +1090,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1134,19 +1147,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1243,45 +1259,48 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk", "tableFrom": "domain", - "tableTo": "preview_deployments", "columnsFrom": [ "previewDeploymentId" ], + "tableTo": "preview_deployments", "columnsTo": [ "previewDeploymentId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1415,40 +1434,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1570,40 +1592,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1737,40 +1762,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1849,71 +1877,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1979,19 +2010,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -2072,58 +2106,61 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk", "tableFrom": "deployment", - "tableTo": "preview_deployments", "columnsFrom": [ "previewDeploymentId" ], + "tableTo": "preview_deployments", "columnsTo": [ "previewDeploymentId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2228,97 +2265,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2378,40 +2418,43 @@ "certificate_adminId_admin_adminId_fk": { "name": "certificate_adminId_admin_adminId_fk", "tableFrom": "certificate", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "certificate_serverId_server_serverId_fk": { "name": "certificate_serverId_server_serverId_fk", "tableFrom": "certificate", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2441,19 +2484,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2508,19 +2554,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2562,28 +2611,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2626,19 +2678,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2754,40 +2809,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -3020,84 +3078,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -3166,19 +3227,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -3200,7 +3264,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3252,7 +3319,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3354,71 +3424,74 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_adminId_admin_adminId_fk": { "name": "notification_adminId_admin_adminId_fk", "tableFrom": "notification", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3446,7 +3519,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3474,7 +3550,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3535,19 +3614,22 @@ "ssh-key_adminId_admin_adminId_fk": { "name": "ssh-key_adminId_admin_adminId_fk", "tableFrom": "ssh-key", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3591,19 +3673,22 @@ "git_provider_adminId_admin_adminId_fk": { "name": "git_provider_adminId_admin_adminId_fk", "tableFrom": "git_provider", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3645,19 +3730,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3723,19 +3811,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3808,19 +3899,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3915,32 +4009,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.preview_deployments": { "name": "preview_deployments", @@ -4032,40 +4129,43 @@ "preview_deployments_applicationId_application_applicationId_fk": { "name": "preview_deployments_applicationId_application_applicationId_fk", "tableFrom": "preview_deployments", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "preview_deployments_domainId_domain_domainId_fk": { "name": "preview_deployments_domainId_domain_domainId_fk", "tableFrom": "preview_deployments", - "tableTo": "domain", "columnsFrom": [ "domainId" ], + "tableTo": "domain", "columnsTo": [ "domainId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "preview_deployments_appName_unique": { "name": "preview_deployments_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -4233,8 +4333,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "0f21aab4-69a8-4ca9-91fa-7a819774e5ea", + "prevId": "89b9d2ac-25d4-46ea-8050-74a96a330cd4", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0052_snapshot.json b/apps/dokploy/drizzle/meta/0052_snapshot.json index 6debca88..44d1f80c 100644 --- a/apps/dokploy/drizzle/meta/0052_snapshot.json +++ b/apps/dokploy/drizzle/meta/0052_snapshot.json @@ -1,7 +1,5 @@ { - "id": "c5eb96f1-db46-4498-8bf4-417f89422de4", - "prevId": "0f21aab4-69a8-4ca9-91fa-7a819774e5ea", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -464,105 +462,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -690,40 +691,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -855,32 +859,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -975,19 +982,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -1080,12 +1090,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1134,19 +1147,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1243,45 +1259,48 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk", "tableFrom": "domain", - "tableTo": "preview_deployments", "columnsFrom": [ "previewDeploymentId" ], + "tableTo": "preview_deployments", "columnsTo": [ "previewDeploymentId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1415,40 +1434,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1570,40 +1592,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1737,40 +1762,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1849,71 +1877,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1979,19 +2010,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -2072,58 +2106,61 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk", "tableFrom": "deployment", - "tableTo": "preview_deployments", "columnsFrom": [ "previewDeploymentId" ], + "tableTo": "preview_deployments", "columnsTo": [ "previewDeploymentId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2228,97 +2265,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2378,40 +2418,43 @@ "certificate_adminId_admin_adminId_fk": { "name": "certificate_adminId_admin_adminId_fk", "tableFrom": "certificate", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "certificate_serverId_server_serverId_fk": { "name": "certificate_serverId_server_serverId_fk", "tableFrom": "certificate", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2441,19 +2484,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2508,19 +2554,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2562,28 +2611,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2626,19 +2678,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2754,40 +2809,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -3020,84 +3078,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -3166,19 +3227,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -3206,7 +3270,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3258,7 +3325,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3360,71 +3430,74 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_adminId_admin_adminId_fk": { "name": "notification_adminId_admin_adminId_fk", "tableFrom": "notification", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3452,7 +3525,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3480,7 +3556,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3541,19 +3620,22 @@ "ssh-key_adminId_admin_adminId_fk": { "name": "ssh-key_adminId_admin_adminId_fk", "tableFrom": "ssh-key", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3597,19 +3679,22 @@ "git_provider_adminId_admin_adminId_fk": { "name": "git_provider_adminId_admin_adminId_fk", "tableFrom": "git_provider", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3651,19 +3736,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3729,19 +3817,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3814,19 +3905,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3921,32 +4015,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.preview_deployments": { "name": "preview_deployments", @@ -4038,40 +4135,43 @@ "preview_deployments_applicationId_application_applicationId_fk": { "name": "preview_deployments_applicationId_application_applicationId_fk", "tableFrom": "preview_deployments", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "preview_deployments_domainId_domain_domainId_fk": { "name": "preview_deployments_domainId_domain_domainId_fk", "tableFrom": "preview_deployments", - "tableTo": "domain", "columnsFrom": [ "domainId" ], + "tableTo": "domain", "columnsTo": [ "domainId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "preview_deployments_appName_unique": { "name": "preview_deployments_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -4239,8 +4339,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "c5eb96f1-db46-4498-8bf4-417f89422de4", + "prevId": "0f21aab4-69a8-4ca9-91fa-7a819774e5ea", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0053_snapshot.json b/apps/dokploy/drizzle/meta/0053_snapshot.json index 1a894288..79d3f610 100644 --- a/apps/dokploy/drizzle/meta/0053_snapshot.json +++ b/apps/dokploy/drizzle/meta/0053_snapshot.json @@ -1,7 +1,5 @@ { - "id": "cae9f45f-2b68-45bc-b2c1-cfbe9ebb8104", - "prevId": "c5eb96f1-db46-4498-8bf4-417f89422de4", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -464,105 +462,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -690,40 +691,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -855,32 +859,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -975,19 +982,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -1080,12 +1090,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1134,19 +1147,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1243,45 +1259,48 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk", "tableFrom": "domain", - "tableTo": "preview_deployments", "columnsFrom": [ "previewDeploymentId" ], + "tableTo": "preview_deployments", "columnsTo": [ "previewDeploymentId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1415,40 +1434,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1577,40 +1599,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1744,40 +1769,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1856,71 +1884,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1986,19 +2017,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -2079,58 +2113,61 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk", "tableFrom": "deployment", - "tableTo": "preview_deployments", "columnsFrom": [ "previewDeploymentId" ], + "tableTo": "preview_deployments", "columnsTo": [ "previewDeploymentId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2235,97 +2272,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2385,40 +2425,43 @@ "certificate_adminId_admin_adminId_fk": { "name": "certificate_adminId_admin_adminId_fk", "tableFrom": "certificate", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "certificate_serverId_server_serverId_fk": { "name": "certificate_serverId_server_serverId_fk", "tableFrom": "certificate", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2448,19 +2491,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2515,19 +2561,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2569,28 +2618,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2633,19 +2685,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2761,40 +2816,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -3027,84 +3085,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -3173,19 +3234,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -3213,7 +3277,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3265,7 +3332,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3367,71 +3437,74 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_adminId_admin_adminId_fk": { "name": "notification_adminId_admin_adminId_fk", "tableFrom": "notification", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3459,7 +3532,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3487,7 +3563,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3548,19 +3627,22 @@ "ssh-key_adminId_admin_adminId_fk": { "name": "ssh-key_adminId_admin_adminId_fk", "tableFrom": "ssh-key", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3604,19 +3686,22 @@ "git_provider_adminId_admin_adminId_fk": { "name": "git_provider_adminId_admin_adminId_fk", "tableFrom": "git_provider", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3658,19 +3743,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3736,19 +3824,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3821,19 +3912,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3928,32 +4022,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.preview_deployments": { "name": "preview_deployments", @@ -4045,40 +4142,43 @@ "preview_deployments_applicationId_application_applicationId_fk": { "name": "preview_deployments_applicationId_application_applicationId_fk", "tableFrom": "preview_deployments", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "preview_deployments_domainId_domain_domainId_fk": { "name": "preview_deployments_domainId_domain_domainId_fk", "tableFrom": "preview_deployments", - "tableTo": "domain", "columnsFrom": [ "domainId" ], + "tableTo": "domain", "columnsTo": [ "domainId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "preview_deployments_appName_unique": { "name": "preview_deployments_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -4246,8 +4346,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "cae9f45f-2b68-45bc-b2c1-cfbe9ebb8104", + "prevId": "c5eb96f1-db46-4498-8bf4-417f89422de4", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0054_snapshot.json b/apps/dokploy/drizzle/meta/0054_snapshot.json index 88447e32..14a14401 100644 --- a/apps/dokploy/drizzle/meta/0054_snapshot.json +++ b/apps/dokploy/drizzle/meta/0054_snapshot.json @@ -1,7 +1,5 @@ { - "id": "25bbf903-8f16-4a7e-977c-df860c858096", - "prevId": "cae9f45f-2b68-45bc-b2c1-cfbe9ebb8104", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -464,105 +462,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -690,40 +691,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -855,32 +859,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -975,19 +982,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -1080,12 +1090,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1134,19 +1147,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1243,45 +1259,48 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk", "tableFrom": "domain", - "tableTo": "preview_deployments", "columnsFrom": [ "previewDeploymentId" ], + "tableTo": "preview_deployments", "columnsTo": [ "previewDeploymentId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1415,40 +1434,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1577,40 +1599,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1744,40 +1769,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1856,71 +1884,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1986,19 +2017,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -2079,58 +2113,61 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk", "tableFrom": "deployment", - "tableTo": "preview_deployments", "columnsFrom": [ "previewDeploymentId" ], + "tableTo": "preview_deployments", "columnsTo": [ "previewDeploymentId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2235,97 +2272,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2385,40 +2425,43 @@ "certificate_adminId_admin_adminId_fk": { "name": "certificate_adminId_admin_adminId_fk", "tableFrom": "certificate", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "certificate_serverId_server_serverId_fk": { "name": "certificate_serverId_server_serverId_fk", "tableFrom": "certificate", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2448,19 +2491,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2515,19 +2561,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2569,28 +2618,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2633,19 +2685,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2761,40 +2816,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -3027,84 +3085,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -3173,19 +3234,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -3213,7 +3277,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3265,7 +3332,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3367,71 +3437,74 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_adminId_admin_adminId_fk": { "name": "notification_adminId_admin_adminId_fk", "tableFrom": "notification", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3459,7 +3532,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3487,7 +3563,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3548,19 +3627,22 @@ "ssh-key_adminId_admin_adminId_fk": { "name": "ssh-key_adminId_admin_adminId_fk", "tableFrom": "ssh-key", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3604,19 +3686,22 @@ "git_provider_adminId_admin_adminId_fk": { "name": "git_provider_adminId_admin_adminId_fk", "tableFrom": "git_provider", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3658,19 +3743,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3736,19 +3824,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3821,19 +3912,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3928,32 +4022,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.preview_deployments": { "name": "preview_deployments", @@ -4045,40 +4142,43 @@ "preview_deployments_applicationId_application_applicationId_fk": { "name": "preview_deployments_applicationId_application_applicationId_fk", "tableFrom": "preview_deployments", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "preview_deployments_domainId_domain_domainId_fk": { "name": "preview_deployments_domainId_domain_domainId_fk", "tableFrom": "preview_deployments", - "tableTo": "domain", "columnsFrom": [ "domainId" ], + "tableTo": "domain", "columnsTo": [ "domainId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "preview_deployments_appName_unique": { "name": "preview_deployments_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -4246,8 +4346,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "25bbf903-8f16-4a7e-977c-df860c858096", + "prevId": "cae9f45f-2b68-45bc-b2c1-cfbe9ebb8104", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0055_snapshot.json b/apps/dokploy/drizzle/meta/0055_snapshot.json index cf708495..35425c07 100644 --- a/apps/dokploy/drizzle/meta/0055_snapshot.json +++ b/apps/dokploy/drizzle/meta/0055_snapshot.json @@ -1,7 +1,5 @@ { - "id": "21a03d52-4db6-4449-a61c-92b6ceae0bd9", - "prevId": "25bbf903-8f16-4a7e-977c-df860c858096", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -464,105 +462,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -690,40 +691,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -855,32 +859,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -975,19 +982,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -1080,12 +1090,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1134,19 +1147,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1243,45 +1259,48 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk", "tableFrom": "domain", - "tableTo": "preview_deployments", "columnsFrom": [ "previewDeploymentId" ], + "tableTo": "preview_deployments", "columnsTo": [ "previewDeploymentId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1415,40 +1434,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1577,40 +1599,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1744,40 +1769,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1856,71 +1884,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1986,19 +2017,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -2079,58 +2113,61 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk", "tableFrom": "deployment", - "tableTo": "preview_deployments", "columnsFrom": [ "previewDeploymentId" ], + "tableTo": "preview_deployments", "columnsTo": [ "previewDeploymentId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2235,97 +2272,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2385,40 +2425,43 @@ "certificate_adminId_admin_adminId_fk": { "name": "certificate_adminId_admin_adminId_fk", "tableFrom": "certificate", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "certificate_serverId_server_serverId_fk": { "name": "certificate_serverId_server_serverId_fk", "tableFrom": "certificate", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2448,19 +2491,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2515,19 +2561,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2569,28 +2618,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2633,19 +2685,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2761,40 +2816,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -3027,84 +3085,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -3173,19 +3234,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -3213,7 +3277,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3265,7 +3332,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3367,71 +3437,74 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_adminId_admin_adminId_fk": { "name": "notification_adminId_admin_adminId_fk", "tableFrom": "notification", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3459,7 +3532,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3487,7 +3563,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3548,19 +3627,22 @@ "ssh-key_adminId_admin_adminId_fk": { "name": "ssh-key_adminId_admin_adminId_fk", "tableFrom": "ssh-key", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3604,19 +3686,22 @@ "git_provider_adminId_admin_adminId_fk": { "name": "git_provider_adminId_admin_adminId_fk", "tableFrom": "git_provider", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3658,19 +3743,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3736,19 +3824,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3821,19 +3912,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3928,32 +4022,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.preview_deployments": { "name": "preview_deployments", @@ -4045,40 +4142,43 @@ "preview_deployments_applicationId_application_applicationId_fk": { "name": "preview_deployments_applicationId_application_applicationId_fk", "tableFrom": "preview_deployments", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "preview_deployments_domainId_domain_domainId_fk": { "name": "preview_deployments_domainId_domain_domainId_fk", "tableFrom": "preview_deployments", - "tableTo": "domain", "columnsFrom": [ "domainId" ], + "tableTo": "domain", "columnsTo": [ "domainId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "preview_deployments_appName_unique": { "name": "preview_deployments_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -4246,8 +4346,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "21a03d52-4db6-4449-a61c-92b6ceae0bd9", + "prevId": "25bbf903-8f16-4a7e-977c-df860c858096", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0056_snapshot.json b/apps/dokploy/drizzle/meta/0056_snapshot.json index be672e8f..86c3e12d 100644 --- a/apps/dokploy/drizzle/meta/0056_snapshot.json +++ b/apps/dokploy/drizzle/meta/0056_snapshot.json @@ -1,7 +1,5 @@ { - "id": "24787a88-0754-437a-b077-03a3265b8ef5", - "prevId": "21a03d52-4db6-4449-a61c-92b6ceae0bd9", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -464,105 +462,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -690,40 +691,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -855,32 +859,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -975,19 +982,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -1080,12 +1090,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1134,19 +1147,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1243,45 +1259,48 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk", "tableFrom": "domain", - "tableTo": "preview_deployments", "columnsFrom": [ "previewDeploymentId" ], + "tableTo": "preview_deployments", "columnsTo": [ "previewDeploymentId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1415,40 +1434,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1577,40 +1599,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1744,40 +1769,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1856,71 +1884,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1986,19 +2017,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -2079,58 +2113,61 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk", "tableFrom": "deployment", - "tableTo": "preview_deployments", "columnsFrom": [ "previewDeploymentId" ], + "tableTo": "preview_deployments", "columnsTo": [ "previewDeploymentId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2235,97 +2272,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2385,40 +2425,43 @@ "certificate_adminId_admin_adminId_fk": { "name": "certificate_adminId_admin_adminId_fk", "tableFrom": "certificate", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "certificate_serverId_server_serverId_fk": { "name": "certificate_serverId_server_serverId_fk", "tableFrom": "certificate", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2448,19 +2491,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2515,19 +2561,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2569,28 +2618,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2633,19 +2685,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2761,40 +2816,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -3027,84 +3085,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -3173,19 +3234,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -3213,7 +3277,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3265,7 +3332,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gotify": { "name": "gotify", @@ -3306,7 +3376,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3414,84 +3487,87 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_gotifyId_gotify_gotifyId_fk": { "name": "notification_gotifyId_gotify_gotifyId_fk", "tableFrom": "notification", - "tableTo": "gotify", "columnsFrom": [ "gotifyId" ], + "tableTo": "gotify", "columnsTo": [ "gotifyId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_adminId_admin_adminId_fk": { "name": "notification_adminId_admin_adminId_fk", "tableFrom": "notification", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3519,7 +3595,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3547,7 +3626,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3608,19 +3690,22 @@ "ssh-key_adminId_admin_adminId_fk": { "name": "ssh-key_adminId_admin_adminId_fk", "tableFrom": "ssh-key", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3664,19 +3749,22 @@ "git_provider_adminId_admin_adminId_fk": { "name": "git_provider_adminId_admin_adminId_fk", "tableFrom": "git_provider", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3718,19 +3806,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3796,19 +3887,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3881,19 +3975,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3988,32 +4085,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.preview_deployments": { "name": "preview_deployments", @@ -4105,40 +4205,43 @@ "preview_deployments_applicationId_application_applicationId_fk": { "name": "preview_deployments_applicationId_application_applicationId_fk", "tableFrom": "preview_deployments", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "preview_deployments_domainId_domain_domainId_fk": { "name": "preview_deployments_domainId_domain_domainId_fk", "tableFrom": "preview_deployments", - "tableTo": "domain", "columnsFrom": [ "domainId" ], + "tableTo": "domain", "columnsTo": [ "domainId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "preview_deployments_appName_unique": { "name": "preview_deployments_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -4307,8 +4410,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "24787a88-0754-437a-b077-03a3265b8ef5", + "prevId": "21a03d52-4db6-4449-a61c-92b6ceae0bd9", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0057_snapshot.json b/apps/dokploy/drizzle/meta/0057_snapshot.json index 8ddfc3b7..42144075 100644 --- a/apps/dokploy/drizzle/meta/0057_snapshot.json +++ b/apps/dokploy/drizzle/meta/0057_snapshot.json @@ -1,7 +1,5 @@ { - "id": "841960d7-0573-41e4-8529-fd9960f726d5", - "prevId": "24787a88-0754-437a-b077-03a3265b8ef5", - "version": "6", + "version": "7", "dialect": "postgresql", "tables": { "public.application": { @@ -464,105 +462,108 @@ "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "application", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_registryId_registry_registryId_fk": { "name": "application_registryId_registry_registryId_fk", "tableFrom": "application", - "tableTo": "registry", "columnsFrom": [ "registryId" ], + "tableTo": "registry", "columnsTo": [ "registryId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_projectId_project_projectId_fk": { "name": "application_projectId_project_projectId_fk", "tableFrom": "application", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "application_githubId_github_githubId_fk": { "name": "application_githubId_github_githubId_fk", "tableFrom": "application", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_gitlabId_gitlab_gitlabId_fk": { "name": "application_gitlabId_gitlab_gitlabId_fk", "tableFrom": "application", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_bitbucketId_bitbucket_bitbucketId_fk": { "name": "application_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "application", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "application_serverId_server_serverId_fk": { "name": "application_serverId_server_serverId_fk", "tableFrom": "application", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "application_appName_unique": { "name": "application_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.postgres": { "name": "postgres", @@ -690,40 +691,43 @@ "postgres_projectId_project_projectId_fk": { "name": "postgres_projectId_project_projectId_fk", "tableFrom": "postgres", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "postgres_serverId_server_serverId_fk": { "name": "postgres_serverId_server_serverId_fk", "tableFrom": "postgres", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "postgres_appName_unique": { "name": "postgres_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.user": { "name": "user", @@ -855,32 +859,35 @@ "user_adminId_admin_adminId_fk": { "name": "user_adminId_admin_adminId_fk", "tableFrom": "user", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "user_authId_auth_id_fk": { "name": "user_authId_auth_id_fk", "tableFrom": "user", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.admin": { "name": "admin", @@ -968,6 +975,27 @@ "primaryKey": false, "notNull": true, "default": 0 + }, + "cleanupCacheApplications": { + "name": "cleanupCacheApplications", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "cleanupCacheOnPreviews": { + "name": "cleanupCacheOnPreviews", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnCompose": { + "name": "cleanupCacheOnCompose", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false } }, "indexes": {}, @@ -975,19 +1003,22 @@ "admin_authId_auth_id_fk": { "name": "admin_authId_auth_id_fk", "tableFrom": "admin", - "tableTo": "auth", "columnsFrom": [ "authId" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.auth": { "name": "auth", @@ -1080,12 +1111,15 @@ "uniqueConstraints": { "auth_email_unique": { "name": "auth_email_unique", - "nullsNotDistinct": false, "columns": [ "email" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.project": { "name": "project", @@ -1134,19 +1168,22 @@ "project_adminId_admin_adminId_fk": { "name": "project_adminId_admin_adminId_fk", "tableFrom": "project", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.domain": { "name": "domain", @@ -1243,45 +1280,48 @@ "domain_composeId_compose_composeId_fk": { "name": "domain_composeId_compose_composeId_fk", "tableFrom": "domain", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_applicationId_application_applicationId_fk": { "name": "domain_applicationId_application_applicationId_fk", "tableFrom": "domain", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk", "tableFrom": "domain", - "tableTo": "preview_deployments", "columnsFrom": [ "previewDeploymentId" ], + "tableTo": "preview_deployments", "columnsTo": [ "previewDeploymentId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mariadb": { "name": "mariadb", @@ -1415,40 +1455,43 @@ "mariadb_projectId_project_projectId_fk": { "name": "mariadb_projectId_project_projectId_fk", "tableFrom": "mariadb", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mariadb_serverId_server_serverId_fk": { "name": "mariadb_serverId_server_serverId_fk", "tableFrom": "mariadb", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mariadb_appName_unique": { "name": "mariadb_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mongo": { "name": "mongo", @@ -1577,40 +1620,43 @@ "mongo_projectId_project_projectId_fk": { "name": "mongo_projectId_project_projectId_fk", "tableFrom": "mongo", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mongo_serverId_server_serverId_fk": { "name": "mongo_serverId_server_serverId_fk", "tableFrom": "mongo", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mongo_appName_unique": { "name": "mongo_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mysql": { "name": "mysql", @@ -1744,40 +1790,43 @@ "mysql_projectId_project_projectId_fk": { "name": "mysql_projectId_project_projectId_fk", "tableFrom": "mysql", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mysql_serverId_server_serverId_fk": { "name": "mysql_serverId_server_serverId_fk", "tableFrom": "mysql", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "mysql_appName_unique": { "name": "mysql_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.backup": { "name": "backup", @@ -1856,71 +1905,74 @@ "backup_destinationId_destination_destinationId_fk": { "name": "backup_destinationId_destination_destinationId_fk", "tableFrom": "backup", - "tableTo": "destination", "columnsFrom": [ "destinationId" ], + "tableTo": "destination", "columnsTo": [ "destinationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_postgresId_postgres_postgresId_fk": { "name": "backup_postgresId_postgres_postgresId_fk", "tableFrom": "backup", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mariadbId_mariadb_mariadbId_fk": { "name": "backup_mariadbId_mariadb_mariadbId_fk", "tableFrom": "backup", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mysqlId_mysql_mysqlId_fk": { "name": "backup_mysqlId_mysql_mysqlId_fk", "tableFrom": "backup", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "backup_mongoId_mongo_mongoId_fk": { "name": "backup_mongoId_mongo_mongoId_fk", "tableFrom": "backup", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.destination": { "name": "destination", @@ -1986,19 +2038,22 @@ "destination_adminId_admin_adminId_fk": { "name": "destination_adminId_admin_adminId_fk", "tableFrom": "destination", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.deployment": { "name": "deployment", @@ -2079,58 +2134,61 @@ "deployment_applicationId_application_applicationId_fk": { "name": "deployment_applicationId_application_applicationId_fk", "tableFrom": "deployment", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_composeId_compose_composeId_fk": { "name": "deployment_composeId_compose_composeId_fk", "tableFrom": "deployment", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_serverId_server_serverId_fk": { "name": "deployment_serverId_server_serverId_fk", "tableFrom": "deployment", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk", "tableFrom": "deployment", - "tableTo": "preview_deployments", "columnsFrom": [ "previewDeploymentId" ], + "tableTo": "preview_deployments", "columnsTo": [ "previewDeploymentId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.mount": { "name": "mount", @@ -2235,97 +2293,100 @@ "mount_applicationId_application_applicationId_fk": { "name": "mount_applicationId_application_applicationId_fk", "tableFrom": "mount", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_postgresId_postgres_postgresId_fk": { "name": "mount_postgresId_postgres_postgresId_fk", "tableFrom": "mount", - "tableTo": "postgres", "columnsFrom": [ "postgresId" ], + "tableTo": "postgres", "columnsTo": [ "postgresId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mariadbId_mariadb_mariadbId_fk": { "name": "mount_mariadbId_mariadb_mariadbId_fk", "tableFrom": "mount", - "tableTo": "mariadb", "columnsFrom": [ "mariadbId" ], + "tableTo": "mariadb", "columnsTo": [ "mariadbId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mongoId_mongo_mongoId_fk": { "name": "mount_mongoId_mongo_mongoId_fk", "tableFrom": "mount", - "tableTo": "mongo", "columnsFrom": [ "mongoId" ], + "tableTo": "mongo", "columnsTo": [ "mongoId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_mysqlId_mysql_mysqlId_fk": { "name": "mount_mysqlId_mysql_mysqlId_fk", "tableFrom": "mount", - "tableTo": "mysql", "columnsFrom": [ "mysqlId" ], + "tableTo": "mysql", "columnsTo": [ "mysqlId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_redisId_redis_redisId_fk": { "name": "mount_redisId_redis_redisId_fk", "tableFrom": "mount", - "tableTo": "redis", "columnsFrom": [ "redisId" ], + "tableTo": "redis", "columnsTo": [ "redisId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "mount_composeId_compose_composeId_fk": { "name": "mount_composeId_compose_composeId_fk", "tableFrom": "mount", - "tableTo": "compose", "columnsFrom": [ "composeId" ], + "tableTo": "compose", "columnsTo": [ "composeId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.certificate": { "name": "certificate", @@ -2385,40 +2446,43 @@ "certificate_adminId_admin_adminId_fk": { "name": "certificate_adminId_admin_adminId_fk", "tableFrom": "certificate", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "certificate_serverId_server_serverId_fk": { "name": "certificate_serverId_server_serverId_fk", "tableFrom": "certificate", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "certificate_certificatePath_unique": { "name": "certificate_certificatePath_unique", - "nullsNotDistinct": false, "columns": [ "certificatePath" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.session": { "name": "session", @@ -2448,19 +2512,22 @@ "session_user_id_auth_id_fk": { "name": "session_user_id_auth_id_fk", "tableFrom": "session", - "tableTo": "auth", "columnsFrom": [ "user_id" ], + "tableTo": "auth", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redirect": { "name": "redirect", @@ -2515,19 +2582,22 @@ "redirect_applicationId_application_applicationId_fk": { "name": "redirect_applicationId_application_applicationId_fk", "tableFrom": "redirect", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.security": { "name": "security", @@ -2569,28 +2639,31 @@ "security_applicationId_application_applicationId_fk": { "name": "security_applicationId_application_applicationId_fk", "tableFrom": "security", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "security_username_applicationId_unique": { "name": "security_username_applicationId_unique", - "nullsNotDistinct": false, "columns": [ "username", "applicationId" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.port": { "name": "port", @@ -2633,19 +2706,22 @@ "port_applicationId_application_applicationId_fk": { "name": "port_applicationId_application_applicationId_fk", "tableFrom": "port", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.redis": { "name": "redis", @@ -2761,40 +2837,43 @@ "redis_projectId_project_projectId_fk": { "name": "redis_projectId_project_projectId_fk", "tableFrom": "redis", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "redis_serverId_server_serverId_fk": { "name": "redis_serverId_server_serverId_fk", "tableFrom": "redis", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "redis_appName_unique": { "name": "redis_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] + ], + "nullsNotDistinct": false } - } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.compose": { "name": "compose", @@ -3027,84 +3106,87 @@ "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", "tableFrom": "compose", - "tableTo": "ssh-key", "columnsFrom": [ "customGitSSHKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_projectId_project_projectId_fk": { "name": "compose_projectId_project_projectId_fk", "tableFrom": "compose", - "tableTo": "project", "columnsFrom": [ "projectId" ], + "tableTo": "project", "columnsTo": [ "projectId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "compose_githubId_github_githubId_fk": { "name": "compose_githubId_github_githubId_fk", "tableFrom": "compose", - "tableTo": "github", "columnsFrom": [ "githubId" ], + "tableTo": "github", "columnsTo": [ "githubId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_gitlabId_gitlab_gitlabId_fk": { "name": "compose_gitlabId_gitlab_gitlabId_fk", "tableFrom": "compose", - "tableTo": "gitlab", "columnsFrom": [ "gitlabId" ], + "tableTo": "gitlab", "columnsTo": [ "gitlabId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_bitbucketId_bitbucket_bitbucketId_fk": { "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", "tableFrom": "compose", - "tableTo": "bitbucket", "columnsFrom": [ "bitbucketId" ], + "tableTo": "bitbucket", "columnsTo": [ "bitbucketId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" }, "compose_serverId_server_serverId_fk": { "name": "compose_serverId_server_serverId_fk", "tableFrom": "compose", - "tableTo": "server", "columnsFrom": [ "serverId" ], + "tableTo": "server", "columnsTo": [ "serverId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.registry": { "name": "registry", @@ -3173,19 +3255,22 @@ "registry_adminId_admin_adminId_fk": { "name": "registry_adminId_admin_adminId_fk", "tableFrom": "registry", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.discord": { "name": "discord", @@ -3213,7 +3298,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.email": { "name": "email", @@ -3265,7 +3353,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gotify": { "name": "gotify", @@ -3306,7 +3397,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.notification": { "name": "notification", @@ -3414,84 +3508,87 @@ "notification_slackId_slack_slackId_fk": { "name": "notification_slackId_slack_slackId_fk", "tableFrom": "notification", - "tableTo": "slack", "columnsFrom": [ "slackId" ], + "tableTo": "slack", "columnsTo": [ "slackId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_telegramId_telegram_telegramId_fk": { "name": "notification_telegramId_telegram_telegramId_fk", "tableFrom": "notification", - "tableTo": "telegram", "columnsFrom": [ "telegramId" ], + "tableTo": "telegram", "columnsTo": [ "telegramId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_discordId_discord_discordId_fk": { "name": "notification_discordId_discord_discordId_fk", "tableFrom": "notification", - "tableTo": "discord", "columnsFrom": [ "discordId" ], + "tableTo": "discord", "columnsTo": [ "discordId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_emailId_email_emailId_fk": { "name": "notification_emailId_email_emailId_fk", "tableFrom": "notification", - "tableTo": "email", "columnsFrom": [ "emailId" ], + "tableTo": "email", "columnsTo": [ "emailId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_gotifyId_gotify_gotifyId_fk": { "name": "notification_gotifyId_gotify_gotifyId_fk", "tableFrom": "notification", - "tableTo": "gotify", "columnsFrom": [ "gotifyId" ], + "tableTo": "gotify", "columnsTo": [ "gotifyId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "notification_adminId_admin_adminId_fk": { "name": "notification_adminId_admin_adminId_fk", "tableFrom": "notification", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.slack": { "name": "slack", @@ -3519,7 +3616,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.telegram": { "name": "telegram", @@ -3547,7 +3647,10 @@ "indexes": {}, "foreignKeys": {}, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.ssh-key": { "name": "ssh-key", @@ -3608,19 +3711,22 @@ "ssh-key_adminId_admin_adminId_fk": { "name": "ssh-key_adminId_admin_adminId_fk", "tableFrom": "ssh-key", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.git_provider": { "name": "git_provider", @@ -3664,19 +3770,22 @@ "git_provider_adminId_admin_adminId_fk": { "name": "git_provider_adminId_admin_adminId_fk", "tableFrom": "git_provider", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.bitbucket": { "name": "bitbucket", @@ -3718,19 +3827,22 @@ "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "bitbucket", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.github": { "name": "github", @@ -3796,19 +3908,22 @@ "github_gitProviderId_git_provider_gitProviderId_fk": { "name": "github_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "github", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.gitlab": { "name": "gitlab", @@ -3881,19 +3996,22 @@ "gitlab_gitProviderId_git_provider_gitProviderId_fk": { "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", "tableFrom": "gitlab", - "tableTo": "git_provider", "columnsFrom": [ "gitProviderId" ], + "tableTo": "git_provider", "columnsTo": [ "gitProviderId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.server": { "name": "server", @@ -3988,32 +4106,35 @@ "server_adminId_admin_adminId_fk": { "name": "server_adminId_admin_adminId_fk", "tableFrom": "server", - "tableTo": "admin", "columnsFrom": [ "adminId" ], + "tableTo": "admin", "columnsTo": [ "adminId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "server_sshKeyId_ssh-key_sshKeyId_fk": { "name": "server_sshKeyId_ssh-key_sshKeyId_fk", "tableFrom": "server", - "tableTo": "ssh-key", "columnsFrom": [ "sshKeyId" ], + "tableTo": "ssh-key", "columnsTo": [ "sshKeyId" ], - "onDelete": "set null", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "set null" } }, "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} }, "public.preview_deployments": { "name": "preview_deployments", @@ -4105,113 +4226,43 @@ "preview_deployments_applicationId_application_applicationId_fk": { "name": "preview_deployments_applicationId_application_applicationId_fk", "tableFrom": "preview_deployments", - "tableTo": "application", "columnsFrom": [ "applicationId" ], + "tableTo": "application", "columnsTo": [ "applicationId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" }, "preview_deployments_domainId_domain_domainId_fk": { "name": "preview_deployments_domainId_domain_domainId_fk", "tableFrom": "preview_deployments", - "tableTo": "domain", "columnsFrom": [ "domainId" ], + "tableTo": "domain", "columnsTo": [ "domainId" ], - "onDelete": "cascade", - "onUpdate": "no action" + "onUpdate": "no action", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": { "preview_deployments_appName_unique": { "name": "preview_deployments_appName_unique", - "nullsNotDistinct": false, "columns": [ "appName" - ] - } - } - }, - "public.ai": { - "name": "ai", - "schema": "", - "columns": { - "aiId": { - "name": "aiId", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "apiUrl": { - "name": "apiUrl", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "apiKey": { - "name": "apiKey", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "model": { - "name": "model", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "isEnabled": { - "name": "isEnabled", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "default": true - }, - "adminId": { - "name": "adminId", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true + ], + "nullsNotDistinct": false } }, - "indexes": {}, - "foreignKeys": { - "ai_adminId_admin_adminId_fk": { - "name": "ai_adminId_admin_adminId_fk", - "tableFrom": "ai", - "tableTo": "admin", - "columnsFrom": [ - "adminId" - ], - "columnsTo": [ - "adminId" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} } }, "enums": { @@ -4380,8 +4431,14 @@ }, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "b00fa001-dd12-4f37-97dc-478c7a790779", + "prevId": "24787a88-0754-437a-b077-03a3265b8ef5", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} } \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0058_snapshot.json b/apps/dokploy/drizzle/meta/0058_snapshot.json new file mode 100644 index 00000000..6d49d76b --- /dev/null +++ b/apps/dokploy/drizzle/meta/0058_snapshot.json @@ -0,0 +1,4450 @@ +{ + "version": "7", + "dialect": "postgresql", + "tables": { + "public.application": { + "name": "application", + "schema": "", + "columns": { + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewEnv": { + "name": "previewEnv", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewBuildArgs": { + "name": "previewBuildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewWildcard": { + "name": "previewWildcard", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewPort": { + "name": "previewPort", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "previewHttps": { + "name": "previewHttps", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "previewPath": { + "name": "previewPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "previewLimit": { + "name": "previewLimit", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3 + }, + "isPreviewDeploymentsActive": { + "name": "isPreviewDeploymentsActive", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "buildArgs": { + "name": "buildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "subtitle": { + "name": "subtitle", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "buildPath": { + "name": "buildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBuildPath": { + "name": "gitlabBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBuildPath": { + "name": "bitbucketBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBuildPath": { + "name": "customGitBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerContextPath": { + "name": "dockerContextPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerBuildStage": { + "name": "dockerBuildStage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dropBuildPath": { + "name": "dropBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "healthCheckSwarm": { + "name": "healthCheckSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "restartPolicySwarm": { + "name": "restartPolicySwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "placementSwarm": { + "name": "placementSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "updateConfigSwarm": { + "name": "updateConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "rollbackConfigSwarm": { + "name": "rollbackConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "modeSwarm": { + "name": "modeSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "labelsSwarm": { + "name": "labelsSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "networkSwarm": { + "name": "networkSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "replicas": { + "name": "replicas", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "buildType": { + "name": "buildType", + "type": "buildType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'nixpacks'" + }, + "herokuVersion": { + "name": "herokuVersion", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'24'" + }, + "publishDirectory": { + "name": "publishDirectory", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "application", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "tableTo": "ssh-key", + "columnsTo": [ + "sshKeyId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "application_registryId_registry_registryId_fk": { + "name": "application_registryId_registry_registryId_fk", + "tableFrom": "application", + "columnsFrom": [ + "registryId" + ], + "tableTo": "registry", + "columnsTo": [ + "registryId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "application_projectId_project_projectId_fk": { + "name": "application_projectId_project_projectId_fk", + "tableFrom": "application", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "application_githubId_github_githubId_fk": { + "name": "application_githubId_github_githubId_fk", + "tableFrom": "application", + "columnsFrom": [ + "githubId" + ], + "tableTo": "github", + "columnsTo": [ + "githubId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "application_gitlabId_gitlab_gitlabId_fk": { + "name": "application_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "application", + "columnsFrom": [ + "gitlabId" + ], + "tableTo": "gitlab", + "columnsTo": [ + "gitlabId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "application_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "application_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "application", + "columnsFrom": [ + "bitbucketId" + ], + "tableTo": "bitbucket", + "columnsTo": [ + "bitbucketId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "application_serverId_server_serverId_fk": { + "name": "application_serverId_server_serverId_fk", + "tableFrom": "application", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "application_appName_unique": { + "name": "application_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.postgres": { + "name": "postgres", + "schema": "", + "columns": { + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "postgres_projectId_project_projectId_fk": { + "name": "postgres_projectId_project_projectId_fk", + "tableFrom": "postgres", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "postgres_serverId_server_serverId_fk": { + "name": "postgres_serverId_server_serverId_fk", + "tableFrom": "postgres", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "postgres_appName_unique": { + "name": "postgres_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "userId": { + "name": "userId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "isRegistered": { + "name": "isRegistered", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "expirationDate": { + "name": "expirationDate", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "canCreateProjects": { + "name": "canCreateProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToSSHKeys": { + "name": "canAccessToSSHKeys", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canCreateServices": { + "name": "canCreateServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteProjects": { + "name": "canDeleteProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteServices": { + "name": "canDeleteServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToDocker": { + "name": "canAccessToDocker", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToAPI": { + "name": "canAccessToAPI", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToGitProviders": { + "name": "canAccessToGitProviders", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToTraefikFiles": { + "name": "canAccessToTraefikFiles", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "accesedProjects": { + "name": "accesedProjects", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "accesedServices": { + "name": "accesedServices", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "user_adminId_admin_adminId_fk": { + "name": "user_adminId_admin_adminId_fk", + "tableFrom": "user", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "user_authId_auth_id_fk": { + "name": "user_authId_auth_id_fk", + "tableFrom": "user", + "columnsFrom": [ + "authId" + ], + "tableTo": "auth", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.admin": { + "name": "admin", + "schema": "", + "columns": { + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "serverIp": { + "name": "serverIp", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "letsEncryptEmail": { + "name": "letsEncryptEmail", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sshPrivateKey": { + "name": "sshPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enableLogRotation": { + "name": "enableLogRotation", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "stripeCustomerId": { + "name": "stripeCustomerId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "stripeSubscriptionId": { + "name": "stripeSubscriptionId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serversQuantity": { + "name": "serversQuantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "cleanupCacheApplications": { + "name": "cleanupCacheApplications", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "cleanupCacheOnPreviews": { + "name": "cleanupCacheOnPreviews", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnCompose": { + "name": "cleanupCacheOnCompose", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "admin_authId_auth_id_fk": { + "name": "admin_authId_auth_id_fk", + "tableFrom": "admin", + "columnsFrom": [ + "authId" + ], + "tableTo": "auth", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.auth": { + "name": "auth", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rol": { + "name": "rol", + "type": "Roles", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is2FAEnabled": { + "name": "is2FAEnabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "resetPasswordToken": { + "name": "resetPasswordToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "resetPasswordExpiresAt": { + "name": "resetPasswordExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationToken": { + "name": "confirmationToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationExpiresAt": { + "name": "confirmationExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "auth_email_unique": { + "name": "auth_email_unique", + "columns": [ + "email" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.project": { + "name": "project", + "schema": "", + "columns": { + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": { + "project_adminId_admin_adminId_fk": { + "name": "project_adminId_admin_adminId_fk", + "tableFrom": "project", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.domain": { + "name": "domain", + "schema": "", + "columns": { + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "https": { + "name": "https", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "serviceName": { + "name": "serviceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "domainType": { + "name": "domainType", + "type": "domainType", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'application'" + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "domain_composeId_compose_composeId_fk": { + "name": "domain_composeId_compose_composeId_fk", + "tableFrom": "domain", + "columnsFrom": [ + "composeId" + ], + "tableTo": "compose", + "columnsTo": [ + "composeId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "domain_applicationId_application_applicationId_fk": { + "name": "domain_applicationId_application_applicationId_fk", + "tableFrom": "domain", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "domain", + "columnsFrom": [ + "previewDeploymentId" + ], + "tableTo": "preview_deployments", + "columnsTo": [ + "previewDeploymentId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.mariadb": { + "name": "mariadb", + "schema": "", + "columns": { + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mariadb_projectId_project_projectId_fk": { + "name": "mariadb_projectId_project_projectId_fk", + "tableFrom": "mariadb", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mariadb_serverId_server_serverId_fk": { + "name": "mariadb_serverId_server_serverId_fk", + "tableFrom": "mariadb", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mariadb_appName_unique": { + "name": "mariadb_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.mongo": { + "name": "mongo", + "schema": "", + "columns": { + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "replicaSets": { + "name": "replicaSets", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "mongo_projectId_project_projectId_fk": { + "name": "mongo_projectId_project_projectId_fk", + "tableFrom": "mongo", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mongo_serverId_server_serverId_fk": { + "name": "mongo_serverId_server_serverId_fk", + "tableFrom": "mongo", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mongo_appName_unique": { + "name": "mongo_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.mysql": { + "name": "mysql", + "schema": "", + "columns": { + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mysql_projectId_project_projectId_fk": { + "name": "mysql_projectId_project_projectId_fk", + "tableFrom": "mysql", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mysql_serverId_server_serverId_fk": { + "name": "mysql_serverId_server_serverId_fk", + "tableFrom": "mysql", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mysql_appName_unique": { + "name": "mysql_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.backup": { + "name": "backup", + "schema": "", + "columns": { + "backupId": { + "name": "backupId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "schedule": { + "name": "schedule", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "database": { + "name": "database", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "prefix": { + "name": "prefix", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseType": { + "name": "databaseType", + "type": "databaseType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "backup_destinationId_destination_destinationId_fk": { + "name": "backup_destinationId_destination_destinationId_fk", + "tableFrom": "backup", + "columnsFrom": [ + "destinationId" + ], + "tableTo": "destination", + "columnsTo": [ + "destinationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "backup_postgresId_postgres_postgresId_fk": { + "name": "backup_postgresId_postgres_postgresId_fk", + "tableFrom": "backup", + "columnsFrom": [ + "postgresId" + ], + "tableTo": "postgres", + "columnsTo": [ + "postgresId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "backup_mariadbId_mariadb_mariadbId_fk": { + "name": "backup_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "backup", + "columnsFrom": [ + "mariadbId" + ], + "tableTo": "mariadb", + "columnsTo": [ + "mariadbId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "backup_mysqlId_mysql_mysqlId_fk": { + "name": "backup_mysqlId_mysql_mysqlId_fk", + "tableFrom": "backup", + "columnsFrom": [ + "mysqlId" + ], + "tableTo": "mysql", + "columnsTo": [ + "mysqlId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "backup_mongoId_mongo_mongoId_fk": { + "name": "backup_mongoId_mongo_mongoId_fk", + "tableFrom": "backup", + "columnsFrom": [ + "mongoId" + ], + "tableTo": "mongo", + "columnsTo": [ + "mongoId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.destination": { + "name": "destination", + "schema": "", + "columns": { + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "accessKey": { + "name": "accessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "secretAccessKey": { + "name": "secretAccessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "bucket": { + "name": "bucket", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "destination_adminId_admin_adminId_fk": { + "name": "destination_adminId_admin_adminId_fk", + "tableFrom": "destination", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.deployment": { + "name": "deployment", + "schema": "", + "columns": { + "deploymentId": { + "name": "deploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "deploymentStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'running'" + }, + "logPath": { + "name": "logPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "isPreviewDeployment": { + "name": "isPreviewDeployment", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "errorMessage": { + "name": "errorMessage", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "deployment_applicationId_application_applicationId_fk": { + "name": "deployment_applicationId_application_applicationId_fk", + "tableFrom": "deployment", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "deployment_composeId_compose_composeId_fk": { + "name": "deployment_composeId_compose_composeId_fk", + "tableFrom": "deployment", + "columnsFrom": [ + "composeId" + ], + "tableTo": "compose", + "columnsTo": [ + "composeId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "deployment_serverId_server_serverId_fk": { + "name": "deployment_serverId_server_serverId_fk", + "tableFrom": "deployment", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "deployment", + "columnsFrom": [ + "previewDeploymentId" + ], + "tableTo": "preview_deployments", + "columnsTo": [ + "previewDeploymentId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.mount": { + "name": "mount", + "schema": "", + "columns": { + "mountId": { + "name": "mountId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "mountType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "hostPath": { + "name": "hostPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "volumeName": { + "name": "volumeName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "filePath": { + "name": "filePath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serviceType": { + "name": "serviceType", + "type": "serviceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'application'" + }, + "mountPath": { + "name": "mountPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mount_applicationId_application_applicationId_fk": { + "name": "mount_applicationId_application_applicationId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_postgresId_postgres_postgresId_fk": { + "name": "mount_postgresId_postgres_postgresId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "postgresId" + ], + "tableTo": "postgres", + "columnsTo": [ + "postgresId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_mariadbId_mariadb_mariadbId_fk": { + "name": "mount_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "mariadbId" + ], + "tableTo": "mariadb", + "columnsTo": [ + "mariadbId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_mongoId_mongo_mongoId_fk": { + "name": "mount_mongoId_mongo_mongoId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "mongoId" + ], + "tableTo": "mongo", + "columnsTo": [ + "mongoId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_mysqlId_mysql_mysqlId_fk": { + "name": "mount_mysqlId_mysql_mysqlId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "mysqlId" + ], + "tableTo": "mysql", + "columnsTo": [ + "mysqlId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_redisId_redis_redisId_fk": { + "name": "mount_redisId_redis_redisId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "redisId" + ], + "tableTo": "redis", + "columnsTo": [ + "redisId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_composeId_compose_composeId_fk": { + "name": "mount_composeId_compose_composeId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "composeId" + ], + "tableTo": "compose", + "columnsTo": [ + "composeId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.certificate": { + "name": "certificate", + "schema": "", + "columns": { + "certificateId": { + "name": "certificateId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateData": { + "name": "certificateData", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificatePath": { + "name": "certificatePath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "autoRenew": { + "name": "autoRenew", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "certificate_adminId_admin_adminId_fk": { + "name": "certificate_adminId_admin_adminId_fk", + "tableFrom": "certificate", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "certificate_serverId_server_serverId_fk": { + "name": "certificate_serverId_server_serverId_fk", + "tableFrom": "certificate", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "certificate_certificatePath_unique": { + "name": "certificate_certificatePath_unique", + "columns": [ + "certificatePath" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "session_user_id_auth_id_fk": { + "name": "session_user_id_auth_id_fk", + "tableFrom": "session", + "columnsFrom": [ + "user_id" + ], + "tableTo": "auth", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.redirect": { + "name": "redirect", + "schema": "", + "columns": { + "redirectId": { + "name": "redirectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "regex": { + "name": "regex", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "replacement": { + "name": "replacement", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "permanent": { + "name": "permanent", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "redirect_applicationId_application_applicationId_fk": { + "name": "redirect_applicationId_application_applicationId_fk", + "tableFrom": "redirect", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.security": { + "name": "security", + "schema": "", + "columns": { + "securityId": { + "name": "securityId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "security_applicationId_application_applicationId_fk": { + "name": "security_applicationId_application_applicationId_fk", + "tableFrom": "security", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "security_username_applicationId_unique": { + "name": "security_username_applicationId_unique", + "columns": [ + "username", + "applicationId" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.port": { + "name": "port", + "schema": "", + "columns": { + "portId": { + "name": "portId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "publishedPort": { + "name": "publishedPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "targetPort": { + "name": "targetPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "protocol": { + "name": "protocol", + "type": "protocolType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "port_applicationId_application_applicationId_fk": { + "name": "port_applicationId_application_applicationId_fk", + "tableFrom": "port", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.redis": { + "name": "redis", + "schema": "", + "columns": { + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "redis_projectId_project_projectId_fk": { + "name": "redis_projectId_project_projectId_fk", + "tableFrom": "redis", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "redis_serverId_server_serverId_fk": { + "name": "redis_serverId_server_serverId_fk", + "tableFrom": "redis", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "redis_appName_unique": { + "name": "redis_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.compose": { + "name": "compose", + "schema": "", + "columns": { + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeFile": { + "name": "composeFile", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceTypeCompose", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "composeType": { + "name": "composeType", + "type": "composeType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'docker-compose'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "composePath": { + "name": "composePath", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'./docker-compose.yml'" + }, + "suffix": { + "name": "suffix", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "randomize": { + "name": "randomize", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "composeStatus": { + "name": "composeStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "compose", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "tableTo": "ssh-key", + "columnsTo": [ + "sshKeyId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "compose_projectId_project_projectId_fk": { + "name": "compose_projectId_project_projectId_fk", + "tableFrom": "compose", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "compose_githubId_github_githubId_fk": { + "name": "compose_githubId_github_githubId_fk", + "tableFrom": "compose", + "columnsFrom": [ + "githubId" + ], + "tableTo": "github", + "columnsTo": [ + "githubId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "compose_gitlabId_gitlab_gitlabId_fk": { + "name": "compose_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "compose", + "columnsFrom": [ + "gitlabId" + ], + "tableTo": "gitlab", + "columnsTo": [ + "gitlabId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "compose_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "compose", + "columnsFrom": [ + "bitbucketId" + ], + "tableTo": "bitbucket", + "columnsTo": [ + "bitbucketId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "compose_serverId_server_serverId_fk": { + "name": "compose_serverId_server_serverId_fk", + "tableFrom": "compose", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.registry": { + "name": "registry", + "schema": "", + "columns": { + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "registryName": { + "name": "registryName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "imagePrefix": { + "name": "imagePrefix", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "selfHosted": { + "name": "selfHosted", + "type": "RegistryType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'cloud'" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "registry_adminId_admin_adminId_fk": { + "name": "registry_adminId_admin_adminId_fk", + "tableFrom": "registry", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.discord": { + "name": "discord", + "schema": "", + "columns": { + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.email": { + "name": "email", + "schema": "", + "columns": { + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "smtpServer": { + "name": "smtpServer", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "smtpPort": { + "name": "smtpPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "fromAddress": { + "name": "fromAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "toAddress": { + "name": "toAddress", + "type": "text[]", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.gotify": { + "name": "gotify", + "schema": "", + "columns": { + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "serverUrl": { + "name": "serverUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appToken": { + "name": "appToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "priority": { + "name": "priority", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 5 + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.notification": { + "name": "notification", + "schema": "", + "columns": { + "notificationId": { + "name": "notificationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appDeploy": { + "name": "appDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "appBuildError": { + "name": "appBuildError", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "databaseBackup": { + "name": "databaseBackup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dokployRestart": { + "name": "dokployRestart", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dockerCleanup": { + "name": "dockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "notificationType": { + "name": "notificationType", + "type": "notificationType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "notification_slackId_slack_slackId_fk": { + "name": "notification_slackId_slack_slackId_fk", + "tableFrom": "notification", + "columnsFrom": [ + "slackId" + ], + "tableTo": "slack", + "columnsTo": [ + "slackId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "notification_telegramId_telegram_telegramId_fk": { + "name": "notification_telegramId_telegram_telegramId_fk", + "tableFrom": "notification", + "columnsFrom": [ + "telegramId" + ], + "tableTo": "telegram", + "columnsTo": [ + "telegramId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "notification_discordId_discord_discordId_fk": { + "name": "notification_discordId_discord_discordId_fk", + "tableFrom": "notification", + "columnsFrom": [ + "discordId" + ], + "tableTo": "discord", + "columnsTo": [ + "discordId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "notification_emailId_email_emailId_fk": { + "name": "notification_emailId_email_emailId_fk", + "tableFrom": "notification", + "columnsFrom": [ + "emailId" + ], + "tableTo": "email", + "columnsTo": [ + "emailId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "notification_gotifyId_gotify_gotifyId_fk": { + "name": "notification_gotifyId_gotify_gotifyId_fk", + "tableFrom": "notification", + "columnsFrom": [ + "gotifyId" + ], + "tableTo": "gotify", + "columnsTo": [ + "gotifyId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "notification_adminId_admin_adminId_fk": { + "name": "notification_adminId_admin_adminId_fk", + "tableFrom": "notification", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.slack": { + "name": "slack", + "schema": "", + "columns": { + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "channel": { + "name": "channel", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.telegram": { + "name": "telegram", + "schema": "", + "columns": { + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "botToken": { + "name": "botToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chatId": { + "name": "chatId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.ssh-key": { + "name": "ssh-key", + "schema": "", + "columns": { + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "publicKey": { + "name": "publicKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "lastUsedAt": { + "name": "lastUsedAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "ssh-key_adminId_admin_adminId_fk": { + "name": "ssh-key_adminId_admin_adminId_fk", + "tableFrom": "ssh-key", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.git_provider": { + "name": "git_provider", + "schema": "", + "columns": { + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "providerType": { + "name": "providerType", + "type": "gitProviderType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "git_provider_adminId_admin_adminId_fk": { + "name": "git_provider_adminId_admin_adminId_fk", + "tableFrom": "git_provider", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.bitbucket": { + "name": "bitbucket", + "schema": "", + "columns": { + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "bitbucketUsername": { + "name": "bitbucketUsername", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "appPassword": { + "name": "appPassword", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketWorkspaceName": { + "name": "bitbucketWorkspaceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { + "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "bitbucket", + "columnsFrom": [ + "gitProviderId" + ], + "tableTo": "git_provider", + "columnsTo": [ + "gitProviderId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.github": { + "name": "github", + "schema": "", + "columns": { + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "githubAppName": { + "name": "githubAppName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubAppId": { + "name": "githubAppId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "githubClientId": { + "name": "githubClientId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubClientSecret": { + "name": "githubClientSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubInstallationId": { + "name": "githubInstallationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubPrivateKey": { + "name": "githubPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubWebhookSecret": { + "name": "githubWebhookSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "github_gitProviderId_git_provider_gitProviderId_fk": { + "name": "github_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "github", + "columnsFrom": [ + "gitProviderId" + ], + "tableTo": "git_provider", + "columnsTo": [ + "gitProviderId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.gitlab": { + "name": "gitlab", + "schema": "", + "columns": { + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "gitlabUrl": { + "name": "gitlabUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'https://gitlab.com'" + }, + "application_id": { + "name": "application_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redirect_uri": { + "name": "redirect_uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "group_name": { + "name": "group_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "gitlab_gitProviderId_git_provider_gitProviderId_fk": { + "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "gitlab", + "columnsFrom": [ + "gitProviderId" + ], + "tableTo": "git_provider", + "columnsTo": [ + "gitProviderId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.server": { + "name": "server", + "schema": "", + "columns": { + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ipAddress": { + "name": "ipAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'root'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverStatus": { + "name": "serverStatus", + "type": "serverStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'active'" + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "server_adminId_admin_adminId_fk": { + "name": "server_adminId_admin_adminId_fk", + "tableFrom": "server", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "server_sshKeyId_ssh-key_sshKeyId_fk": { + "name": "server_sshKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "server", + "columnsFrom": [ + "sshKeyId" + ], + "tableTo": "ssh-key", + "columnsTo": [ + "sshKeyId" + ], + "onUpdate": "no action", + "onDelete": "set null" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.preview_deployments": { + "name": "preview_deployments", + "schema": "", + "columns": { + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestId": { + "name": "pullRequestId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestNumber": { + "name": "pullRequestNumber", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestURL": { + "name": "pullRequestURL", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestTitle": { + "name": "pullRequestTitle", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestCommentId": { + "name": "pullRequestCommentId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "previewStatus": { + "name": "previewStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "preview_deployments_applicationId_application_applicationId_fk": { + "name": "preview_deployments_applicationId_application_applicationId_fk", + "tableFrom": "preview_deployments", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "preview_deployments_domainId_domain_domainId_fk": { + "name": "preview_deployments_domainId_domain_domainId_fk", + "tableFrom": "preview_deployments", + "columnsFrom": [ + "domainId" + ], + "tableTo": "domain", + "columnsTo": [ + "domainId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "preview_deployments_appName_unique": { + "name": "preview_deployments_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + } + }, + "enums": { + "public.buildType": { + "name": "buildType", + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks", + "static" + ] + }, + "public.sourceType": { + "name": "sourceType", + "schema": "public", + "values": [ + "docker", + "git", + "github", + "gitlab", + "bitbucket", + "drop" + ] + }, + "public.Roles": { + "name": "Roles", + "schema": "public", + "values": [ + "admin", + "user" + ] + }, + "public.domainType": { + "name": "domainType", + "schema": "public", + "values": [ + "compose", + "application", + "preview" + ] + }, + "public.databaseType": { + "name": "databaseType", + "schema": "public", + "values": [ + "postgres", + "mariadb", + "mysql", + "mongo" + ] + }, + "public.deploymentStatus": { + "name": "deploymentStatus", + "schema": "public", + "values": [ + "running", + "done", + "error" + ] + }, + "public.mountType": { + "name": "mountType", + "schema": "public", + "values": [ + "bind", + "volume", + "file" + ] + }, + "public.serviceType": { + "name": "serviceType", + "schema": "public", + "values": [ + "application", + "postgres", + "mysql", + "mariadb", + "mongo", + "redis", + "compose" + ] + }, + "public.protocolType": { + "name": "protocolType", + "schema": "public", + "values": [ + "tcp", + "udp" + ] + }, + "public.applicationStatus": { + "name": "applicationStatus", + "schema": "public", + "values": [ + "idle", + "running", + "done", + "error" + ] + }, + "public.certificateType": { + "name": "certificateType", + "schema": "public", + "values": [ + "letsencrypt", + "none" + ] + }, + "public.composeType": { + "name": "composeType", + "schema": "public", + "values": [ + "docker-compose", + "stack" + ] + }, + "public.sourceTypeCompose": { + "name": "sourceTypeCompose", + "schema": "public", + "values": [ + "git", + "github", + "gitlab", + "bitbucket", + "raw" + ] + }, + "public.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + }, + "public.notificationType": { + "name": "notificationType", + "schema": "public", + "values": [ + "slack", + "telegram", + "discord", + "email", + "gotify" + ] + }, + "public.gitProviderType": { + "name": "gitProviderType", + "schema": "public", + "values": [ + "github", + "gitlab", + "bitbucket" + ] + }, + "public.serverStatus": { + "name": "serverStatus", + "schema": "public", + "values": [ + "active", + "inactive" + ] + } + }, + "schemas": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "id": "fdb721ab-5cc8-4063-a3ca-6437b046669c", + "prevId": "b00fa001-dd12-4f37-97dc-478c7a790779", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} +} \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0059_snapshot.json b/apps/dokploy/drizzle/meta/0059_snapshot.json new file mode 100644 index 00000000..7dcf737a --- /dev/null +++ b/apps/dokploy/drizzle/meta/0059_snapshot.json @@ -0,0 +1,4450 @@ +{ + "version": "7", + "dialect": "postgresql", + "tables": { + "public.application": { + "name": "application", + "schema": "", + "columns": { + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewEnv": { + "name": "previewEnv", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewBuildArgs": { + "name": "previewBuildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewWildcard": { + "name": "previewWildcard", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewPort": { + "name": "previewPort", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "previewHttps": { + "name": "previewHttps", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "previewPath": { + "name": "previewPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "previewLimit": { + "name": "previewLimit", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3 + }, + "isPreviewDeploymentsActive": { + "name": "isPreviewDeploymentsActive", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "buildArgs": { + "name": "buildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "subtitle": { + "name": "subtitle", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "buildPath": { + "name": "buildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBuildPath": { + "name": "gitlabBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBuildPath": { + "name": "bitbucketBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBuildPath": { + "name": "customGitBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerContextPath": { + "name": "dockerContextPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerBuildStage": { + "name": "dockerBuildStage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dropBuildPath": { + "name": "dropBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "healthCheckSwarm": { + "name": "healthCheckSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "restartPolicySwarm": { + "name": "restartPolicySwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "placementSwarm": { + "name": "placementSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "updateConfigSwarm": { + "name": "updateConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "rollbackConfigSwarm": { + "name": "rollbackConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "modeSwarm": { + "name": "modeSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "labelsSwarm": { + "name": "labelsSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "networkSwarm": { + "name": "networkSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "replicas": { + "name": "replicas", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "buildType": { + "name": "buildType", + "type": "buildType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'nixpacks'" + }, + "herokuVersion": { + "name": "herokuVersion", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'24'" + }, + "publishDirectory": { + "name": "publishDirectory", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "application", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "tableTo": "ssh-key", + "columnsTo": [ + "sshKeyId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "application_registryId_registry_registryId_fk": { + "name": "application_registryId_registry_registryId_fk", + "tableFrom": "application", + "columnsFrom": [ + "registryId" + ], + "tableTo": "registry", + "columnsTo": [ + "registryId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "application_projectId_project_projectId_fk": { + "name": "application_projectId_project_projectId_fk", + "tableFrom": "application", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "application_githubId_github_githubId_fk": { + "name": "application_githubId_github_githubId_fk", + "tableFrom": "application", + "columnsFrom": [ + "githubId" + ], + "tableTo": "github", + "columnsTo": [ + "githubId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "application_gitlabId_gitlab_gitlabId_fk": { + "name": "application_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "application", + "columnsFrom": [ + "gitlabId" + ], + "tableTo": "gitlab", + "columnsTo": [ + "gitlabId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "application_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "application_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "application", + "columnsFrom": [ + "bitbucketId" + ], + "tableTo": "bitbucket", + "columnsTo": [ + "bitbucketId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "application_serverId_server_serverId_fk": { + "name": "application_serverId_server_serverId_fk", + "tableFrom": "application", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "application_appName_unique": { + "name": "application_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.postgres": { + "name": "postgres", + "schema": "", + "columns": { + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "postgres_projectId_project_projectId_fk": { + "name": "postgres_projectId_project_projectId_fk", + "tableFrom": "postgres", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "postgres_serverId_server_serverId_fk": { + "name": "postgres_serverId_server_serverId_fk", + "tableFrom": "postgres", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "postgres_appName_unique": { + "name": "postgres_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "userId": { + "name": "userId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "isRegistered": { + "name": "isRegistered", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "expirationDate": { + "name": "expirationDate", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "canCreateProjects": { + "name": "canCreateProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToSSHKeys": { + "name": "canAccessToSSHKeys", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canCreateServices": { + "name": "canCreateServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteProjects": { + "name": "canDeleteProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteServices": { + "name": "canDeleteServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToDocker": { + "name": "canAccessToDocker", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToAPI": { + "name": "canAccessToAPI", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToGitProviders": { + "name": "canAccessToGitProviders", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToTraefikFiles": { + "name": "canAccessToTraefikFiles", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "accesedProjects": { + "name": "accesedProjects", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "accesedServices": { + "name": "accesedServices", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "user_adminId_admin_adminId_fk": { + "name": "user_adminId_admin_adminId_fk", + "tableFrom": "user", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "user_authId_auth_id_fk": { + "name": "user_authId_auth_id_fk", + "tableFrom": "user", + "columnsFrom": [ + "authId" + ], + "tableTo": "auth", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.admin": { + "name": "admin", + "schema": "", + "columns": { + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "serverIp": { + "name": "serverIp", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "letsEncryptEmail": { + "name": "letsEncryptEmail", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sshPrivateKey": { + "name": "sshPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enableLogRotation": { + "name": "enableLogRotation", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "stripeCustomerId": { + "name": "stripeCustomerId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "stripeSubscriptionId": { + "name": "stripeSubscriptionId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serversQuantity": { + "name": "serversQuantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "cleanupCacheApplications": { + "name": "cleanupCacheApplications", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnPreviews": { + "name": "cleanupCacheOnPreviews", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnCompose": { + "name": "cleanupCacheOnCompose", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "admin_authId_auth_id_fk": { + "name": "admin_authId_auth_id_fk", + "tableFrom": "admin", + "columnsFrom": [ + "authId" + ], + "tableTo": "auth", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.auth": { + "name": "auth", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rol": { + "name": "rol", + "type": "Roles", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is2FAEnabled": { + "name": "is2FAEnabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "resetPasswordToken": { + "name": "resetPasswordToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "resetPasswordExpiresAt": { + "name": "resetPasswordExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationToken": { + "name": "confirmationToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationExpiresAt": { + "name": "confirmationExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "auth_email_unique": { + "name": "auth_email_unique", + "columns": [ + "email" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.project": { + "name": "project", + "schema": "", + "columns": { + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": { + "project_adminId_admin_adminId_fk": { + "name": "project_adminId_admin_adminId_fk", + "tableFrom": "project", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.domain": { + "name": "domain", + "schema": "", + "columns": { + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "https": { + "name": "https", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "serviceName": { + "name": "serviceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "domainType": { + "name": "domainType", + "type": "domainType", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'application'" + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "domain_composeId_compose_composeId_fk": { + "name": "domain_composeId_compose_composeId_fk", + "tableFrom": "domain", + "columnsFrom": [ + "composeId" + ], + "tableTo": "compose", + "columnsTo": [ + "composeId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "domain_applicationId_application_applicationId_fk": { + "name": "domain_applicationId_application_applicationId_fk", + "tableFrom": "domain", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "domain", + "columnsFrom": [ + "previewDeploymentId" + ], + "tableTo": "preview_deployments", + "columnsTo": [ + "previewDeploymentId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.mariadb": { + "name": "mariadb", + "schema": "", + "columns": { + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mariadb_projectId_project_projectId_fk": { + "name": "mariadb_projectId_project_projectId_fk", + "tableFrom": "mariadb", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mariadb_serverId_server_serverId_fk": { + "name": "mariadb_serverId_server_serverId_fk", + "tableFrom": "mariadb", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mariadb_appName_unique": { + "name": "mariadb_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.mongo": { + "name": "mongo", + "schema": "", + "columns": { + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "replicaSets": { + "name": "replicaSets", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "mongo_projectId_project_projectId_fk": { + "name": "mongo_projectId_project_projectId_fk", + "tableFrom": "mongo", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mongo_serverId_server_serverId_fk": { + "name": "mongo_serverId_server_serverId_fk", + "tableFrom": "mongo", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mongo_appName_unique": { + "name": "mongo_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.mysql": { + "name": "mysql", + "schema": "", + "columns": { + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mysql_projectId_project_projectId_fk": { + "name": "mysql_projectId_project_projectId_fk", + "tableFrom": "mysql", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mysql_serverId_server_serverId_fk": { + "name": "mysql_serverId_server_serverId_fk", + "tableFrom": "mysql", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mysql_appName_unique": { + "name": "mysql_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.backup": { + "name": "backup", + "schema": "", + "columns": { + "backupId": { + "name": "backupId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "schedule": { + "name": "schedule", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "database": { + "name": "database", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "prefix": { + "name": "prefix", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseType": { + "name": "databaseType", + "type": "databaseType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "backup_destinationId_destination_destinationId_fk": { + "name": "backup_destinationId_destination_destinationId_fk", + "tableFrom": "backup", + "columnsFrom": [ + "destinationId" + ], + "tableTo": "destination", + "columnsTo": [ + "destinationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "backup_postgresId_postgres_postgresId_fk": { + "name": "backup_postgresId_postgres_postgresId_fk", + "tableFrom": "backup", + "columnsFrom": [ + "postgresId" + ], + "tableTo": "postgres", + "columnsTo": [ + "postgresId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "backup_mariadbId_mariadb_mariadbId_fk": { + "name": "backup_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "backup", + "columnsFrom": [ + "mariadbId" + ], + "tableTo": "mariadb", + "columnsTo": [ + "mariadbId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "backup_mysqlId_mysql_mysqlId_fk": { + "name": "backup_mysqlId_mysql_mysqlId_fk", + "tableFrom": "backup", + "columnsFrom": [ + "mysqlId" + ], + "tableTo": "mysql", + "columnsTo": [ + "mysqlId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "backup_mongoId_mongo_mongoId_fk": { + "name": "backup_mongoId_mongo_mongoId_fk", + "tableFrom": "backup", + "columnsFrom": [ + "mongoId" + ], + "tableTo": "mongo", + "columnsTo": [ + "mongoId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.destination": { + "name": "destination", + "schema": "", + "columns": { + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "accessKey": { + "name": "accessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "secretAccessKey": { + "name": "secretAccessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "bucket": { + "name": "bucket", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "destination_adminId_admin_adminId_fk": { + "name": "destination_adminId_admin_adminId_fk", + "tableFrom": "destination", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.deployment": { + "name": "deployment", + "schema": "", + "columns": { + "deploymentId": { + "name": "deploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "deploymentStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'running'" + }, + "logPath": { + "name": "logPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "isPreviewDeployment": { + "name": "isPreviewDeployment", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "errorMessage": { + "name": "errorMessage", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "deployment_applicationId_application_applicationId_fk": { + "name": "deployment_applicationId_application_applicationId_fk", + "tableFrom": "deployment", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "deployment_composeId_compose_composeId_fk": { + "name": "deployment_composeId_compose_composeId_fk", + "tableFrom": "deployment", + "columnsFrom": [ + "composeId" + ], + "tableTo": "compose", + "columnsTo": [ + "composeId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "deployment_serverId_server_serverId_fk": { + "name": "deployment_serverId_server_serverId_fk", + "tableFrom": "deployment", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "deployment", + "columnsFrom": [ + "previewDeploymentId" + ], + "tableTo": "preview_deployments", + "columnsTo": [ + "previewDeploymentId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.mount": { + "name": "mount", + "schema": "", + "columns": { + "mountId": { + "name": "mountId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "mountType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "hostPath": { + "name": "hostPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "volumeName": { + "name": "volumeName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "filePath": { + "name": "filePath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serviceType": { + "name": "serviceType", + "type": "serviceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'application'" + }, + "mountPath": { + "name": "mountPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mount_applicationId_application_applicationId_fk": { + "name": "mount_applicationId_application_applicationId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_postgresId_postgres_postgresId_fk": { + "name": "mount_postgresId_postgres_postgresId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "postgresId" + ], + "tableTo": "postgres", + "columnsTo": [ + "postgresId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_mariadbId_mariadb_mariadbId_fk": { + "name": "mount_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "mariadbId" + ], + "tableTo": "mariadb", + "columnsTo": [ + "mariadbId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_mongoId_mongo_mongoId_fk": { + "name": "mount_mongoId_mongo_mongoId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "mongoId" + ], + "tableTo": "mongo", + "columnsTo": [ + "mongoId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_mysqlId_mysql_mysqlId_fk": { + "name": "mount_mysqlId_mysql_mysqlId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "mysqlId" + ], + "tableTo": "mysql", + "columnsTo": [ + "mysqlId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_redisId_redis_redisId_fk": { + "name": "mount_redisId_redis_redisId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "redisId" + ], + "tableTo": "redis", + "columnsTo": [ + "redisId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_composeId_compose_composeId_fk": { + "name": "mount_composeId_compose_composeId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "composeId" + ], + "tableTo": "compose", + "columnsTo": [ + "composeId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.certificate": { + "name": "certificate", + "schema": "", + "columns": { + "certificateId": { + "name": "certificateId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateData": { + "name": "certificateData", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificatePath": { + "name": "certificatePath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "autoRenew": { + "name": "autoRenew", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "certificate_adminId_admin_adminId_fk": { + "name": "certificate_adminId_admin_adminId_fk", + "tableFrom": "certificate", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "certificate_serverId_server_serverId_fk": { + "name": "certificate_serverId_server_serverId_fk", + "tableFrom": "certificate", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "certificate_certificatePath_unique": { + "name": "certificate_certificatePath_unique", + "columns": [ + "certificatePath" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "session_user_id_auth_id_fk": { + "name": "session_user_id_auth_id_fk", + "tableFrom": "session", + "columnsFrom": [ + "user_id" + ], + "tableTo": "auth", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.redirect": { + "name": "redirect", + "schema": "", + "columns": { + "redirectId": { + "name": "redirectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "regex": { + "name": "regex", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "replacement": { + "name": "replacement", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "permanent": { + "name": "permanent", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "redirect_applicationId_application_applicationId_fk": { + "name": "redirect_applicationId_application_applicationId_fk", + "tableFrom": "redirect", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.security": { + "name": "security", + "schema": "", + "columns": { + "securityId": { + "name": "securityId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "security_applicationId_application_applicationId_fk": { + "name": "security_applicationId_application_applicationId_fk", + "tableFrom": "security", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "security_username_applicationId_unique": { + "name": "security_username_applicationId_unique", + "columns": [ + "username", + "applicationId" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.port": { + "name": "port", + "schema": "", + "columns": { + "portId": { + "name": "portId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "publishedPort": { + "name": "publishedPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "targetPort": { + "name": "targetPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "protocol": { + "name": "protocol", + "type": "protocolType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "port_applicationId_application_applicationId_fk": { + "name": "port_applicationId_application_applicationId_fk", + "tableFrom": "port", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.redis": { + "name": "redis", + "schema": "", + "columns": { + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "redis_projectId_project_projectId_fk": { + "name": "redis_projectId_project_projectId_fk", + "tableFrom": "redis", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "redis_serverId_server_serverId_fk": { + "name": "redis_serverId_server_serverId_fk", + "tableFrom": "redis", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "redis_appName_unique": { + "name": "redis_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.compose": { + "name": "compose", + "schema": "", + "columns": { + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeFile": { + "name": "composeFile", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceTypeCompose", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "composeType": { + "name": "composeType", + "type": "composeType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'docker-compose'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "composePath": { + "name": "composePath", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'./docker-compose.yml'" + }, + "suffix": { + "name": "suffix", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "randomize": { + "name": "randomize", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "composeStatus": { + "name": "composeStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "compose", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "tableTo": "ssh-key", + "columnsTo": [ + "sshKeyId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "compose_projectId_project_projectId_fk": { + "name": "compose_projectId_project_projectId_fk", + "tableFrom": "compose", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "compose_githubId_github_githubId_fk": { + "name": "compose_githubId_github_githubId_fk", + "tableFrom": "compose", + "columnsFrom": [ + "githubId" + ], + "tableTo": "github", + "columnsTo": [ + "githubId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "compose_gitlabId_gitlab_gitlabId_fk": { + "name": "compose_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "compose", + "columnsFrom": [ + "gitlabId" + ], + "tableTo": "gitlab", + "columnsTo": [ + "gitlabId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "compose_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "compose", + "columnsFrom": [ + "bitbucketId" + ], + "tableTo": "bitbucket", + "columnsTo": [ + "bitbucketId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "compose_serverId_server_serverId_fk": { + "name": "compose_serverId_server_serverId_fk", + "tableFrom": "compose", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.registry": { + "name": "registry", + "schema": "", + "columns": { + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "registryName": { + "name": "registryName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "imagePrefix": { + "name": "imagePrefix", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "selfHosted": { + "name": "selfHosted", + "type": "RegistryType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'cloud'" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "registry_adminId_admin_adminId_fk": { + "name": "registry_adminId_admin_adminId_fk", + "tableFrom": "registry", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.discord": { + "name": "discord", + "schema": "", + "columns": { + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.email": { + "name": "email", + "schema": "", + "columns": { + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "smtpServer": { + "name": "smtpServer", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "smtpPort": { + "name": "smtpPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "fromAddress": { + "name": "fromAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "toAddress": { + "name": "toAddress", + "type": "text[]", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.gotify": { + "name": "gotify", + "schema": "", + "columns": { + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "serverUrl": { + "name": "serverUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appToken": { + "name": "appToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "priority": { + "name": "priority", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 5 + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.notification": { + "name": "notification", + "schema": "", + "columns": { + "notificationId": { + "name": "notificationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appDeploy": { + "name": "appDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "appBuildError": { + "name": "appBuildError", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "databaseBackup": { + "name": "databaseBackup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dokployRestart": { + "name": "dokployRestart", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dockerCleanup": { + "name": "dockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "notificationType": { + "name": "notificationType", + "type": "notificationType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "notification_slackId_slack_slackId_fk": { + "name": "notification_slackId_slack_slackId_fk", + "tableFrom": "notification", + "columnsFrom": [ + "slackId" + ], + "tableTo": "slack", + "columnsTo": [ + "slackId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "notification_telegramId_telegram_telegramId_fk": { + "name": "notification_telegramId_telegram_telegramId_fk", + "tableFrom": "notification", + "columnsFrom": [ + "telegramId" + ], + "tableTo": "telegram", + "columnsTo": [ + "telegramId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "notification_discordId_discord_discordId_fk": { + "name": "notification_discordId_discord_discordId_fk", + "tableFrom": "notification", + "columnsFrom": [ + "discordId" + ], + "tableTo": "discord", + "columnsTo": [ + "discordId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "notification_emailId_email_emailId_fk": { + "name": "notification_emailId_email_emailId_fk", + "tableFrom": "notification", + "columnsFrom": [ + "emailId" + ], + "tableTo": "email", + "columnsTo": [ + "emailId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "notification_gotifyId_gotify_gotifyId_fk": { + "name": "notification_gotifyId_gotify_gotifyId_fk", + "tableFrom": "notification", + "columnsFrom": [ + "gotifyId" + ], + "tableTo": "gotify", + "columnsTo": [ + "gotifyId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "notification_adminId_admin_adminId_fk": { + "name": "notification_adminId_admin_adminId_fk", + "tableFrom": "notification", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.slack": { + "name": "slack", + "schema": "", + "columns": { + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "channel": { + "name": "channel", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.telegram": { + "name": "telegram", + "schema": "", + "columns": { + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "botToken": { + "name": "botToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chatId": { + "name": "chatId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.ssh-key": { + "name": "ssh-key", + "schema": "", + "columns": { + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "publicKey": { + "name": "publicKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "lastUsedAt": { + "name": "lastUsedAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "ssh-key_adminId_admin_adminId_fk": { + "name": "ssh-key_adminId_admin_adminId_fk", + "tableFrom": "ssh-key", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.git_provider": { + "name": "git_provider", + "schema": "", + "columns": { + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "providerType": { + "name": "providerType", + "type": "gitProviderType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "git_provider_adminId_admin_adminId_fk": { + "name": "git_provider_adminId_admin_adminId_fk", + "tableFrom": "git_provider", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.bitbucket": { + "name": "bitbucket", + "schema": "", + "columns": { + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "bitbucketUsername": { + "name": "bitbucketUsername", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "appPassword": { + "name": "appPassword", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketWorkspaceName": { + "name": "bitbucketWorkspaceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { + "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "bitbucket", + "columnsFrom": [ + "gitProviderId" + ], + "tableTo": "git_provider", + "columnsTo": [ + "gitProviderId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.github": { + "name": "github", + "schema": "", + "columns": { + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "githubAppName": { + "name": "githubAppName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubAppId": { + "name": "githubAppId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "githubClientId": { + "name": "githubClientId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubClientSecret": { + "name": "githubClientSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubInstallationId": { + "name": "githubInstallationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubPrivateKey": { + "name": "githubPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubWebhookSecret": { + "name": "githubWebhookSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "github_gitProviderId_git_provider_gitProviderId_fk": { + "name": "github_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "github", + "columnsFrom": [ + "gitProviderId" + ], + "tableTo": "git_provider", + "columnsTo": [ + "gitProviderId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.gitlab": { + "name": "gitlab", + "schema": "", + "columns": { + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "gitlabUrl": { + "name": "gitlabUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'https://gitlab.com'" + }, + "application_id": { + "name": "application_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redirect_uri": { + "name": "redirect_uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "group_name": { + "name": "group_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "gitlab_gitProviderId_git_provider_gitProviderId_fk": { + "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "gitlab", + "columnsFrom": [ + "gitProviderId" + ], + "tableTo": "git_provider", + "columnsTo": [ + "gitProviderId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.server": { + "name": "server", + "schema": "", + "columns": { + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ipAddress": { + "name": "ipAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'root'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverStatus": { + "name": "serverStatus", + "type": "serverStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'active'" + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "server_adminId_admin_adminId_fk": { + "name": "server_adminId_admin_adminId_fk", + "tableFrom": "server", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "server_sshKeyId_ssh-key_sshKeyId_fk": { + "name": "server_sshKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "server", + "columnsFrom": [ + "sshKeyId" + ], + "tableTo": "ssh-key", + "columnsTo": [ + "sshKeyId" + ], + "onUpdate": "no action", + "onDelete": "set null" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.preview_deployments": { + "name": "preview_deployments", + "schema": "", + "columns": { + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestId": { + "name": "pullRequestId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestNumber": { + "name": "pullRequestNumber", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestURL": { + "name": "pullRequestURL", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestTitle": { + "name": "pullRequestTitle", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestCommentId": { + "name": "pullRequestCommentId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "previewStatus": { + "name": "previewStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "preview_deployments_applicationId_application_applicationId_fk": { + "name": "preview_deployments_applicationId_application_applicationId_fk", + "tableFrom": "preview_deployments", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "preview_deployments_domainId_domain_domainId_fk": { + "name": "preview_deployments_domainId_domain_domainId_fk", + "tableFrom": "preview_deployments", + "columnsFrom": [ + "domainId" + ], + "tableTo": "domain", + "columnsTo": [ + "domainId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "preview_deployments_appName_unique": { + "name": "preview_deployments_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + } + }, + "enums": { + "public.buildType": { + "name": "buildType", + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks", + "static" + ] + }, + "public.sourceType": { + "name": "sourceType", + "schema": "public", + "values": [ + "docker", + "git", + "github", + "gitlab", + "bitbucket", + "drop" + ] + }, + "public.Roles": { + "name": "Roles", + "schema": "public", + "values": [ + "admin", + "user" + ] + }, + "public.domainType": { + "name": "domainType", + "schema": "public", + "values": [ + "compose", + "application", + "preview" + ] + }, + "public.databaseType": { + "name": "databaseType", + "schema": "public", + "values": [ + "postgres", + "mariadb", + "mysql", + "mongo" + ] + }, + "public.deploymentStatus": { + "name": "deploymentStatus", + "schema": "public", + "values": [ + "running", + "done", + "error" + ] + }, + "public.mountType": { + "name": "mountType", + "schema": "public", + "values": [ + "bind", + "volume", + "file" + ] + }, + "public.serviceType": { + "name": "serviceType", + "schema": "public", + "values": [ + "application", + "postgres", + "mysql", + "mariadb", + "mongo", + "redis", + "compose" + ] + }, + "public.protocolType": { + "name": "protocolType", + "schema": "public", + "values": [ + "tcp", + "udp" + ] + }, + "public.applicationStatus": { + "name": "applicationStatus", + "schema": "public", + "values": [ + "idle", + "running", + "done", + "error" + ] + }, + "public.certificateType": { + "name": "certificateType", + "schema": "public", + "values": [ + "letsencrypt", + "none" + ] + }, + "public.composeType": { + "name": "composeType", + "schema": "public", + "values": [ + "docker-compose", + "stack" + ] + }, + "public.sourceTypeCompose": { + "name": "sourceTypeCompose", + "schema": "public", + "values": [ + "git", + "github", + "gitlab", + "bitbucket", + "raw" + ] + }, + "public.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + }, + "public.notificationType": { + "name": "notificationType", + "schema": "public", + "values": [ + "slack", + "telegram", + "discord", + "email", + "gotify" + ] + }, + "public.gitProviderType": { + "name": "gitProviderType", + "schema": "public", + "values": [ + "github", + "gitlab", + "bitbucket" + ] + }, + "public.serverStatus": { + "name": "serverStatus", + "schema": "public", + "values": [ + "active", + "inactive" + ] + } + }, + "schemas": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "id": "8492fecb-69a3-4efb-86b1-7bbc62e1eba8", + "prevId": "fdb721ab-5cc8-4063-a3ca-6437b046669c", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} +} \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0060_snapshot.json b/apps/dokploy/drizzle/meta/0060_snapshot.json new file mode 100644 index 00000000..f2a028e8 --- /dev/null +++ b/apps/dokploy/drizzle/meta/0060_snapshot.json @@ -0,0 +1,4450 @@ +{ + "version": "7", + "dialect": "postgresql", + "tables": { + "public.application": { + "name": "application", + "schema": "", + "columns": { + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewEnv": { + "name": "previewEnv", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewBuildArgs": { + "name": "previewBuildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewWildcard": { + "name": "previewWildcard", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewPort": { + "name": "previewPort", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "previewHttps": { + "name": "previewHttps", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "previewPath": { + "name": "previewPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "previewLimit": { + "name": "previewLimit", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3 + }, + "isPreviewDeploymentsActive": { + "name": "isPreviewDeploymentsActive", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "buildArgs": { + "name": "buildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "subtitle": { + "name": "subtitle", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "buildPath": { + "name": "buildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBuildPath": { + "name": "gitlabBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBuildPath": { + "name": "bitbucketBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBuildPath": { + "name": "customGitBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerContextPath": { + "name": "dockerContextPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerBuildStage": { + "name": "dockerBuildStage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dropBuildPath": { + "name": "dropBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "healthCheckSwarm": { + "name": "healthCheckSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "restartPolicySwarm": { + "name": "restartPolicySwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "placementSwarm": { + "name": "placementSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "updateConfigSwarm": { + "name": "updateConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "rollbackConfigSwarm": { + "name": "rollbackConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "modeSwarm": { + "name": "modeSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "labelsSwarm": { + "name": "labelsSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "networkSwarm": { + "name": "networkSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "replicas": { + "name": "replicas", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "buildType": { + "name": "buildType", + "type": "buildType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'nixpacks'" + }, + "herokuVersion": { + "name": "herokuVersion", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'24'" + }, + "publishDirectory": { + "name": "publishDirectory", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "application", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "tableTo": "ssh-key", + "columnsTo": [ + "sshKeyId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "application_registryId_registry_registryId_fk": { + "name": "application_registryId_registry_registryId_fk", + "tableFrom": "application", + "columnsFrom": [ + "registryId" + ], + "tableTo": "registry", + "columnsTo": [ + "registryId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "application_projectId_project_projectId_fk": { + "name": "application_projectId_project_projectId_fk", + "tableFrom": "application", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "application_githubId_github_githubId_fk": { + "name": "application_githubId_github_githubId_fk", + "tableFrom": "application", + "columnsFrom": [ + "githubId" + ], + "tableTo": "github", + "columnsTo": [ + "githubId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "application_gitlabId_gitlab_gitlabId_fk": { + "name": "application_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "application", + "columnsFrom": [ + "gitlabId" + ], + "tableTo": "gitlab", + "columnsTo": [ + "gitlabId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "application_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "application_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "application", + "columnsFrom": [ + "bitbucketId" + ], + "tableTo": "bitbucket", + "columnsTo": [ + "bitbucketId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "application_serverId_server_serverId_fk": { + "name": "application_serverId_server_serverId_fk", + "tableFrom": "application", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "application_appName_unique": { + "name": "application_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.postgres": { + "name": "postgres", + "schema": "", + "columns": { + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "postgres_projectId_project_projectId_fk": { + "name": "postgres_projectId_project_projectId_fk", + "tableFrom": "postgres", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "postgres_serverId_server_serverId_fk": { + "name": "postgres_serverId_server_serverId_fk", + "tableFrom": "postgres", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "postgres_appName_unique": { + "name": "postgres_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "userId": { + "name": "userId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "isRegistered": { + "name": "isRegistered", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "expirationDate": { + "name": "expirationDate", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "canCreateProjects": { + "name": "canCreateProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToSSHKeys": { + "name": "canAccessToSSHKeys", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canCreateServices": { + "name": "canCreateServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteProjects": { + "name": "canDeleteProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteServices": { + "name": "canDeleteServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToDocker": { + "name": "canAccessToDocker", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToAPI": { + "name": "canAccessToAPI", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToGitProviders": { + "name": "canAccessToGitProviders", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToTraefikFiles": { + "name": "canAccessToTraefikFiles", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "accesedProjects": { + "name": "accesedProjects", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "accesedServices": { + "name": "accesedServices", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "user_adminId_admin_adminId_fk": { + "name": "user_adminId_admin_adminId_fk", + "tableFrom": "user", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "user_authId_auth_id_fk": { + "name": "user_authId_auth_id_fk", + "tableFrom": "user", + "columnsFrom": [ + "authId" + ], + "tableTo": "auth", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.admin": { + "name": "admin", + "schema": "", + "columns": { + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "serverIp": { + "name": "serverIp", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "letsEncryptEmail": { + "name": "letsEncryptEmail", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sshPrivateKey": { + "name": "sshPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enableLogRotation": { + "name": "enableLogRotation", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "stripeCustomerId": { + "name": "stripeCustomerId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "stripeSubscriptionId": { + "name": "stripeSubscriptionId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serversQuantity": { + "name": "serversQuantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "cleanupCacheApplications": { + "name": "cleanupCacheApplications", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnPreviews": { + "name": "cleanupCacheOnPreviews", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnCompose": { + "name": "cleanupCacheOnCompose", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "admin_authId_auth_id_fk": { + "name": "admin_authId_auth_id_fk", + "tableFrom": "admin", + "columnsFrom": [ + "authId" + ], + "tableTo": "auth", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.auth": { + "name": "auth", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rol": { + "name": "rol", + "type": "Roles", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is2FAEnabled": { + "name": "is2FAEnabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "resetPasswordToken": { + "name": "resetPasswordToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "resetPasswordExpiresAt": { + "name": "resetPasswordExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationToken": { + "name": "confirmationToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationExpiresAt": { + "name": "confirmationExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "auth_email_unique": { + "name": "auth_email_unique", + "columns": [ + "email" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.project": { + "name": "project", + "schema": "", + "columns": { + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": { + "project_adminId_admin_adminId_fk": { + "name": "project_adminId_admin_adminId_fk", + "tableFrom": "project", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.domain": { + "name": "domain", + "schema": "", + "columns": { + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "https": { + "name": "https", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "serviceName": { + "name": "serviceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "domainType": { + "name": "domainType", + "type": "domainType", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'application'" + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "domain_composeId_compose_composeId_fk": { + "name": "domain_composeId_compose_composeId_fk", + "tableFrom": "domain", + "columnsFrom": [ + "composeId" + ], + "tableTo": "compose", + "columnsTo": [ + "composeId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "domain_applicationId_application_applicationId_fk": { + "name": "domain_applicationId_application_applicationId_fk", + "tableFrom": "domain", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "domain", + "columnsFrom": [ + "previewDeploymentId" + ], + "tableTo": "preview_deployments", + "columnsTo": [ + "previewDeploymentId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.mariadb": { + "name": "mariadb", + "schema": "", + "columns": { + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mariadb_projectId_project_projectId_fk": { + "name": "mariadb_projectId_project_projectId_fk", + "tableFrom": "mariadb", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mariadb_serverId_server_serverId_fk": { + "name": "mariadb_serverId_server_serverId_fk", + "tableFrom": "mariadb", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mariadb_appName_unique": { + "name": "mariadb_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.mongo": { + "name": "mongo", + "schema": "", + "columns": { + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "replicaSets": { + "name": "replicaSets", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "mongo_projectId_project_projectId_fk": { + "name": "mongo_projectId_project_projectId_fk", + "tableFrom": "mongo", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mongo_serverId_server_serverId_fk": { + "name": "mongo_serverId_server_serverId_fk", + "tableFrom": "mongo", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mongo_appName_unique": { + "name": "mongo_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.mysql": { + "name": "mysql", + "schema": "", + "columns": { + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mysql_projectId_project_projectId_fk": { + "name": "mysql_projectId_project_projectId_fk", + "tableFrom": "mysql", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mysql_serverId_server_serverId_fk": { + "name": "mysql_serverId_server_serverId_fk", + "tableFrom": "mysql", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mysql_appName_unique": { + "name": "mysql_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.backup": { + "name": "backup", + "schema": "", + "columns": { + "backupId": { + "name": "backupId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "schedule": { + "name": "schedule", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "database": { + "name": "database", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "prefix": { + "name": "prefix", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseType": { + "name": "databaseType", + "type": "databaseType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "backup_destinationId_destination_destinationId_fk": { + "name": "backup_destinationId_destination_destinationId_fk", + "tableFrom": "backup", + "columnsFrom": [ + "destinationId" + ], + "tableTo": "destination", + "columnsTo": [ + "destinationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "backup_postgresId_postgres_postgresId_fk": { + "name": "backup_postgresId_postgres_postgresId_fk", + "tableFrom": "backup", + "columnsFrom": [ + "postgresId" + ], + "tableTo": "postgres", + "columnsTo": [ + "postgresId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "backup_mariadbId_mariadb_mariadbId_fk": { + "name": "backup_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "backup", + "columnsFrom": [ + "mariadbId" + ], + "tableTo": "mariadb", + "columnsTo": [ + "mariadbId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "backup_mysqlId_mysql_mysqlId_fk": { + "name": "backup_mysqlId_mysql_mysqlId_fk", + "tableFrom": "backup", + "columnsFrom": [ + "mysqlId" + ], + "tableTo": "mysql", + "columnsTo": [ + "mysqlId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "backup_mongoId_mongo_mongoId_fk": { + "name": "backup_mongoId_mongo_mongoId_fk", + "tableFrom": "backup", + "columnsFrom": [ + "mongoId" + ], + "tableTo": "mongo", + "columnsTo": [ + "mongoId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.destination": { + "name": "destination", + "schema": "", + "columns": { + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "accessKey": { + "name": "accessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "secretAccessKey": { + "name": "secretAccessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "bucket": { + "name": "bucket", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "destination_adminId_admin_adminId_fk": { + "name": "destination_adminId_admin_adminId_fk", + "tableFrom": "destination", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.deployment": { + "name": "deployment", + "schema": "", + "columns": { + "deploymentId": { + "name": "deploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "deploymentStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'running'" + }, + "logPath": { + "name": "logPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "isPreviewDeployment": { + "name": "isPreviewDeployment", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "errorMessage": { + "name": "errorMessage", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "deployment_applicationId_application_applicationId_fk": { + "name": "deployment_applicationId_application_applicationId_fk", + "tableFrom": "deployment", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "deployment_composeId_compose_composeId_fk": { + "name": "deployment_composeId_compose_composeId_fk", + "tableFrom": "deployment", + "columnsFrom": [ + "composeId" + ], + "tableTo": "compose", + "columnsTo": [ + "composeId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "deployment_serverId_server_serverId_fk": { + "name": "deployment_serverId_server_serverId_fk", + "tableFrom": "deployment", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "deployment", + "columnsFrom": [ + "previewDeploymentId" + ], + "tableTo": "preview_deployments", + "columnsTo": [ + "previewDeploymentId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.mount": { + "name": "mount", + "schema": "", + "columns": { + "mountId": { + "name": "mountId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "mountType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "hostPath": { + "name": "hostPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "volumeName": { + "name": "volumeName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "filePath": { + "name": "filePath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serviceType": { + "name": "serviceType", + "type": "serviceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'application'" + }, + "mountPath": { + "name": "mountPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mount_applicationId_application_applicationId_fk": { + "name": "mount_applicationId_application_applicationId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_postgresId_postgres_postgresId_fk": { + "name": "mount_postgresId_postgres_postgresId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "postgresId" + ], + "tableTo": "postgres", + "columnsTo": [ + "postgresId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_mariadbId_mariadb_mariadbId_fk": { + "name": "mount_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "mariadbId" + ], + "tableTo": "mariadb", + "columnsTo": [ + "mariadbId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_mongoId_mongo_mongoId_fk": { + "name": "mount_mongoId_mongo_mongoId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "mongoId" + ], + "tableTo": "mongo", + "columnsTo": [ + "mongoId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_mysqlId_mysql_mysqlId_fk": { + "name": "mount_mysqlId_mysql_mysqlId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "mysqlId" + ], + "tableTo": "mysql", + "columnsTo": [ + "mysqlId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_redisId_redis_redisId_fk": { + "name": "mount_redisId_redis_redisId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "redisId" + ], + "tableTo": "redis", + "columnsTo": [ + "redisId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "mount_composeId_compose_composeId_fk": { + "name": "mount_composeId_compose_composeId_fk", + "tableFrom": "mount", + "columnsFrom": [ + "composeId" + ], + "tableTo": "compose", + "columnsTo": [ + "composeId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.certificate": { + "name": "certificate", + "schema": "", + "columns": { + "certificateId": { + "name": "certificateId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateData": { + "name": "certificateData", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificatePath": { + "name": "certificatePath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "autoRenew": { + "name": "autoRenew", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "certificate_adminId_admin_adminId_fk": { + "name": "certificate_adminId_admin_adminId_fk", + "tableFrom": "certificate", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "certificate_serverId_server_serverId_fk": { + "name": "certificate_serverId_server_serverId_fk", + "tableFrom": "certificate", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "certificate_certificatePath_unique": { + "name": "certificate_certificatePath_unique", + "columns": [ + "certificatePath" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "session_user_id_auth_id_fk": { + "name": "session_user_id_auth_id_fk", + "tableFrom": "session", + "columnsFrom": [ + "user_id" + ], + "tableTo": "auth", + "columnsTo": [ + "id" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.redirect": { + "name": "redirect", + "schema": "", + "columns": { + "redirectId": { + "name": "redirectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "regex": { + "name": "regex", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "replacement": { + "name": "replacement", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "permanent": { + "name": "permanent", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "redirect_applicationId_application_applicationId_fk": { + "name": "redirect_applicationId_application_applicationId_fk", + "tableFrom": "redirect", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.security": { + "name": "security", + "schema": "", + "columns": { + "securityId": { + "name": "securityId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "security_applicationId_application_applicationId_fk": { + "name": "security_applicationId_application_applicationId_fk", + "tableFrom": "security", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "security_username_applicationId_unique": { + "name": "security_username_applicationId_unique", + "columns": [ + "username", + "applicationId" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.port": { + "name": "port", + "schema": "", + "columns": { + "portId": { + "name": "portId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "publishedPort": { + "name": "publishedPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "targetPort": { + "name": "targetPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "protocol": { + "name": "protocol", + "type": "protocolType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "port_applicationId_application_applicationId_fk": { + "name": "port_applicationId_application_applicationId_fk", + "tableFrom": "port", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.redis": { + "name": "redis", + "schema": "", + "columns": { + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "redis_projectId_project_projectId_fk": { + "name": "redis_projectId_project_projectId_fk", + "tableFrom": "redis", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "redis_serverId_server_serverId_fk": { + "name": "redis_serverId_server_serverId_fk", + "tableFrom": "redis", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "redis_appName_unique": { + "name": "redis_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.compose": { + "name": "compose", + "schema": "", + "columns": { + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeFile": { + "name": "composeFile", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceTypeCompose", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "composeType": { + "name": "composeType", + "type": "composeType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'docker-compose'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "composePath": { + "name": "composePath", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'./docker-compose.yml'" + }, + "suffix": { + "name": "suffix", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "randomize": { + "name": "randomize", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "composeStatus": { + "name": "composeStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "compose", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "tableTo": "ssh-key", + "columnsTo": [ + "sshKeyId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "compose_projectId_project_projectId_fk": { + "name": "compose_projectId_project_projectId_fk", + "tableFrom": "compose", + "columnsFrom": [ + "projectId" + ], + "tableTo": "project", + "columnsTo": [ + "projectId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "compose_githubId_github_githubId_fk": { + "name": "compose_githubId_github_githubId_fk", + "tableFrom": "compose", + "columnsFrom": [ + "githubId" + ], + "tableTo": "github", + "columnsTo": [ + "githubId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "compose_gitlabId_gitlab_gitlabId_fk": { + "name": "compose_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "compose", + "columnsFrom": [ + "gitlabId" + ], + "tableTo": "gitlab", + "columnsTo": [ + "gitlabId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "compose_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "compose", + "columnsFrom": [ + "bitbucketId" + ], + "tableTo": "bitbucket", + "columnsTo": [ + "bitbucketId" + ], + "onUpdate": "no action", + "onDelete": "set null" + }, + "compose_serverId_server_serverId_fk": { + "name": "compose_serverId_server_serverId_fk", + "tableFrom": "compose", + "columnsFrom": [ + "serverId" + ], + "tableTo": "server", + "columnsTo": [ + "serverId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.registry": { + "name": "registry", + "schema": "", + "columns": { + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "registryName": { + "name": "registryName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "imagePrefix": { + "name": "imagePrefix", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "selfHosted": { + "name": "selfHosted", + "type": "RegistryType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'cloud'" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "registry_adminId_admin_adminId_fk": { + "name": "registry_adminId_admin_adminId_fk", + "tableFrom": "registry", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.discord": { + "name": "discord", + "schema": "", + "columns": { + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.email": { + "name": "email", + "schema": "", + "columns": { + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "smtpServer": { + "name": "smtpServer", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "smtpPort": { + "name": "smtpPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "fromAddress": { + "name": "fromAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "toAddress": { + "name": "toAddress", + "type": "text[]", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.gotify": { + "name": "gotify", + "schema": "", + "columns": { + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "serverUrl": { + "name": "serverUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appToken": { + "name": "appToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "priority": { + "name": "priority", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 5 + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.notification": { + "name": "notification", + "schema": "", + "columns": { + "notificationId": { + "name": "notificationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appDeploy": { + "name": "appDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "appBuildError": { + "name": "appBuildError", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "databaseBackup": { + "name": "databaseBackup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dokployRestart": { + "name": "dokployRestart", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dockerCleanup": { + "name": "dockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "notificationType": { + "name": "notificationType", + "type": "notificationType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "notification_slackId_slack_slackId_fk": { + "name": "notification_slackId_slack_slackId_fk", + "tableFrom": "notification", + "columnsFrom": [ + "slackId" + ], + "tableTo": "slack", + "columnsTo": [ + "slackId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "notification_telegramId_telegram_telegramId_fk": { + "name": "notification_telegramId_telegram_telegramId_fk", + "tableFrom": "notification", + "columnsFrom": [ + "telegramId" + ], + "tableTo": "telegram", + "columnsTo": [ + "telegramId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "notification_discordId_discord_discordId_fk": { + "name": "notification_discordId_discord_discordId_fk", + "tableFrom": "notification", + "columnsFrom": [ + "discordId" + ], + "tableTo": "discord", + "columnsTo": [ + "discordId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "notification_emailId_email_emailId_fk": { + "name": "notification_emailId_email_emailId_fk", + "tableFrom": "notification", + "columnsFrom": [ + "emailId" + ], + "tableTo": "email", + "columnsTo": [ + "emailId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "notification_gotifyId_gotify_gotifyId_fk": { + "name": "notification_gotifyId_gotify_gotifyId_fk", + "tableFrom": "notification", + "columnsFrom": [ + "gotifyId" + ], + "tableTo": "gotify", + "columnsTo": [ + "gotifyId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "notification_adminId_admin_adminId_fk": { + "name": "notification_adminId_admin_adminId_fk", + "tableFrom": "notification", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.slack": { + "name": "slack", + "schema": "", + "columns": { + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "channel": { + "name": "channel", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.telegram": { + "name": "telegram", + "schema": "", + "columns": { + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "botToken": { + "name": "botToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chatId": { + "name": "chatId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.ssh-key": { + "name": "ssh-key", + "schema": "", + "columns": { + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "publicKey": { + "name": "publicKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "lastUsedAt": { + "name": "lastUsedAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "ssh-key_adminId_admin_adminId_fk": { + "name": "ssh-key_adminId_admin_adminId_fk", + "tableFrom": "ssh-key", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.git_provider": { + "name": "git_provider", + "schema": "", + "columns": { + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "providerType": { + "name": "providerType", + "type": "gitProviderType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "git_provider_adminId_admin_adminId_fk": { + "name": "git_provider_adminId_admin_adminId_fk", + "tableFrom": "git_provider", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.bitbucket": { + "name": "bitbucket", + "schema": "", + "columns": { + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "bitbucketUsername": { + "name": "bitbucketUsername", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "appPassword": { + "name": "appPassword", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketWorkspaceName": { + "name": "bitbucketWorkspaceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { + "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "bitbucket", + "columnsFrom": [ + "gitProviderId" + ], + "tableTo": "git_provider", + "columnsTo": [ + "gitProviderId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.github": { + "name": "github", + "schema": "", + "columns": { + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "githubAppName": { + "name": "githubAppName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubAppId": { + "name": "githubAppId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "githubClientId": { + "name": "githubClientId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubClientSecret": { + "name": "githubClientSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubInstallationId": { + "name": "githubInstallationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubPrivateKey": { + "name": "githubPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubWebhookSecret": { + "name": "githubWebhookSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "github_gitProviderId_git_provider_gitProviderId_fk": { + "name": "github_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "github", + "columnsFrom": [ + "gitProviderId" + ], + "tableTo": "git_provider", + "columnsTo": [ + "gitProviderId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.gitlab": { + "name": "gitlab", + "schema": "", + "columns": { + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "gitlabUrl": { + "name": "gitlabUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'https://gitlab.com'" + }, + "application_id": { + "name": "application_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redirect_uri": { + "name": "redirect_uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "group_name": { + "name": "group_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "gitlab_gitProviderId_git_provider_gitProviderId_fk": { + "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "gitlab", + "columnsFrom": [ + "gitProviderId" + ], + "tableTo": "git_provider", + "columnsTo": [ + "gitProviderId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.server": { + "name": "server", + "schema": "", + "columns": { + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ipAddress": { + "name": "ipAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'root'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverStatus": { + "name": "serverStatus", + "type": "serverStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'active'" + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "server_adminId_admin_adminId_fk": { + "name": "server_adminId_admin_adminId_fk", + "tableFrom": "server", + "columnsFrom": [ + "adminId" + ], + "tableTo": "admin", + "columnsTo": [ + "adminId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "server_sshKeyId_ssh-key_sshKeyId_fk": { + "name": "server_sshKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "server", + "columnsFrom": [ + "sshKeyId" + ], + "tableTo": "ssh-key", + "columnsTo": [ + "sshKeyId" + ], + "onUpdate": "no action", + "onDelete": "set null" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + }, + "public.preview_deployments": { + "name": "preview_deployments", + "schema": "", + "columns": { + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestId": { + "name": "pullRequestId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestNumber": { + "name": "pullRequestNumber", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestURL": { + "name": "pullRequestURL", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestTitle": { + "name": "pullRequestTitle", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestCommentId": { + "name": "pullRequestCommentId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "previewStatus": { + "name": "previewStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "preview_deployments_applicationId_application_applicationId_fk": { + "name": "preview_deployments_applicationId_application_applicationId_fk", + "tableFrom": "preview_deployments", + "columnsFrom": [ + "applicationId" + ], + "tableTo": "application", + "columnsTo": [ + "applicationId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + }, + "preview_deployments_domainId_domain_domainId_fk": { + "name": "preview_deployments_domainId_domain_domainId_fk", + "tableFrom": "preview_deployments", + "columnsFrom": [ + "domainId" + ], + "tableTo": "domain", + "columnsTo": [ + "domainId" + ], + "onUpdate": "no action", + "onDelete": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "preview_deployments_appName_unique": { + "name": "preview_deployments_appName_unique", + "columns": [ + "appName" + ], + "nullsNotDistinct": false + } + }, + "policies": {}, + "isRLSEnabled": false, + "checkConstraints": {} + } + }, + "enums": { + "public.buildType": { + "name": "buildType", + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks", + "static" + ] + }, + "public.sourceType": { + "name": "sourceType", + "schema": "public", + "values": [ + "docker", + "git", + "github", + "gitlab", + "bitbucket", + "drop" + ] + }, + "public.Roles": { + "name": "Roles", + "schema": "public", + "values": [ + "admin", + "user" + ] + }, + "public.domainType": { + "name": "domainType", + "schema": "public", + "values": [ + "compose", + "application", + "preview" + ] + }, + "public.databaseType": { + "name": "databaseType", + "schema": "public", + "values": [ + "postgres", + "mariadb", + "mysql", + "mongo" + ] + }, + "public.deploymentStatus": { + "name": "deploymentStatus", + "schema": "public", + "values": [ + "running", + "done", + "error" + ] + }, + "public.mountType": { + "name": "mountType", + "schema": "public", + "values": [ + "bind", + "volume", + "file" + ] + }, + "public.serviceType": { + "name": "serviceType", + "schema": "public", + "values": [ + "application", + "postgres", + "mysql", + "mariadb", + "mongo", + "redis", + "compose" + ] + }, + "public.protocolType": { + "name": "protocolType", + "schema": "public", + "values": [ + "tcp", + "udp" + ] + }, + "public.applicationStatus": { + "name": "applicationStatus", + "schema": "public", + "values": [ + "idle", + "running", + "done", + "error" + ] + }, + "public.certificateType": { + "name": "certificateType", + "schema": "public", + "values": [ + "letsencrypt", + "none" + ] + }, + "public.composeType": { + "name": "composeType", + "schema": "public", + "values": [ + "docker-compose", + "stack" + ] + }, + "public.sourceTypeCompose": { + "name": "sourceTypeCompose", + "schema": "public", + "values": [ + "git", + "github", + "gitlab", + "bitbucket", + "raw" + ] + }, + "public.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + }, + "public.notificationType": { + "name": "notificationType", + "schema": "public", + "values": [ + "slack", + "telegram", + "discord", + "email", + "gotify" + ] + }, + "public.gitProviderType": { + "name": "gitProviderType", + "schema": "public", + "values": [ + "github", + "gitlab", + "bitbucket" + ] + }, + "public.serverStatus": { + "name": "serverStatus", + "schema": "public", + "values": [ + "active", + "inactive" + ] + } + }, + "schemas": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "id": "1f4eada1-a120-490d-a152-2fc7a81eee7a", + "prevId": "8492fecb-69a3-4efb-86b1-7bbc62e1eba8", + "sequences": {}, + "policies": {}, + "views": {}, + "roles": {} +} \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0061_snapshot.json b/apps/dokploy/drizzle/meta/0061_snapshot.json new file mode 100644 index 00000000..e35b7b0a --- /dev/null +++ b/apps/dokploy/drizzle/meta/0061_snapshot.json @@ -0,0 +1,4478 @@ +{ + "id": "5ec4c091-a361-4acb-ae2b-dff5078d77f0", + "prevId": "1f4eada1-a120-490d-a152-2fc7a81eee7a", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.application": { + "name": "application", + "schema": "", + "columns": { + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewEnv": { + "name": "previewEnv", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewBuildArgs": { + "name": "previewBuildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewWildcard": { + "name": "previewWildcard", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewPort": { + "name": "previewPort", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "previewHttps": { + "name": "previewHttps", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "previewPath": { + "name": "previewPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "previewLimit": { + "name": "previewLimit", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3 + }, + "isPreviewDeploymentsActive": { + "name": "isPreviewDeploymentsActive", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "buildArgs": { + "name": "buildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "subtitle": { + "name": "subtitle", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "buildPath": { + "name": "buildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBuildPath": { + "name": "gitlabBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBuildPath": { + "name": "bitbucketBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBuildPath": { + "name": "customGitBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerContextPath": { + "name": "dockerContextPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerBuildStage": { + "name": "dockerBuildStage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dropBuildPath": { + "name": "dropBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "healthCheckSwarm": { + "name": "healthCheckSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "restartPolicySwarm": { + "name": "restartPolicySwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "placementSwarm": { + "name": "placementSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "updateConfigSwarm": { + "name": "updateConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "rollbackConfigSwarm": { + "name": "rollbackConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "modeSwarm": { + "name": "modeSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "labelsSwarm": { + "name": "labelsSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "networkSwarm": { + "name": "networkSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "replicas": { + "name": "replicas", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "buildType": { + "name": "buildType", + "type": "buildType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'nixpacks'" + }, + "herokuVersion": { + "name": "herokuVersion", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'24'" + }, + "publishDirectory": { + "name": "publishDirectory", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "application", + "tableTo": "ssh-key", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_registryId_registry_registryId_fk": { + "name": "application_registryId_registry_registryId_fk", + "tableFrom": "application", + "tableTo": "registry", + "columnsFrom": [ + "registryId" + ], + "columnsTo": [ + "registryId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_projectId_project_projectId_fk": { + "name": "application_projectId_project_projectId_fk", + "tableFrom": "application", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "application_githubId_github_githubId_fk": { + "name": "application_githubId_github_githubId_fk", + "tableFrom": "application", + "tableTo": "github", + "columnsFrom": [ + "githubId" + ], + "columnsTo": [ + "githubId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_gitlabId_gitlab_gitlabId_fk": { + "name": "application_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "application", + "tableTo": "gitlab", + "columnsFrom": [ + "gitlabId" + ], + "columnsTo": [ + "gitlabId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "application_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "application", + "tableTo": "bitbucket", + "columnsFrom": [ + "bitbucketId" + ], + "columnsTo": [ + "bitbucketId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_serverId_server_serverId_fk": { + "name": "application_serverId_server_serverId_fk", + "tableFrom": "application", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "application_appName_unique": { + "name": "application_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.postgres": { + "name": "postgres", + "schema": "", + "columns": { + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "postgres_projectId_project_projectId_fk": { + "name": "postgres_projectId_project_projectId_fk", + "tableFrom": "postgres", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "postgres_serverId_server_serverId_fk": { + "name": "postgres_serverId_server_serverId_fk", + "tableFrom": "postgres", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "postgres_appName_unique": { + "name": "postgres_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "userId": { + "name": "userId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "isRegistered": { + "name": "isRegistered", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "expirationDate": { + "name": "expirationDate", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "canCreateProjects": { + "name": "canCreateProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToSSHKeys": { + "name": "canAccessToSSHKeys", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canCreateServices": { + "name": "canCreateServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteProjects": { + "name": "canDeleteProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteServices": { + "name": "canDeleteServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToDocker": { + "name": "canAccessToDocker", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToAPI": { + "name": "canAccessToAPI", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToGitProviders": { + "name": "canAccessToGitProviders", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToTraefikFiles": { + "name": "canAccessToTraefikFiles", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "accesedProjects": { + "name": "accesedProjects", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "accesedServices": { + "name": "accesedServices", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "user_adminId_admin_adminId_fk": { + "name": "user_adminId_admin_adminId_fk", + "tableFrom": "user", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_authId_auth_id_fk": { + "name": "user_authId_auth_id_fk", + "tableFrom": "user", + "tableTo": "auth", + "columnsFrom": [ + "authId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.admin": { + "name": "admin", + "schema": "", + "columns": { + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "serverIp": { + "name": "serverIp", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "letsEncryptEmail": { + "name": "letsEncryptEmail", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sshPrivateKey": { + "name": "sshPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enableLogRotation": { + "name": "enableLogRotation", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "stripeCustomerId": { + "name": "stripeCustomerId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "stripeSubscriptionId": { + "name": "stripeSubscriptionId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serversQuantity": { + "name": "serversQuantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "enablePaidFeatures": { + "name": "enablePaidFeatures", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "metricsConfig": { + "name": "metricsConfig", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{\"server\":{\"refreshRate\":20,\"port\":4500,\"token\":\"\",\"retentionDays\":2,\"cronJob\":\"\",\"urlCallback\":\"\",\"thresholds\":{\"cpu\":0,\"memory\":0}},\"containers\":{\"refreshRate\":20,\"services\":{\"include\":[],\"exclude\":[]}}}'::jsonb" + }, + "cleanupCacheApplications": { + "name": "cleanupCacheApplications", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnPreviews": { + "name": "cleanupCacheOnPreviews", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnCompose": { + "name": "cleanupCacheOnCompose", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "admin_authId_auth_id_fk": { + "name": "admin_authId_auth_id_fk", + "tableFrom": "admin", + "tableTo": "auth", + "columnsFrom": [ + "authId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.auth": { + "name": "auth", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rol": { + "name": "rol", + "type": "Roles", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is2FAEnabled": { + "name": "is2FAEnabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "resetPasswordToken": { + "name": "resetPasswordToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "resetPasswordExpiresAt": { + "name": "resetPasswordExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationToken": { + "name": "confirmationToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationExpiresAt": { + "name": "confirmationExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "auth_email_unique": { + "name": "auth_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.project": { + "name": "project", + "schema": "", + "columns": { + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": { + "project_adminId_admin_adminId_fk": { + "name": "project_adminId_admin_adminId_fk", + "tableFrom": "project", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.domain": { + "name": "domain", + "schema": "", + "columns": { + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "https": { + "name": "https", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "serviceName": { + "name": "serviceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "domainType": { + "name": "domainType", + "type": "domainType", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'application'" + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "domain_composeId_compose_composeId_fk": { + "name": "domain_composeId_compose_composeId_fk", + "tableFrom": "domain", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "domain_applicationId_application_applicationId_fk": { + "name": "domain_applicationId_application_applicationId_fk", + "tableFrom": "domain", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "domain", + "tableTo": "preview_deployments", + "columnsFrom": [ + "previewDeploymentId" + ], + "columnsTo": [ + "previewDeploymentId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mariadb": { + "name": "mariadb", + "schema": "", + "columns": { + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mariadb_projectId_project_projectId_fk": { + "name": "mariadb_projectId_project_projectId_fk", + "tableFrom": "mariadb", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mariadb_serverId_server_serverId_fk": { + "name": "mariadb_serverId_server_serverId_fk", + "tableFrom": "mariadb", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mariadb_appName_unique": { + "name": "mariadb_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mongo": { + "name": "mongo", + "schema": "", + "columns": { + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "replicaSets": { + "name": "replicaSets", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "mongo_projectId_project_projectId_fk": { + "name": "mongo_projectId_project_projectId_fk", + "tableFrom": "mongo", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mongo_serverId_server_serverId_fk": { + "name": "mongo_serverId_server_serverId_fk", + "tableFrom": "mongo", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mongo_appName_unique": { + "name": "mongo_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mysql": { + "name": "mysql", + "schema": "", + "columns": { + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mysql_projectId_project_projectId_fk": { + "name": "mysql_projectId_project_projectId_fk", + "tableFrom": "mysql", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mysql_serverId_server_serverId_fk": { + "name": "mysql_serverId_server_serverId_fk", + "tableFrom": "mysql", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mysql_appName_unique": { + "name": "mysql_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.backup": { + "name": "backup", + "schema": "", + "columns": { + "backupId": { + "name": "backupId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "schedule": { + "name": "schedule", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "database": { + "name": "database", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "prefix": { + "name": "prefix", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseType": { + "name": "databaseType", + "type": "databaseType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "backup_destinationId_destination_destinationId_fk": { + "name": "backup_destinationId_destination_destinationId_fk", + "tableFrom": "backup", + "tableTo": "destination", + "columnsFrom": [ + "destinationId" + ], + "columnsTo": [ + "destinationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_postgresId_postgres_postgresId_fk": { + "name": "backup_postgresId_postgres_postgresId_fk", + "tableFrom": "backup", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mariadbId_mariadb_mariadbId_fk": { + "name": "backup_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "backup", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mysqlId_mysql_mysqlId_fk": { + "name": "backup_mysqlId_mysql_mysqlId_fk", + "tableFrom": "backup", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mongoId_mongo_mongoId_fk": { + "name": "backup_mongoId_mongo_mongoId_fk", + "tableFrom": "backup", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.destination": { + "name": "destination", + "schema": "", + "columns": { + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "accessKey": { + "name": "accessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "secretAccessKey": { + "name": "secretAccessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "bucket": { + "name": "bucket", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "destination_adminId_admin_adminId_fk": { + "name": "destination_adminId_admin_adminId_fk", + "tableFrom": "destination", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.deployment": { + "name": "deployment", + "schema": "", + "columns": { + "deploymentId": { + "name": "deploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "deploymentStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'running'" + }, + "logPath": { + "name": "logPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "isPreviewDeployment": { + "name": "isPreviewDeployment", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "errorMessage": { + "name": "errorMessage", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "deployment_applicationId_application_applicationId_fk": { + "name": "deployment_applicationId_application_applicationId_fk", + "tableFrom": "deployment", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_composeId_compose_composeId_fk": { + "name": "deployment_composeId_compose_composeId_fk", + "tableFrom": "deployment", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_serverId_server_serverId_fk": { + "name": "deployment_serverId_server_serverId_fk", + "tableFrom": "deployment", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "deployment", + "tableTo": "preview_deployments", + "columnsFrom": [ + "previewDeploymentId" + ], + "columnsTo": [ + "previewDeploymentId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mount": { + "name": "mount", + "schema": "", + "columns": { + "mountId": { + "name": "mountId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "mountType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "hostPath": { + "name": "hostPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "volumeName": { + "name": "volumeName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "filePath": { + "name": "filePath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serviceType": { + "name": "serviceType", + "type": "serviceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'application'" + }, + "mountPath": { + "name": "mountPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mount_applicationId_application_applicationId_fk": { + "name": "mount_applicationId_application_applicationId_fk", + "tableFrom": "mount", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_postgresId_postgres_postgresId_fk": { + "name": "mount_postgresId_postgres_postgresId_fk", + "tableFrom": "mount", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mariadbId_mariadb_mariadbId_fk": { + "name": "mount_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "mount", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mongoId_mongo_mongoId_fk": { + "name": "mount_mongoId_mongo_mongoId_fk", + "tableFrom": "mount", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mysqlId_mysql_mysqlId_fk": { + "name": "mount_mysqlId_mysql_mysqlId_fk", + "tableFrom": "mount", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_redisId_redis_redisId_fk": { + "name": "mount_redisId_redis_redisId_fk", + "tableFrom": "mount", + "tableTo": "redis", + "columnsFrom": [ + "redisId" + ], + "columnsTo": [ + "redisId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_composeId_compose_composeId_fk": { + "name": "mount_composeId_compose_composeId_fk", + "tableFrom": "mount", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.certificate": { + "name": "certificate", + "schema": "", + "columns": { + "certificateId": { + "name": "certificateId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateData": { + "name": "certificateData", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificatePath": { + "name": "certificatePath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "autoRenew": { + "name": "autoRenew", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "certificate_adminId_admin_adminId_fk": { + "name": "certificate_adminId_admin_adminId_fk", + "tableFrom": "certificate", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "certificate_serverId_server_serverId_fk": { + "name": "certificate_serverId_server_serverId_fk", + "tableFrom": "certificate", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "certificate_certificatePath_unique": { + "name": "certificate_certificatePath_unique", + "nullsNotDistinct": false, + "columns": [ + "certificatePath" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "session_user_id_auth_id_fk": { + "name": "session_user_id_auth_id_fk", + "tableFrom": "session", + "tableTo": "auth", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.redirect": { + "name": "redirect", + "schema": "", + "columns": { + "redirectId": { + "name": "redirectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "regex": { + "name": "regex", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "replacement": { + "name": "replacement", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "permanent": { + "name": "permanent", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "redirect_applicationId_application_applicationId_fk": { + "name": "redirect_applicationId_application_applicationId_fk", + "tableFrom": "redirect", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.security": { + "name": "security", + "schema": "", + "columns": { + "securityId": { + "name": "securityId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "security_applicationId_application_applicationId_fk": { + "name": "security_applicationId_application_applicationId_fk", + "tableFrom": "security", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "security_username_applicationId_unique": { + "name": "security_username_applicationId_unique", + "nullsNotDistinct": false, + "columns": [ + "username", + "applicationId" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.port": { + "name": "port", + "schema": "", + "columns": { + "portId": { + "name": "portId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "publishedPort": { + "name": "publishedPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "targetPort": { + "name": "targetPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "protocol": { + "name": "protocol", + "type": "protocolType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "port_applicationId_application_applicationId_fk": { + "name": "port_applicationId_application_applicationId_fk", + "tableFrom": "port", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.redis": { + "name": "redis", + "schema": "", + "columns": { + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "redis_projectId_project_projectId_fk": { + "name": "redis_projectId_project_projectId_fk", + "tableFrom": "redis", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "redis_serverId_server_serverId_fk": { + "name": "redis_serverId_server_serverId_fk", + "tableFrom": "redis", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "redis_appName_unique": { + "name": "redis_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.compose": { + "name": "compose", + "schema": "", + "columns": { + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeFile": { + "name": "composeFile", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceTypeCompose", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "composeType": { + "name": "composeType", + "type": "composeType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'docker-compose'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "composePath": { + "name": "composePath", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'./docker-compose.yml'" + }, + "suffix": { + "name": "suffix", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "randomize": { + "name": "randomize", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "composeStatus": { + "name": "composeStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "compose", + "tableTo": "ssh-key", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_projectId_project_projectId_fk": { + "name": "compose_projectId_project_projectId_fk", + "tableFrom": "compose", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "compose_githubId_github_githubId_fk": { + "name": "compose_githubId_github_githubId_fk", + "tableFrom": "compose", + "tableTo": "github", + "columnsFrom": [ + "githubId" + ], + "columnsTo": [ + "githubId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_gitlabId_gitlab_gitlabId_fk": { + "name": "compose_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "compose", + "tableTo": "gitlab", + "columnsFrom": [ + "gitlabId" + ], + "columnsTo": [ + "gitlabId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "compose", + "tableTo": "bitbucket", + "columnsFrom": [ + "bitbucketId" + ], + "columnsTo": [ + "bitbucketId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_serverId_server_serverId_fk": { + "name": "compose_serverId_server_serverId_fk", + "tableFrom": "compose", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.registry": { + "name": "registry", + "schema": "", + "columns": { + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "registryName": { + "name": "registryName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "imagePrefix": { + "name": "imagePrefix", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "selfHosted": { + "name": "selfHosted", + "type": "RegistryType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'cloud'" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "registry_adminId_admin_adminId_fk": { + "name": "registry_adminId_admin_adminId_fk", + "tableFrom": "registry", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.discord": { + "name": "discord", + "schema": "", + "columns": { + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.email": { + "name": "email", + "schema": "", + "columns": { + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "smtpServer": { + "name": "smtpServer", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "smtpPort": { + "name": "smtpPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "fromAddress": { + "name": "fromAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "toAddress": { + "name": "toAddress", + "type": "text[]", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.gotify": { + "name": "gotify", + "schema": "", + "columns": { + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "serverUrl": { + "name": "serverUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appToken": { + "name": "appToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "priority": { + "name": "priority", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 5 + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.notification": { + "name": "notification", + "schema": "", + "columns": { + "notificationId": { + "name": "notificationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appDeploy": { + "name": "appDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "appBuildError": { + "name": "appBuildError", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "databaseBackup": { + "name": "databaseBackup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dokployRestart": { + "name": "dokployRestart", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dockerCleanup": { + "name": "dockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "serverThreshold": { + "name": "serverThreshold", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "notificationType": { + "name": "notificationType", + "type": "notificationType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "notification_slackId_slack_slackId_fk": { + "name": "notification_slackId_slack_slackId_fk", + "tableFrom": "notification", + "tableTo": "slack", + "columnsFrom": [ + "slackId" + ], + "columnsTo": [ + "slackId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_telegramId_telegram_telegramId_fk": { + "name": "notification_telegramId_telegram_telegramId_fk", + "tableFrom": "notification", + "tableTo": "telegram", + "columnsFrom": [ + "telegramId" + ], + "columnsTo": [ + "telegramId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_discordId_discord_discordId_fk": { + "name": "notification_discordId_discord_discordId_fk", + "tableFrom": "notification", + "tableTo": "discord", + "columnsFrom": [ + "discordId" + ], + "columnsTo": [ + "discordId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_emailId_email_emailId_fk": { + "name": "notification_emailId_email_emailId_fk", + "tableFrom": "notification", + "tableTo": "email", + "columnsFrom": [ + "emailId" + ], + "columnsTo": [ + "emailId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_gotifyId_gotify_gotifyId_fk": { + "name": "notification_gotifyId_gotify_gotifyId_fk", + "tableFrom": "notification", + "tableTo": "gotify", + "columnsFrom": [ + "gotifyId" + ], + "columnsTo": [ + "gotifyId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_adminId_admin_adminId_fk": { + "name": "notification_adminId_admin_adminId_fk", + "tableFrom": "notification", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.slack": { + "name": "slack", + "schema": "", + "columns": { + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "channel": { + "name": "channel", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.telegram": { + "name": "telegram", + "schema": "", + "columns": { + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "botToken": { + "name": "botToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chatId": { + "name": "chatId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ssh-key": { + "name": "ssh-key", + "schema": "", + "columns": { + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "publicKey": { + "name": "publicKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "lastUsedAt": { + "name": "lastUsedAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "ssh-key_adminId_admin_adminId_fk": { + "name": "ssh-key_adminId_admin_adminId_fk", + "tableFrom": "ssh-key", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.git_provider": { + "name": "git_provider", + "schema": "", + "columns": { + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "providerType": { + "name": "providerType", + "type": "gitProviderType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "git_provider_adminId_admin_adminId_fk": { + "name": "git_provider_adminId_admin_adminId_fk", + "tableFrom": "git_provider", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.bitbucket": { + "name": "bitbucket", + "schema": "", + "columns": { + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "bitbucketUsername": { + "name": "bitbucketUsername", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "appPassword": { + "name": "appPassword", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketWorkspaceName": { + "name": "bitbucketWorkspaceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { + "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "bitbucket", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.github": { + "name": "github", + "schema": "", + "columns": { + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "githubAppName": { + "name": "githubAppName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubAppId": { + "name": "githubAppId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "githubClientId": { + "name": "githubClientId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubClientSecret": { + "name": "githubClientSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubInstallationId": { + "name": "githubInstallationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubPrivateKey": { + "name": "githubPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubWebhookSecret": { + "name": "githubWebhookSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "github_gitProviderId_git_provider_gitProviderId_fk": { + "name": "github_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "github", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.gitlab": { + "name": "gitlab", + "schema": "", + "columns": { + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "gitlabUrl": { + "name": "gitlabUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'https://gitlab.com'" + }, + "application_id": { + "name": "application_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redirect_uri": { + "name": "redirect_uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "group_name": { + "name": "group_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "gitlab_gitProviderId_git_provider_gitProviderId_fk": { + "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "gitlab", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.server": { + "name": "server", + "schema": "", + "columns": { + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ipAddress": { + "name": "ipAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'root'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverStatus": { + "name": "serverStatus", + "type": "serverStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'active'" + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "metricsConfig": { + "name": "metricsConfig", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{\"server\":{\"refreshRate\":20,\"port\":4500,\"token\":\"\",\"urlCallback\":\"\",\"cronJob\":\"\",\"retentionDays\":2,\"thresholds\":{\"cpu\":0,\"memory\":0}},\"containers\":{\"refreshRate\":20,\"services\":{\"include\":[],\"exclude\":[]}}}'::jsonb" + } + }, + "indexes": {}, + "foreignKeys": { + "server_adminId_admin_adminId_fk": { + "name": "server_adminId_admin_adminId_fk", + "tableFrom": "server", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "server_sshKeyId_ssh-key_sshKeyId_fk": { + "name": "server_sshKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "server", + "tableTo": "ssh-key", + "columnsFrom": [ + "sshKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.preview_deployments": { + "name": "preview_deployments", + "schema": "", + "columns": { + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestId": { + "name": "pullRequestId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestNumber": { + "name": "pullRequestNumber", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestURL": { + "name": "pullRequestURL", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestTitle": { + "name": "pullRequestTitle", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestCommentId": { + "name": "pullRequestCommentId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "previewStatus": { + "name": "previewStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "preview_deployments_applicationId_application_applicationId_fk": { + "name": "preview_deployments_applicationId_application_applicationId_fk", + "tableFrom": "preview_deployments", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "preview_deployments_domainId_domain_domainId_fk": { + "name": "preview_deployments_domainId_domain_domainId_fk", + "tableFrom": "preview_deployments", + "tableTo": "domain", + "columnsFrom": [ + "domainId" + ], + "columnsTo": [ + "domainId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "preview_deployments_appName_unique": { + "name": "preview_deployments_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.buildType": { + "name": "buildType", + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks", + "static" + ] + }, + "public.sourceType": { + "name": "sourceType", + "schema": "public", + "values": [ + "docker", + "git", + "github", + "gitlab", + "bitbucket", + "drop" + ] + }, + "public.Roles": { + "name": "Roles", + "schema": "public", + "values": [ + "admin", + "user" + ] + }, + "public.domainType": { + "name": "domainType", + "schema": "public", + "values": [ + "compose", + "application", + "preview" + ] + }, + "public.databaseType": { + "name": "databaseType", + "schema": "public", + "values": [ + "postgres", + "mariadb", + "mysql", + "mongo" + ] + }, + "public.deploymentStatus": { + "name": "deploymentStatus", + "schema": "public", + "values": [ + "running", + "done", + "error" + ] + }, + "public.mountType": { + "name": "mountType", + "schema": "public", + "values": [ + "bind", + "volume", + "file" + ] + }, + "public.serviceType": { + "name": "serviceType", + "schema": "public", + "values": [ + "application", + "postgres", + "mysql", + "mariadb", + "mongo", + "redis", + "compose" + ] + }, + "public.protocolType": { + "name": "protocolType", + "schema": "public", + "values": [ + "tcp", + "udp" + ] + }, + "public.applicationStatus": { + "name": "applicationStatus", + "schema": "public", + "values": [ + "idle", + "running", + "done", + "error" + ] + }, + "public.certificateType": { + "name": "certificateType", + "schema": "public", + "values": [ + "letsencrypt", + "none" + ] + }, + "public.composeType": { + "name": "composeType", + "schema": "public", + "values": [ + "docker-compose", + "stack" + ] + }, + "public.sourceTypeCompose": { + "name": "sourceTypeCompose", + "schema": "public", + "values": [ + "git", + "github", + "gitlab", + "bitbucket", + "raw" + ] + }, + "public.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + }, + "public.notificationType": { + "name": "notificationType", + "schema": "public", + "values": [ + "slack", + "telegram", + "discord", + "email", + "gotify" + ] + }, + "public.gitProviderType": { + "name": "gitProviderType", + "schema": "public", + "values": [ + "github", + "gitlab", + "bitbucket" + ] + }, + "public.serverStatus": { + "name": "serverStatus", + "schema": "public", + "values": [ + "active", + "inactive" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0062_snapshot.json b/apps/dokploy/drizzle/meta/0062_snapshot.json new file mode 100644 index 00000000..bab449b8 --- /dev/null +++ b/apps/dokploy/drizzle/meta/0062_snapshot.json @@ -0,0 +1,4478 @@ +{ + "id": "a000faa7-0776-43cd-b394-48210be90be1", + "prevId": "5ec4c091-a361-4acb-ae2b-dff5078d77f0", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.application": { + "name": "application", + "schema": "", + "columns": { + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewEnv": { + "name": "previewEnv", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewBuildArgs": { + "name": "previewBuildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewWildcard": { + "name": "previewWildcard", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewPort": { + "name": "previewPort", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "previewHttps": { + "name": "previewHttps", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "previewPath": { + "name": "previewPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "previewLimit": { + "name": "previewLimit", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3 + }, + "isPreviewDeploymentsActive": { + "name": "isPreviewDeploymentsActive", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "buildArgs": { + "name": "buildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "subtitle": { + "name": "subtitle", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "buildPath": { + "name": "buildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBuildPath": { + "name": "gitlabBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBuildPath": { + "name": "bitbucketBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBuildPath": { + "name": "customGitBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerContextPath": { + "name": "dockerContextPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerBuildStage": { + "name": "dockerBuildStage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dropBuildPath": { + "name": "dropBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "healthCheckSwarm": { + "name": "healthCheckSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "restartPolicySwarm": { + "name": "restartPolicySwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "placementSwarm": { + "name": "placementSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "updateConfigSwarm": { + "name": "updateConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "rollbackConfigSwarm": { + "name": "rollbackConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "modeSwarm": { + "name": "modeSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "labelsSwarm": { + "name": "labelsSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "networkSwarm": { + "name": "networkSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "replicas": { + "name": "replicas", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "buildType": { + "name": "buildType", + "type": "buildType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'nixpacks'" + }, + "herokuVersion": { + "name": "herokuVersion", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'24'" + }, + "publishDirectory": { + "name": "publishDirectory", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "application", + "tableTo": "ssh-key", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_registryId_registry_registryId_fk": { + "name": "application_registryId_registry_registryId_fk", + "tableFrom": "application", + "tableTo": "registry", + "columnsFrom": [ + "registryId" + ], + "columnsTo": [ + "registryId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_projectId_project_projectId_fk": { + "name": "application_projectId_project_projectId_fk", + "tableFrom": "application", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "application_githubId_github_githubId_fk": { + "name": "application_githubId_github_githubId_fk", + "tableFrom": "application", + "tableTo": "github", + "columnsFrom": [ + "githubId" + ], + "columnsTo": [ + "githubId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_gitlabId_gitlab_gitlabId_fk": { + "name": "application_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "application", + "tableTo": "gitlab", + "columnsFrom": [ + "gitlabId" + ], + "columnsTo": [ + "gitlabId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "application_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "application", + "tableTo": "bitbucket", + "columnsFrom": [ + "bitbucketId" + ], + "columnsTo": [ + "bitbucketId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_serverId_server_serverId_fk": { + "name": "application_serverId_server_serverId_fk", + "tableFrom": "application", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "application_appName_unique": { + "name": "application_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.postgres": { + "name": "postgres", + "schema": "", + "columns": { + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "postgres_projectId_project_projectId_fk": { + "name": "postgres_projectId_project_projectId_fk", + "tableFrom": "postgres", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "postgres_serverId_server_serverId_fk": { + "name": "postgres_serverId_server_serverId_fk", + "tableFrom": "postgres", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "postgres_appName_unique": { + "name": "postgres_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "userId": { + "name": "userId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "isRegistered": { + "name": "isRegistered", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "expirationDate": { + "name": "expirationDate", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "canCreateProjects": { + "name": "canCreateProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToSSHKeys": { + "name": "canAccessToSSHKeys", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canCreateServices": { + "name": "canCreateServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteProjects": { + "name": "canDeleteProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteServices": { + "name": "canDeleteServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToDocker": { + "name": "canAccessToDocker", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToAPI": { + "name": "canAccessToAPI", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToGitProviders": { + "name": "canAccessToGitProviders", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToTraefikFiles": { + "name": "canAccessToTraefikFiles", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "accesedProjects": { + "name": "accesedProjects", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "accesedServices": { + "name": "accesedServices", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "user_adminId_admin_adminId_fk": { + "name": "user_adminId_admin_adminId_fk", + "tableFrom": "user", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_authId_auth_id_fk": { + "name": "user_authId_auth_id_fk", + "tableFrom": "user", + "tableTo": "auth", + "columnsFrom": [ + "authId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.admin": { + "name": "admin", + "schema": "", + "columns": { + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "serverIp": { + "name": "serverIp", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "letsEncryptEmail": { + "name": "letsEncryptEmail", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sshPrivateKey": { + "name": "sshPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enableLogRotation": { + "name": "enableLogRotation", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "stripeCustomerId": { + "name": "stripeCustomerId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "stripeSubscriptionId": { + "name": "stripeSubscriptionId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serversQuantity": { + "name": "serversQuantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "enablePaidFeatures": { + "name": "enablePaidFeatures", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "metricsConfig": { + "name": "metricsConfig", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{\"server\":{\"type\":\"Dokploy\",\"refreshRate\":20,\"port\":4500,\"token\":\"\",\"retentionDays\":2,\"cronJob\":\"\",\"urlCallback\":\"\",\"thresholds\":{\"cpu\":0,\"memory\":0}},\"containers\":{\"refreshRate\":20,\"services\":{\"include\":[],\"exclude\":[]}}}'::jsonb" + }, + "cleanupCacheApplications": { + "name": "cleanupCacheApplications", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnPreviews": { + "name": "cleanupCacheOnPreviews", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnCompose": { + "name": "cleanupCacheOnCompose", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "admin_authId_auth_id_fk": { + "name": "admin_authId_auth_id_fk", + "tableFrom": "admin", + "tableTo": "auth", + "columnsFrom": [ + "authId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.auth": { + "name": "auth", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rol": { + "name": "rol", + "type": "Roles", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is2FAEnabled": { + "name": "is2FAEnabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "resetPasswordToken": { + "name": "resetPasswordToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "resetPasswordExpiresAt": { + "name": "resetPasswordExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationToken": { + "name": "confirmationToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationExpiresAt": { + "name": "confirmationExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "auth_email_unique": { + "name": "auth_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.project": { + "name": "project", + "schema": "", + "columns": { + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": { + "project_adminId_admin_adminId_fk": { + "name": "project_adminId_admin_adminId_fk", + "tableFrom": "project", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.domain": { + "name": "domain", + "schema": "", + "columns": { + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "https": { + "name": "https", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "serviceName": { + "name": "serviceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "domainType": { + "name": "domainType", + "type": "domainType", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'application'" + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "domain_composeId_compose_composeId_fk": { + "name": "domain_composeId_compose_composeId_fk", + "tableFrom": "domain", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "domain_applicationId_application_applicationId_fk": { + "name": "domain_applicationId_application_applicationId_fk", + "tableFrom": "domain", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "domain", + "tableTo": "preview_deployments", + "columnsFrom": [ + "previewDeploymentId" + ], + "columnsTo": [ + "previewDeploymentId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mariadb": { + "name": "mariadb", + "schema": "", + "columns": { + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mariadb_projectId_project_projectId_fk": { + "name": "mariadb_projectId_project_projectId_fk", + "tableFrom": "mariadb", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mariadb_serverId_server_serverId_fk": { + "name": "mariadb_serverId_server_serverId_fk", + "tableFrom": "mariadb", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mariadb_appName_unique": { + "name": "mariadb_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mongo": { + "name": "mongo", + "schema": "", + "columns": { + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "replicaSets": { + "name": "replicaSets", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "mongo_projectId_project_projectId_fk": { + "name": "mongo_projectId_project_projectId_fk", + "tableFrom": "mongo", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mongo_serverId_server_serverId_fk": { + "name": "mongo_serverId_server_serverId_fk", + "tableFrom": "mongo", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mongo_appName_unique": { + "name": "mongo_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mysql": { + "name": "mysql", + "schema": "", + "columns": { + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mysql_projectId_project_projectId_fk": { + "name": "mysql_projectId_project_projectId_fk", + "tableFrom": "mysql", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mysql_serverId_server_serverId_fk": { + "name": "mysql_serverId_server_serverId_fk", + "tableFrom": "mysql", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mysql_appName_unique": { + "name": "mysql_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.backup": { + "name": "backup", + "schema": "", + "columns": { + "backupId": { + "name": "backupId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "schedule": { + "name": "schedule", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "database": { + "name": "database", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "prefix": { + "name": "prefix", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseType": { + "name": "databaseType", + "type": "databaseType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "backup_destinationId_destination_destinationId_fk": { + "name": "backup_destinationId_destination_destinationId_fk", + "tableFrom": "backup", + "tableTo": "destination", + "columnsFrom": [ + "destinationId" + ], + "columnsTo": [ + "destinationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_postgresId_postgres_postgresId_fk": { + "name": "backup_postgresId_postgres_postgresId_fk", + "tableFrom": "backup", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mariadbId_mariadb_mariadbId_fk": { + "name": "backup_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "backup", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mysqlId_mysql_mysqlId_fk": { + "name": "backup_mysqlId_mysql_mysqlId_fk", + "tableFrom": "backup", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mongoId_mongo_mongoId_fk": { + "name": "backup_mongoId_mongo_mongoId_fk", + "tableFrom": "backup", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.destination": { + "name": "destination", + "schema": "", + "columns": { + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "accessKey": { + "name": "accessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "secretAccessKey": { + "name": "secretAccessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "bucket": { + "name": "bucket", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "destination_adminId_admin_adminId_fk": { + "name": "destination_adminId_admin_adminId_fk", + "tableFrom": "destination", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.deployment": { + "name": "deployment", + "schema": "", + "columns": { + "deploymentId": { + "name": "deploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "deploymentStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'running'" + }, + "logPath": { + "name": "logPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "isPreviewDeployment": { + "name": "isPreviewDeployment", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "errorMessage": { + "name": "errorMessage", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "deployment_applicationId_application_applicationId_fk": { + "name": "deployment_applicationId_application_applicationId_fk", + "tableFrom": "deployment", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_composeId_compose_composeId_fk": { + "name": "deployment_composeId_compose_composeId_fk", + "tableFrom": "deployment", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_serverId_server_serverId_fk": { + "name": "deployment_serverId_server_serverId_fk", + "tableFrom": "deployment", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "deployment", + "tableTo": "preview_deployments", + "columnsFrom": [ + "previewDeploymentId" + ], + "columnsTo": [ + "previewDeploymentId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mount": { + "name": "mount", + "schema": "", + "columns": { + "mountId": { + "name": "mountId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "mountType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "hostPath": { + "name": "hostPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "volumeName": { + "name": "volumeName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "filePath": { + "name": "filePath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serviceType": { + "name": "serviceType", + "type": "serviceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'application'" + }, + "mountPath": { + "name": "mountPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mount_applicationId_application_applicationId_fk": { + "name": "mount_applicationId_application_applicationId_fk", + "tableFrom": "mount", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_postgresId_postgres_postgresId_fk": { + "name": "mount_postgresId_postgres_postgresId_fk", + "tableFrom": "mount", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mariadbId_mariadb_mariadbId_fk": { + "name": "mount_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "mount", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mongoId_mongo_mongoId_fk": { + "name": "mount_mongoId_mongo_mongoId_fk", + "tableFrom": "mount", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mysqlId_mysql_mysqlId_fk": { + "name": "mount_mysqlId_mysql_mysqlId_fk", + "tableFrom": "mount", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_redisId_redis_redisId_fk": { + "name": "mount_redisId_redis_redisId_fk", + "tableFrom": "mount", + "tableTo": "redis", + "columnsFrom": [ + "redisId" + ], + "columnsTo": [ + "redisId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_composeId_compose_composeId_fk": { + "name": "mount_composeId_compose_composeId_fk", + "tableFrom": "mount", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.certificate": { + "name": "certificate", + "schema": "", + "columns": { + "certificateId": { + "name": "certificateId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateData": { + "name": "certificateData", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificatePath": { + "name": "certificatePath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "autoRenew": { + "name": "autoRenew", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "certificate_adminId_admin_adminId_fk": { + "name": "certificate_adminId_admin_adminId_fk", + "tableFrom": "certificate", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "certificate_serverId_server_serverId_fk": { + "name": "certificate_serverId_server_serverId_fk", + "tableFrom": "certificate", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "certificate_certificatePath_unique": { + "name": "certificate_certificatePath_unique", + "nullsNotDistinct": false, + "columns": [ + "certificatePath" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "session_user_id_auth_id_fk": { + "name": "session_user_id_auth_id_fk", + "tableFrom": "session", + "tableTo": "auth", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.redirect": { + "name": "redirect", + "schema": "", + "columns": { + "redirectId": { + "name": "redirectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "regex": { + "name": "regex", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "replacement": { + "name": "replacement", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "permanent": { + "name": "permanent", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "redirect_applicationId_application_applicationId_fk": { + "name": "redirect_applicationId_application_applicationId_fk", + "tableFrom": "redirect", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.security": { + "name": "security", + "schema": "", + "columns": { + "securityId": { + "name": "securityId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "security_applicationId_application_applicationId_fk": { + "name": "security_applicationId_application_applicationId_fk", + "tableFrom": "security", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "security_username_applicationId_unique": { + "name": "security_username_applicationId_unique", + "nullsNotDistinct": false, + "columns": [ + "username", + "applicationId" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.port": { + "name": "port", + "schema": "", + "columns": { + "portId": { + "name": "portId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "publishedPort": { + "name": "publishedPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "targetPort": { + "name": "targetPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "protocol": { + "name": "protocol", + "type": "protocolType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "port_applicationId_application_applicationId_fk": { + "name": "port_applicationId_application_applicationId_fk", + "tableFrom": "port", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.redis": { + "name": "redis", + "schema": "", + "columns": { + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "redis_projectId_project_projectId_fk": { + "name": "redis_projectId_project_projectId_fk", + "tableFrom": "redis", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "redis_serverId_server_serverId_fk": { + "name": "redis_serverId_server_serverId_fk", + "tableFrom": "redis", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "redis_appName_unique": { + "name": "redis_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.compose": { + "name": "compose", + "schema": "", + "columns": { + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeFile": { + "name": "composeFile", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceTypeCompose", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "composeType": { + "name": "composeType", + "type": "composeType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'docker-compose'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "composePath": { + "name": "composePath", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'./docker-compose.yml'" + }, + "suffix": { + "name": "suffix", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "randomize": { + "name": "randomize", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "composeStatus": { + "name": "composeStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "compose", + "tableTo": "ssh-key", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_projectId_project_projectId_fk": { + "name": "compose_projectId_project_projectId_fk", + "tableFrom": "compose", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "compose_githubId_github_githubId_fk": { + "name": "compose_githubId_github_githubId_fk", + "tableFrom": "compose", + "tableTo": "github", + "columnsFrom": [ + "githubId" + ], + "columnsTo": [ + "githubId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_gitlabId_gitlab_gitlabId_fk": { + "name": "compose_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "compose", + "tableTo": "gitlab", + "columnsFrom": [ + "gitlabId" + ], + "columnsTo": [ + "gitlabId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "compose", + "tableTo": "bitbucket", + "columnsFrom": [ + "bitbucketId" + ], + "columnsTo": [ + "bitbucketId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_serverId_server_serverId_fk": { + "name": "compose_serverId_server_serverId_fk", + "tableFrom": "compose", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.registry": { + "name": "registry", + "schema": "", + "columns": { + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "registryName": { + "name": "registryName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "imagePrefix": { + "name": "imagePrefix", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "selfHosted": { + "name": "selfHosted", + "type": "RegistryType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'cloud'" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "registry_adminId_admin_adminId_fk": { + "name": "registry_adminId_admin_adminId_fk", + "tableFrom": "registry", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.discord": { + "name": "discord", + "schema": "", + "columns": { + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.email": { + "name": "email", + "schema": "", + "columns": { + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "smtpServer": { + "name": "smtpServer", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "smtpPort": { + "name": "smtpPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "fromAddress": { + "name": "fromAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "toAddress": { + "name": "toAddress", + "type": "text[]", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.gotify": { + "name": "gotify", + "schema": "", + "columns": { + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "serverUrl": { + "name": "serverUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appToken": { + "name": "appToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "priority": { + "name": "priority", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 5 + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.notification": { + "name": "notification", + "schema": "", + "columns": { + "notificationId": { + "name": "notificationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appDeploy": { + "name": "appDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "appBuildError": { + "name": "appBuildError", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "databaseBackup": { + "name": "databaseBackup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dokployRestart": { + "name": "dokployRestart", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dockerCleanup": { + "name": "dockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "serverThreshold": { + "name": "serverThreshold", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "notificationType": { + "name": "notificationType", + "type": "notificationType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "notification_slackId_slack_slackId_fk": { + "name": "notification_slackId_slack_slackId_fk", + "tableFrom": "notification", + "tableTo": "slack", + "columnsFrom": [ + "slackId" + ], + "columnsTo": [ + "slackId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_telegramId_telegram_telegramId_fk": { + "name": "notification_telegramId_telegram_telegramId_fk", + "tableFrom": "notification", + "tableTo": "telegram", + "columnsFrom": [ + "telegramId" + ], + "columnsTo": [ + "telegramId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_discordId_discord_discordId_fk": { + "name": "notification_discordId_discord_discordId_fk", + "tableFrom": "notification", + "tableTo": "discord", + "columnsFrom": [ + "discordId" + ], + "columnsTo": [ + "discordId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_emailId_email_emailId_fk": { + "name": "notification_emailId_email_emailId_fk", + "tableFrom": "notification", + "tableTo": "email", + "columnsFrom": [ + "emailId" + ], + "columnsTo": [ + "emailId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_gotifyId_gotify_gotifyId_fk": { + "name": "notification_gotifyId_gotify_gotifyId_fk", + "tableFrom": "notification", + "tableTo": "gotify", + "columnsFrom": [ + "gotifyId" + ], + "columnsTo": [ + "gotifyId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_adminId_admin_adminId_fk": { + "name": "notification_adminId_admin_adminId_fk", + "tableFrom": "notification", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.slack": { + "name": "slack", + "schema": "", + "columns": { + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "channel": { + "name": "channel", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.telegram": { + "name": "telegram", + "schema": "", + "columns": { + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "botToken": { + "name": "botToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chatId": { + "name": "chatId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ssh-key": { + "name": "ssh-key", + "schema": "", + "columns": { + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "publicKey": { + "name": "publicKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "lastUsedAt": { + "name": "lastUsedAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "ssh-key_adminId_admin_adminId_fk": { + "name": "ssh-key_adminId_admin_adminId_fk", + "tableFrom": "ssh-key", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.git_provider": { + "name": "git_provider", + "schema": "", + "columns": { + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "providerType": { + "name": "providerType", + "type": "gitProviderType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "git_provider_adminId_admin_adminId_fk": { + "name": "git_provider_adminId_admin_adminId_fk", + "tableFrom": "git_provider", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.bitbucket": { + "name": "bitbucket", + "schema": "", + "columns": { + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "bitbucketUsername": { + "name": "bitbucketUsername", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "appPassword": { + "name": "appPassword", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketWorkspaceName": { + "name": "bitbucketWorkspaceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { + "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "bitbucket", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.github": { + "name": "github", + "schema": "", + "columns": { + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "githubAppName": { + "name": "githubAppName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubAppId": { + "name": "githubAppId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "githubClientId": { + "name": "githubClientId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubClientSecret": { + "name": "githubClientSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubInstallationId": { + "name": "githubInstallationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubPrivateKey": { + "name": "githubPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubWebhookSecret": { + "name": "githubWebhookSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "github_gitProviderId_git_provider_gitProviderId_fk": { + "name": "github_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "github", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.gitlab": { + "name": "gitlab", + "schema": "", + "columns": { + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "gitlabUrl": { + "name": "gitlabUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'https://gitlab.com'" + }, + "application_id": { + "name": "application_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redirect_uri": { + "name": "redirect_uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "group_name": { + "name": "group_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "gitlab_gitProviderId_git_provider_gitProviderId_fk": { + "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "gitlab", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.server": { + "name": "server", + "schema": "", + "columns": { + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ipAddress": { + "name": "ipAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'root'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverStatus": { + "name": "serverStatus", + "type": "serverStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'active'" + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "metricsConfig": { + "name": "metricsConfig", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{\"server\":{\"type\":\"Remote\",\"refreshRate\":20,\"port\":4500,\"token\":\"\",\"urlCallback\":\"\",\"cronJob\":\"\",\"retentionDays\":2,\"thresholds\":{\"cpu\":0,\"memory\":0}},\"containers\":{\"refreshRate\":20,\"services\":{\"include\":[],\"exclude\":[]}}}'::jsonb" + } + }, + "indexes": {}, + "foreignKeys": { + "server_adminId_admin_adminId_fk": { + "name": "server_adminId_admin_adminId_fk", + "tableFrom": "server", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "server_sshKeyId_ssh-key_sshKeyId_fk": { + "name": "server_sshKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "server", + "tableTo": "ssh-key", + "columnsFrom": [ + "sshKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.preview_deployments": { + "name": "preview_deployments", + "schema": "", + "columns": { + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestId": { + "name": "pullRequestId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestNumber": { + "name": "pullRequestNumber", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestURL": { + "name": "pullRequestURL", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestTitle": { + "name": "pullRequestTitle", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestCommentId": { + "name": "pullRequestCommentId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "previewStatus": { + "name": "previewStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "preview_deployments_applicationId_application_applicationId_fk": { + "name": "preview_deployments_applicationId_application_applicationId_fk", + "tableFrom": "preview_deployments", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "preview_deployments_domainId_domain_domainId_fk": { + "name": "preview_deployments_domainId_domain_domainId_fk", + "tableFrom": "preview_deployments", + "tableTo": "domain", + "columnsFrom": [ + "domainId" + ], + "columnsTo": [ + "domainId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "preview_deployments_appName_unique": { + "name": "preview_deployments_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.buildType": { + "name": "buildType", + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks", + "static" + ] + }, + "public.sourceType": { + "name": "sourceType", + "schema": "public", + "values": [ + "docker", + "git", + "github", + "gitlab", + "bitbucket", + "drop" + ] + }, + "public.Roles": { + "name": "Roles", + "schema": "public", + "values": [ + "admin", + "user" + ] + }, + "public.domainType": { + "name": "domainType", + "schema": "public", + "values": [ + "compose", + "application", + "preview" + ] + }, + "public.databaseType": { + "name": "databaseType", + "schema": "public", + "values": [ + "postgres", + "mariadb", + "mysql", + "mongo" + ] + }, + "public.deploymentStatus": { + "name": "deploymentStatus", + "schema": "public", + "values": [ + "running", + "done", + "error" + ] + }, + "public.mountType": { + "name": "mountType", + "schema": "public", + "values": [ + "bind", + "volume", + "file" + ] + }, + "public.serviceType": { + "name": "serviceType", + "schema": "public", + "values": [ + "application", + "postgres", + "mysql", + "mariadb", + "mongo", + "redis", + "compose" + ] + }, + "public.protocolType": { + "name": "protocolType", + "schema": "public", + "values": [ + "tcp", + "udp" + ] + }, + "public.applicationStatus": { + "name": "applicationStatus", + "schema": "public", + "values": [ + "idle", + "running", + "done", + "error" + ] + }, + "public.certificateType": { + "name": "certificateType", + "schema": "public", + "values": [ + "letsencrypt", + "none" + ] + }, + "public.composeType": { + "name": "composeType", + "schema": "public", + "values": [ + "docker-compose", + "stack" + ] + }, + "public.sourceTypeCompose": { + "name": "sourceTypeCompose", + "schema": "public", + "values": [ + "git", + "github", + "gitlab", + "bitbucket", + "raw" + ] + }, + "public.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + }, + "public.notificationType": { + "name": "notificationType", + "schema": "public", + "values": [ + "slack", + "telegram", + "discord", + "email", + "gotify" + ] + }, + "public.gitProviderType": { + "name": "gitProviderType", + "schema": "public", + "values": [ + "github", + "gitlab", + "bitbucket" + ] + }, + "public.serverStatus": { + "name": "serverStatus", + "schema": "public", + "values": [ + "active", + "inactive" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0063_snapshot.json b/apps/dokploy/drizzle/meta/0063_snapshot.json new file mode 100644 index 00000000..e4f6c8e7 --- /dev/null +++ b/apps/dokploy/drizzle/meta/0063_snapshot.json @@ -0,0 +1,4478 @@ +{ + "id": "f2fb7162-4b29-4494-9f6a-ab2794b1be48", + "prevId": "a000faa7-0776-43cd-b394-48210be90be1", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.application": { + "name": "application", + "schema": "", + "columns": { + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewEnv": { + "name": "previewEnv", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewBuildArgs": { + "name": "previewBuildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewWildcard": { + "name": "previewWildcard", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewPort": { + "name": "previewPort", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "previewHttps": { + "name": "previewHttps", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "previewPath": { + "name": "previewPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "previewLimit": { + "name": "previewLimit", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3 + }, + "isPreviewDeploymentsActive": { + "name": "isPreviewDeploymentsActive", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "buildArgs": { + "name": "buildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "subtitle": { + "name": "subtitle", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "buildPath": { + "name": "buildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBuildPath": { + "name": "gitlabBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBuildPath": { + "name": "bitbucketBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBuildPath": { + "name": "customGitBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerContextPath": { + "name": "dockerContextPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerBuildStage": { + "name": "dockerBuildStage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dropBuildPath": { + "name": "dropBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "healthCheckSwarm": { + "name": "healthCheckSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "restartPolicySwarm": { + "name": "restartPolicySwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "placementSwarm": { + "name": "placementSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "updateConfigSwarm": { + "name": "updateConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "rollbackConfigSwarm": { + "name": "rollbackConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "modeSwarm": { + "name": "modeSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "labelsSwarm": { + "name": "labelsSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "networkSwarm": { + "name": "networkSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "replicas": { + "name": "replicas", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "buildType": { + "name": "buildType", + "type": "buildType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'nixpacks'" + }, + "herokuVersion": { + "name": "herokuVersion", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'24'" + }, + "publishDirectory": { + "name": "publishDirectory", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "application", + "tableTo": "ssh-key", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_registryId_registry_registryId_fk": { + "name": "application_registryId_registry_registryId_fk", + "tableFrom": "application", + "tableTo": "registry", + "columnsFrom": [ + "registryId" + ], + "columnsTo": [ + "registryId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_projectId_project_projectId_fk": { + "name": "application_projectId_project_projectId_fk", + "tableFrom": "application", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "application_githubId_github_githubId_fk": { + "name": "application_githubId_github_githubId_fk", + "tableFrom": "application", + "tableTo": "github", + "columnsFrom": [ + "githubId" + ], + "columnsTo": [ + "githubId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_gitlabId_gitlab_gitlabId_fk": { + "name": "application_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "application", + "tableTo": "gitlab", + "columnsFrom": [ + "gitlabId" + ], + "columnsTo": [ + "gitlabId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "application_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "application", + "tableTo": "bitbucket", + "columnsFrom": [ + "bitbucketId" + ], + "columnsTo": [ + "bitbucketId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_serverId_server_serverId_fk": { + "name": "application_serverId_server_serverId_fk", + "tableFrom": "application", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "application_appName_unique": { + "name": "application_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.postgres": { + "name": "postgres", + "schema": "", + "columns": { + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "postgres_projectId_project_projectId_fk": { + "name": "postgres_projectId_project_projectId_fk", + "tableFrom": "postgres", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "postgres_serverId_server_serverId_fk": { + "name": "postgres_serverId_server_serverId_fk", + "tableFrom": "postgres", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "postgres_appName_unique": { + "name": "postgres_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "userId": { + "name": "userId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "isRegistered": { + "name": "isRegistered", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "expirationDate": { + "name": "expirationDate", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "canCreateProjects": { + "name": "canCreateProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToSSHKeys": { + "name": "canAccessToSSHKeys", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canCreateServices": { + "name": "canCreateServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteProjects": { + "name": "canDeleteProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteServices": { + "name": "canDeleteServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToDocker": { + "name": "canAccessToDocker", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToAPI": { + "name": "canAccessToAPI", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToGitProviders": { + "name": "canAccessToGitProviders", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToTraefikFiles": { + "name": "canAccessToTraefikFiles", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "accesedProjects": { + "name": "accesedProjects", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "accesedServices": { + "name": "accesedServices", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "user_adminId_admin_adminId_fk": { + "name": "user_adminId_admin_adminId_fk", + "tableFrom": "user", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_authId_auth_id_fk": { + "name": "user_authId_auth_id_fk", + "tableFrom": "user", + "tableTo": "auth", + "columnsFrom": [ + "authId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.admin": { + "name": "admin", + "schema": "", + "columns": { + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "serverIp": { + "name": "serverIp", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "letsEncryptEmail": { + "name": "letsEncryptEmail", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sshPrivateKey": { + "name": "sshPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enableLogRotation": { + "name": "enableLogRotation", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "stripeCustomerId": { + "name": "stripeCustomerId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "stripeSubscriptionId": { + "name": "stripeSubscriptionId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serversQuantity": { + "name": "serversQuantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "enablePaidFeatures": { + "name": "enablePaidFeatures", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "metricsConfig": { + "name": "metricsConfig", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{\"server\":{\"type\":\"Dokploy\",\"refreshRate\":60,\"port\":4500,\"token\":\"\",\"retentionDays\":2,\"cronJob\":\"\",\"urlCallback\":\"\",\"thresholds\":{\"cpu\":0,\"memory\":0}},\"containers\":{\"refreshRate\":60,\"services\":{\"include\":[],\"exclude\":[]}}}'::jsonb" + }, + "cleanupCacheApplications": { + "name": "cleanupCacheApplications", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnPreviews": { + "name": "cleanupCacheOnPreviews", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnCompose": { + "name": "cleanupCacheOnCompose", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "admin_authId_auth_id_fk": { + "name": "admin_authId_auth_id_fk", + "tableFrom": "admin", + "tableTo": "auth", + "columnsFrom": [ + "authId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.auth": { + "name": "auth", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rol": { + "name": "rol", + "type": "Roles", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is2FAEnabled": { + "name": "is2FAEnabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "resetPasswordToken": { + "name": "resetPasswordToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "resetPasswordExpiresAt": { + "name": "resetPasswordExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationToken": { + "name": "confirmationToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationExpiresAt": { + "name": "confirmationExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "auth_email_unique": { + "name": "auth_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.project": { + "name": "project", + "schema": "", + "columns": { + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": { + "project_adminId_admin_adminId_fk": { + "name": "project_adminId_admin_adminId_fk", + "tableFrom": "project", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.domain": { + "name": "domain", + "schema": "", + "columns": { + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "https": { + "name": "https", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "serviceName": { + "name": "serviceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "domainType": { + "name": "domainType", + "type": "domainType", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'application'" + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "domain_composeId_compose_composeId_fk": { + "name": "domain_composeId_compose_composeId_fk", + "tableFrom": "domain", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "domain_applicationId_application_applicationId_fk": { + "name": "domain_applicationId_application_applicationId_fk", + "tableFrom": "domain", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "domain", + "tableTo": "preview_deployments", + "columnsFrom": [ + "previewDeploymentId" + ], + "columnsTo": [ + "previewDeploymentId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mariadb": { + "name": "mariadb", + "schema": "", + "columns": { + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mariadb_projectId_project_projectId_fk": { + "name": "mariadb_projectId_project_projectId_fk", + "tableFrom": "mariadb", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mariadb_serverId_server_serverId_fk": { + "name": "mariadb_serverId_server_serverId_fk", + "tableFrom": "mariadb", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mariadb_appName_unique": { + "name": "mariadb_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mongo": { + "name": "mongo", + "schema": "", + "columns": { + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "replicaSets": { + "name": "replicaSets", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "mongo_projectId_project_projectId_fk": { + "name": "mongo_projectId_project_projectId_fk", + "tableFrom": "mongo", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mongo_serverId_server_serverId_fk": { + "name": "mongo_serverId_server_serverId_fk", + "tableFrom": "mongo", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mongo_appName_unique": { + "name": "mongo_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mysql": { + "name": "mysql", + "schema": "", + "columns": { + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mysql_projectId_project_projectId_fk": { + "name": "mysql_projectId_project_projectId_fk", + "tableFrom": "mysql", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mysql_serverId_server_serverId_fk": { + "name": "mysql_serverId_server_serverId_fk", + "tableFrom": "mysql", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mysql_appName_unique": { + "name": "mysql_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.backup": { + "name": "backup", + "schema": "", + "columns": { + "backupId": { + "name": "backupId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "schedule": { + "name": "schedule", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "database": { + "name": "database", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "prefix": { + "name": "prefix", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseType": { + "name": "databaseType", + "type": "databaseType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "backup_destinationId_destination_destinationId_fk": { + "name": "backup_destinationId_destination_destinationId_fk", + "tableFrom": "backup", + "tableTo": "destination", + "columnsFrom": [ + "destinationId" + ], + "columnsTo": [ + "destinationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_postgresId_postgres_postgresId_fk": { + "name": "backup_postgresId_postgres_postgresId_fk", + "tableFrom": "backup", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mariadbId_mariadb_mariadbId_fk": { + "name": "backup_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "backup", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mysqlId_mysql_mysqlId_fk": { + "name": "backup_mysqlId_mysql_mysqlId_fk", + "tableFrom": "backup", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mongoId_mongo_mongoId_fk": { + "name": "backup_mongoId_mongo_mongoId_fk", + "tableFrom": "backup", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.destination": { + "name": "destination", + "schema": "", + "columns": { + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "accessKey": { + "name": "accessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "secretAccessKey": { + "name": "secretAccessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "bucket": { + "name": "bucket", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "destination_adminId_admin_adminId_fk": { + "name": "destination_adminId_admin_adminId_fk", + "tableFrom": "destination", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.deployment": { + "name": "deployment", + "schema": "", + "columns": { + "deploymentId": { + "name": "deploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "deploymentStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'running'" + }, + "logPath": { + "name": "logPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "isPreviewDeployment": { + "name": "isPreviewDeployment", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "errorMessage": { + "name": "errorMessage", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "deployment_applicationId_application_applicationId_fk": { + "name": "deployment_applicationId_application_applicationId_fk", + "tableFrom": "deployment", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_composeId_compose_composeId_fk": { + "name": "deployment_composeId_compose_composeId_fk", + "tableFrom": "deployment", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_serverId_server_serverId_fk": { + "name": "deployment_serverId_server_serverId_fk", + "tableFrom": "deployment", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "deployment", + "tableTo": "preview_deployments", + "columnsFrom": [ + "previewDeploymentId" + ], + "columnsTo": [ + "previewDeploymentId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mount": { + "name": "mount", + "schema": "", + "columns": { + "mountId": { + "name": "mountId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "mountType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "hostPath": { + "name": "hostPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "volumeName": { + "name": "volumeName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "filePath": { + "name": "filePath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serviceType": { + "name": "serviceType", + "type": "serviceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'application'" + }, + "mountPath": { + "name": "mountPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mount_applicationId_application_applicationId_fk": { + "name": "mount_applicationId_application_applicationId_fk", + "tableFrom": "mount", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_postgresId_postgres_postgresId_fk": { + "name": "mount_postgresId_postgres_postgresId_fk", + "tableFrom": "mount", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mariadbId_mariadb_mariadbId_fk": { + "name": "mount_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "mount", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mongoId_mongo_mongoId_fk": { + "name": "mount_mongoId_mongo_mongoId_fk", + "tableFrom": "mount", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mysqlId_mysql_mysqlId_fk": { + "name": "mount_mysqlId_mysql_mysqlId_fk", + "tableFrom": "mount", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_redisId_redis_redisId_fk": { + "name": "mount_redisId_redis_redisId_fk", + "tableFrom": "mount", + "tableTo": "redis", + "columnsFrom": [ + "redisId" + ], + "columnsTo": [ + "redisId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_composeId_compose_composeId_fk": { + "name": "mount_composeId_compose_composeId_fk", + "tableFrom": "mount", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.certificate": { + "name": "certificate", + "schema": "", + "columns": { + "certificateId": { + "name": "certificateId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateData": { + "name": "certificateData", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificatePath": { + "name": "certificatePath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "autoRenew": { + "name": "autoRenew", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "certificate_adminId_admin_adminId_fk": { + "name": "certificate_adminId_admin_adminId_fk", + "tableFrom": "certificate", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "certificate_serverId_server_serverId_fk": { + "name": "certificate_serverId_server_serverId_fk", + "tableFrom": "certificate", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "certificate_certificatePath_unique": { + "name": "certificate_certificatePath_unique", + "nullsNotDistinct": false, + "columns": [ + "certificatePath" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "session_user_id_auth_id_fk": { + "name": "session_user_id_auth_id_fk", + "tableFrom": "session", + "tableTo": "auth", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.redirect": { + "name": "redirect", + "schema": "", + "columns": { + "redirectId": { + "name": "redirectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "regex": { + "name": "regex", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "replacement": { + "name": "replacement", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "permanent": { + "name": "permanent", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "redirect_applicationId_application_applicationId_fk": { + "name": "redirect_applicationId_application_applicationId_fk", + "tableFrom": "redirect", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.security": { + "name": "security", + "schema": "", + "columns": { + "securityId": { + "name": "securityId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "security_applicationId_application_applicationId_fk": { + "name": "security_applicationId_application_applicationId_fk", + "tableFrom": "security", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "security_username_applicationId_unique": { + "name": "security_username_applicationId_unique", + "nullsNotDistinct": false, + "columns": [ + "username", + "applicationId" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.port": { + "name": "port", + "schema": "", + "columns": { + "portId": { + "name": "portId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "publishedPort": { + "name": "publishedPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "targetPort": { + "name": "targetPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "protocol": { + "name": "protocol", + "type": "protocolType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "port_applicationId_application_applicationId_fk": { + "name": "port_applicationId_application_applicationId_fk", + "tableFrom": "port", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.redis": { + "name": "redis", + "schema": "", + "columns": { + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "redis_projectId_project_projectId_fk": { + "name": "redis_projectId_project_projectId_fk", + "tableFrom": "redis", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "redis_serverId_server_serverId_fk": { + "name": "redis_serverId_server_serverId_fk", + "tableFrom": "redis", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "redis_appName_unique": { + "name": "redis_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.compose": { + "name": "compose", + "schema": "", + "columns": { + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeFile": { + "name": "composeFile", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceTypeCompose", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "composeType": { + "name": "composeType", + "type": "composeType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'docker-compose'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "composePath": { + "name": "composePath", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'./docker-compose.yml'" + }, + "suffix": { + "name": "suffix", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "randomize": { + "name": "randomize", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "composeStatus": { + "name": "composeStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "compose", + "tableTo": "ssh-key", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_projectId_project_projectId_fk": { + "name": "compose_projectId_project_projectId_fk", + "tableFrom": "compose", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "compose_githubId_github_githubId_fk": { + "name": "compose_githubId_github_githubId_fk", + "tableFrom": "compose", + "tableTo": "github", + "columnsFrom": [ + "githubId" + ], + "columnsTo": [ + "githubId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_gitlabId_gitlab_gitlabId_fk": { + "name": "compose_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "compose", + "tableTo": "gitlab", + "columnsFrom": [ + "gitlabId" + ], + "columnsTo": [ + "gitlabId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "compose", + "tableTo": "bitbucket", + "columnsFrom": [ + "bitbucketId" + ], + "columnsTo": [ + "bitbucketId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_serverId_server_serverId_fk": { + "name": "compose_serverId_server_serverId_fk", + "tableFrom": "compose", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.registry": { + "name": "registry", + "schema": "", + "columns": { + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "registryName": { + "name": "registryName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "imagePrefix": { + "name": "imagePrefix", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "selfHosted": { + "name": "selfHosted", + "type": "RegistryType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'cloud'" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "registry_adminId_admin_adminId_fk": { + "name": "registry_adminId_admin_adminId_fk", + "tableFrom": "registry", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.discord": { + "name": "discord", + "schema": "", + "columns": { + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.email": { + "name": "email", + "schema": "", + "columns": { + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "smtpServer": { + "name": "smtpServer", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "smtpPort": { + "name": "smtpPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "fromAddress": { + "name": "fromAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "toAddress": { + "name": "toAddress", + "type": "text[]", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.gotify": { + "name": "gotify", + "schema": "", + "columns": { + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "serverUrl": { + "name": "serverUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appToken": { + "name": "appToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "priority": { + "name": "priority", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 5 + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.notification": { + "name": "notification", + "schema": "", + "columns": { + "notificationId": { + "name": "notificationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appDeploy": { + "name": "appDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "appBuildError": { + "name": "appBuildError", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "databaseBackup": { + "name": "databaseBackup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dokployRestart": { + "name": "dokployRestart", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dockerCleanup": { + "name": "dockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "serverThreshold": { + "name": "serverThreshold", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "notificationType": { + "name": "notificationType", + "type": "notificationType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "notification_slackId_slack_slackId_fk": { + "name": "notification_slackId_slack_slackId_fk", + "tableFrom": "notification", + "tableTo": "slack", + "columnsFrom": [ + "slackId" + ], + "columnsTo": [ + "slackId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_telegramId_telegram_telegramId_fk": { + "name": "notification_telegramId_telegram_telegramId_fk", + "tableFrom": "notification", + "tableTo": "telegram", + "columnsFrom": [ + "telegramId" + ], + "columnsTo": [ + "telegramId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_discordId_discord_discordId_fk": { + "name": "notification_discordId_discord_discordId_fk", + "tableFrom": "notification", + "tableTo": "discord", + "columnsFrom": [ + "discordId" + ], + "columnsTo": [ + "discordId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_emailId_email_emailId_fk": { + "name": "notification_emailId_email_emailId_fk", + "tableFrom": "notification", + "tableTo": "email", + "columnsFrom": [ + "emailId" + ], + "columnsTo": [ + "emailId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_gotifyId_gotify_gotifyId_fk": { + "name": "notification_gotifyId_gotify_gotifyId_fk", + "tableFrom": "notification", + "tableTo": "gotify", + "columnsFrom": [ + "gotifyId" + ], + "columnsTo": [ + "gotifyId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_adminId_admin_adminId_fk": { + "name": "notification_adminId_admin_adminId_fk", + "tableFrom": "notification", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.slack": { + "name": "slack", + "schema": "", + "columns": { + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "channel": { + "name": "channel", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.telegram": { + "name": "telegram", + "schema": "", + "columns": { + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "botToken": { + "name": "botToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chatId": { + "name": "chatId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ssh-key": { + "name": "ssh-key", + "schema": "", + "columns": { + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "publicKey": { + "name": "publicKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "lastUsedAt": { + "name": "lastUsedAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "ssh-key_adminId_admin_adminId_fk": { + "name": "ssh-key_adminId_admin_adminId_fk", + "tableFrom": "ssh-key", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.git_provider": { + "name": "git_provider", + "schema": "", + "columns": { + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "providerType": { + "name": "providerType", + "type": "gitProviderType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "git_provider_adminId_admin_adminId_fk": { + "name": "git_provider_adminId_admin_adminId_fk", + "tableFrom": "git_provider", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.bitbucket": { + "name": "bitbucket", + "schema": "", + "columns": { + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "bitbucketUsername": { + "name": "bitbucketUsername", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "appPassword": { + "name": "appPassword", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketWorkspaceName": { + "name": "bitbucketWorkspaceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { + "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "bitbucket", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.github": { + "name": "github", + "schema": "", + "columns": { + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "githubAppName": { + "name": "githubAppName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubAppId": { + "name": "githubAppId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "githubClientId": { + "name": "githubClientId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubClientSecret": { + "name": "githubClientSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubInstallationId": { + "name": "githubInstallationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubPrivateKey": { + "name": "githubPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubWebhookSecret": { + "name": "githubWebhookSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "github_gitProviderId_git_provider_gitProviderId_fk": { + "name": "github_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "github", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.gitlab": { + "name": "gitlab", + "schema": "", + "columns": { + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "gitlabUrl": { + "name": "gitlabUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'https://gitlab.com'" + }, + "application_id": { + "name": "application_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redirect_uri": { + "name": "redirect_uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "group_name": { + "name": "group_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "gitlab_gitProviderId_git_provider_gitProviderId_fk": { + "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "gitlab", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.server": { + "name": "server", + "schema": "", + "columns": { + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ipAddress": { + "name": "ipAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'root'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverStatus": { + "name": "serverStatus", + "type": "serverStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'active'" + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "metricsConfig": { + "name": "metricsConfig", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{\"server\":{\"type\":\"Remote\",\"refreshRate\":60,\"port\":4500,\"token\":\"\",\"urlCallback\":\"\",\"cronJob\":\"\",\"retentionDays\":2,\"thresholds\":{\"cpu\":0,\"memory\":0}},\"containers\":{\"refreshRate\":60,\"services\":{\"include\":[],\"exclude\":[]}}}'::jsonb" + } + }, + "indexes": {}, + "foreignKeys": { + "server_adminId_admin_adminId_fk": { + "name": "server_adminId_admin_adminId_fk", + "tableFrom": "server", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "server_sshKeyId_ssh-key_sshKeyId_fk": { + "name": "server_sshKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "server", + "tableTo": "ssh-key", + "columnsFrom": [ + "sshKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.preview_deployments": { + "name": "preview_deployments", + "schema": "", + "columns": { + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestId": { + "name": "pullRequestId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestNumber": { + "name": "pullRequestNumber", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestURL": { + "name": "pullRequestURL", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestTitle": { + "name": "pullRequestTitle", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestCommentId": { + "name": "pullRequestCommentId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "previewStatus": { + "name": "previewStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "preview_deployments_applicationId_application_applicationId_fk": { + "name": "preview_deployments_applicationId_application_applicationId_fk", + "tableFrom": "preview_deployments", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "preview_deployments_domainId_domain_domainId_fk": { + "name": "preview_deployments_domainId_domain_domainId_fk", + "tableFrom": "preview_deployments", + "tableTo": "domain", + "columnsFrom": [ + "domainId" + ], + "columnsTo": [ + "domainId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "preview_deployments_appName_unique": { + "name": "preview_deployments_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.buildType": { + "name": "buildType", + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks", + "static" + ] + }, + "public.sourceType": { + "name": "sourceType", + "schema": "public", + "values": [ + "docker", + "git", + "github", + "gitlab", + "bitbucket", + "drop" + ] + }, + "public.Roles": { + "name": "Roles", + "schema": "public", + "values": [ + "admin", + "user" + ] + }, + "public.domainType": { + "name": "domainType", + "schema": "public", + "values": [ + "compose", + "application", + "preview" + ] + }, + "public.databaseType": { + "name": "databaseType", + "schema": "public", + "values": [ + "postgres", + "mariadb", + "mysql", + "mongo" + ] + }, + "public.deploymentStatus": { + "name": "deploymentStatus", + "schema": "public", + "values": [ + "running", + "done", + "error" + ] + }, + "public.mountType": { + "name": "mountType", + "schema": "public", + "values": [ + "bind", + "volume", + "file" + ] + }, + "public.serviceType": { + "name": "serviceType", + "schema": "public", + "values": [ + "application", + "postgres", + "mysql", + "mariadb", + "mongo", + "redis", + "compose" + ] + }, + "public.protocolType": { + "name": "protocolType", + "schema": "public", + "values": [ + "tcp", + "udp" + ] + }, + "public.applicationStatus": { + "name": "applicationStatus", + "schema": "public", + "values": [ + "idle", + "running", + "done", + "error" + ] + }, + "public.certificateType": { + "name": "certificateType", + "schema": "public", + "values": [ + "letsencrypt", + "none" + ] + }, + "public.composeType": { + "name": "composeType", + "schema": "public", + "values": [ + "docker-compose", + "stack" + ] + }, + "public.sourceTypeCompose": { + "name": "sourceTypeCompose", + "schema": "public", + "values": [ + "git", + "github", + "gitlab", + "bitbucket", + "raw" + ] + }, + "public.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + }, + "public.notificationType": { + "name": "notificationType", + "schema": "public", + "values": [ + "slack", + "telegram", + "discord", + "email", + "gotify" + ] + }, + "public.gitProviderType": { + "name": "gitProviderType", + "schema": "public", + "values": [ + "github", + "gitlab", + "bitbucket" + ] + }, + "public.serverStatus": { + "name": "serverStatus", + "schema": "public", + "values": [ + "active", + "inactive" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0064_snapshot.json b/apps/dokploy/drizzle/meta/0064_snapshot.json new file mode 100644 index 00000000..8e034af6 --- /dev/null +++ b/apps/dokploy/drizzle/meta/0064_snapshot.json @@ -0,0 +1,4485 @@ +{ + "id": "c9ab7857-cc4c-475f-bd11-5f14f11017cc", + "prevId": "f2fb7162-4b29-4494-9f6a-ab2794b1be48", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.application": { + "name": "application", + "schema": "", + "columns": { + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewEnv": { + "name": "previewEnv", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewBuildArgs": { + "name": "previewBuildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewWildcard": { + "name": "previewWildcard", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewPort": { + "name": "previewPort", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "previewHttps": { + "name": "previewHttps", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "previewPath": { + "name": "previewPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "previewLimit": { + "name": "previewLimit", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3 + }, + "isPreviewDeploymentsActive": { + "name": "isPreviewDeploymentsActive", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "buildArgs": { + "name": "buildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "subtitle": { + "name": "subtitle", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "buildPath": { + "name": "buildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBuildPath": { + "name": "gitlabBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBuildPath": { + "name": "bitbucketBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBuildPath": { + "name": "customGitBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerContextPath": { + "name": "dockerContextPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerBuildStage": { + "name": "dockerBuildStage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dropBuildPath": { + "name": "dropBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "healthCheckSwarm": { + "name": "healthCheckSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "restartPolicySwarm": { + "name": "restartPolicySwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "placementSwarm": { + "name": "placementSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "updateConfigSwarm": { + "name": "updateConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "rollbackConfigSwarm": { + "name": "rollbackConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "modeSwarm": { + "name": "modeSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "labelsSwarm": { + "name": "labelsSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "networkSwarm": { + "name": "networkSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "replicas": { + "name": "replicas", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "buildType": { + "name": "buildType", + "type": "buildType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'nixpacks'" + }, + "herokuVersion": { + "name": "herokuVersion", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'24'" + }, + "publishDirectory": { + "name": "publishDirectory", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "application", + "tableTo": "ssh-key", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_registryId_registry_registryId_fk": { + "name": "application_registryId_registry_registryId_fk", + "tableFrom": "application", + "tableTo": "registry", + "columnsFrom": [ + "registryId" + ], + "columnsTo": [ + "registryId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_projectId_project_projectId_fk": { + "name": "application_projectId_project_projectId_fk", + "tableFrom": "application", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "application_githubId_github_githubId_fk": { + "name": "application_githubId_github_githubId_fk", + "tableFrom": "application", + "tableTo": "github", + "columnsFrom": [ + "githubId" + ], + "columnsTo": [ + "githubId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_gitlabId_gitlab_gitlabId_fk": { + "name": "application_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "application", + "tableTo": "gitlab", + "columnsFrom": [ + "gitlabId" + ], + "columnsTo": [ + "gitlabId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "application_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "application", + "tableTo": "bitbucket", + "columnsFrom": [ + "bitbucketId" + ], + "columnsTo": [ + "bitbucketId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_serverId_server_serverId_fk": { + "name": "application_serverId_server_serverId_fk", + "tableFrom": "application", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "application_appName_unique": { + "name": "application_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.postgres": { + "name": "postgres", + "schema": "", + "columns": { + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "postgres_projectId_project_projectId_fk": { + "name": "postgres_projectId_project_projectId_fk", + "tableFrom": "postgres", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "postgres_serverId_server_serverId_fk": { + "name": "postgres_serverId_server_serverId_fk", + "tableFrom": "postgres", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "postgres_appName_unique": { + "name": "postgres_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "userId": { + "name": "userId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "isRegistered": { + "name": "isRegistered", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "expirationDate": { + "name": "expirationDate", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "canCreateProjects": { + "name": "canCreateProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToSSHKeys": { + "name": "canAccessToSSHKeys", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canCreateServices": { + "name": "canCreateServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteProjects": { + "name": "canDeleteProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteServices": { + "name": "canDeleteServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToDocker": { + "name": "canAccessToDocker", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToAPI": { + "name": "canAccessToAPI", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToGitProviders": { + "name": "canAccessToGitProviders", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToTraefikFiles": { + "name": "canAccessToTraefikFiles", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "accesedProjects": { + "name": "accesedProjects", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "accesedServices": { + "name": "accesedServices", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "user_adminId_admin_adminId_fk": { + "name": "user_adminId_admin_adminId_fk", + "tableFrom": "user", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_authId_auth_id_fk": { + "name": "user_authId_auth_id_fk", + "tableFrom": "user", + "tableTo": "auth", + "columnsFrom": [ + "authId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.admin": { + "name": "admin", + "schema": "", + "columns": { + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "serverIp": { + "name": "serverIp", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "letsEncryptEmail": { + "name": "letsEncryptEmail", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sshPrivateKey": { + "name": "sshPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enableLogRotation": { + "name": "enableLogRotation", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "stripeCustomerId": { + "name": "stripeCustomerId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "stripeSubscriptionId": { + "name": "stripeSubscriptionId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serversQuantity": { + "name": "serversQuantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "enablePaidFeatures": { + "name": "enablePaidFeatures", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "metricsConfig": { + "name": "metricsConfig", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{\"server\":{\"type\":\"Dokploy\",\"refreshRate\":60,\"port\":4500,\"token\":\"\",\"retentionDays\":2,\"cronJob\":\"\",\"urlCallback\":\"\",\"thresholds\":{\"cpu\":0,\"memory\":0}},\"containers\":{\"refreshRate\":60,\"services\":{\"include\":[],\"exclude\":[]}}}'::jsonb" + }, + "cleanupCacheApplications": { + "name": "cleanupCacheApplications", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnPreviews": { + "name": "cleanupCacheOnPreviews", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnCompose": { + "name": "cleanupCacheOnCompose", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "admin_authId_auth_id_fk": { + "name": "admin_authId_auth_id_fk", + "tableFrom": "admin", + "tableTo": "auth", + "columnsFrom": [ + "authId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.auth": { + "name": "auth", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rol": { + "name": "rol", + "type": "Roles", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is2FAEnabled": { + "name": "is2FAEnabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "resetPasswordToken": { + "name": "resetPasswordToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "resetPasswordExpiresAt": { + "name": "resetPasswordExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationToken": { + "name": "confirmationToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationExpiresAt": { + "name": "confirmationExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "auth_email_unique": { + "name": "auth_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.project": { + "name": "project", + "schema": "", + "columns": { + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": { + "project_adminId_admin_adminId_fk": { + "name": "project_adminId_admin_adminId_fk", + "tableFrom": "project", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.domain": { + "name": "domain", + "schema": "", + "columns": { + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "https": { + "name": "https", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "serviceName": { + "name": "serviceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "domainType": { + "name": "domainType", + "type": "domainType", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'application'" + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "domain_composeId_compose_composeId_fk": { + "name": "domain_composeId_compose_composeId_fk", + "tableFrom": "domain", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "domain_applicationId_application_applicationId_fk": { + "name": "domain_applicationId_application_applicationId_fk", + "tableFrom": "domain", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "domain", + "tableTo": "preview_deployments", + "columnsFrom": [ + "previewDeploymentId" + ], + "columnsTo": [ + "previewDeploymentId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mariadb": { + "name": "mariadb", + "schema": "", + "columns": { + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mariadb_projectId_project_projectId_fk": { + "name": "mariadb_projectId_project_projectId_fk", + "tableFrom": "mariadb", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mariadb_serverId_server_serverId_fk": { + "name": "mariadb_serverId_server_serverId_fk", + "tableFrom": "mariadb", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mariadb_appName_unique": { + "name": "mariadb_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mongo": { + "name": "mongo", + "schema": "", + "columns": { + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "replicaSets": { + "name": "replicaSets", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "mongo_projectId_project_projectId_fk": { + "name": "mongo_projectId_project_projectId_fk", + "tableFrom": "mongo", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mongo_serverId_server_serverId_fk": { + "name": "mongo_serverId_server_serverId_fk", + "tableFrom": "mongo", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mongo_appName_unique": { + "name": "mongo_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mysql": { + "name": "mysql", + "schema": "", + "columns": { + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mysql_projectId_project_projectId_fk": { + "name": "mysql_projectId_project_projectId_fk", + "tableFrom": "mysql", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mysql_serverId_server_serverId_fk": { + "name": "mysql_serverId_server_serverId_fk", + "tableFrom": "mysql", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mysql_appName_unique": { + "name": "mysql_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.backup": { + "name": "backup", + "schema": "", + "columns": { + "backupId": { + "name": "backupId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "schedule": { + "name": "schedule", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "database": { + "name": "database", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "prefix": { + "name": "prefix", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseType": { + "name": "databaseType", + "type": "databaseType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "backup_destinationId_destination_destinationId_fk": { + "name": "backup_destinationId_destination_destinationId_fk", + "tableFrom": "backup", + "tableTo": "destination", + "columnsFrom": [ + "destinationId" + ], + "columnsTo": [ + "destinationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_postgresId_postgres_postgresId_fk": { + "name": "backup_postgresId_postgres_postgresId_fk", + "tableFrom": "backup", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mariadbId_mariadb_mariadbId_fk": { + "name": "backup_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "backup", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mysqlId_mysql_mysqlId_fk": { + "name": "backup_mysqlId_mysql_mysqlId_fk", + "tableFrom": "backup", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mongoId_mongo_mongoId_fk": { + "name": "backup_mongoId_mongo_mongoId_fk", + "tableFrom": "backup", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.destination": { + "name": "destination", + "schema": "", + "columns": { + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "accessKey": { + "name": "accessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "secretAccessKey": { + "name": "secretAccessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "bucket": { + "name": "bucket", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "destination_adminId_admin_adminId_fk": { + "name": "destination_adminId_admin_adminId_fk", + "tableFrom": "destination", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.deployment": { + "name": "deployment", + "schema": "", + "columns": { + "deploymentId": { + "name": "deploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "deploymentStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'running'" + }, + "logPath": { + "name": "logPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "isPreviewDeployment": { + "name": "isPreviewDeployment", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "errorMessage": { + "name": "errorMessage", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "deployment_applicationId_application_applicationId_fk": { + "name": "deployment_applicationId_application_applicationId_fk", + "tableFrom": "deployment", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_composeId_compose_composeId_fk": { + "name": "deployment_composeId_compose_composeId_fk", + "tableFrom": "deployment", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_serverId_server_serverId_fk": { + "name": "deployment_serverId_server_serverId_fk", + "tableFrom": "deployment", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "deployment", + "tableTo": "preview_deployments", + "columnsFrom": [ + "previewDeploymentId" + ], + "columnsTo": [ + "previewDeploymentId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mount": { + "name": "mount", + "schema": "", + "columns": { + "mountId": { + "name": "mountId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "mountType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "hostPath": { + "name": "hostPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "volumeName": { + "name": "volumeName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "filePath": { + "name": "filePath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serviceType": { + "name": "serviceType", + "type": "serviceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'application'" + }, + "mountPath": { + "name": "mountPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mount_applicationId_application_applicationId_fk": { + "name": "mount_applicationId_application_applicationId_fk", + "tableFrom": "mount", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_postgresId_postgres_postgresId_fk": { + "name": "mount_postgresId_postgres_postgresId_fk", + "tableFrom": "mount", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mariadbId_mariadb_mariadbId_fk": { + "name": "mount_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "mount", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mongoId_mongo_mongoId_fk": { + "name": "mount_mongoId_mongo_mongoId_fk", + "tableFrom": "mount", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mysqlId_mysql_mysqlId_fk": { + "name": "mount_mysqlId_mysql_mysqlId_fk", + "tableFrom": "mount", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_redisId_redis_redisId_fk": { + "name": "mount_redisId_redis_redisId_fk", + "tableFrom": "mount", + "tableTo": "redis", + "columnsFrom": [ + "redisId" + ], + "columnsTo": [ + "redisId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_composeId_compose_composeId_fk": { + "name": "mount_composeId_compose_composeId_fk", + "tableFrom": "mount", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.certificate": { + "name": "certificate", + "schema": "", + "columns": { + "certificateId": { + "name": "certificateId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateData": { + "name": "certificateData", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificatePath": { + "name": "certificatePath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "autoRenew": { + "name": "autoRenew", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "certificate_adminId_admin_adminId_fk": { + "name": "certificate_adminId_admin_adminId_fk", + "tableFrom": "certificate", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "certificate_serverId_server_serverId_fk": { + "name": "certificate_serverId_server_serverId_fk", + "tableFrom": "certificate", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "certificate_certificatePath_unique": { + "name": "certificate_certificatePath_unique", + "nullsNotDistinct": false, + "columns": [ + "certificatePath" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "session_user_id_auth_id_fk": { + "name": "session_user_id_auth_id_fk", + "tableFrom": "session", + "tableTo": "auth", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.redirect": { + "name": "redirect", + "schema": "", + "columns": { + "redirectId": { + "name": "redirectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "regex": { + "name": "regex", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "replacement": { + "name": "replacement", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "permanent": { + "name": "permanent", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "redirect_applicationId_application_applicationId_fk": { + "name": "redirect_applicationId_application_applicationId_fk", + "tableFrom": "redirect", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.security": { + "name": "security", + "schema": "", + "columns": { + "securityId": { + "name": "securityId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "security_applicationId_application_applicationId_fk": { + "name": "security_applicationId_application_applicationId_fk", + "tableFrom": "security", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "security_username_applicationId_unique": { + "name": "security_username_applicationId_unique", + "nullsNotDistinct": false, + "columns": [ + "username", + "applicationId" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.port": { + "name": "port", + "schema": "", + "columns": { + "portId": { + "name": "portId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "publishedPort": { + "name": "publishedPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "targetPort": { + "name": "targetPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "protocol": { + "name": "protocol", + "type": "protocolType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "port_applicationId_application_applicationId_fk": { + "name": "port_applicationId_application_applicationId_fk", + "tableFrom": "port", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.redis": { + "name": "redis", + "schema": "", + "columns": { + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "redis_projectId_project_projectId_fk": { + "name": "redis_projectId_project_projectId_fk", + "tableFrom": "redis", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "redis_serverId_server_serverId_fk": { + "name": "redis_serverId_server_serverId_fk", + "tableFrom": "redis", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "redis_appName_unique": { + "name": "redis_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.compose": { + "name": "compose", + "schema": "", + "columns": { + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeFile": { + "name": "composeFile", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceTypeCompose", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "composeType": { + "name": "composeType", + "type": "composeType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'docker-compose'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "composePath": { + "name": "composePath", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'./docker-compose.yml'" + }, + "suffix": { + "name": "suffix", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "randomize": { + "name": "randomize", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "deployable": { + "name": "deployable", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "composeStatus": { + "name": "composeStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "compose", + "tableTo": "ssh-key", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_projectId_project_projectId_fk": { + "name": "compose_projectId_project_projectId_fk", + "tableFrom": "compose", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "compose_githubId_github_githubId_fk": { + "name": "compose_githubId_github_githubId_fk", + "tableFrom": "compose", + "tableTo": "github", + "columnsFrom": [ + "githubId" + ], + "columnsTo": [ + "githubId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_gitlabId_gitlab_gitlabId_fk": { + "name": "compose_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "compose", + "tableTo": "gitlab", + "columnsFrom": [ + "gitlabId" + ], + "columnsTo": [ + "gitlabId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "compose", + "tableTo": "bitbucket", + "columnsFrom": [ + "bitbucketId" + ], + "columnsTo": [ + "bitbucketId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_serverId_server_serverId_fk": { + "name": "compose_serverId_server_serverId_fk", + "tableFrom": "compose", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.registry": { + "name": "registry", + "schema": "", + "columns": { + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "registryName": { + "name": "registryName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "imagePrefix": { + "name": "imagePrefix", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "selfHosted": { + "name": "selfHosted", + "type": "RegistryType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'cloud'" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "registry_adminId_admin_adminId_fk": { + "name": "registry_adminId_admin_adminId_fk", + "tableFrom": "registry", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.discord": { + "name": "discord", + "schema": "", + "columns": { + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.email": { + "name": "email", + "schema": "", + "columns": { + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "smtpServer": { + "name": "smtpServer", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "smtpPort": { + "name": "smtpPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "fromAddress": { + "name": "fromAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "toAddress": { + "name": "toAddress", + "type": "text[]", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.gotify": { + "name": "gotify", + "schema": "", + "columns": { + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "serverUrl": { + "name": "serverUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appToken": { + "name": "appToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "priority": { + "name": "priority", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 5 + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.notification": { + "name": "notification", + "schema": "", + "columns": { + "notificationId": { + "name": "notificationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appDeploy": { + "name": "appDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "appBuildError": { + "name": "appBuildError", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "databaseBackup": { + "name": "databaseBackup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dokployRestart": { + "name": "dokployRestart", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dockerCleanup": { + "name": "dockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "serverThreshold": { + "name": "serverThreshold", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "notificationType": { + "name": "notificationType", + "type": "notificationType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "notification_slackId_slack_slackId_fk": { + "name": "notification_slackId_slack_slackId_fk", + "tableFrom": "notification", + "tableTo": "slack", + "columnsFrom": [ + "slackId" + ], + "columnsTo": [ + "slackId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_telegramId_telegram_telegramId_fk": { + "name": "notification_telegramId_telegram_telegramId_fk", + "tableFrom": "notification", + "tableTo": "telegram", + "columnsFrom": [ + "telegramId" + ], + "columnsTo": [ + "telegramId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_discordId_discord_discordId_fk": { + "name": "notification_discordId_discord_discordId_fk", + "tableFrom": "notification", + "tableTo": "discord", + "columnsFrom": [ + "discordId" + ], + "columnsTo": [ + "discordId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_emailId_email_emailId_fk": { + "name": "notification_emailId_email_emailId_fk", + "tableFrom": "notification", + "tableTo": "email", + "columnsFrom": [ + "emailId" + ], + "columnsTo": [ + "emailId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_gotifyId_gotify_gotifyId_fk": { + "name": "notification_gotifyId_gotify_gotifyId_fk", + "tableFrom": "notification", + "tableTo": "gotify", + "columnsFrom": [ + "gotifyId" + ], + "columnsTo": [ + "gotifyId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_adminId_admin_adminId_fk": { + "name": "notification_adminId_admin_adminId_fk", + "tableFrom": "notification", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.slack": { + "name": "slack", + "schema": "", + "columns": { + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "channel": { + "name": "channel", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.telegram": { + "name": "telegram", + "schema": "", + "columns": { + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "botToken": { + "name": "botToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chatId": { + "name": "chatId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ssh-key": { + "name": "ssh-key", + "schema": "", + "columns": { + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "publicKey": { + "name": "publicKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "lastUsedAt": { + "name": "lastUsedAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "ssh-key_adminId_admin_adminId_fk": { + "name": "ssh-key_adminId_admin_adminId_fk", + "tableFrom": "ssh-key", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.git_provider": { + "name": "git_provider", + "schema": "", + "columns": { + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "providerType": { + "name": "providerType", + "type": "gitProviderType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "git_provider_adminId_admin_adminId_fk": { + "name": "git_provider_adminId_admin_adminId_fk", + "tableFrom": "git_provider", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.bitbucket": { + "name": "bitbucket", + "schema": "", + "columns": { + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "bitbucketUsername": { + "name": "bitbucketUsername", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "appPassword": { + "name": "appPassword", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketWorkspaceName": { + "name": "bitbucketWorkspaceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { + "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "bitbucket", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.github": { + "name": "github", + "schema": "", + "columns": { + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "githubAppName": { + "name": "githubAppName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubAppId": { + "name": "githubAppId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "githubClientId": { + "name": "githubClientId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubClientSecret": { + "name": "githubClientSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubInstallationId": { + "name": "githubInstallationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubPrivateKey": { + "name": "githubPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubWebhookSecret": { + "name": "githubWebhookSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "github_gitProviderId_git_provider_gitProviderId_fk": { + "name": "github_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "github", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.gitlab": { + "name": "gitlab", + "schema": "", + "columns": { + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "gitlabUrl": { + "name": "gitlabUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'https://gitlab.com'" + }, + "application_id": { + "name": "application_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redirect_uri": { + "name": "redirect_uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "group_name": { + "name": "group_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "gitlab_gitProviderId_git_provider_gitProviderId_fk": { + "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "gitlab", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.server": { + "name": "server", + "schema": "", + "columns": { + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ipAddress": { + "name": "ipAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'root'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverStatus": { + "name": "serverStatus", + "type": "serverStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'active'" + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "metricsConfig": { + "name": "metricsConfig", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{\"server\":{\"type\":\"Remote\",\"refreshRate\":60,\"port\":4500,\"token\":\"\",\"urlCallback\":\"\",\"cronJob\":\"\",\"retentionDays\":2,\"thresholds\":{\"cpu\":0,\"memory\":0}},\"containers\":{\"refreshRate\":60,\"services\":{\"include\":[],\"exclude\":[]}}}'::jsonb" + } + }, + "indexes": {}, + "foreignKeys": { + "server_adminId_admin_adminId_fk": { + "name": "server_adminId_admin_adminId_fk", + "tableFrom": "server", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "server_sshKeyId_ssh-key_sshKeyId_fk": { + "name": "server_sshKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "server", + "tableTo": "ssh-key", + "columnsFrom": [ + "sshKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.preview_deployments": { + "name": "preview_deployments", + "schema": "", + "columns": { + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestId": { + "name": "pullRequestId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestNumber": { + "name": "pullRequestNumber", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestURL": { + "name": "pullRequestURL", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestTitle": { + "name": "pullRequestTitle", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestCommentId": { + "name": "pullRequestCommentId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "previewStatus": { + "name": "previewStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "preview_deployments_applicationId_application_applicationId_fk": { + "name": "preview_deployments_applicationId_application_applicationId_fk", + "tableFrom": "preview_deployments", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "preview_deployments_domainId_domain_domainId_fk": { + "name": "preview_deployments_domainId_domain_domainId_fk", + "tableFrom": "preview_deployments", + "tableTo": "domain", + "columnsFrom": [ + "domainId" + ], + "columnsTo": [ + "domainId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "preview_deployments_appName_unique": { + "name": "preview_deployments_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.buildType": { + "name": "buildType", + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks", + "static" + ] + }, + "public.sourceType": { + "name": "sourceType", + "schema": "public", + "values": [ + "docker", + "git", + "github", + "gitlab", + "bitbucket", + "drop" + ] + }, + "public.Roles": { + "name": "Roles", + "schema": "public", + "values": [ + "admin", + "user" + ] + }, + "public.domainType": { + "name": "domainType", + "schema": "public", + "values": [ + "compose", + "application", + "preview" + ] + }, + "public.databaseType": { + "name": "databaseType", + "schema": "public", + "values": [ + "postgres", + "mariadb", + "mysql", + "mongo" + ] + }, + "public.deploymentStatus": { + "name": "deploymentStatus", + "schema": "public", + "values": [ + "running", + "done", + "error" + ] + }, + "public.mountType": { + "name": "mountType", + "schema": "public", + "values": [ + "bind", + "volume", + "file" + ] + }, + "public.serviceType": { + "name": "serviceType", + "schema": "public", + "values": [ + "application", + "postgres", + "mysql", + "mariadb", + "mongo", + "redis", + "compose" + ] + }, + "public.protocolType": { + "name": "protocolType", + "schema": "public", + "values": [ + "tcp", + "udp" + ] + }, + "public.applicationStatus": { + "name": "applicationStatus", + "schema": "public", + "values": [ + "idle", + "running", + "done", + "error" + ] + }, + "public.certificateType": { + "name": "certificateType", + "schema": "public", + "values": [ + "letsencrypt", + "none" + ] + }, + "public.composeType": { + "name": "composeType", + "schema": "public", + "values": [ + "docker-compose", + "stack" + ] + }, + "public.sourceTypeCompose": { + "name": "sourceTypeCompose", + "schema": "public", + "values": [ + "git", + "github", + "gitlab", + "bitbucket", + "raw" + ] + }, + "public.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + }, + "public.notificationType": { + "name": "notificationType", + "schema": "public", + "values": [ + "slack", + "telegram", + "discord", + "email", + "gotify" + ] + }, + "public.gitProviderType": { + "name": "gitProviderType", + "schema": "public", + "values": [ + "github", + "gitlab", + "bitbucket" + ] + }, + "public.serverStatus": { + "name": "serverStatus", + "schema": "public", + "values": [ + "active", + "inactive" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0065_snapshot.json b/apps/dokploy/drizzle/meta/0065_snapshot.json new file mode 100644 index 00000000..28eef618 --- /dev/null +++ b/apps/dokploy/drizzle/meta/0065_snapshot.json @@ -0,0 +1,4485 @@ +{ + "id": "1240ec96-1751-4de3-b64f-cef9cb716786", + "prevId": "c9ab7857-cc4c-475f-bd11-5f14f11017cc", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.application": { + "name": "application", + "schema": "", + "columns": { + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewEnv": { + "name": "previewEnv", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewBuildArgs": { + "name": "previewBuildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewWildcard": { + "name": "previewWildcard", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewPort": { + "name": "previewPort", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "previewHttps": { + "name": "previewHttps", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "previewPath": { + "name": "previewPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "previewLimit": { + "name": "previewLimit", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3 + }, + "isPreviewDeploymentsActive": { + "name": "isPreviewDeploymentsActive", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "buildArgs": { + "name": "buildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "subtitle": { + "name": "subtitle", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "buildPath": { + "name": "buildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBuildPath": { + "name": "gitlabBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBuildPath": { + "name": "bitbucketBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBuildPath": { + "name": "customGitBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerContextPath": { + "name": "dockerContextPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerBuildStage": { + "name": "dockerBuildStage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dropBuildPath": { + "name": "dropBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "healthCheckSwarm": { + "name": "healthCheckSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "restartPolicySwarm": { + "name": "restartPolicySwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "placementSwarm": { + "name": "placementSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "updateConfigSwarm": { + "name": "updateConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "rollbackConfigSwarm": { + "name": "rollbackConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "modeSwarm": { + "name": "modeSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "labelsSwarm": { + "name": "labelsSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "networkSwarm": { + "name": "networkSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "replicas": { + "name": "replicas", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "buildType": { + "name": "buildType", + "type": "buildType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'nixpacks'" + }, + "herokuVersion": { + "name": "herokuVersion", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'24'" + }, + "publishDirectory": { + "name": "publishDirectory", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "application", + "tableTo": "ssh-key", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_registryId_registry_registryId_fk": { + "name": "application_registryId_registry_registryId_fk", + "tableFrom": "application", + "tableTo": "registry", + "columnsFrom": [ + "registryId" + ], + "columnsTo": [ + "registryId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_projectId_project_projectId_fk": { + "name": "application_projectId_project_projectId_fk", + "tableFrom": "application", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "application_githubId_github_githubId_fk": { + "name": "application_githubId_github_githubId_fk", + "tableFrom": "application", + "tableTo": "github", + "columnsFrom": [ + "githubId" + ], + "columnsTo": [ + "githubId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_gitlabId_gitlab_gitlabId_fk": { + "name": "application_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "application", + "tableTo": "gitlab", + "columnsFrom": [ + "gitlabId" + ], + "columnsTo": [ + "gitlabId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "application_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "application", + "tableTo": "bitbucket", + "columnsFrom": [ + "bitbucketId" + ], + "columnsTo": [ + "bitbucketId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_serverId_server_serverId_fk": { + "name": "application_serverId_server_serverId_fk", + "tableFrom": "application", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "application_appName_unique": { + "name": "application_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.postgres": { + "name": "postgres", + "schema": "", + "columns": { + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "postgres_projectId_project_projectId_fk": { + "name": "postgres_projectId_project_projectId_fk", + "tableFrom": "postgres", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "postgres_serverId_server_serverId_fk": { + "name": "postgres_serverId_server_serverId_fk", + "tableFrom": "postgres", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "postgres_appName_unique": { + "name": "postgres_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "userId": { + "name": "userId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "isRegistered": { + "name": "isRegistered", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "expirationDate": { + "name": "expirationDate", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "canCreateProjects": { + "name": "canCreateProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToSSHKeys": { + "name": "canAccessToSSHKeys", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canCreateServices": { + "name": "canCreateServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteProjects": { + "name": "canDeleteProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteServices": { + "name": "canDeleteServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToDocker": { + "name": "canAccessToDocker", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToAPI": { + "name": "canAccessToAPI", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToGitProviders": { + "name": "canAccessToGitProviders", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToTraefikFiles": { + "name": "canAccessToTraefikFiles", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "accesedProjects": { + "name": "accesedProjects", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "accesedServices": { + "name": "accesedServices", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "user_adminId_admin_adminId_fk": { + "name": "user_adminId_admin_adminId_fk", + "tableFrom": "user", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_authId_auth_id_fk": { + "name": "user_authId_auth_id_fk", + "tableFrom": "user", + "tableTo": "auth", + "columnsFrom": [ + "authId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.admin": { + "name": "admin", + "schema": "", + "columns": { + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "serverIp": { + "name": "serverIp", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "letsEncryptEmail": { + "name": "letsEncryptEmail", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sshPrivateKey": { + "name": "sshPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enableLogRotation": { + "name": "enableLogRotation", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "stripeCustomerId": { + "name": "stripeCustomerId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "stripeSubscriptionId": { + "name": "stripeSubscriptionId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serversQuantity": { + "name": "serversQuantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "enablePaidFeatures": { + "name": "enablePaidFeatures", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "metricsConfig": { + "name": "metricsConfig", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{\"server\":{\"type\":\"Dokploy\",\"refreshRate\":60,\"port\":4500,\"token\":\"\",\"retentionDays\":2,\"cronJob\":\"\",\"urlCallback\":\"\",\"thresholds\":{\"cpu\":0,\"memory\":0}},\"containers\":{\"refreshRate\":60,\"services\":{\"include\":[],\"exclude\":[]}}}'::jsonb" + }, + "cleanupCacheApplications": { + "name": "cleanupCacheApplications", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnPreviews": { + "name": "cleanupCacheOnPreviews", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnCompose": { + "name": "cleanupCacheOnCompose", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "admin_authId_auth_id_fk": { + "name": "admin_authId_auth_id_fk", + "tableFrom": "admin", + "tableTo": "auth", + "columnsFrom": [ + "authId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.auth": { + "name": "auth", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rol": { + "name": "rol", + "type": "Roles", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is2FAEnabled": { + "name": "is2FAEnabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "resetPasswordToken": { + "name": "resetPasswordToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "resetPasswordExpiresAt": { + "name": "resetPasswordExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationToken": { + "name": "confirmationToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationExpiresAt": { + "name": "confirmationExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "auth_email_unique": { + "name": "auth_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.project": { + "name": "project", + "schema": "", + "columns": { + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": { + "project_adminId_admin_adminId_fk": { + "name": "project_adminId_admin_adminId_fk", + "tableFrom": "project", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.domain": { + "name": "domain", + "schema": "", + "columns": { + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "https": { + "name": "https", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "serviceName": { + "name": "serviceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "domainType": { + "name": "domainType", + "type": "domainType", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'application'" + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "domain_composeId_compose_composeId_fk": { + "name": "domain_composeId_compose_composeId_fk", + "tableFrom": "domain", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "domain_applicationId_application_applicationId_fk": { + "name": "domain_applicationId_application_applicationId_fk", + "tableFrom": "domain", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "domain", + "tableTo": "preview_deployments", + "columnsFrom": [ + "previewDeploymentId" + ], + "columnsTo": [ + "previewDeploymentId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mariadb": { + "name": "mariadb", + "schema": "", + "columns": { + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mariadb_projectId_project_projectId_fk": { + "name": "mariadb_projectId_project_projectId_fk", + "tableFrom": "mariadb", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mariadb_serverId_server_serverId_fk": { + "name": "mariadb_serverId_server_serverId_fk", + "tableFrom": "mariadb", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mariadb_appName_unique": { + "name": "mariadb_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mongo": { + "name": "mongo", + "schema": "", + "columns": { + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "replicaSets": { + "name": "replicaSets", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "mongo_projectId_project_projectId_fk": { + "name": "mongo_projectId_project_projectId_fk", + "tableFrom": "mongo", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mongo_serverId_server_serverId_fk": { + "name": "mongo_serverId_server_serverId_fk", + "tableFrom": "mongo", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mongo_appName_unique": { + "name": "mongo_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mysql": { + "name": "mysql", + "schema": "", + "columns": { + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mysql_projectId_project_projectId_fk": { + "name": "mysql_projectId_project_projectId_fk", + "tableFrom": "mysql", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mysql_serverId_server_serverId_fk": { + "name": "mysql_serverId_server_serverId_fk", + "tableFrom": "mysql", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mysql_appName_unique": { + "name": "mysql_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.backup": { + "name": "backup", + "schema": "", + "columns": { + "backupId": { + "name": "backupId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "schedule": { + "name": "schedule", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "database": { + "name": "database", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "prefix": { + "name": "prefix", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseType": { + "name": "databaseType", + "type": "databaseType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "backup_destinationId_destination_destinationId_fk": { + "name": "backup_destinationId_destination_destinationId_fk", + "tableFrom": "backup", + "tableTo": "destination", + "columnsFrom": [ + "destinationId" + ], + "columnsTo": [ + "destinationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_postgresId_postgres_postgresId_fk": { + "name": "backup_postgresId_postgres_postgresId_fk", + "tableFrom": "backup", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mariadbId_mariadb_mariadbId_fk": { + "name": "backup_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "backup", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mysqlId_mysql_mysqlId_fk": { + "name": "backup_mysqlId_mysql_mysqlId_fk", + "tableFrom": "backup", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mongoId_mongo_mongoId_fk": { + "name": "backup_mongoId_mongo_mongoId_fk", + "tableFrom": "backup", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.destination": { + "name": "destination", + "schema": "", + "columns": { + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "accessKey": { + "name": "accessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "secretAccessKey": { + "name": "secretAccessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "bucket": { + "name": "bucket", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "destination_adminId_admin_adminId_fk": { + "name": "destination_adminId_admin_adminId_fk", + "tableFrom": "destination", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.deployment": { + "name": "deployment", + "schema": "", + "columns": { + "deploymentId": { + "name": "deploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "deploymentStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'running'" + }, + "logPath": { + "name": "logPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "isPreviewDeployment": { + "name": "isPreviewDeployment", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "errorMessage": { + "name": "errorMessage", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "deployment_applicationId_application_applicationId_fk": { + "name": "deployment_applicationId_application_applicationId_fk", + "tableFrom": "deployment", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_composeId_compose_composeId_fk": { + "name": "deployment_composeId_compose_composeId_fk", + "tableFrom": "deployment", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_serverId_server_serverId_fk": { + "name": "deployment_serverId_server_serverId_fk", + "tableFrom": "deployment", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "deployment", + "tableTo": "preview_deployments", + "columnsFrom": [ + "previewDeploymentId" + ], + "columnsTo": [ + "previewDeploymentId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mount": { + "name": "mount", + "schema": "", + "columns": { + "mountId": { + "name": "mountId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "mountType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "hostPath": { + "name": "hostPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "volumeName": { + "name": "volumeName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "filePath": { + "name": "filePath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serviceType": { + "name": "serviceType", + "type": "serviceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'application'" + }, + "mountPath": { + "name": "mountPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mount_applicationId_application_applicationId_fk": { + "name": "mount_applicationId_application_applicationId_fk", + "tableFrom": "mount", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_postgresId_postgres_postgresId_fk": { + "name": "mount_postgresId_postgres_postgresId_fk", + "tableFrom": "mount", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mariadbId_mariadb_mariadbId_fk": { + "name": "mount_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "mount", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mongoId_mongo_mongoId_fk": { + "name": "mount_mongoId_mongo_mongoId_fk", + "tableFrom": "mount", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mysqlId_mysql_mysqlId_fk": { + "name": "mount_mysqlId_mysql_mysqlId_fk", + "tableFrom": "mount", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_redisId_redis_redisId_fk": { + "name": "mount_redisId_redis_redisId_fk", + "tableFrom": "mount", + "tableTo": "redis", + "columnsFrom": [ + "redisId" + ], + "columnsTo": [ + "redisId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_composeId_compose_composeId_fk": { + "name": "mount_composeId_compose_composeId_fk", + "tableFrom": "mount", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.certificate": { + "name": "certificate", + "schema": "", + "columns": { + "certificateId": { + "name": "certificateId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateData": { + "name": "certificateData", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificatePath": { + "name": "certificatePath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "autoRenew": { + "name": "autoRenew", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "certificate_adminId_admin_adminId_fk": { + "name": "certificate_adminId_admin_adminId_fk", + "tableFrom": "certificate", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "certificate_serverId_server_serverId_fk": { + "name": "certificate_serverId_server_serverId_fk", + "tableFrom": "certificate", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "certificate_certificatePath_unique": { + "name": "certificate_certificatePath_unique", + "nullsNotDistinct": false, + "columns": [ + "certificatePath" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "session_user_id_auth_id_fk": { + "name": "session_user_id_auth_id_fk", + "tableFrom": "session", + "tableTo": "auth", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.redirect": { + "name": "redirect", + "schema": "", + "columns": { + "redirectId": { + "name": "redirectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "regex": { + "name": "regex", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "replacement": { + "name": "replacement", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "permanent": { + "name": "permanent", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "redirect_applicationId_application_applicationId_fk": { + "name": "redirect_applicationId_application_applicationId_fk", + "tableFrom": "redirect", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.security": { + "name": "security", + "schema": "", + "columns": { + "securityId": { + "name": "securityId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "security_applicationId_application_applicationId_fk": { + "name": "security_applicationId_application_applicationId_fk", + "tableFrom": "security", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "security_username_applicationId_unique": { + "name": "security_username_applicationId_unique", + "nullsNotDistinct": false, + "columns": [ + "username", + "applicationId" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.port": { + "name": "port", + "schema": "", + "columns": { + "portId": { + "name": "portId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "publishedPort": { + "name": "publishedPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "targetPort": { + "name": "targetPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "protocol": { + "name": "protocol", + "type": "protocolType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "port_applicationId_application_applicationId_fk": { + "name": "port_applicationId_application_applicationId_fk", + "tableFrom": "port", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.redis": { + "name": "redis", + "schema": "", + "columns": { + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "redis_projectId_project_projectId_fk": { + "name": "redis_projectId_project_projectId_fk", + "tableFrom": "redis", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "redis_serverId_server_serverId_fk": { + "name": "redis_serverId_server_serverId_fk", + "tableFrom": "redis", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "redis_appName_unique": { + "name": "redis_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.compose": { + "name": "compose", + "schema": "", + "columns": { + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeFile": { + "name": "composeFile", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceTypeCompose", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "composeType": { + "name": "composeType", + "type": "composeType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'docker-compose'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "composePath": { + "name": "composePath", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'./docker-compose.yml'" + }, + "suffix": { + "name": "suffix", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "randomize": { + "name": "randomize", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "isolatedDeployment": { + "name": "isolatedDeployment", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "composeStatus": { + "name": "composeStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "compose", + "tableTo": "ssh-key", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_projectId_project_projectId_fk": { + "name": "compose_projectId_project_projectId_fk", + "tableFrom": "compose", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "compose_githubId_github_githubId_fk": { + "name": "compose_githubId_github_githubId_fk", + "tableFrom": "compose", + "tableTo": "github", + "columnsFrom": [ + "githubId" + ], + "columnsTo": [ + "githubId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_gitlabId_gitlab_gitlabId_fk": { + "name": "compose_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "compose", + "tableTo": "gitlab", + "columnsFrom": [ + "gitlabId" + ], + "columnsTo": [ + "gitlabId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "compose", + "tableTo": "bitbucket", + "columnsFrom": [ + "bitbucketId" + ], + "columnsTo": [ + "bitbucketId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_serverId_server_serverId_fk": { + "name": "compose_serverId_server_serverId_fk", + "tableFrom": "compose", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.registry": { + "name": "registry", + "schema": "", + "columns": { + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "registryName": { + "name": "registryName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "imagePrefix": { + "name": "imagePrefix", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "selfHosted": { + "name": "selfHosted", + "type": "RegistryType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'cloud'" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "registry_adminId_admin_adminId_fk": { + "name": "registry_adminId_admin_adminId_fk", + "tableFrom": "registry", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.discord": { + "name": "discord", + "schema": "", + "columns": { + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.email": { + "name": "email", + "schema": "", + "columns": { + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "smtpServer": { + "name": "smtpServer", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "smtpPort": { + "name": "smtpPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "fromAddress": { + "name": "fromAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "toAddress": { + "name": "toAddress", + "type": "text[]", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.gotify": { + "name": "gotify", + "schema": "", + "columns": { + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "serverUrl": { + "name": "serverUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appToken": { + "name": "appToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "priority": { + "name": "priority", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 5 + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.notification": { + "name": "notification", + "schema": "", + "columns": { + "notificationId": { + "name": "notificationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appDeploy": { + "name": "appDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "appBuildError": { + "name": "appBuildError", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "databaseBackup": { + "name": "databaseBackup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dokployRestart": { + "name": "dokployRestart", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dockerCleanup": { + "name": "dockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "serverThreshold": { + "name": "serverThreshold", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "notificationType": { + "name": "notificationType", + "type": "notificationType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "notification_slackId_slack_slackId_fk": { + "name": "notification_slackId_slack_slackId_fk", + "tableFrom": "notification", + "tableTo": "slack", + "columnsFrom": [ + "slackId" + ], + "columnsTo": [ + "slackId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_telegramId_telegram_telegramId_fk": { + "name": "notification_telegramId_telegram_telegramId_fk", + "tableFrom": "notification", + "tableTo": "telegram", + "columnsFrom": [ + "telegramId" + ], + "columnsTo": [ + "telegramId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_discordId_discord_discordId_fk": { + "name": "notification_discordId_discord_discordId_fk", + "tableFrom": "notification", + "tableTo": "discord", + "columnsFrom": [ + "discordId" + ], + "columnsTo": [ + "discordId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_emailId_email_emailId_fk": { + "name": "notification_emailId_email_emailId_fk", + "tableFrom": "notification", + "tableTo": "email", + "columnsFrom": [ + "emailId" + ], + "columnsTo": [ + "emailId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_gotifyId_gotify_gotifyId_fk": { + "name": "notification_gotifyId_gotify_gotifyId_fk", + "tableFrom": "notification", + "tableTo": "gotify", + "columnsFrom": [ + "gotifyId" + ], + "columnsTo": [ + "gotifyId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_adminId_admin_adminId_fk": { + "name": "notification_adminId_admin_adminId_fk", + "tableFrom": "notification", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.slack": { + "name": "slack", + "schema": "", + "columns": { + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "channel": { + "name": "channel", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.telegram": { + "name": "telegram", + "schema": "", + "columns": { + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "botToken": { + "name": "botToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chatId": { + "name": "chatId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ssh-key": { + "name": "ssh-key", + "schema": "", + "columns": { + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "publicKey": { + "name": "publicKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "lastUsedAt": { + "name": "lastUsedAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "ssh-key_adminId_admin_adminId_fk": { + "name": "ssh-key_adminId_admin_adminId_fk", + "tableFrom": "ssh-key", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.git_provider": { + "name": "git_provider", + "schema": "", + "columns": { + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "providerType": { + "name": "providerType", + "type": "gitProviderType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "git_provider_adminId_admin_adminId_fk": { + "name": "git_provider_adminId_admin_adminId_fk", + "tableFrom": "git_provider", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.bitbucket": { + "name": "bitbucket", + "schema": "", + "columns": { + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "bitbucketUsername": { + "name": "bitbucketUsername", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "appPassword": { + "name": "appPassword", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketWorkspaceName": { + "name": "bitbucketWorkspaceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { + "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "bitbucket", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.github": { + "name": "github", + "schema": "", + "columns": { + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "githubAppName": { + "name": "githubAppName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubAppId": { + "name": "githubAppId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "githubClientId": { + "name": "githubClientId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubClientSecret": { + "name": "githubClientSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubInstallationId": { + "name": "githubInstallationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubPrivateKey": { + "name": "githubPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubWebhookSecret": { + "name": "githubWebhookSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "github_gitProviderId_git_provider_gitProviderId_fk": { + "name": "github_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "github", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.gitlab": { + "name": "gitlab", + "schema": "", + "columns": { + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "gitlabUrl": { + "name": "gitlabUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'https://gitlab.com'" + }, + "application_id": { + "name": "application_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redirect_uri": { + "name": "redirect_uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "group_name": { + "name": "group_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "gitlab_gitProviderId_git_provider_gitProviderId_fk": { + "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "gitlab", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.server": { + "name": "server", + "schema": "", + "columns": { + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ipAddress": { + "name": "ipAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'root'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverStatus": { + "name": "serverStatus", + "type": "serverStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'active'" + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "metricsConfig": { + "name": "metricsConfig", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{\"server\":{\"type\":\"Remote\",\"refreshRate\":60,\"port\":4500,\"token\":\"\",\"urlCallback\":\"\",\"cronJob\":\"\",\"retentionDays\":2,\"thresholds\":{\"cpu\":0,\"memory\":0}},\"containers\":{\"refreshRate\":60,\"services\":{\"include\":[],\"exclude\":[]}}}'::jsonb" + } + }, + "indexes": {}, + "foreignKeys": { + "server_adminId_admin_adminId_fk": { + "name": "server_adminId_admin_adminId_fk", + "tableFrom": "server", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "server_sshKeyId_ssh-key_sshKeyId_fk": { + "name": "server_sshKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "server", + "tableTo": "ssh-key", + "columnsFrom": [ + "sshKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.preview_deployments": { + "name": "preview_deployments", + "schema": "", + "columns": { + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestId": { + "name": "pullRequestId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestNumber": { + "name": "pullRequestNumber", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestURL": { + "name": "pullRequestURL", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestTitle": { + "name": "pullRequestTitle", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestCommentId": { + "name": "pullRequestCommentId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "previewStatus": { + "name": "previewStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "preview_deployments_applicationId_application_applicationId_fk": { + "name": "preview_deployments_applicationId_application_applicationId_fk", + "tableFrom": "preview_deployments", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "preview_deployments_domainId_domain_domainId_fk": { + "name": "preview_deployments_domainId_domain_domainId_fk", + "tableFrom": "preview_deployments", + "tableTo": "domain", + "columnsFrom": [ + "domainId" + ], + "columnsTo": [ + "domainId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "preview_deployments_appName_unique": { + "name": "preview_deployments_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.buildType": { + "name": "buildType", + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks", + "static" + ] + }, + "public.sourceType": { + "name": "sourceType", + "schema": "public", + "values": [ + "docker", + "git", + "github", + "gitlab", + "bitbucket", + "drop" + ] + }, + "public.Roles": { + "name": "Roles", + "schema": "public", + "values": [ + "admin", + "user" + ] + }, + "public.domainType": { + "name": "domainType", + "schema": "public", + "values": [ + "compose", + "application", + "preview" + ] + }, + "public.databaseType": { + "name": "databaseType", + "schema": "public", + "values": [ + "postgres", + "mariadb", + "mysql", + "mongo" + ] + }, + "public.deploymentStatus": { + "name": "deploymentStatus", + "schema": "public", + "values": [ + "running", + "done", + "error" + ] + }, + "public.mountType": { + "name": "mountType", + "schema": "public", + "values": [ + "bind", + "volume", + "file" + ] + }, + "public.serviceType": { + "name": "serviceType", + "schema": "public", + "values": [ + "application", + "postgres", + "mysql", + "mariadb", + "mongo", + "redis", + "compose" + ] + }, + "public.protocolType": { + "name": "protocolType", + "schema": "public", + "values": [ + "tcp", + "udp" + ] + }, + "public.applicationStatus": { + "name": "applicationStatus", + "schema": "public", + "values": [ + "idle", + "running", + "done", + "error" + ] + }, + "public.certificateType": { + "name": "certificateType", + "schema": "public", + "values": [ + "letsencrypt", + "none" + ] + }, + "public.composeType": { + "name": "composeType", + "schema": "public", + "values": [ + "docker-compose", + "stack" + ] + }, + "public.sourceTypeCompose": { + "name": "sourceTypeCompose", + "schema": "public", + "values": [ + "git", + "github", + "gitlab", + "bitbucket", + "raw" + ] + }, + "public.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + }, + "public.notificationType": { + "name": "notificationType", + "schema": "public", + "values": [ + "slack", + "telegram", + "discord", + "email", + "gotify" + ] + }, + "public.gitProviderType": { + "name": "gitProviderType", + "schema": "public", + "values": [ + "github", + "gitlab", + "bitbucket" + ] + }, + "public.serverStatus": { + "name": "serverStatus", + "schema": "public", + "values": [ + "active", + "inactive" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0066_snapshot.json b/apps/dokploy/drizzle/meta/0066_snapshot.json new file mode 100644 index 00000000..55804f0c --- /dev/null +++ b/apps/dokploy/drizzle/meta/0066_snapshot.json @@ -0,0 +1,5037 @@ +{ + "id": "c5e17a87-0aa3-4178-be24-cfa7cde0f75d", + "prevId": "9cb79f1e-14c2-4deb-b1ab-a1d038f72356", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.application": { + "name": "application", + "schema": "", + "columns": { + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewEnv": { + "name": "previewEnv", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewBuildArgs": { + "name": "previewBuildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewWildcard": { + "name": "previewWildcard", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewPort": { + "name": "previewPort", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "previewHttps": { + "name": "previewHttps", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "previewPath": { + "name": "previewPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "previewLimit": { + "name": "previewLimit", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3 + }, + "isPreviewDeploymentsActive": { + "name": "isPreviewDeploymentsActive", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "buildArgs": { + "name": "buildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "subtitle": { + "name": "subtitle", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "buildPath": { + "name": "buildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBuildPath": { + "name": "gitlabBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBuildPath": { + "name": "bitbucketBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBuildPath": { + "name": "customGitBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerContextPath": { + "name": "dockerContextPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerBuildStage": { + "name": "dockerBuildStage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dropBuildPath": { + "name": "dropBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "healthCheckSwarm": { + "name": "healthCheckSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "restartPolicySwarm": { + "name": "restartPolicySwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "placementSwarm": { + "name": "placementSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "updateConfigSwarm": { + "name": "updateConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "rollbackConfigSwarm": { + "name": "rollbackConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "modeSwarm": { + "name": "modeSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "labelsSwarm": { + "name": "labelsSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "networkSwarm": { + "name": "networkSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "replicas": { + "name": "replicas", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "buildType": { + "name": "buildType", + "type": "buildType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'nixpacks'" + }, + "herokuVersion": { + "name": "herokuVersion", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'24'" + }, + "publishDirectory": { + "name": "publishDirectory", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "application", + "tableTo": "ssh-key", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_registryId_registry_registryId_fk": { + "name": "application_registryId_registry_registryId_fk", + "tableFrom": "application", + "tableTo": "registry", + "columnsFrom": [ + "registryId" + ], + "columnsTo": [ + "registryId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_projectId_project_projectId_fk": { + "name": "application_projectId_project_projectId_fk", + "tableFrom": "application", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "application_githubId_github_githubId_fk": { + "name": "application_githubId_github_githubId_fk", + "tableFrom": "application", + "tableTo": "github", + "columnsFrom": [ + "githubId" + ], + "columnsTo": [ + "githubId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_gitlabId_gitlab_gitlabId_fk": { + "name": "application_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "application", + "tableTo": "gitlab", + "columnsFrom": [ + "gitlabId" + ], + "columnsTo": [ + "gitlabId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "application_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "application", + "tableTo": "bitbucket", + "columnsFrom": [ + "bitbucketId" + ], + "columnsTo": [ + "bitbucketId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_serverId_server_serverId_fk": { + "name": "application_serverId_server_serverId_fk", + "tableFrom": "application", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "application_appName_unique": { + "name": "application_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.postgres": { + "name": "postgres", + "schema": "", + "columns": { + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "postgres_projectId_project_projectId_fk": { + "name": "postgres_projectId_project_projectId_fk", + "tableFrom": "postgres", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "postgres_serverId_server_serverId_fk": { + "name": "postgres_serverId_server_serverId_fk", + "tableFrom": "postgres", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "postgres_appName_unique": { + "name": "postgres_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_temp": { + "name": "user_temp", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "isRegistered": { + "name": "isRegistered", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "expirationDate": { + "name": "expirationDate", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "two_factor_enabled": { + "name": "two_factor_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email_verified": { + "name": "email_verified", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "banned": { + "name": "banned", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "ban_reason": { + "name": "ban_reason", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ban_expires": { + "name": "ban_expires", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "serverIp": { + "name": "serverIp", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "letsEncryptEmail": { + "name": "letsEncryptEmail", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sshPrivateKey": { + "name": "sshPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enableLogRotation": { + "name": "enableLogRotation", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enablePaidFeatures": { + "name": "enablePaidFeatures", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "metricsConfig": { + "name": "metricsConfig", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{\"server\":{\"type\":\"Dokploy\",\"refreshRate\":60,\"port\":4500,\"token\":\"\",\"retentionDays\":2,\"cronJob\":\"\",\"urlCallback\":\"\",\"thresholds\":{\"cpu\":0,\"memory\":0}},\"containers\":{\"refreshRate\":60,\"services\":{\"include\":[],\"exclude\":[]}}}'::jsonb" + }, + "cleanupCacheApplications": { + "name": "cleanupCacheApplications", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnPreviews": { + "name": "cleanupCacheOnPreviews", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnCompose": { + "name": "cleanupCacheOnCompose", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "stripeCustomerId": { + "name": "stripeCustomerId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "stripeSubscriptionId": { + "name": "stripeSubscriptionId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serversQuantity": { + "name": "serversQuantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_temp_email_unique": { + "name": "user_temp_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.project": { + "name": "project", + "schema": "", + "columns": { + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organizationId": { + "name": "organizationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": { + "project_organizationId_organization_id_fk": { + "name": "project_organizationId_organization_id_fk", + "tableFrom": "project", + "tableTo": "organization", + "columnsFrom": [ + "organizationId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.domain": { + "name": "domain", + "schema": "", + "columns": { + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "https": { + "name": "https", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "serviceName": { + "name": "serviceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "domainType": { + "name": "domainType", + "type": "domainType", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'application'" + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "domain_composeId_compose_composeId_fk": { + "name": "domain_composeId_compose_composeId_fk", + "tableFrom": "domain", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "domain_applicationId_application_applicationId_fk": { + "name": "domain_applicationId_application_applicationId_fk", + "tableFrom": "domain", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "domain", + "tableTo": "preview_deployments", + "columnsFrom": [ + "previewDeploymentId" + ], + "columnsTo": [ + "previewDeploymentId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mariadb": { + "name": "mariadb", + "schema": "", + "columns": { + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mariadb_projectId_project_projectId_fk": { + "name": "mariadb_projectId_project_projectId_fk", + "tableFrom": "mariadb", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mariadb_serverId_server_serverId_fk": { + "name": "mariadb_serverId_server_serverId_fk", + "tableFrom": "mariadb", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mariadb_appName_unique": { + "name": "mariadb_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mongo": { + "name": "mongo", + "schema": "", + "columns": { + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "replicaSets": { + "name": "replicaSets", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "mongo_projectId_project_projectId_fk": { + "name": "mongo_projectId_project_projectId_fk", + "tableFrom": "mongo", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mongo_serverId_server_serverId_fk": { + "name": "mongo_serverId_server_serverId_fk", + "tableFrom": "mongo", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mongo_appName_unique": { + "name": "mongo_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mysql": { + "name": "mysql", + "schema": "", + "columns": { + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mysql_projectId_project_projectId_fk": { + "name": "mysql_projectId_project_projectId_fk", + "tableFrom": "mysql", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mysql_serverId_server_serverId_fk": { + "name": "mysql_serverId_server_serverId_fk", + "tableFrom": "mysql", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mysql_appName_unique": { + "name": "mysql_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.backup": { + "name": "backup", + "schema": "", + "columns": { + "backupId": { + "name": "backupId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "schedule": { + "name": "schedule", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "database": { + "name": "database", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "prefix": { + "name": "prefix", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseType": { + "name": "databaseType", + "type": "databaseType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "backup_destinationId_destination_destinationId_fk": { + "name": "backup_destinationId_destination_destinationId_fk", + "tableFrom": "backup", + "tableTo": "destination", + "columnsFrom": [ + "destinationId" + ], + "columnsTo": [ + "destinationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_postgresId_postgres_postgresId_fk": { + "name": "backup_postgresId_postgres_postgresId_fk", + "tableFrom": "backup", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mariadbId_mariadb_mariadbId_fk": { + "name": "backup_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "backup", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mysqlId_mysql_mysqlId_fk": { + "name": "backup_mysqlId_mysql_mysqlId_fk", + "tableFrom": "backup", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mongoId_mongo_mongoId_fk": { + "name": "backup_mongoId_mongo_mongoId_fk", + "tableFrom": "backup", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.destination": { + "name": "destination", + "schema": "", + "columns": { + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "accessKey": { + "name": "accessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "secretAccessKey": { + "name": "secretAccessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "bucket": { + "name": "bucket", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organizationId": { + "name": "organizationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "destination_organizationId_organization_id_fk": { + "name": "destination_organizationId_organization_id_fk", + "tableFrom": "destination", + "tableTo": "organization", + "columnsFrom": [ + "organizationId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.deployment": { + "name": "deployment", + "schema": "", + "columns": { + "deploymentId": { + "name": "deploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "deploymentStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'running'" + }, + "logPath": { + "name": "logPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "isPreviewDeployment": { + "name": "isPreviewDeployment", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "errorMessage": { + "name": "errorMessage", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "deployment_applicationId_application_applicationId_fk": { + "name": "deployment_applicationId_application_applicationId_fk", + "tableFrom": "deployment", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_composeId_compose_composeId_fk": { + "name": "deployment_composeId_compose_composeId_fk", + "tableFrom": "deployment", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_serverId_server_serverId_fk": { + "name": "deployment_serverId_server_serverId_fk", + "tableFrom": "deployment", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "deployment", + "tableTo": "preview_deployments", + "columnsFrom": [ + "previewDeploymentId" + ], + "columnsTo": [ + "previewDeploymentId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mount": { + "name": "mount", + "schema": "", + "columns": { + "mountId": { + "name": "mountId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "mountType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "hostPath": { + "name": "hostPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "volumeName": { + "name": "volumeName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "filePath": { + "name": "filePath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serviceType": { + "name": "serviceType", + "type": "serviceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'application'" + }, + "mountPath": { + "name": "mountPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mount_applicationId_application_applicationId_fk": { + "name": "mount_applicationId_application_applicationId_fk", + "tableFrom": "mount", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_postgresId_postgres_postgresId_fk": { + "name": "mount_postgresId_postgres_postgresId_fk", + "tableFrom": "mount", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mariadbId_mariadb_mariadbId_fk": { + "name": "mount_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "mount", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mongoId_mongo_mongoId_fk": { + "name": "mount_mongoId_mongo_mongoId_fk", + "tableFrom": "mount", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mysqlId_mysql_mysqlId_fk": { + "name": "mount_mysqlId_mysql_mysqlId_fk", + "tableFrom": "mount", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_redisId_redis_redisId_fk": { + "name": "mount_redisId_redis_redisId_fk", + "tableFrom": "mount", + "tableTo": "redis", + "columnsFrom": [ + "redisId" + ], + "columnsTo": [ + "redisId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_composeId_compose_composeId_fk": { + "name": "mount_composeId_compose_composeId_fk", + "tableFrom": "mount", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.certificate": { + "name": "certificate", + "schema": "", + "columns": { + "certificateId": { + "name": "certificateId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateData": { + "name": "certificateData", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificatePath": { + "name": "certificatePath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "autoRenew": { + "name": "autoRenew", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "organizationId": { + "name": "organizationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "certificate_organizationId_organization_id_fk": { + "name": "certificate_organizationId_organization_id_fk", + "tableFrom": "certificate", + "tableTo": "organization", + "columnsFrom": [ + "organizationId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "certificate_serverId_server_serverId_fk": { + "name": "certificate_serverId_server_serverId_fk", + "tableFrom": "certificate", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "certificate_certificatePath_unique": { + "name": "certificate_certificatePath_unique", + "nullsNotDistinct": false, + "columns": [ + "certificatePath" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.session_temp": { + "name": "session_temp", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "impersonated_by": { + "name": "impersonated_by", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "active_organization_id": { + "name": "active_organization_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "session_temp_user_id_user_temp_id_fk": { + "name": "session_temp_user_id_user_temp_id_fk", + "tableFrom": "session_temp", + "tableTo": "user_temp", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "session_temp_token_unique": { + "name": "session_temp_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.redirect": { + "name": "redirect", + "schema": "", + "columns": { + "redirectId": { + "name": "redirectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "regex": { + "name": "regex", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "replacement": { + "name": "replacement", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "permanent": { + "name": "permanent", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "redirect_applicationId_application_applicationId_fk": { + "name": "redirect_applicationId_application_applicationId_fk", + "tableFrom": "redirect", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.security": { + "name": "security", + "schema": "", + "columns": { + "securityId": { + "name": "securityId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "security_applicationId_application_applicationId_fk": { + "name": "security_applicationId_application_applicationId_fk", + "tableFrom": "security", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "security_username_applicationId_unique": { + "name": "security_username_applicationId_unique", + "nullsNotDistinct": false, + "columns": [ + "username", + "applicationId" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.port": { + "name": "port", + "schema": "", + "columns": { + "portId": { + "name": "portId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "publishedPort": { + "name": "publishedPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "targetPort": { + "name": "targetPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "protocol": { + "name": "protocol", + "type": "protocolType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "port_applicationId_application_applicationId_fk": { + "name": "port_applicationId_application_applicationId_fk", + "tableFrom": "port", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.redis": { + "name": "redis", + "schema": "", + "columns": { + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "redis_projectId_project_projectId_fk": { + "name": "redis_projectId_project_projectId_fk", + "tableFrom": "redis", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "redis_serverId_server_serverId_fk": { + "name": "redis_serverId_server_serverId_fk", + "tableFrom": "redis", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "redis_appName_unique": { + "name": "redis_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.compose": { + "name": "compose", + "schema": "", + "columns": { + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeFile": { + "name": "composeFile", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceTypeCompose", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "composeType": { + "name": "composeType", + "type": "composeType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'docker-compose'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "composePath": { + "name": "composePath", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'./docker-compose.yml'" + }, + "suffix": { + "name": "suffix", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "randomize": { + "name": "randomize", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "isolatedDeployment": { + "name": "isolatedDeployment", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "composeStatus": { + "name": "composeStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "compose", + "tableTo": "ssh-key", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_projectId_project_projectId_fk": { + "name": "compose_projectId_project_projectId_fk", + "tableFrom": "compose", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "compose_githubId_github_githubId_fk": { + "name": "compose_githubId_github_githubId_fk", + "tableFrom": "compose", + "tableTo": "github", + "columnsFrom": [ + "githubId" + ], + "columnsTo": [ + "githubId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_gitlabId_gitlab_gitlabId_fk": { + "name": "compose_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "compose", + "tableTo": "gitlab", + "columnsFrom": [ + "gitlabId" + ], + "columnsTo": [ + "gitlabId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "compose", + "tableTo": "bitbucket", + "columnsFrom": [ + "bitbucketId" + ], + "columnsTo": [ + "bitbucketId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_serverId_server_serverId_fk": { + "name": "compose_serverId_server_serverId_fk", + "tableFrom": "compose", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.registry": { + "name": "registry", + "schema": "", + "columns": { + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "registryName": { + "name": "registryName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "imagePrefix": { + "name": "imagePrefix", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "selfHosted": { + "name": "selfHosted", + "type": "RegistryType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'cloud'" + }, + "organizationId": { + "name": "organizationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "registry_organizationId_organization_id_fk": { + "name": "registry_organizationId_organization_id_fk", + "tableFrom": "registry", + "tableTo": "organization", + "columnsFrom": [ + "organizationId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.discord": { + "name": "discord", + "schema": "", + "columns": { + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.email": { + "name": "email", + "schema": "", + "columns": { + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "smtpServer": { + "name": "smtpServer", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "smtpPort": { + "name": "smtpPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "fromAddress": { + "name": "fromAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "toAddress": { + "name": "toAddress", + "type": "text[]", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.gotify": { + "name": "gotify", + "schema": "", + "columns": { + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "serverUrl": { + "name": "serverUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appToken": { + "name": "appToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "priority": { + "name": "priority", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 5 + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.notification": { + "name": "notification", + "schema": "", + "columns": { + "notificationId": { + "name": "notificationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appDeploy": { + "name": "appDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "appBuildError": { + "name": "appBuildError", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "databaseBackup": { + "name": "databaseBackup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dokployRestart": { + "name": "dokployRestart", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dockerCleanup": { + "name": "dockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "serverThreshold": { + "name": "serverThreshold", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "notificationType": { + "name": "notificationType", + "type": "notificationType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "organizationId": { + "name": "organizationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "notification_slackId_slack_slackId_fk": { + "name": "notification_slackId_slack_slackId_fk", + "tableFrom": "notification", + "tableTo": "slack", + "columnsFrom": [ + "slackId" + ], + "columnsTo": [ + "slackId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_telegramId_telegram_telegramId_fk": { + "name": "notification_telegramId_telegram_telegramId_fk", + "tableFrom": "notification", + "tableTo": "telegram", + "columnsFrom": [ + "telegramId" + ], + "columnsTo": [ + "telegramId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_discordId_discord_discordId_fk": { + "name": "notification_discordId_discord_discordId_fk", + "tableFrom": "notification", + "tableTo": "discord", + "columnsFrom": [ + "discordId" + ], + "columnsTo": [ + "discordId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_emailId_email_emailId_fk": { + "name": "notification_emailId_email_emailId_fk", + "tableFrom": "notification", + "tableTo": "email", + "columnsFrom": [ + "emailId" + ], + "columnsTo": [ + "emailId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_gotifyId_gotify_gotifyId_fk": { + "name": "notification_gotifyId_gotify_gotifyId_fk", + "tableFrom": "notification", + "tableTo": "gotify", + "columnsFrom": [ + "gotifyId" + ], + "columnsTo": [ + "gotifyId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_organizationId_organization_id_fk": { + "name": "notification_organizationId_organization_id_fk", + "tableFrom": "notification", + "tableTo": "organization", + "columnsFrom": [ + "organizationId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.slack": { + "name": "slack", + "schema": "", + "columns": { + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "channel": { + "name": "channel", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.telegram": { + "name": "telegram", + "schema": "", + "columns": { + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "botToken": { + "name": "botToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chatId": { + "name": "chatId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ssh-key": { + "name": "ssh-key", + "schema": "", + "columns": { + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "publicKey": { + "name": "publicKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "lastUsedAt": { + "name": "lastUsedAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "organizationId": { + "name": "organizationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "ssh-key_organizationId_organization_id_fk": { + "name": "ssh-key_organizationId_organization_id_fk", + "tableFrom": "ssh-key", + "tableTo": "organization", + "columnsFrom": [ + "organizationId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.git_provider": { + "name": "git_provider", + "schema": "", + "columns": { + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "providerType": { + "name": "providerType", + "type": "gitProviderType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organizationId": { + "name": "organizationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "git_provider_organizationId_organization_id_fk": { + "name": "git_provider_organizationId_organization_id_fk", + "tableFrom": "git_provider", + "tableTo": "organization", + "columnsFrom": [ + "organizationId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.bitbucket": { + "name": "bitbucket", + "schema": "", + "columns": { + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "bitbucketUsername": { + "name": "bitbucketUsername", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "appPassword": { + "name": "appPassword", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketWorkspaceName": { + "name": "bitbucketWorkspaceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { + "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "bitbucket", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.github": { + "name": "github", + "schema": "", + "columns": { + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "githubAppName": { + "name": "githubAppName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubAppId": { + "name": "githubAppId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "githubClientId": { + "name": "githubClientId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubClientSecret": { + "name": "githubClientSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubInstallationId": { + "name": "githubInstallationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubPrivateKey": { + "name": "githubPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubWebhookSecret": { + "name": "githubWebhookSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "github_gitProviderId_git_provider_gitProviderId_fk": { + "name": "github_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "github", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.gitlab": { + "name": "gitlab", + "schema": "", + "columns": { + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "gitlabUrl": { + "name": "gitlabUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'https://gitlab.com'" + }, + "application_id": { + "name": "application_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redirect_uri": { + "name": "redirect_uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "group_name": { + "name": "group_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "gitlab_gitProviderId_git_provider_gitProviderId_fk": { + "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "gitlab", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.server": { + "name": "server", + "schema": "", + "columns": { + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ipAddress": { + "name": "ipAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'root'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organizationId": { + "name": "organizationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverStatus": { + "name": "serverStatus", + "type": "serverStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'active'" + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "metricsConfig": { + "name": "metricsConfig", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{\"server\":{\"type\":\"Remote\",\"refreshRate\":60,\"port\":4500,\"token\":\"\",\"urlCallback\":\"\",\"cronJob\":\"\",\"retentionDays\":2,\"thresholds\":{\"cpu\":0,\"memory\":0}},\"containers\":{\"refreshRate\":60,\"services\":{\"include\":[],\"exclude\":[]}}}'::jsonb" + } + }, + "indexes": {}, + "foreignKeys": { + "server_organizationId_organization_id_fk": { + "name": "server_organizationId_organization_id_fk", + "tableFrom": "server", + "tableTo": "organization", + "columnsFrom": [ + "organizationId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "server_sshKeyId_ssh-key_sshKeyId_fk": { + "name": "server_sshKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "server", + "tableTo": "ssh-key", + "columnsFrom": [ + "sshKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.preview_deployments": { + "name": "preview_deployments", + "schema": "", + "columns": { + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestId": { + "name": "pullRequestId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestNumber": { + "name": "pullRequestNumber", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestURL": { + "name": "pullRequestURL", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestTitle": { + "name": "pullRequestTitle", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestCommentId": { + "name": "pullRequestCommentId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "previewStatus": { + "name": "previewStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "preview_deployments_applicationId_application_applicationId_fk": { + "name": "preview_deployments_applicationId_application_applicationId_fk", + "tableFrom": "preview_deployments", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "preview_deployments_domainId_domain_domainId_fk": { + "name": "preview_deployments_domainId_domain_domainId_fk", + "tableFrom": "preview_deployments", + "tableTo": "domain", + "columnsFrom": [ + "domainId" + ], + "columnsTo": [ + "domainId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "preview_deployments_appName_unique": { + "name": "preview_deployments_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.account": { + "name": "account", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token_expires_at": { + "name": "access_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "refresh_token_expires_at": { + "name": "refresh_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is2FAEnabled": { + "name": "is2FAEnabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "resetPasswordToken": { + "name": "resetPasswordToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "resetPasswordExpiresAt": { + "name": "resetPasswordExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationToken": { + "name": "confirmationToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationExpiresAt": { + "name": "confirmationExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "account_user_id_user_temp_id_fk": { + "name": "account_user_id_user_temp_id_fk", + "tableFrom": "account", + "tableTo": "user_temp", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.apikey": { + "name": "apikey", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "start": { + "name": "start", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "prefix": { + "name": "prefix", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "refill_interval": { + "name": "refill_interval", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "refill_amount": { + "name": "refill_amount", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "last_refill_at": { + "name": "last_refill_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "rate_limit_enabled": { + "name": "rate_limit_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "rate_limit_time_window": { + "name": "rate_limit_time_window", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "rate_limit_max": { + "name": "rate_limit_max", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "request_count": { + "name": "request_count", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "remaining": { + "name": "remaining", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "last_request": { + "name": "last_request", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "permissions": { + "name": "permissions", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "metadata": { + "name": "metadata", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "apikey_user_id_user_temp_id_fk": { + "name": "apikey_user_id_user_temp_id_fk", + "tableFrom": "apikey", + "tableTo": "user_temp", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.invitation": { + "name": "invitation", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "inviter_id": { + "name": "inviter_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "team_id": { + "name": "team_id", + "type": "text", + "primaryKey": false, + "notNull": false + + } + }, + "indexes": {}, + "foreignKeys": { + "invitation_organization_id_organization_id_fk": { + "name": "invitation_organization_id_organization_id_fk", + "tableFrom": "invitation", + "tableTo": "organization", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "invitation_inviter_id_user_temp_id_fk": { + "name": "invitation_inviter_id_user_temp_id_fk", + "tableFrom": "invitation", + "tableTo": "user_temp", + "columnsFrom": [ + "inviter_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.member": { + "name": "member", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "team_id": { + "name": "team_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "canCreateProjects": { + "name": "canCreateProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToSSHKeys": { + "name": "canAccessToSSHKeys", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canCreateServices": { + "name": "canCreateServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteProjects": { + "name": "canDeleteProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteServices": { + "name": "canDeleteServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToDocker": { + "name": "canAccessToDocker", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToAPI": { + "name": "canAccessToAPI", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToGitProviders": { + "name": "canAccessToGitProviders", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToTraefikFiles": { + "name": "canAccessToTraefikFiles", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "accesedProjects": { + "name": "accesedProjects", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "accesedServices": { + "name": "accesedServices", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + } + }, + "indexes": {}, + "foreignKeys": { + "member_organization_id_organization_id_fk": { + "name": "member_organization_id_organization_id_fk", + "tableFrom": "member", + "tableTo": "organization", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "member_user_id_user_temp_id_fk": { + "name": "member_user_id_user_temp_id_fk", + "tableFrom": "member", + "tableTo": "user_temp", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.organization": { + "name": "organization", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slug": { + "name": "slug", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "logo": { + "name": "logo", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "metadata": { + "name": "metadata", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "organization_owner_id_user_temp_id_fk": { + "name": "organization_owner_id_user_temp_id_fk", + "tableFrom": "organization", + "tableTo": "user_temp", + "columnsFrom": [ + "owner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "organization_slug_unique": { + "name": "organization_slug_unique", + "nullsNotDistinct": false, + "columns": [ + "slug" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.two_factor": { + "name": "two_factor", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "backup_codes": { + "name": "backup_codes", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "two_factor_user_id_user_temp_id_fk": { + "name": "two_factor_user_id_user_temp_id_fk", + "tableFrom": "two_factor", + "tableTo": "user_temp", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.verification": { + "name": "verification", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.buildType": { + "name": "buildType", + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks", + "static" + ] + }, + "public.sourceType": { + "name": "sourceType", + "schema": "public", + "values": [ + "docker", + "git", + "github", + "gitlab", + "bitbucket", + "drop" + ] + }, + "public.domainType": { + "name": "domainType", + "schema": "public", + "values": [ + "compose", + "application", + "preview" + ] + }, + "public.databaseType": { + "name": "databaseType", + "schema": "public", + "values": [ + "postgres", + "mariadb", + "mysql", + "mongo" + ] + }, + "public.deploymentStatus": { + "name": "deploymentStatus", + "schema": "public", + "values": [ + "running", + "done", + "error" + ] + }, + "public.mountType": { + "name": "mountType", + "schema": "public", + "values": [ + "bind", + "volume", + "file" + ] + }, + "public.serviceType": { + "name": "serviceType", + "schema": "public", + "values": [ + "application", + "postgres", + "mysql", + "mariadb", + "mongo", + "redis", + "compose" + ] + }, + "public.protocolType": { + "name": "protocolType", + "schema": "public", + "values": [ + "tcp", + "udp" + ] + }, + "public.applicationStatus": { + "name": "applicationStatus", + "schema": "public", + "values": [ + "idle", + "running", + "done", + "error" + ] + }, + "public.certificateType": { + "name": "certificateType", + "schema": "public", + "values": [ + "letsencrypt", + "none" + ] + }, + "public.composeType": { + "name": "composeType", + "schema": "public", + "values": [ + "docker-compose", + "stack" + ] + }, + "public.sourceTypeCompose": { + "name": "sourceTypeCompose", + "schema": "public", + "values": [ + "git", + "github", + "gitlab", + "bitbucket", + "raw" + ] + }, + "public.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + }, + "public.notificationType": { + "name": "notificationType", + "schema": "public", + "values": [ + "slack", + "telegram", + "discord", + "email", + "gotify" + ] + }, + "public.gitProviderType": { + "name": "gitProviderType", + "schema": "public", + "values": [ + "github", + "gitlab", + "bitbucket" + ] + }, + "public.serverStatus": { + "name": "serverStatus", + "schema": "public", + "values": [ + "active", + "inactive" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/0067_snapshot.json b/apps/dokploy/drizzle/meta/0067_snapshot.json new file mode 100644 index 00000000..4fc64698 --- /dev/null +++ b/apps/dokploy/drizzle/meta/0067_snapshot.json @@ -0,0 +1,5042 @@ +{ + "id": "ba6b8dbb-406c-4ab1-9c24-6dd2e19a9184", + "prevId": "c5e17a87-0aa3-4178-be24-cfa7cde0f75d", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.application": { + "name": "application", + "schema": "", + "columns": { + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewEnv": { + "name": "previewEnv", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewBuildArgs": { + "name": "previewBuildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewWildcard": { + "name": "previewWildcard", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewPort": { + "name": "previewPort", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "previewHttps": { + "name": "previewHttps", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "previewPath": { + "name": "previewPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "previewLimit": { + "name": "previewLimit", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3 + }, + "isPreviewDeploymentsActive": { + "name": "isPreviewDeploymentsActive", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "buildArgs": { + "name": "buildArgs", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "subtitle": { + "name": "subtitle", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "buildPath": { + "name": "buildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBuildPath": { + "name": "gitlabBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBuildPath": { + "name": "bitbucketBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBuildPath": { + "name": "customGitBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerContextPath": { + "name": "dockerContextPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerBuildStage": { + "name": "dockerBuildStage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dropBuildPath": { + "name": "dropBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "healthCheckSwarm": { + "name": "healthCheckSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "restartPolicySwarm": { + "name": "restartPolicySwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "placementSwarm": { + "name": "placementSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "updateConfigSwarm": { + "name": "updateConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "rollbackConfigSwarm": { + "name": "rollbackConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "modeSwarm": { + "name": "modeSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "labelsSwarm": { + "name": "labelsSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "networkSwarm": { + "name": "networkSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "replicas": { + "name": "replicas", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "buildType": { + "name": "buildType", + "type": "buildType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'nixpacks'" + }, + "herokuVersion": { + "name": "herokuVersion", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'24'" + }, + "publishDirectory": { + "name": "publishDirectory", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "application_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "application_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "application", + "tableTo": "ssh-key", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_registryId_registry_registryId_fk": { + "name": "application_registryId_registry_registryId_fk", + "tableFrom": "application", + "tableTo": "registry", + "columnsFrom": [ + "registryId" + ], + "columnsTo": [ + "registryId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_projectId_project_projectId_fk": { + "name": "application_projectId_project_projectId_fk", + "tableFrom": "application", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "application_githubId_github_githubId_fk": { + "name": "application_githubId_github_githubId_fk", + "tableFrom": "application", + "tableTo": "github", + "columnsFrom": [ + "githubId" + ], + "columnsTo": [ + "githubId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_gitlabId_gitlab_gitlabId_fk": { + "name": "application_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "application", + "tableTo": "gitlab", + "columnsFrom": [ + "gitlabId" + ], + "columnsTo": [ + "gitlabId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "application_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "application", + "tableTo": "bitbucket", + "columnsFrom": [ + "bitbucketId" + ], + "columnsTo": [ + "bitbucketId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_serverId_server_serverId_fk": { + "name": "application_serverId_server_serverId_fk", + "tableFrom": "application", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "application_appName_unique": { + "name": "application_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.postgres": { + "name": "postgres", + "schema": "", + "columns": { + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "postgres_projectId_project_projectId_fk": { + "name": "postgres_projectId_project_projectId_fk", + "tableFrom": "postgres", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "postgres_serverId_server_serverId_fk": { + "name": "postgres_serverId_server_serverId_fk", + "tableFrom": "postgres", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "postgres_appName_unique": { + "name": "postgres_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_temp": { + "name": "user_temp", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "isRegistered": { + "name": "isRegistered", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "expirationDate": { + "name": "expirationDate", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "two_factor_enabled": { + "name": "two_factor_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email_verified": { + "name": "email_verified", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "banned": { + "name": "banned", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "ban_reason": { + "name": "ban_reason", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ban_expires": { + "name": "ban_expires", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "serverIp": { + "name": "serverIp", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "letsEncryptEmail": { + "name": "letsEncryptEmail", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sshPrivateKey": { + "name": "sshPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enableLogRotation": { + "name": "enableLogRotation", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enablePaidFeatures": { + "name": "enablePaidFeatures", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "metricsConfig": { + "name": "metricsConfig", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{\"server\":{\"type\":\"Dokploy\",\"refreshRate\":60,\"port\":4500,\"token\":\"\",\"retentionDays\":2,\"cronJob\":\"\",\"urlCallback\":\"\",\"thresholds\":{\"cpu\":0,\"memory\":0}},\"containers\":{\"refreshRate\":60,\"services\":{\"include\":[],\"exclude\":[]}}}'::jsonb" + }, + "cleanupCacheApplications": { + "name": "cleanupCacheApplications", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnPreviews": { + "name": "cleanupCacheOnPreviews", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cleanupCacheOnCompose": { + "name": "cleanupCacheOnCompose", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "stripeCustomerId": { + "name": "stripeCustomerId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "stripeSubscriptionId": { + "name": "stripeSubscriptionId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serversQuantity": { + "name": "serversQuantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_temp_email_unique": { + "name": "user_temp_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.project": { + "name": "project", + "schema": "", + "columns": { + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organizationId": { + "name": "organizationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": {}, + "foreignKeys": { + "project_organizationId_organization_id_fk": { + "name": "project_organizationId_organization_id_fk", + "tableFrom": "project", + "tableTo": "organization", + "columnsFrom": [ + "organizationId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.domain": { + "name": "domain", + "schema": "", + "columns": { + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "https": { + "name": "https", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3000 + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "serviceName": { + "name": "serviceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "domainType": { + "name": "domainType", + "type": "domainType", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'application'" + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "domain_composeId_compose_composeId_fk": { + "name": "domain_composeId_compose_composeId_fk", + "tableFrom": "domain", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "domain_applicationId_application_applicationId_fk": { + "name": "domain_applicationId_application_applicationId_fk", + "tableFrom": "domain", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "domain_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "domain", + "tableTo": "preview_deployments", + "columnsFrom": [ + "previewDeploymentId" + ], + "columnsTo": [ + "previewDeploymentId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mariadb": { + "name": "mariadb", + "schema": "", + "columns": { + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mariadb_projectId_project_projectId_fk": { + "name": "mariadb_projectId_project_projectId_fk", + "tableFrom": "mariadb", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mariadb_serverId_server_serverId_fk": { + "name": "mariadb_serverId_server_serverId_fk", + "tableFrom": "mariadb", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mariadb_appName_unique": { + "name": "mariadb_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mongo": { + "name": "mongo", + "schema": "", + "columns": { + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "replicaSets": { + "name": "replicaSets", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "mongo_projectId_project_projectId_fk": { + "name": "mongo_projectId_project_projectId_fk", + "tableFrom": "mongo", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mongo_serverId_server_serverId_fk": { + "name": "mongo_serverId_server_serverId_fk", + "tableFrom": "mongo", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mongo_appName_unique": { + "name": "mongo_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mysql": { + "name": "mysql", + "schema": "", + "columns": { + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mysql_projectId_project_projectId_fk": { + "name": "mysql_projectId_project_projectId_fk", + "tableFrom": "mysql", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mysql_serverId_server_serverId_fk": { + "name": "mysql_serverId_server_serverId_fk", + "tableFrom": "mysql", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mysql_appName_unique": { + "name": "mysql_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.backup": { + "name": "backup", + "schema": "", + "columns": { + "backupId": { + "name": "backupId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "schedule": { + "name": "schedule", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "database": { + "name": "database", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "prefix": { + "name": "prefix", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseType": { + "name": "databaseType", + "type": "databaseType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "backup_destinationId_destination_destinationId_fk": { + "name": "backup_destinationId_destination_destinationId_fk", + "tableFrom": "backup", + "tableTo": "destination", + "columnsFrom": [ + "destinationId" + ], + "columnsTo": [ + "destinationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_postgresId_postgres_postgresId_fk": { + "name": "backup_postgresId_postgres_postgresId_fk", + "tableFrom": "backup", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mariadbId_mariadb_mariadbId_fk": { + "name": "backup_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "backup", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mysqlId_mysql_mysqlId_fk": { + "name": "backup_mysqlId_mysql_mysqlId_fk", + "tableFrom": "backup", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mongoId_mongo_mongoId_fk": { + "name": "backup_mongoId_mongo_mongoId_fk", + "tableFrom": "backup", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.destination": { + "name": "destination", + "schema": "", + "columns": { + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "accessKey": { + "name": "accessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "secretAccessKey": { + "name": "secretAccessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "bucket": { + "name": "bucket", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organizationId": { + "name": "organizationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "destination_organizationId_organization_id_fk": { + "name": "destination_organizationId_organization_id_fk", + "tableFrom": "destination", + "tableTo": "organization", + "columnsFrom": [ + "organizationId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.deployment": { + "name": "deployment", + "schema": "", + "columns": { + "deploymentId": { + "name": "deploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "deploymentStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'running'" + }, + "logPath": { + "name": "logPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "isPreviewDeployment": { + "name": "isPreviewDeployment", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "errorMessage": { + "name": "errorMessage", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "deployment_applicationId_application_applicationId_fk": { + "name": "deployment_applicationId_application_applicationId_fk", + "tableFrom": "deployment", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_composeId_compose_composeId_fk": { + "name": "deployment_composeId_compose_composeId_fk", + "tableFrom": "deployment", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_serverId_server_serverId_fk": { + "name": "deployment_serverId_server_serverId_fk", + "tableFrom": "deployment", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk": { + "name": "deployment_previewDeploymentId_preview_deployments_previewDeploymentId_fk", + "tableFrom": "deployment", + "tableTo": "preview_deployments", + "columnsFrom": [ + "previewDeploymentId" + ], + "columnsTo": [ + "previewDeploymentId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mount": { + "name": "mount", + "schema": "", + "columns": { + "mountId": { + "name": "mountId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "mountType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "hostPath": { + "name": "hostPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "volumeName": { + "name": "volumeName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "filePath": { + "name": "filePath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serviceType": { + "name": "serviceType", + "type": "serviceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'application'" + }, + "mountPath": { + "name": "mountPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mount_applicationId_application_applicationId_fk": { + "name": "mount_applicationId_application_applicationId_fk", + "tableFrom": "mount", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_postgresId_postgres_postgresId_fk": { + "name": "mount_postgresId_postgres_postgresId_fk", + "tableFrom": "mount", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mariadbId_mariadb_mariadbId_fk": { + "name": "mount_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "mount", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mongoId_mongo_mongoId_fk": { + "name": "mount_mongoId_mongo_mongoId_fk", + "tableFrom": "mount", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mysqlId_mysql_mysqlId_fk": { + "name": "mount_mysqlId_mysql_mysqlId_fk", + "tableFrom": "mount", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_redisId_redis_redisId_fk": { + "name": "mount_redisId_redis_redisId_fk", + "tableFrom": "mount", + "tableTo": "redis", + "columnsFrom": [ + "redisId" + ], + "columnsTo": [ + "redisId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_composeId_compose_composeId_fk": { + "name": "mount_composeId_compose_composeId_fk", + "tableFrom": "mount", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.certificate": { + "name": "certificate", + "schema": "", + "columns": { + "certificateId": { + "name": "certificateId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateData": { + "name": "certificateData", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificatePath": { + "name": "certificatePath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "autoRenew": { + "name": "autoRenew", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "organizationId": { + "name": "organizationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "certificate_organizationId_organization_id_fk": { + "name": "certificate_organizationId_organization_id_fk", + "tableFrom": "certificate", + "tableTo": "organization", + "columnsFrom": [ + "organizationId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "certificate_serverId_server_serverId_fk": { + "name": "certificate_serverId_server_serverId_fk", + "tableFrom": "certificate", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "certificate_certificatePath_unique": { + "name": "certificate_certificatePath_unique", + "nullsNotDistinct": false, + "columns": [ + "certificatePath" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.session_temp": { + "name": "session_temp", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "impersonated_by": { + "name": "impersonated_by", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "active_organization_id": { + "name": "active_organization_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "session_temp_user_id_user_temp_id_fk": { + "name": "session_temp_user_id_user_temp_id_fk", + "tableFrom": "session_temp", + "tableTo": "user_temp", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "session_temp_token_unique": { + "name": "session_temp_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.redirect": { + "name": "redirect", + "schema": "", + "columns": { + "redirectId": { + "name": "redirectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "regex": { + "name": "regex", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "replacement": { + "name": "replacement", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "permanent": { + "name": "permanent", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "redirect_applicationId_application_applicationId_fk": { + "name": "redirect_applicationId_application_applicationId_fk", + "tableFrom": "redirect", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.security": { + "name": "security", + "schema": "", + "columns": { + "securityId": { + "name": "securityId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "security_applicationId_application_applicationId_fk": { + "name": "security_applicationId_application_applicationId_fk", + "tableFrom": "security", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "security_username_applicationId_unique": { + "name": "security_username_applicationId_unique", + "nullsNotDistinct": false, + "columns": [ + "username", + "applicationId" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.port": { + "name": "port", + "schema": "", + "columns": { + "portId": { + "name": "portId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "publishedPort": { + "name": "publishedPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "targetPort": { + "name": "targetPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "protocol": { + "name": "protocol", + "type": "protocolType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "port_applicationId_application_applicationId_fk": { + "name": "port_applicationId_application_applicationId_fk", + "tableFrom": "port", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.redis": { + "name": "redis", + "schema": "", + "columns": { + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "redis_projectId_project_projectId_fk": { + "name": "redis_projectId_project_projectId_fk", + "tableFrom": "redis", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "redis_serverId_server_serverId_fk": { + "name": "redis_serverId_server_serverId_fk", + "tableFrom": "redis", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "redis_appName_unique": { + "name": "redis_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.compose": { + "name": "compose", + "schema": "", + "columns": { + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeFile": { + "name": "composeFile", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceTypeCompose", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "composeType": { + "name": "composeType", + "type": "composeType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'docker-compose'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "gitlabProjectId": { + "name": "gitlabProjectId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitlabRepository": { + "name": "gitlabRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabOwner": { + "name": "gitlabOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabBranch": { + "name": "gitlabBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabPathNamespace": { + "name": "gitlabPathNamespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketRepository": { + "name": "bitbucketRepository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketOwner": { + "name": "bitbucketOwner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketBranch": { + "name": "bitbucketBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKeyId": { + "name": "customGitSSHKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "composePath": { + "name": "composePath", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'./docker-compose.yml'" + }, + "suffix": { + "name": "suffix", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "randomize": { + "name": "randomize", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "isolatedDeployment": { + "name": "isolatedDeployment", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "composeStatus": { + "name": "composeStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk": { + "name": "compose_customGitSSHKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "compose", + "tableTo": "ssh-key", + "columnsFrom": [ + "customGitSSHKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_projectId_project_projectId_fk": { + "name": "compose_projectId_project_projectId_fk", + "tableFrom": "compose", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "compose_githubId_github_githubId_fk": { + "name": "compose_githubId_github_githubId_fk", + "tableFrom": "compose", + "tableTo": "github", + "columnsFrom": [ + "githubId" + ], + "columnsTo": [ + "githubId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_gitlabId_gitlab_gitlabId_fk": { + "name": "compose_gitlabId_gitlab_gitlabId_fk", + "tableFrom": "compose", + "tableTo": "gitlab", + "columnsFrom": [ + "gitlabId" + ], + "columnsTo": [ + "gitlabId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_bitbucketId_bitbucket_bitbucketId_fk": { + "name": "compose_bitbucketId_bitbucket_bitbucketId_fk", + "tableFrom": "compose", + "tableTo": "bitbucket", + "columnsFrom": [ + "bitbucketId" + ], + "columnsTo": [ + "bitbucketId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "compose_serverId_server_serverId_fk": { + "name": "compose_serverId_server_serverId_fk", + "tableFrom": "compose", + "tableTo": "server", + "columnsFrom": [ + "serverId" + ], + "columnsTo": [ + "serverId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.registry": { + "name": "registry", + "schema": "", + "columns": { + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "registryName": { + "name": "registryName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "imagePrefix": { + "name": "imagePrefix", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "selfHosted": { + "name": "selfHosted", + "type": "RegistryType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'cloud'" + }, + "organizationId": { + "name": "organizationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "registry_organizationId_organization_id_fk": { + "name": "registry_organizationId_organization_id_fk", + "tableFrom": "registry", + "tableTo": "organization", + "columnsFrom": [ + "organizationId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.discord": { + "name": "discord", + "schema": "", + "columns": { + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.email": { + "name": "email", + "schema": "", + "columns": { + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "smtpServer": { + "name": "smtpServer", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "smtpPort": { + "name": "smtpPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "fromAddress": { + "name": "fromAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "toAddress": { + "name": "toAddress", + "type": "text[]", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.gotify": { + "name": "gotify", + "schema": "", + "columns": { + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "serverUrl": { + "name": "serverUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appToken": { + "name": "appToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "priority": { + "name": "priority", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 5 + }, + "decoration": { + "name": "decoration", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.notification": { + "name": "notification", + "schema": "", + "columns": { + "notificationId": { + "name": "notificationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appDeploy": { + "name": "appDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "appBuildError": { + "name": "appBuildError", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "databaseBackup": { + "name": "databaseBackup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dokployRestart": { + "name": "dokployRestart", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dockerCleanup": { + "name": "dockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "serverThreshold": { + "name": "serverThreshold", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "notificationType": { + "name": "notificationType", + "type": "notificationType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gotifyId": { + "name": "gotifyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "organizationId": { + "name": "organizationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "notification_slackId_slack_slackId_fk": { + "name": "notification_slackId_slack_slackId_fk", + "tableFrom": "notification", + "tableTo": "slack", + "columnsFrom": [ + "slackId" + ], + "columnsTo": [ + "slackId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_telegramId_telegram_telegramId_fk": { + "name": "notification_telegramId_telegram_telegramId_fk", + "tableFrom": "notification", + "tableTo": "telegram", + "columnsFrom": [ + "telegramId" + ], + "columnsTo": [ + "telegramId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_discordId_discord_discordId_fk": { + "name": "notification_discordId_discord_discordId_fk", + "tableFrom": "notification", + "tableTo": "discord", + "columnsFrom": [ + "discordId" + ], + "columnsTo": [ + "discordId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_emailId_email_emailId_fk": { + "name": "notification_emailId_email_emailId_fk", + "tableFrom": "notification", + "tableTo": "email", + "columnsFrom": [ + "emailId" + ], + "columnsTo": [ + "emailId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_gotifyId_gotify_gotifyId_fk": { + "name": "notification_gotifyId_gotify_gotifyId_fk", + "tableFrom": "notification", + "tableTo": "gotify", + "columnsFrom": [ + "gotifyId" + ], + "columnsTo": [ + "gotifyId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_organizationId_organization_id_fk": { + "name": "notification_organizationId_organization_id_fk", + "tableFrom": "notification", + "tableTo": "organization", + "columnsFrom": [ + "organizationId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.slack": { + "name": "slack", + "schema": "", + "columns": { + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "channel": { + "name": "channel", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.telegram": { + "name": "telegram", + "schema": "", + "columns": { + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "botToken": { + "name": "botToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chatId": { + "name": "chatId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "messageThreadId": { + "name": "messageThreadId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ssh-key": { + "name": "ssh-key", + "schema": "", + "columns": { + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "publicKey": { + "name": "publicKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "lastUsedAt": { + "name": "lastUsedAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "organizationId": { + "name": "organizationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "ssh-key_organizationId_organization_id_fk": { + "name": "ssh-key_organizationId_organization_id_fk", + "tableFrom": "ssh-key", + "tableTo": "organization", + "columnsFrom": [ + "organizationId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.git_provider": { + "name": "git_provider", + "schema": "", + "columns": { + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "providerType": { + "name": "providerType", + "type": "gitProviderType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organizationId": { + "name": "organizationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "git_provider_organizationId_organization_id_fk": { + "name": "git_provider_organizationId_organization_id_fk", + "tableFrom": "git_provider", + "tableTo": "organization", + "columnsFrom": [ + "organizationId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.bitbucket": { + "name": "bitbucket", + "schema": "", + "columns": { + "bitbucketId": { + "name": "bitbucketId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "bitbucketUsername": { + "name": "bitbucketUsername", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "appPassword": { + "name": "appPassword", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "bitbucketWorkspaceName": { + "name": "bitbucketWorkspaceName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "bitbucket_gitProviderId_git_provider_gitProviderId_fk": { + "name": "bitbucket_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "bitbucket", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.github": { + "name": "github", + "schema": "", + "columns": { + "githubId": { + "name": "githubId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "githubAppName": { + "name": "githubAppName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubAppId": { + "name": "githubAppId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "githubClientId": { + "name": "githubClientId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubClientSecret": { + "name": "githubClientSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubInstallationId": { + "name": "githubInstallationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubPrivateKey": { + "name": "githubPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubWebhookSecret": { + "name": "githubWebhookSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "github_gitProviderId_git_provider_gitProviderId_fk": { + "name": "github_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "github", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.gitlab": { + "name": "gitlab", + "schema": "", + "columns": { + "gitlabId": { + "name": "gitlabId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "gitlabUrl": { + "name": "gitlabUrl", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'https://gitlab.com'" + }, + "application_id": { + "name": "application_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redirect_uri": { + "name": "redirect_uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "group_name": { + "name": "group_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "gitProviderId": { + "name": "gitProviderId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "gitlab_gitProviderId_git_provider_gitProviderId_fk": { + "name": "gitlab_gitProviderId_git_provider_gitProviderId_fk", + "tableFrom": "gitlab", + "tableTo": "git_provider", + "columnsFrom": [ + "gitProviderId" + ], + "columnsTo": [ + "gitProviderId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.server": { + "name": "server", + "schema": "", + "columns": { + "serverId": { + "name": "serverId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ipAddress": { + "name": "ipAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'root'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organizationId": { + "name": "organizationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "serverStatus": { + "name": "serverStatus", + "type": "serverStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'active'" + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "sshKeyId": { + "name": "sshKeyId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "metricsConfig": { + "name": "metricsConfig", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{\"server\":{\"type\":\"Remote\",\"refreshRate\":60,\"port\":4500,\"token\":\"\",\"urlCallback\":\"\",\"cronJob\":\"\",\"retentionDays\":2,\"thresholds\":{\"cpu\":0,\"memory\":0}},\"containers\":{\"refreshRate\":60,\"services\":{\"include\":[],\"exclude\":[]}}}'::jsonb" + } + }, + "indexes": {}, + "foreignKeys": { + "server_organizationId_organization_id_fk": { + "name": "server_organizationId_organization_id_fk", + "tableFrom": "server", + "tableTo": "organization", + "columnsFrom": [ + "organizationId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "server_sshKeyId_ssh-key_sshKeyId_fk": { + "name": "server_sshKeyId_ssh-key_sshKeyId_fk", + "tableFrom": "server", + "tableTo": "ssh-key", + "columnsFrom": [ + "sshKeyId" + ], + "columnsTo": [ + "sshKeyId" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.preview_deployments": { + "name": "preview_deployments", + "schema": "", + "columns": { + "previewDeploymentId": { + "name": "previewDeploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestId": { + "name": "pullRequestId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestNumber": { + "name": "pullRequestNumber", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestURL": { + "name": "pullRequestURL", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestTitle": { + "name": "pullRequestTitle", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "pullRequestCommentId": { + "name": "pullRequestCommentId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "previewStatus": { + "name": "previewStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "preview_deployments_applicationId_application_applicationId_fk": { + "name": "preview_deployments_applicationId_application_applicationId_fk", + "tableFrom": "preview_deployments", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "preview_deployments_domainId_domain_domainId_fk": { + "name": "preview_deployments_domainId_domain_domainId_fk", + "tableFrom": "preview_deployments", + "tableTo": "domain", + "columnsFrom": [ + "domainId" + ], + "columnsTo": [ + "domainId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "preview_deployments_appName_unique": { + "name": "preview_deployments_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.account": { + "name": "account", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token_expires_at": { + "name": "access_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "refresh_token_expires_at": { + "name": "refresh_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is2FAEnabled": { + "name": "is2FAEnabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "resetPasswordToken": { + "name": "resetPasswordToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "resetPasswordExpiresAt": { + "name": "resetPasswordExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationToken": { + "name": "confirmationToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confirmationExpiresAt": { + "name": "confirmationExpiresAt", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "account_user_id_user_temp_id_fk": { + "name": "account_user_id_user_temp_id_fk", + "tableFrom": "account", + "tableTo": "user_temp", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.apikey": { + "name": "apikey", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "start": { + "name": "start", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "prefix": { + "name": "prefix", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "refill_interval": { + "name": "refill_interval", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "refill_amount": { + "name": "refill_amount", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "last_refill_at": { + "name": "last_refill_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "rate_limit_enabled": { + "name": "rate_limit_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "rate_limit_time_window": { + "name": "rate_limit_time_window", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "rate_limit_max": { + "name": "rate_limit_max", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "request_count": { + "name": "request_count", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "remaining": { + "name": "remaining", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "last_request": { + "name": "last_request", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "permissions": { + "name": "permissions", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "metadata": { + "name": "metadata", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "apikey_user_id_user_temp_id_fk": { + "name": "apikey_user_id_user_temp_id_fk", + "tableFrom": "apikey", + "tableTo": "user_temp", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.invitation": { + "name": "invitation", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "inviter_id": { + "name": "inviter_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "team_id": { + "name": "team_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "invitation_organization_id_organization_id_fk": { + "name": "invitation_organization_id_organization_id_fk", + "tableFrom": "invitation", + "tableTo": "organization", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "invitation_inviter_id_user_temp_id_fk": { + "name": "invitation_inviter_id_user_temp_id_fk", + "tableFrom": "invitation", + "tableTo": "user_temp", + "columnsFrom": [ + "inviter_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.member": { + "name": "member", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "team_id": { + "name": "team_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "canCreateProjects": { + "name": "canCreateProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToSSHKeys": { + "name": "canAccessToSSHKeys", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canCreateServices": { + "name": "canCreateServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteProjects": { + "name": "canDeleteProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteServices": { + "name": "canDeleteServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToDocker": { + "name": "canAccessToDocker", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToAPI": { + "name": "canAccessToAPI", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToGitProviders": { + "name": "canAccessToGitProviders", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToTraefikFiles": { + "name": "canAccessToTraefikFiles", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "accesedProjects": { + "name": "accesedProjects", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "accesedServices": { + "name": "accesedServices", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + } + }, + "indexes": {}, + "foreignKeys": { + "member_organization_id_organization_id_fk": { + "name": "member_organization_id_organization_id_fk", + "tableFrom": "member", + "tableTo": "organization", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "member_user_id_user_temp_id_fk": { + "name": "member_user_id_user_temp_id_fk", + "tableFrom": "member", + "tableTo": "user_temp", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.organization": { + "name": "organization", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slug": { + "name": "slug", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "logo": { + "name": "logo", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "metadata": { + "name": "metadata", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "organization_owner_id_user_temp_id_fk": { + "name": "organization_owner_id_user_temp_id_fk", + "tableFrom": "organization", + "tableTo": "user_temp", + "columnsFrom": [ + "owner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "organization_slug_unique": { + "name": "organization_slug_unique", + "nullsNotDistinct": false, + "columns": [ + "slug" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.two_factor": { + "name": "two_factor", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "backup_codes": { + "name": "backup_codes", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "two_factor_user_id_user_temp_id_fk": { + "name": "two_factor_user_id_user_temp_id_fk", + "tableFrom": "two_factor", + "tableTo": "user_temp", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.verification": { + "name": "verification", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.buildType": { + "name": "buildType", + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks", + "static" + ] + }, + "public.sourceType": { + "name": "sourceType", + "schema": "public", + "values": [ + "docker", + "git", + "github", + "gitlab", + "bitbucket", + "drop" + ] + }, + "public.domainType": { + "name": "domainType", + "schema": "public", + "values": [ + "compose", + "application", + "preview" + ] + }, + "public.databaseType": { + "name": "databaseType", + "schema": "public", + "values": [ + "postgres", + "mariadb", + "mysql", + "mongo" + ] + }, + "public.deploymentStatus": { + "name": "deploymentStatus", + "schema": "public", + "values": [ + "running", + "done", + "error" + ] + }, + "public.mountType": { + "name": "mountType", + "schema": "public", + "values": [ + "bind", + "volume", + "file" + ] + }, + "public.serviceType": { + "name": "serviceType", + "schema": "public", + "values": [ + "application", + "postgres", + "mysql", + "mariadb", + "mongo", + "redis", + "compose" + ] + }, + "public.protocolType": { + "name": "protocolType", + "schema": "public", + "values": [ + "tcp", + "udp" + ] + }, + "public.applicationStatus": { + "name": "applicationStatus", + "schema": "public", + "values": [ + "idle", + "running", + "done", + "error" + ] + }, + "public.certificateType": { + "name": "certificateType", + "schema": "public", + "values": [ + "letsencrypt", + "none" + ] + }, + "public.composeType": { + "name": "composeType", + "schema": "public", + "values": [ + "docker-compose", + "stack" + ] + }, + "public.sourceTypeCompose": { + "name": "sourceTypeCompose", + "schema": "public", + "values": [ + "git", + "github", + "gitlab", + "bitbucket", + "raw" + ] + }, + "public.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + }, + "public.notificationType": { + "name": "notificationType", + "schema": "public", + "values": [ + "slack", + "telegram", + "discord", + "email", + "gotify" + ] + }, + "public.gitProviderType": { + "name": "gitProviderType", + "schema": "public", + "values": [ + "github", + "gitlab", + "bitbucket" + ] + }, + "public.serverStatus": { + "name": "serverStatus", + "schema": "public", + "values": [ + "active", + "inactive" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/dokploy/drizzle/meta/_journal.json b/apps/dokploy/drizzle/meta/_journal.json index 7943d693..b6009700 100644 --- a/apps/dokploy/drizzle/meta/_journal.json +++ b/apps/dokploy/drizzle/meta/_journal.json @@ -404,8 +404,78 @@ { "idx": 57, "version": "6", - "when": 1737251708859, - "tag": "0057_damp_prism", + "when": 1737306063563, + "tag": "0057_tricky_living_tribunal", + "breakpoints": true + }, + { + "idx": 58, + "version": "6", + "when": 1737612903012, + "tag": "0058_brown_sharon_carter", + "breakpoints": true + }, + { + "idx": 59, + "version": "6", + "when": 1737615160768, + "tag": "0059_striped_bill_hollister", + "breakpoints": true + }, + { + "idx": 60, + "version": "6", + "when": 1737929896838, + "tag": "0060_disable-aggressive-cache", + "breakpoints": true + }, + { + "idx": 61, + "version": "7", + "when": 1738481304953, + "tag": "0061_many_molten_man", + "breakpoints": true + }, + { + "idx": 62, + "version": "7", + "when": 1738482795112, + "tag": "0062_slippery_white_tiger", + "breakpoints": true + }, + { + "idx": 63, + "version": "7", + "when": 1738522845992, + "tag": "0063_panoramic_dreadnoughts", + "breakpoints": true + }, + { + "idx": 64, + "version": "7", + "when": 1738564387043, + "tag": "0064_previous_agent_brand", + "breakpoints": true + }, + { + "idx": 65, + "version": "7", + "when": 1739087857244, + "tag": "0065_daily_zaladane", + "breakpoints": true + }, + { + "idx": 66, + "version": "7", + "when": 1739426913392, + "tag": "0066_yielding_echo", + "breakpoints": true + }, + { + "idx": 67, + "version": "7", + "when": 1740892043121, + "tag": "0067_condemned_sugar_man", "breakpoints": true } ] diff --git a/apps/dokploy/hooks/useLocalStorage.tsx b/apps/dokploy/hooks/useLocalStorage.tsx new file mode 100644 index 00000000..e7462a1a --- /dev/null +++ b/apps/dokploy/hooks/useLocalStorage.tsx @@ -0,0 +1,33 @@ +import { useState } from "react"; + +export const useLocalStorage = (key: string, initialValue: boolean) => { + // State to store our value + // Pass initial state function to useState so logic is only executed once + const [storedValue, setStoredValue] = useState(() => { + try { + if (typeof window === "undefined") return initialValue; + const item = window.localStorage.getItem(key); + return item ? JSON.parse(item) : initialValue; + } catch (error) { + console.error(error); + return initialValue; + } + }); + + // Return a wrapped version of useState's setter function that persists the new value to localStorage + const setValue = (value: boolean | ((val: boolean) => boolean)) => { + try { + // Allow value to be a function so we have same API as useState + const valueToStore = + value instanceof Function ? value(storedValue) : value; + setStoredValue(valueToStore); + if (typeof window !== "undefined") { + window.localStorage.setItem(key, JSON.stringify(valueToStore)); + } + } catch (error) { + console.error(error); + } + }; + + return [storedValue, setValue] as const; +}; diff --git a/apps/dokploy/lib/auth-client.ts b/apps/dokploy/lib/auth-client.ts new file mode 100644 index 00000000..f1088e73 --- /dev/null +++ b/apps/dokploy/lib/auth-client.ts @@ -0,0 +1,9 @@ +import { organizationClient } from "better-auth/client/plugins"; +import { twoFactorClient } from "better-auth/client/plugins"; +import { apiKeyClient } from "better-auth/client/plugins"; +import { createAuthClient } from "better-auth/react"; + +export const authClient = createAuthClient({ + // baseURL: "http://localhost:3000", // the base url of your auth server + plugins: [organizationClient(), twoFactorClient(), apiKeyClient()], +}); diff --git a/apps/dokploy/lib/languages.ts b/apps/dokploy/lib/languages.ts index f83b3de6..a19c9589 100644 --- a/apps/dokploy/lib/languages.ts +++ b/apps/dokploy/lib/languages.ts @@ -1,6 +1,7 @@ export const Languages = { english: { code: "en", name: "English" }, polish: { code: "pl", name: "Polski" }, + ukrainian: { code: "uk", name: "Українська" }, russian: { code: "ru", name: "Русский" }, french: { code: "fr", name: "Français" }, german: { code: "de", name: "Deutsch" }, @@ -17,6 +18,7 @@ export const Languages = { norwegian: { code: "no", name: "Norsk" }, azerbaijani: { code: "az", name: "Azərbaycan" }, indonesian: { code: "id", name: "Bahasa Indonesia" }, + malayalam: { code: "ml", name: "മലയാളം" }, }; export type Language = keyof typeof Languages; diff --git a/apps/dokploy/lib/utils.ts b/apps/dokploy/lib/utils.ts index c83f5e22..b763e9ee 100644 --- a/apps/dokploy/lib/utils.ts +++ b/apps/dokploy/lib/utils.ts @@ -12,3 +12,18 @@ export async function generateSHA256Hash(text: string) { const hashArray = Array.from(new Uint8Array(hashBuffer)); return hashArray.map((b) => b.toString(16).padStart(2, "0")).join(""); } + +export function formatTimestamp(timestamp: string | number) { + try { + // Si es un string ISO, lo parseamos directamente + if (typeof timestamp === "string" && timestamp.includes("T")) { + const date = new Date(timestamp); + if (!Number.isNaN(date.getTime())) { + return date.toLocaleString(); + } + } + return "Fecha inválida"; + } catch { + return "Fecha inválida"; + } +} diff --git a/apps/dokploy/migrate.ts b/apps/dokploy/migrate.ts new file mode 100644 index 00000000..e1f52c9a --- /dev/null +++ b/apps/dokploy/migrate.ts @@ -0,0 +1,149 @@ +// import { drizzle } from "drizzle-orm/postgres-js"; +// import { nanoid } from "nanoid"; +// import postgres from "postgres"; +// import * as schema from "./server/db/schema"; + +// const connectionString = process.env.DATABASE_URL!; + +// const sql = postgres(connectionString, { max: 1 }); +// const db = drizzle(sql, { +// schema, +// }); + +// await db +// .transaction(async (db) => { +// const admins = await db.query.admins.findMany({ +// with: { +// auth: true, +// users: { +// with: { +// auth: true, +// }, +// }, +// }, +// }); +// for (const admin of admins) { +// const user = await db +// .insert(schema.users_temp) +// .values({ +// id: admin.adminId, +// email: admin.auth.email, +// token: admin.auth.token || "", +// emailVerified: true, +// updatedAt: new Date(), +// role: "admin", +// serverIp: admin.serverIp, +// image: admin.auth.image, +// certificateType: admin.certificateType, +// host: admin.host, +// letsEncryptEmail: admin.letsEncryptEmail, +// sshPrivateKey: admin.sshPrivateKey, +// enableDockerCleanup: admin.enableDockerCleanup, +// enableLogRotation: admin.enableLogRotation, +// enablePaidFeatures: admin.enablePaidFeatures, +// metricsConfig: admin.metricsConfig, +// cleanupCacheApplications: admin.cleanupCacheApplications, +// cleanupCacheOnPreviews: admin.cleanupCacheOnPreviews, +// cleanupCacheOnCompose: admin.cleanupCacheOnCompose, +// stripeCustomerId: admin.stripeCustomerId, +// stripeSubscriptionId: admin.stripeSubscriptionId, +// serversQuantity: admin.serversQuantity, +// }) +// .returning() +// .then((user) => user[0]); + +// await db.insert(schema.account).values({ +// providerId: "credential", +// userId: user?.id || "", +// password: admin.auth.password, +// is2FAEnabled: admin.auth.is2FAEnabled || false, +// createdAt: new Date(admin.auth.createdAt) || new Date(), +// updatedAt: new Date(admin.auth.createdAt) || new Date(), +// }); + +// const organization = await db +// .insert(schema.organization) +// .values({ +// name: "My Organization", +// slug: nanoid(), +// ownerId: user?.id || "", +// createdAt: new Date(admin.createdAt) || new Date(), +// }) +// .returning() +// .then((organization) => organization[0]); + +// for (const member of admin.users) { +// const userTemp = await db +// .insert(schema.users_temp) +// .values({ +// id: member.userId, +// email: member.auth.email, +// token: member.token || "", +// emailVerified: true, +// updatedAt: new Date(admin.createdAt) || new Date(), +// role: "user", +// image: member.auth.image, +// createdAt: admin.createdAt, +// canAccessToAPI: member.canAccessToAPI || false, +// canAccessToDocker: member.canAccessToDocker || false, +// canAccessToGitProviders: member.canAccessToGitProviders || false, +// canAccessToSSHKeys: member.canAccessToSSHKeys || false, +// canAccessToTraefikFiles: member.canAccessToTraefikFiles || false, +// canCreateProjects: member.canCreateProjects || false, +// canCreateServices: member.canCreateServices || false, +// canDeleteProjects: member.canDeleteProjects || false, +// canDeleteServices: member.canDeleteServices || false, +// accessedProjects: member.accessedProjects || [], +// accessedServices: member.accessedServices || [], +// }) +// .returning() +// .then((userTemp) => userTemp[0]); + +// await db.insert(schema.account).values({ +// providerId: "credential", +// userId: member?.userId || "", +// password: member.auth.password, +// is2FAEnabled: member.auth.is2FAEnabled || false, +// createdAt: new Date(member.auth.createdAt) || new Date(), +// updatedAt: new Date(member.auth.createdAt) || new Date(), +// }); + +// await db.insert(schema.member).values({ +// organizationId: organization?.id || "", +// userId: userTemp?.id || "", +// role: "admin", +// createdAt: new Date(member.createdAt) || new Date(), +// }); +// } +// } +// }) +// .then(() => { +// console.log("Migration finished"); +// }) +// .catch((error) => { +// console.error(error); +// }); + +// await db +// .transaction(async (db) => { +// const projects = await db.query.projects.findMany({ +// with: { +// user: { +// with: { +// organizations: true, +// }, +// }, +// }, +// }); +// for (const project of projects) { +// const _user = await db.update(schema.projects).set({ +// organizationId: project.user.organizations[0]?.id || "", +// }); +// } +// }) +// .then(() => { +// console.log("Migration finished"); +// }) +// .catch((error) => { +// console.error(error); +// }); diff --git a/apps/dokploy/package.json b/apps/dokploy/package.json index 27c0eb87..12ff30b8 100644 --- a/apps/dokploy/package.json +++ b/apps/dokploy/package.json @@ -1,6 +1,6 @@ { "name": "dokploy", - "version": "v0.17.2", + "version": "v0.18.4", "private": true, "license": "Apache-2.0", "type": "module", @@ -16,6 +16,7 @@ "studio": "drizzle-kit studio --config ./server/db/drizzle.config.ts", "migration:generate": "drizzle-kit generate --config ./server/db/drizzle.config.ts", "migration:run": "tsx -r dotenv/config migration.ts", + "manual-migration:run": "tsx -r dotenv/config migrate.ts", "migration:up": "drizzle-kit up --config ./server/db/drizzle.config.ts", "migration:drop": "drizzle-kit drop --config ./server/db/drizzle.config.ts", "db:push": "drizzle-kit push --config ./server/db/drizzle.config.ts", @@ -36,6 +37,19 @@ }, "dependencies": { "@ai-sdk/openai": "^1.0.12", + "better-auth": "1.2.0", + "bl": "6.0.11", + "rotating-file-stream": "3.2.3", + "qrcode": "^1.5.3", + "otpauth": "^9.2.3", + "hi-base32": "^0.5.1", + "boxen": "^7.1.1", + "@octokit/auth-app": "^6.0.4", + "nodemailer": "6.9.14", + "@react-email/components": "^0.0.21", + "node-os-utils": "1.3.7", + "@lucia-auth/adapter-drizzle": "1.0.7", + "dockerode": "4.0.2", "@codemirror/lang-json": "^6.0.1", "@codemirror/lang-yaml": "^6.1.1", "@codemirror/language": "^6.10.1", @@ -76,6 +90,7 @@ "@uiw/react-codemirror": "^4.22.1", "@xterm/addon-attach": "0.10.0", "@xterm/xterm": "^5.4.0", + "@xterm/addon-clipboard": "0.1.0", "adm-zip": "^0.5.14", "ai": "^4.0.23", "bcrypt": "5.1.1", @@ -87,7 +102,7 @@ "copy-webpack-plugin": "^12.0.2", "date-fns": "3.6.0", "dotenv": "16.4.5", - "drizzle-orm": "^0.30.8", + "drizzle-orm": "^0.39.1", "drizzle-zod": "0.5.1", "fancy-ansi": "^0.1.3", "i18next": "^23.16.4", @@ -108,6 +123,7 @@ "public-ip": "6.0.2", "react": "18.2.0", "react-confetti-explosion": "2.1.2", + "react-day-picker": "8.10.1", "react-dom": "18.2.0", "react-hook-form": "^7.52.1", "react-i18next": "^15.1.0", @@ -130,7 +146,9 @@ "@faker-js/faker": "^8.4.1" }, "devDependencies": { - "@tailwindcss/typography": "^0.5.15", + "@types/qrcode": "^1.5.5", + "@types/nodemailer": "^6.4.15", + "@types/node-os-utils": "1.3.4", "@types/adm-zip": "^0.5.5", "@types/bcrypt": "5.0.2", "@types/js-cookie": "^3.0.6", @@ -144,7 +162,7 @@ "@types/swagger-ui-react": "^4.18.3", "@types/ws": "8.5.10", "autoprefixer": "10.4.12", - "drizzle-kit": "^0.21.1", + "drizzle-kit": "^0.30.4", "esbuild": "0.20.2", "lint-staged": "^15.2.7", "memfs": "^4.11.0", diff --git a/apps/dokploy/pages/_error.tsx b/apps/dokploy/pages/_error.tsx index 958e1740..d28e2cb0 100644 --- a/apps/dokploy/pages/_error.tsx +++ b/apps/dokploy/pages/_error.tsx @@ -90,7 +90,7 @@ export default function Custom404({ statusCode, error }: Props) { } // @ts-ignore -Error.getInitialProps = ({ res, err, ...rest }: NextPageContext) => { +Error.getInitialProps = ({ res, err }: NextPageContext) => { const statusCode = res ? res.statusCode : err ? err.statusCode : 404; return { statusCode, error: err }; }; diff --git a/apps/dokploy/pages/accept-invitation/[accept-invitation].tsx b/apps/dokploy/pages/accept-invitation/[accept-invitation].tsx new file mode 100644 index 00000000..bc60d970 --- /dev/null +++ b/apps/dokploy/pages/accept-invitation/[accept-invitation].tsx @@ -0,0 +1,30 @@ +import { Button } from "@/components/ui/button"; +import { authClient } from "@/lib/auth-client"; +import { useRouter } from "next/router"; + +export const AcceptInvitation = () => { + const { query } = useRouter(); + + const invitationId = query["accept-invitation"]; + + // const { data: organization } = api.organization.getById.useQuery({ + // id: id as string + // }) + + return ( +
+ +
+ ); +}; + +export default AcceptInvitation; diff --git a/apps/dokploy/pages/api/[...trpc].ts b/apps/dokploy/pages/api/[...trpc].ts index df85440b..85ddbb28 100644 --- a/apps/dokploy/pages/api/[...trpc].ts +++ b/apps/dokploy/pages/api/[...trpc].ts @@ -1,17 +1,11 @@ import { appRouter } from "@/server/api/root"; import { createTRPCContext } from "@/server/api/trpc"; -import { validateBearerToken, validateRequest } from "@dokploy/server"; +import { validateRequest } from "@dokploy/server"; import { createOpenApiNextHandler } from "@dokploy/trpc-openapi"; import type { NextApiRequest, NextApiResponse } from "next"; const handler = async (req: NextApiRequest, res: NextApiResponse) => { - let { session, user } = await validateBearerToken(req); - - if (!session) { - const cookieResult = await validateRequest(req, res); - session = cookieResult.session; - user = cookieResult.user; - } + const { session, user } = await validateRequest(req); if (!user || !session) { res.status(401).json({ message: "Unauthorized" }); diff --git a/apps/dokploy/pages/api/auth/[...all].ts b/apps/dokploy/pages/api/auth/[...all].ts new file mode 100644 index 00000000..48aa0370 --- /dev/null +++ b/apps/dokploy/pages/api/auth/[...all].ts @@ -0,0 +1,7 @@ +import { auth } from "@dokploy/server/index"; +import { toNodeHandler } from "better-auth/node"; + +// Disallow body parsing, we will parse it manually +export const config = { api: { bodyParser: false } }; + +export default toNodeHandler(auth.handler); diff --git a/apps/dokploy/pages/api/deploy/github.ts b/apps/dokploy/pages/api/deploy/github.ts index 2ee17394..5e64d8b2 100644 --- a/apps/dokploy/pages/api/deploy/github.ts +++ b/apps/dokploy/pages/api/deploy/github.ts @@ -3,9 +3,7 @@ import { applications, compose, github } from "@/server/db/schema"; import type { DeploymentJob } from "@/server/queues/queue-types"; import { myQueue } from "@/server/queues/queueSetup"; import { deploy } from "@/server/utils/deploy"; -import { generateRandomDomain } from "@/templates/utils"; import { - type Domain, IS_CLOUD, createPreviewDeployment, findPreviewDeploymentByApplicationId, @@ -121,7 +119,7 @@ export default async function handler( if (IS_CLOUD && app.serverId) { jobData.serverId = app.serverId; await deploy(jobData); - return true; + continue; } await myQueue.add( "deployments", @@ -156,7 +154,7 @@ export default async function handler( if (IS_CLOUD && composeApp.serverId) { jobData.serverId = composeApp.serverId; await deploy(jobData); - return true; + continue; } await myQueue.add( @@ -182,8 +180,9 @@ export default async function handler( } } else if (req.headers["x-github-event"] === "pull_request") { const prId = githubBody?.pull_request?.id; + const action = githubBody?.action; - if (githubBody?.action === "closed") { + if (action === "closed") { const previewDeploymentResult = await findPreviewDeploymentsByPullRequestId(prId); @@ -201,79 +200,86 @@ export default async function handler( res.status(200).json({ message: "Preview Deployment Closed" }); return; } + // opened or synchronize or reopened - const repository = githubBody?.repository?.name; - const deploymentHash = githubBody?.pull_request?.head?.sha; - const branch = githubBody?.pull_request?.base?.ref; - const owner = githubBody?.repository?.owner?.login; + if ( + action === "opened" || + action === "synchronize" || + action === "reopened" + ) { + const repository = githubBody?.repository?.name; + const deploymentHash = githubBody?.pull_request?.head?.sha; + const branch = githubBody?.pull_request?.base?.ref; + const owner = githubBody?.repository?.owner?.login; - const apps = await db.query.applications.findMany({ - where: and( - eq(applications.sourceType, "github"), - eq(applications.repository, repository), - eq(applications.branch, branch), - eq(applications.isPreviewDeploymentsActive, true), - eq(applications.owner, owner), - ), - with: { - previewDeployments: true, - }, - }); - - const prBranch = githubBody?.pull_request?.head?.ref; - - const prNumber = githubBody?.pull_request?.number; - const prTitle = githubBody?.pull_request?.title; - const prURL = githubBody?.pull_request?.html_url; - - for (const app of apps) { - const previewLimit = app?.previewLimit || 0; - if (app?.previewDeployments?.length > previewLimit) { - continue; - } - const previewDeploymentResult = - await findPreviewDeploymentByApplicationId(app.applicationId, prId); - - let previewDeploymentId = - previewDeploymentResult?.previewDeploymentId || ""; - - if (!previewDeploymentResult) { - const previewDeployment = await createPreviewDeployment({ - applicationId: app.applicationId as string, - branch: prBranch, - pullRequestId: prId, - pullRequestNumber: prNumber, - pullRequestTitle: prTitle, - pullRequestURL: prURL, - }); - previewDeploymentId = previewDeployment.previewDeploymentId; - } - - const jobData: DeploymentJob = { - applicationId: app.applicationId as string, - titleLog: "Preview Deployment", - descriptionLog: `Hash: ${deploymentHash}`, - type: "deploy", - applicationType: "application-preview", - server: !!app.serverId, - previewDeploymentId, - }; - - if (IS_CLOUD && app.serverId) { - jobData.serverId = app.serverId; - await deploy(jobData); - return true; - } - await myQueue.add( - "deployments", - { ...jobData }, - { - removeOnComplete: true, - removeOnFail: true, + const apps = await db.query.applications.findMany({ + where: and( + eq(applications.sourceType, "github"), + eq(applications.repository, repository), + eq(applications.branch, branch), + eq(applications.isPreviewDeploymentsActive, true), + eq(applications.owner, owner), + ), + with: { + previewDeployments: true, }, - ); + }); + + const prBranch = githubBody?.pull_request?.head?.ref; + + const prNumber = githubBody?.pull_request?.number; + const prTitle = githubBody?.pull_request?.title; + const prURL = githubBody?.pull_request?.html_url; + + for (const app of apps) { + const previewLimit = app?.previewLimit || 0; + if (app?.previewDeployments?.length > previewLimit) { + continue; + } + const previewDeploymentResult = + await findPreviewDeploymentByApplicationId(app.applicationId, prId); + + let previewDeploymentId = + previewDeploymentResult?.previewDeploymentId || ""; + + if (!previewDeploymentResult) { + const previewDeployment = await createPreviewDeployment({ + applicationId: app.applicationId as string, + branch: prBranch, + pullRequestId: prId, + pullRequestNumber: prNumber, + pullRequestTitle: prTitle, + pullRequestURL: prURL, + }); + previewDeploymentId = previewDeployment.previewDeploymentId; + } + + const jobData: DeploymentJob = { + applicationId: app.applicationId as string, + titleLog: "Preview Deployment", + descriptionLog: `Hash: ${deploymentHash}`, + type: "deploy", + applicationType: "application-preview", + server: !!app.serverId, + previewDeploymentId, + }; + + if (IS_CLOUD && app.serverId) { + jobData.serverId = app.serverId; + await deploy(jobData); + continue; + } + await myQueue.add( + "deployments", + { ...jobData }, + { + removeOnComplete: true, + removeOnFail: true, + }, + ); + } + return res.status(200).json({ message: "Apps Deployed" }); } - return res.status(200).json({ message: "Apps Deployed" }); } return res.status(400).json({ message: "No Actions matched" }); diff --git a/apps/dokploy/pages/api/health.ts b/apps/dokploy/pages/api/health.ts index 9dc8101e..57875a19 100644 --- a/apps/dokploy/pages/api/health.ts +++ b/apps/dokploy/pages/api/health.ts @@ -1,7 +1,7 @@ import type { NextApiRequest, NextApiResponse } from "next"; export default async function handler( - req: NextApiRequest, + _req: NextApiRequest, res: NextApiResponse, ) { return res.status(200).json({ ok: true }); diff --git a/apps/dokploy/pages/api/providers/github/setup.ts b/apps/dokploy/pages/api/providers/github/setup.ts index a1ce98d4..32712250 100644 --- a/apps/dokploy/pages/api/providers/github/setup.ts +++ b/apps/dokploy/pages/api/providers/github/setup.ts @@ -1,11 +1,6 @@ import { db } from "@/server/db"; import { github } from "@/server/db/schema"; -import { - createGithub, - findAdminByAuthId, - findAuthById, - findUserByAuthId, -} from "@dokploy/server"; +import { createGithub } from "@dokploy/server"; import { eq } from "drizzle-orm"; import type { NextApiRequest, NextApiResponse } from "next"; import { Octokit } from "octokit"; @@ -21,14 +16,13 @@ export default async function handler( req: NextApiRequest, res: NextApiResponse, ) { - const { code, state, installation_id, setup_action }: Query = - req.query as Query; + const { code, state, installation_id }: Query = req.query as Query; if (!code) { return res.status(400).json({ error: "Missing code parameter" }); } const [action, value] = state?.split(":"); - // Value could be the authId or the githubProviderId + // Value could be the organizationId or the githubProviderId if (action === "gh_init") { const octokit = new Octokit({}); @@ -39,17 +33,6 @@ export default async function handler( }, ); - const auth = await findAuthById(value as string); - - let adminId = ""; - if (auth.rol === "admin") { - const admin = await findAdminByAuthId(auth.id); - adminId = admin.adminId; - } else { - const user = await findUserByAuthId(auth.id); - adminId = user.adminId; - } - await createGithub( { name: data.name, @@ -60,7 +43,7 @@ export default async function handler( githubWebhookSecret: data.webhook_secret, githubPrivateKey: data.pem, }, - adminId, + value as string, ); } else if (action === "gh_setup") { await db diff --git a/apps/dokploy/pages/api/stripe/webhook.ts b/apps/dokploy/pages/api/stripe/webhook.ts index d4599f78..9e8c9da5 100644 --- a/apps/dokploy/pages/api/stripe/webhook.ts +++ b/apps/dokploy/pages/api/stripe/webhook.ts @@ -1,7 +1,7 @@ import { buffer } from "node:stream/consumers"; import { db } from "@/server/db"; -import { admins, server } from "@/server/db/schema"; -import { findAdminById } from "@dokploy/server"; +import { organization, server, users_temp } from "@/server/db/schema"; +import { type Server, findUserById } from "@dokploy/server"; import { asc, eq } from "drizzle-orm"; import type { NextApiRequest, NextApiResponse } from "next"; import Stripe from "stripe"; @@ -64,33 +64,35 @@ export default async function handler( session.subscription as string, ); await db - .update(admins) + .update(users_temp) .set({ stripeCustomerId: session.customer as string, stripeSubscriptionId: session.subscription as string, serversQuantity: subscription?.items?.data?.[0]?.quantity ?? 0, }) - .where(eq(admins.adminId, adminId)) + .where(eq(users_temp.id, adminId)) .returning(); - const admin = await findAdminById(adminId); + const admin = await findUserById(adminId); if (!admin) { return res.status(400).send("Webhook Error: Admin not found"); } const newServersQuantity = admin.serversQuantity; - await updateServersBasedOnQuantity(admin.adminId, newServersQuantity); + await updateServersBasedOnQuantity(admin.id, newServersQuantity); break; } case "customer.subscription.created": { const newSubscription = event.data.object as Stripe.Subscription; await db - .update(admins) + .update(users_temp) .set({ stripeSubscriptionId: newSubscription.id, stripeCustomerId: newSubscription.customer as string, }) - .where(eq(admins.stripeCustomerId, newSubscription.customer as string)) + .where( + eq(users_temp.stripeCustomerId, newSubscription.customer as string), + ) .returning(); break; @@ -100,14 +102,16 @@ export default async function handler( const newSubscription = event.data.object as Stripe.Subscription; await db - .update(admins) + .update(users_temp) .set({ stripeSubscriptionId: null, serversQuantity: 0, }) - .where(eq(admins.stripeCustomerId, newSubscription.customer as string)); + .where( + eq(users_temp.stripeCustomerId, newSubscription.customer as string), + ); - const admin = await findAdminByStripeCustomerId( + const admin = await findUserByStripeCustomerId( newSubscription.customer as string, ); @@ -115,13 +119,13 @@ export default async function handler( return res.status(400).send("Webhook Error: Admin not found"); } - await disableServers(admin.adminId); + await disableServers(admin.id); break; } case "customer.subscription.updated": { const newSubscription = event.data.object as Stripe.Subscription; - const admin = await findAdminByStripeCustomerId( + const admin = await findUserByStripeCustomerId( newSubscription.customer as string, ); @@ -131,23 +135,23 @@ export default async function handler( if (newSubscription.status === "active") { await db - .update(admins) + .update(users_temp) .set({ serversQuantity: newSubscription?.items?.data?.[0]?.quantity ?? 0, }) .where( - eq(admins.stripeCustomerId, newSubscription.customer as string), + eq(users_temp.stripeCustomerId, newSubscription.customer as string), ); const newServersQuantity = admin.serversQuantity; - await updateServersBasedOnQuantity(admin.adminId, newServersQuantity); + await updateServersBasedOnQuantity(admin.id, newServersQuantity); } else { - await disableServers(admin.adminId); + await disableServers(admin.id); await db - .update(admins) + .update(users_temp) .set({ serversQuantity: 0 }) .where( - eq(admins.stripeCustomerId, newSubscription.customer as string), + eq(users_temp.stripeCustomerId, newSubscription.customer as string), ); } @@ -168,13 +172,13 @@ export default async function handler( } await db - .update(admins) + .update(users_temp) .set({ serversQuantity: suscription?.items?.data?.[0]?.quantity ?? 0, }) - .where(eq(admins.stripeCustomerId, suscription.customer as string)); + .where(eq(users_temp.stripeCustomerId, suscription.customer as string)); - const admin = await findAdminByStripeCustomerId( + const admin = await findUserByStripeCustomerId( suscription.customer as string, ); @@ -182,7 +186,7 @@ export default async function handler( return res.status(400).send("Webhook Error: Admin not found"); } const newServersQuantity = admin.serversQuantity; - await updateServersBasedOnQuantity(admin.adminId, newServersQuantity); + await updateServersBasedOnQuantity(admin.id, newServersQuantity); break; } case "invoice.payment_failed": { @@ -193,7 +197,7 @@ export default async function handler( ); if (subscription.status !== "active") { - const admin = await findAdminByStripeCustomerId( + const admin = await findUserByStripeCustomerId( newInvoice.customer as string, ); @@ -201,13 +205,15 @@ export default async function handler( return res.status(400).send("Webhook Error: Admin not found"); } await db - .update(admins) + .update(users_temp) .set({ serversQuantity: 0, }) - .where(eq(admins.stripeCustomerId, newInvoice.customer as string)); + .where( + eq(users_temp.stripeCustomerId, newInvoice.customer as string), + ); - await disableServers(admin.adminId); + await disableServers(admin.id); } break; @@ -216,20 +222,20 @@ export default async function handler( case "customer.deleted": { const customer = event.data.object as Stripe.Customer; - const admin = await findAdminByStripeCustomerId(customer.id); + const admin = await findUserByStripeCustomerId(customer.id); if (!admin) { return res.status(400).send("Webhook Error: Admin not found"); } - await disableServers(admin.adminId); + await disableServers(admin.id); await db - .update(admins) + .update(users_temp) .set({ stripeCustomerId: null, stripeSubscriptionId: null, serversQuantity: 0, }) - .where(eq(admins.stripeCustomerId, customer.id)); + .where(eq(users_temp.stripeCustomerId, customer.id)); break; } @@ -240,20 +246,26 @@ export default async function handler( return res.status(200).json({ received: true }); } -const disableServers = async (adminId: string) => { - await db - .update(server) - .set({ - serverStatus: "inactive", - }) - .where(eq(server.adminId, adminId)); +const disableServers = async (userId: string) => { + const organizations = await db.query.organization.findMany({ + where: eq(organization.ownerId, userId), + }); + + for (const org of organizations) { + await db + .update(server) + .set({ + serverStatus: "inactive", + }) + .where(eq(server.organizationId, org.id)); + } }; -const findAdminByStripeCustomerId = async (stripeCustomerId: string) => { - const admin = db.query.admins.findFirst({ - where: eq(admins.stripeCustomerId, stripeCustomerId), +const findUserByStripeCustomerId = async (stripeCustomerId: string) => { + const user = db.query.users_temp.findFirst({ + where: eq(users_temp.stripeCustomerId, stripeCustomerId), }); - return admin; + return user; }; const activateServer = async (serverId: string) => { @@ -270,19 +282,27 @@ const deactivateServer = async (serverId: string) => { .where(eq(server.serverId, serverId)); }; -export const findServersByAdminIdSorted = async (adminId: string) => { - const servers = await db.query.server.findMany({ - where: eq(server.adminId, adminId), - orderBy: asc(server.createdAt), +export const findServersByUserIdSorted = async (userId: string) => { + const organizations = await db.query.organization.findMany({ + where: eq(organization.ownerId, userId), }); + const servers: Server[] = []; + for (const org of organizations) { + const serversByOrg = await db.query.server.findMany({ + where: eq(server.organizationId, org.id), + orderBy: asc(server.createdAt), + }); + servers.push(...serversByOrg); + } + return servers; }; export const updateServersBasedOnQuantity = async ( - adminId: string, + userId: string, newServersQuantity: number, ) => { - const servers = await findServersByAdminIdSorted(adminId); + const servers = await findServersByUserIdSorted(userId); if (servers.length > newServersQuantity) { for (const [index, server] of servers.entries()) { diff --git a/apps/dokploy/pages/confirm-email.tsx b/apps/dokploy/pages/confirm-email.tsx deleted file mode 100644 index 2910a267..00000000 --- a/apps/dokploy/pages/confirm-email.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { OnboardingLayout } from "@/components/layouts/onboarding-layout"; -import { Logo } from "@/components/shared/logo"; -import { CardDescription, CardTitle } from "@/components/ui/card"; -import { db } from "@/server/db"; -import { auth } from "@/server/db/schema"; -import { IS_CLOUD, updateAuthById } from "@dokploy/server"; -import { isBefore } from "date-fns"; -import { eq } from "drizzle-orm"; -import type { GetServerSidePropsContext } from "next"; -import Link from "next/link"; -import type { ReactElement } from "react"; - -export default function Home() { - return ( -
-
- - - Dokploy - - Email Confirmed - - Congratulations, your email is confirmed. - -
- - Click here to login - -
-
-
- ); -} - -Home.getLayout = (page: ReactElement) => { - return {page}; -}; -export async function getServerSideProps(context: GetServerSidePropsContext) { - if (!IS_CLOUD) { - return { - redirect: { - permanent: true, - destination: "/", - }, - }; - } - const { token } = context.query; - - if (typeof token !== "string") { - return { - redirect: { - permanent: true, - destination: "/", - }, - }; - } - - const authR = await db.query.auth.findFirst({ - where: eq(auth.confirmationToken, token), - }); - - if ( - !authR || - authR?.confirmationToken === null || - authR?.confirmationExpiresAt === null - ) { - return { - redirect: { - permanent: true, - destination: "/", - }, - }; - } - - const isExpired = isBefore(new Date(authR.confirmationExpiresAt), new Date()); - - if (isExpired) { - return { - redirect: { - permanent: true, - destination: "/", - }, - }; - } - - await updateAuthById(authR.id, { - confirmationToken: null, - confirmationExpiresAt: null, - }); - - return { - props: { - token: authR.confirmationToken, - }, - }; -} diff --git a/apps/dokploy/pages/dashboard/docker.tsx b/apps/dokploy/pages/dashboard/docker.tsx index 96387c07..e01a763b 100644 --- a/apps/dokploy/pages/dashboard/docker.tsx +++ b/apps/dokploy/pages/dashboard/docker.tsx @@ -1,10 +1,11 @@ import { ShowContainers } from "@/components/dashboard/docker/show/show-containers"; import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { appRouter } from "@/server/api/root"; -import { IS_CLOUD, validateRequest } from "@dokploy/server"; +import { IS_CLOUD } from "@dokploy/server/constants"; +import { validateRequest } from "@dokploy/server/lib/auth"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import React, { type ReactElement } from "react"; +import type { ReactElement } from "react"; import superjson from "superjson"; const Dashboard = () => { @@ -27,7 +28,7 @@ export async function getServerSideProps( }, }; } - const { user, session } = await validateRequest(ctx.req, ctx.res); + const { user, session } = await validateRequest(ctx.req); if (!user) { return { redirect: { @@ -44,21 +45,20 @@ export async function getServerSideProps( req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); try { await helpers.project.all.prefetch(); - const auth = await helpers.auth.get.fetch(); - if (auth.rol === "user") { - const user = await helpers.user.byAuthId.fetch({ - authId: auth.id, + if (user.role === "member") { + const userR = await helpers.user.one.fetch({ + userId: user.id, }); - if (!user.canAccessToDocker) { + if (!userR?.canAccessToDocker) { return { redirect: { permanent: true, @@ -72,7 +72,7 @@ export async function getServerSideProps( trpcState: helpers.dehydrate(), }, }; - } catch (error) { + } catch (_error) { return { props: {}, }; diff --git a/apps/dokploy/pages/dashboard/monitoring.tsx b/apps/dokploy/pages/dashboard/monitoring.tsx index 7cdfcd4b..4272c453 100644 --- a/apps/dokploy/pages/dashboard/monitoring.tsx +++ b/apps/dokploy/pages/dashboard/monitoring.tsx @@ -1,11 +1,86 @@ -import { ShowMonitoring } from "@/components/dashboard/monitoring/web-server/show"; +import { ContainerFreeMonitoring } from "@/components/dashboard/monitoring/free/container/show-free-container-monitoring"; +import { ShowPaidMonitoring } from "@/components/dashboard/monitoring/paid/servers/show-paid-monitoring"; import { DashboardLayout } from "@/components/layouts/dashboard-layout"; -import { IS_CLOUD, validateRequest } from "@dokploy/server"; +import { Card } from "@/components/ui/card"; +import { useLocalStorage } from "@/hooks/useLocalStorage"; +import { api } from "@/utils/api"; +import { IS_CLOUD } from "@dokploy/server/constants"; +import { validateRequest } from "@dokploy/server/lib/auth"; +import { Loader2 } from "lucide-react"; import type { GetServerSidePropsContext } from "next"; -import React, { type ReactElement } from "react"; +import type { ReactElement } from "react"; + +const BASE_URL = "http://localhost:3001/metrics"; + +const DEFAULT_TOKEN = "metrics"; const Dashboard = () => { - return ; + const [toggleMonitoring, _setToggleMonitoring] = useLocalStorage( + "monitoring-enabled", + false, + ); + + const { data: monitoring, isLoading } = api.user.getMetricsToken.useQuery(); + return ( +
+ {/* + You are watching the Free plan.{" "} + + Upgrade + {" "} + to get more features. + */} + {isLoading ? ( + +
+ Loading... + +
+
+ ) : ( + <> + {/* {monitoring?.enabledFeatures && ( +
+ + +
+ )} */} + {toggleMonitoring ? ( + +
+ +
+
+ ) : ( + +
+ +
+
+ )} + + )} +
+ ); }; export default Dashboard; @@ -24,7 +99,7 @@ export async function getServerSideProps( }, }; } - const { user } = await validateRequest(ctx.req, ctx.res); + const { user } = await validateRequest(ctx.req); if (!user) { return { redirect: { diff --git a/apps/dokploy/pages/dashboard/project/[projectId].tsx b/apps/dokploy/pages/dashboard/project/[projectId].tsx index 7134c14d..605fe6e5 100644 --- a/apps/dokploy/pages/dashboard/project/[projectId].tsx +++ b/apps/dokploy/pages/dashboard/project/[projectId].tsx @@ -13,6 +13,7 @@ import { import { ProjectLayout } from "@/components/layouts/project-layout"; import { BreadcrumbSidebar } from "@/components/shared/breadcrumb-sidebar"; import { DateTooltip } from "@/components/shared/date-tooltip"; +import { DialogAction } from "@/components/shared/dialog-action"; import { StatusTooltip } from "@/components/shared/status-tooltip"; import { Button } from "@/components/ui/button"; @@ -25,6 +26,7 @@ import { CardHeader, CardTitle, } from "@/components/ui/card"; +import { Checkbox } from "@/components/ui/checkbox"; import { Command, CommandEmpty, @@ -49,27 +51,34 @@ import { cn } from "@/lib/utils"; import { appRouter } from "@/server/api/root"; import { api } from "@/utils/api"; import type { findProjectById } from "@dokploy/server"; -import { validateRequest } from "@dokploy/server"; +import { validateRequest } from "@dokploy/server/lib/auth"; import { createServerSideHelpers } from "@trpc/react-query/server"; import { + Ban, + Check, + CheckCircle2, + ChevronsUpDown, CircuitBoard, FolderInput, GlobeIcon, Loader2, PlusIcon, Search, + X, } from "lucide-react"; -import { Check, ChevronsUpDown, X } from "lucide-react"; import type { GetServerSidePropsContext, InferGetServerSidePropsType, } from "next"; import Head from "next/head"; import { useRouter } from "next/router"; -import React, { useMemo, useState, type ReactElement } from "react"; +import { type ReactElement, useMemo, useState } from "react"; +import { toast } from "sonner"; import superjson from "superjson"; export type Services = { + appName: string; + serverId?: string | null; name: string; type: | "mariadb" @@ -90,72 +99,86 @@ type Project = Awaited>; export const extractServices = (data: Project | undefined) => { const applications: Services[] = data?.applications.map((item) => ({ + appName: item.appName, name: item.name, type: "application", id: item.applicationId, createdAt: item.createdAt, status: item.applicationStatus, description: item.description, + serverId: item.serverId, })) || []; const mariadb: Services[] = data?.mariadb.map((item) => ({ + appName: item.appName, name: item.name, type: "mariadb", id: item.mariadbId, createdAt: item.createdAt, status: item.applicationStatus, description: item.description, + serverId: item.serverId, })) || []; const postgres: Services[] = data?.postgres.map((item) => ({ + appName: item.appName, name: item.name, type: "postgres", id: item.postgresId, createdAt: item.createdAt, status: item.applicationStatus, description: item.description, + serverId: item.serverId, })) || []; const mongo: Services[] = data?.mongo.map((item) => ({ + appName: item.appName, name: item.name, type: "mongo", id: item.mongoId, createdAt: item.createdAt, status: item.applicationStatus, description: item.description, + serverId: item.serverId, })) || []; const redis: Services[] = data?.redis.map((item) => ({ + appName: item.appName, name: item.name, type: "redis", id: item.redisId, createdAt: item.createdAt, status: item.applicationStatus, description: item.description, + serverId: item.serverId, })) || []; const mysql: Services[] = data?.mysql.map((item) => ({ + appName: item.appName, name: item.name, type: "mysql", id: item.mysqlId, createdAt: item.createdAt, status: item.applicationStatus, description: item.description, + serverId: item.serverId, })) || []; const compose: Services[] = data?.compose.map((item) => ({ + appName: item.appName, name: item.name, type: "compose", id: item.composeId, createdAt: item.createdAt, status: item.composeStatus, description: item.description, + serverId: item.serverId, })) || []; applications.push( @@ -177,17 +200,11 @@ export const extractServices = (data: Project | undefined) => { const Project = ( props: InferGetServerSidePropsType, ) => { + const [isBulkActionLoading, setIsBulkActionLoading] = useState(false); const { projectId } = props; - const { data: auth } = api.auth.get.useQuery(); - const { data: user } = api.user.byAuthId.useQuery( - { - authId: auth?.id || "", - }, - { - enabled: !!auth?.id && auth?.rol === "user", - }, - ); - const { data, isLoading } = api.project.one.useQuery({ projectId }); + const { data: auth } = api.user.get.useQuery(); + + const { data, isLoading, refetch } = api.project.one.useQuery({ projectId }); const router = useRouter(); const emptyServices = @@ -214,6 +231,70 @@ const Project = ( const [selectedTypes, setSelectedTypes] = useState([]); const [openCombobox, setOpenCombobox] = useState(false); + const [selectedServices, setSelectedServices] = useState([]); + const [isDropdownOpen, setIsDropdownOpen] = useState(false); + + const handleSelectAll = () => { + if (selectedServices.length === filteredServices.length) { + setSelectedServices([]); + } else { + setSelectedServices(filteredServices.map((service) => service.id)); + } + }; + + const handleServiceSelect = (serviceId: string, event: React.MouseEvent) => { + event.stopPropagation(); + setSelectedServices((prev) => + prev.includes(serviceId) + ? prev.filter((id) => id !== serviceId) + : [...prev, serviceId], + ); + }; + + const composeActions = { + start: api.compose.start.useMutation(), + stop: api.compose.stop.useMutation(), + }; + + const handleBulkStart = async () => { + let success = 0; + setIsBulkActionLoading(true); + for (const serviceId of selectedServices) { + try { + await composeActions.start.mutateAsync({ composeId: serviceId }); + success++; + } catch (_error) { + toast.error(`Error starting service ${serviceId}`); + } + } + if (success > 0) { + toast.success(`${success} services started successfully`); + refetch(); + } + setIsBulkActionLoading(false); + setSelectedServices([]); + setIsDropdownOpen(false); + }; + + const handleBulkStop = async () => { + let success = 0; + setIsBulkActionLoading(true); + for (const serviceId of selectedServices) { + try { + await composeActions.stop.mutateAsync({ composeId: serviceId }); + success++; + } catch (_error) { + toast.error(`Error stopping service ${serviceId}`); + } + } + if (success > 0) { + toast.success(`${success} services stopped successfully`); + refetch(); + } + setSelectedServices([]); + setIsDropdownOpen(false); + setIsBulkActionLoading(false); + }; const filteredServices = useMemo(() => { if (!applications) return []; @@ -241,16 +322,16 @@ const Project = (
-
- +
+ {data?.name} {data?.description} - {(auth?.rol === "admin" || user?.canCreateServices) && ( -
+ {(auth?.role === "owner" || auth?.canCreateServices) && ( +
@@ -299,78 +380,151 @@ const Project = (
) : ( <> -
-
- setSearchQuery(e.target.value)} - className="pr-10" - /> - +
+
+
+ 0} + className={cn( + "data-[state=checked]:bg-primary", + selectedServices.length > 0 && + selectedServices.length < + filteredServices.length && + "bg-primary/50", + )} + onCheckedChange={handleSelectAll} + /> + + Select All{" "} + {selectedServices.length > 0 && + `(${selectedServices.length}/${filteredServices.length})`} + +
+ + + + + + + Actions + + + + + + + + +
- - - - - - - - No type found. - - {serviceTypes.map((type) => ( + +
+
+ setSearchQuery(e.target.value)} + className="pr-10" + /> + +
+ + + + + + + + No type found. + + {serviceTypes.map((type) => ( + { + setSelectedTypes((prev) => + prev.includes(type.value) + ? prev.filter((t) => t !== type.value) + : [...prev, type.value], + ); + setOpenCombobox(false); + }} + > +
+ + {type.icon && ( + + )} + {type.label} +
+
+ ))} { - setSelectedTypes((prev) => - prev.includes(type.value) - ? prev.filter((t) => t !== type.value) - : [...prev, type.value], - ); + setSelectedTypes([]); setOpenCombobox(false); }} + className="border-t" > -
- - {type.icon && ( - - )} - {type.label} +
+ + Clear filters
- ))} - { - setSelectedTypes([]); - setOpenCombobox(false); - }} - className="border-t" - > -
- - Clear filters -
-
- - - - + + + + +
@@ -408,6 +562,27 @@ const Project = (
+
+ handleServiceSelect(service.id, e) + } + > +
+ +
+
+
@@ -482,7 +657,7 @@ export async function getServerSideProps( const { params } = ctx; const { req, res } = ctx; - const { user, session } = await validateRequest(req, res); + const { user, session } = await validateRequest(req); if (!user) { return { redirect: { @@ -498,8 +673,8 @@ export async function getServerSideProps( req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); @@ -516,7 +691,7 @@ export async function getServerSideProps( projectId: params?.projectId, }, }; - } catch (error) { + } catch (_error) { return { redirect: { permanent: false, diff --git a/apps/dokploy/pages/dashboard/project/[projectId]/services/application/[applicationId].tsx b/apps/dokploy/pages/dashboard/project/[projectId]/services/application/[applicationId].tsx index bdde2af5..94b8f5f5 100644 --- a/apps/dokploy/pages/dashboard/project/[projectId]/services/application/[applicationId].tsx +++ b/apps/dokploy/pages/dashboard/project/[projectId]/services/application/[applicationId].tsx @@ -13,13 +13,13 @@ import { ShowGeneralApplication } from "@/components/dashboard/application/gener import { ShowDockerLogs } from "@/components/dashboard/application/logs/show"; import { ShowPreviewDeployments } from "@/components/dashboard/application/preview-deployments/show-preview-deployments"; import { UpdateApplication } from "@/components/dashboard/application/update-application"; -import { DockerMonitoring } from "@/components/dashboard/monitoring/docker/show"; +import { DeleteService } from "@/components/dashboard/compose/delete-service"; +import { ContainerFreeMonitoring } from "@/components/dashboard/monitoring/free/container/show-free-container-monitoring"; +import { ContainerPaidMonitoring } from "@/components/dashboard/monitoring/paid/container/show-paid-container-monitoring"; import { ProjectLayout } from "@/components/layouts/project-layout"; import { BreadcrumbSidebar } from "@/components/shared/breadcrumb-sidebar"; -import { DialogAction } from "@/components/shared/dialog-action"; import { StatusTooltip } from "@/components/shared/status-tooltip"; import { Badge } from "@/components/ui/badge"; -import { Button } from "@/components/ui/button"; import { Card, CardContent, @@ -38,9 +38,10 @@ import { import { cn } from "@/lib/utils"; import { appRouter } from "@/server/api/root"; import { api } from "@/utils/api"; -import { validateRequest } from "@dokploy/server"; +import { validateRequest } from "@dokploy/server/lib/auth"; import { createServerSideHelpers } from "@trpc/react-query/server"; -import { GlobeIcon, HelpCircle, ServerOff, Trash2 } from "lucide-react"; +import copy from "copy-to-clipboard"; +import { GlobeIcon, HelpCircle, ServerOff } from "lucide-react"; import type { GetServerSidePropsContext, InferGetServerSidePropsType, @@ -48,7 +49,7 @@ import type { import Head from "next/head"; import Link from "next/link"; import { useRouter } from "next/router"; -import React, { useState, useEffect, type ReactElement } from "react"; +import { type ReactElement, useEffect, useState } from "react"; import { toast } from "sonner"; import superjson from "superjson"; @@ -64,6 +65,7 @@ type TabState = const Service = ( props: InferGetServerSidePropsType, ) => { + const [_toggleMonitoring, _setToggleMonitoring] = useState(false); const { applicationId, activeTab } = props; const router = useRouter(); const { projectId } = router.query; @@ -82,17 +84,8 @@ const Service = ( }, ); - const { mutateAsync, isLoading: isRemoving } = - api.application.delete.useMutation(); - const { data: auth } = api.auth.get.useQuery(); - const { data: user } = api.user.byAuthId.useQuery( - { - authId: auth?.id || "", - }, - { - enabled: !!auth?.id && auth?.rol === "user", - }, - ); + const { data: isCloud } = api.settings.isCloud.useQuery(); + const { data: auth } = api.user.get.useQuery(); return (
@@ -140,6 +133,13 @@ const Service = (
{ + if (data?.server?.ipAddress) { + copy(data.server.ipAddress); + toast.success("IP Address Copied!"); + } + }} variant={ !data?.serverId ? "default" @@ -176,35 +176,8 @@ const Service = (
- {(auth?.rol === "admin" || user?.canDeleteServices) && ( - { - await mutateAsync({ - applicationId: applicationId, - }) - .then(() => { - router.push( - `/dashboard/project/${data?.projectId}`, - ); - toast.success("Application deleted successfully"); - }) - .catch(() => { - toast.error("Error deleting application"); - }); - }} - > - - + {(auth?.role === "owner" || auth?.canDeleteServices) && ( + )}
@@ -246,12 +219,16 @@ const Service = ( General Environment - {!data?.serverId && ( + {((data?.serverId && isCloud) || !data?.server) && ( Monitoring )} Logs @@ -274,13 +251,54 @@ const Service = (
- {!data?.serverId && ( - -
- + + +
+
+ {data?.serverId && isCloud ? ( + + ) : ( + <> + {/* {monitoring?.enabledFeatures && + isCloud && + data?.serverId && ( +
+ + +
+ )} */} + + {/* {toggleMonitoring ? ( + + ) : ( */} +
+ +
+ {/* )} */} + + )}
- - )} +
+
@@ -342,7 +360,7 @@ export async function getServerSideProps( const { query, params, req, res } = ctx; const activeTab = query.tab; - const { user, session } = await validateRequest(req, res); + const { user, session } = await validateRequest(req); if (!user) { return { redirect: { @@ -358,8 +376,8 @@ export async function getServerSideProps( req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); @@ -371,6 +389,8 @@ export async function getServerSideProps( applicationId: params?.applicationId, }); + await helpers.settings.isCloud.prefetch(); + return { props: { trpcState: helpers.dehydrate(), @@ -378,7 +398,7 @@ export async function getServerSideProps( activeTab: (activeTab || "general") as TabState, }, }; - } catch (error) { + } catch (_error) { return { redirect: { permanent: false, diff --git a/apps/dokploy/pages/dashboard/project/[projectId]/services/compose/[composeId].tsx b/apps/dokploy/pages/dashboard/project/[projectId]/services/compose/[composeId].tsx index dba3aea8..46b727d2 100644 --- a/apps/dokploy/pages/dashboard/project/[projectId]/services/compose/[composeId].tsx +++ b/apps/dokploy/pages/dashboard/project/[projectId]/services/compose/[composeId].tsx @@ -1,14 +1,15 @@ import { ShowVolumes } from "@/components/dashboard/application/advanced/volumes/show-volumes"; import { ShowEnvironment } from "@/components/dashboard/application/environment/show-enviroment"; import { AddCommandCompose } from "@/components/dashboard/compose/advanced/add-command"; -import { DeleteCompose } from "@/components/dashboard/compose/delete-compose"; +import { DeleteService } from "@/components/dashboard/compose/delete-service"; import { ShowDeploymentsCompose } from "@/components/dashboard/compose/deployments/show-deployments-compose"; import { ShowDomainsCompose } from "@/components/dashboard/compose/domains/show-domains"; import { ShowGeneralCompose } from "@/components/dashboard/compose/general/show"; import { ShowDockerLogsCompose } from "@/components/dashboard/compose/logs/show"; import { ShowDockerLogsStack } from "@/components/dashboard/compose/logs/show-stack"; -import { ShowMonitoringCompose } from "@/components/dashboard/compose/monitoring/show"; import { UpdateCompose } from "@/components/dashboard/compose/update-compose"; +import { ComposeFreeMonitoring } from "@/components/dashboard/monitoring/free/container/show-free-compose-monitoring"; +import { ComposePaidMonitoring } from "@/components/dashboard/monitoring/paid/container/show-paid-compose-monitoring"; import { ProjectLayout } from "@/components/layouts/project-layout"; import { BreadcrumbSidebar } from "@/components/shared/breadcrumb-sidebar"; import { StatusTooltip } from "@/components/shared/status-tooltip"; @@ -31,8 +32,9 @@ import { import { cn } from "@/lib/utils"; import { appRouter } from "@/server/api/root"; import { api } from "@/utils/api"; -import { validateRequest } from "@dokploy/server"; +import { validateRequest } from "@dokploy/server/lib/auth"; import { createServerSideHelpers } from "@trpc/react-query/server"; +import copy from "copy-to-clipboard"; import { CircuitBoard, ServerOff } from "lucide-react"; import { HelpCircle } from "lucide-react"; import type { @@ -42,7 +44,8 @@ import type { import Head from "next/head"; import Link from "next/link"; import { useRouter } from "next/router"; -import React, { useState, useEffect, type ReactElement } from "react"; +import { type ReactElement, useEffect, useState } from "react"; +import { toast } from "sonner"; import superjson from "superjson"; type TabState = @@ -56,6 +59,7 @@ type TabState = const Service = ( props: InferGetServerSidePropsType, ) => { + const [_toggleMonitoring, _setToggleMonitoring] = useState(false); const { composeId, activeTab } = props; const router = useRouter(); const { projectId } = router.query; @@ -74,15 +78,8 @@ const Service = ( }, ); - const { data: auth } = api.auth.get.useQuery(); - const { data: user } = api.user.byAuthId.useQuery( - { - authId: auth?.id || "", - }, - { - enabled: !!auth?.id && auth?.rol === "user", - }, - ); + const { data: auth } = api.user.get.useQuery(); + const { data: isCloud } = api.settings.isCloud.useQuery(); return (
@@ -131,6 +128,13 @@ const Service = (
{ + if (data?.server?.ipAddress) { + copy(data.server.ipAddress); + toast.success("IP Address Copied!"); + } + }} variant={ !data?.serverId ? "default" @@ -142,7 +146,7 @@ const Service = ( {data?.server?.name || "Dokploy Server"} {data?.server?.serverStatus === "inactive" && ( - +
@@ -211,22 +215,16 @@ const Service = ( General - {data?.composeType === "docker-compose" && ( - - Environment - - )} - {!data?.serverId && ( + Environment + {((data?.serverId && isCloud) || !data?.server) && ( Monitoring )} Logs @@ -246,17 +244,59 @@ const Service = (
- {!data?.serverId && ( - -
- + + +
+
+ {data?.serverId && isCloud ? ( + + ) : ( + <> + {/* {monitoring?.enabledFeatures && + isCloud && + data?.serverId && ( +
+ + +
+ )} + + {toggleMonitoring ? ( + + ) : ( */} + {/*
*/} + + {/*
*/} + {/* )} */} + + )}
- - )} +
+
@@ -316,7 +356,7 @@ export async function getServerSideProps( const { query, params, req, res } = ctx; const activeTab = query.tab; - const { user, session } = await validateRequest(req, res); + const { user, session } = await validateRequest(req); if (!user) { return { redirect: { @@ -332,8 +372,8 @@ export async function getServerSideProps( req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); @@ -344,7 +384,7 @@ export async function getServerSideProps( await helpers.compose.one.fetch({ composeId: params?.composeId, }); - + await helpers.settings.isCloud.prefetch(); return { props: { trpcState: helpers.dehydrate(), @@ -352,7 +392,7 @@ export async function getServerSideProps( activeTab: (activeTab || "general") as TabState, }, }; - } catch (error) { + } catch (_error) { return { redirect: { permanent: false, diff --git a/apps/dokploy/pages/dashboard/project/[projectId]/services/mariadb/[mariadbId].tsx b/apps/dokploy/pages/dashboard/project/[projectId]/services/mariadb/[mariadbId].tsx index fed8faa3..e91e0978 100644 --- a/apps/dokploy/pages/dashboard/project/[projectId]/services/mariadb/[mariadbId].tsx +++ b/apps/dokploy/pages/dashboard/project/[projectId]/services/mariadb/[mariadbId].tsx @@ -2,20 +2,20 @@ import { ShowResources } from "@/components/dashboard/application/advanced/show- import { ShowVolumes } from "@/components/dashboard/application/advanced/volumes/show-volumes"; import { ShowEnvironment } from "@/components/dashboard/application/environment/show-enviroment"; import { ShowDockerLogs } from "@/components/dashboard/application/logs/show"; +import { DeleteService } from "@/components/dashboard/compose/delete-service"; import { ShowBackups } from "@/components/dashboard/database/backups/show-backups"; import { ShowExternalMariadbCredentials } from "@/components/dashboard/mariadb/general/show-external-mariadb-credentials"; import { ShowGeneralMariadb } from "@/components/dashboard/mariadb/general/show-general-mariadb"; import { ShowInternalMariadbCredentials } from "@/components/dashboard/mariadb/general/show-internal-mariadb-credentials"; import { UpdateMariadb } from "@/components/dashboard/mariadb/update-mariadb"; -import { DockerMonitoring } from "@/components/dashboard/monitoring/docker/show"; +import { ContainerFreeMonitoring } from "@/components/dashboard/monitoring/free/container/show-free-container-monitoring"; +import { ContainerPaidMonitoring } from "@/components/dashboard/monitoring/paid/container/show-paid-container-monitoring"; import { ShowCustomCommand } from "@/components/dashboard/postgres/advanced/show-custom-command"; import { MariadbIcon } from "@/components/icons/data-tools-icons"; import { ProjectLayout } from "@/components/layouts/project-layout"; import { BreadcrumbSidebar } from "@/components/shared/breadcrumb-sidebar"; -import { DialogAction } from "@/components/shared/dialog-action"; import { StatusTooltip } from "@/components/shared/status-tooltip"; import { Badge } from "@/components/ui/badge"; -import { Button } from "@/components/ui/button"; import { Card, CardContent, @@ -34,9 +34,9 @@ import { import { cn } from "@/lib/utils"; import { appRouter } from "@/server/api/root"; import { api } from "@/utils/api"; -import { validateRequest } from "@dokploy/server"; +import { validateRequest } from "@dokploy/server/lib/auth"; import { createServerSideHelpers } from "@trpc/react-query/server"; -import { HelpCircle, ServerOff, Trash2 } from "lucide-react"; +import { HelpCircle, ServerOff } from "lucide-react"; import type { GetServerSidePropsContext, InferGetServerSidePropsType, @@ -44,8 +44,7 @@ import type { import Head from "next/head"; import Link from "next/link"; import { useRouter } from "next/router"; -import React, { useState, type ReactElement } from "react"; -import { toast } from "sonner"; +import { type ReactElement, useState } from "react"; import superjson from "superjson"; type TabState = "projects" | "monitoring" | "settings" | "backups" | "advanced"; @@ -53,22 +52,17 @@ type TabState = "projects" | "monitoring" | "settings" | "backups" | "advanced"; const Mariadb = ( props: InferGetServerSidePropsType, ) => { + const [_toggleMonitoring, _setToggleMonitoring] = useState(false); + const { mariadbId, activeTab } = props; const router = useRouter(); const { projectId } = router.query; const [tab, setSab] = useState(activeTab); const { data } = api.mariadb.one.useQuery({ mariadbId }); - const { data: auth } = api.auth.get.useQuery(); - const { data: user } = api.user.byAuthId.useQuery( - { - authId: auth?.id || "", - }, - { - enabled: !!auth?.id && auth?.rol === "user", - }, - ); - const { mutateAsync: remove, isLoading: isRemoving } = - api.mariadb.remove.useMutation(); + const { data: auth } = api.user.get.useQuery(); + + const { data: isCloud } = api.settings.isCloud.useQuery(); + return (
)}
-
+
- {(auth?.rol === "admin" || user?.canDeleteServices) && ( - { - await remove({ mariadbId }) - .then(() => { - router.push( - `/dashboard/project/${data?.projectId}`, - ); - toast.success("Mariadb deleted successfully"); - }) - .catch(() => { - toast.error("Error deleting the mariadb"); - }); - }} - > - - + {(auth?.role === "owner" || auth?.canDeleteServices) && ( + )}
@@ -219,12 +188,16 @@ const Mariadb = ( General Environment - {!data?.serverId && ( + {((data?.serverId && isCloud) || !data?.server) && ( Monitoring )} Backups @@ -245,13 +218,51 @@ const Mariadb = (
- {!data?.serverId && ( - -
- + +
+
+ {data?.serverId && isCloud ? ( + + ) : ( + <> + {/* {monitoring?.enabledFeatures && ( +
+ + +
+ )} + + {toggleMonitoring ? ( + + ) : ( +
*/} + + {/*
*/} + {/* )} */} + + )}
- - )} +
+
, ) => { + const [_toggleMonitoring, _setToggleMonitoring] = useState(false); const { mongoId, activeTab } = props; const router = useRouter(); const { projectId } = router.query; const [tab, setSab] = useState(activeTab); const { data } = api.mongo.one.useQuery({ mongoId }); - const { data: auth } = api.auth.get.useQuery(); - const { data: user } = api.user.byAuthId.useQuery( - { - authId: auth?.id || "", - }, - { - enabled: !!auth?.id && auth?.rol === "user", - }, - ); - const { mutateAsync: remove, isLoading: isRemoving } = - api.mongo.remove.useMutation(); + const { data: auth } = api.user.get.useQuery(); + + const { data: isCloud } = api.settings.isCloud.useQuery(); return (
@@ -154,33 +145,8 @@ const Mongo = (
- {(auth?.rol === "admin" || user?.canDeleteServices) && ( - { - await remove({ mongoId }) - .then(() => { - router.push( - `/dashboard/project/${data?.projectId}`, - ); - toast.success("Mongo deleted successfully"); - }) - .catch(() => { - toast.error("Error deleting the mongo"); - }); - }} - > - - + {(auth?.role === "owner" || auth?.canDeleteServices) && ( + )}
@@ -223,12 +189,16 @@ const Mongo = ( General Environment - {!data?.serverId && ( + {((data?.serverId && isCloud) || !data?.server) && ( Monitoring )} Backups @@ -249,13 +219,51 @@ const Mongo = (
- {!data?.serverId && ( - -
- + +
+
+ {data?.serverId && isCloud ? ( + + ) : ( + <> + {/* {monitoring?.enabledFeatures && ( +
+ + +
+ )} + + {toggleMonitoring ? ( + + ) : ( +
*/} + + {/*
*/} + {/* )} */} + + )}
- - )} +
+
, ) => { + const [_toggleMonitoring, _setToggleMonitoring] = useState(false); const { mysqlId, activeTab } = props; const router = useRouter(); const { projectId } = router.query; const [tab, setSab] = useState(activeTab); const { data } = api.mysql.one.useQuery({ mysqlId }); - const { data: auth } = api.auth.get.useQuery(); - const { data: user } = api.user.byAuthId.useQuery( - { - authId: auth?.id || "", - }, - { - enabled: !!auth?.id && auth?.rol === "user", - }, - ); + const { data: auth } = api.user.get.useQuery(); + + const { data: isCloud } = api.settings.isCloud.useQuery(); - const { mutateAsync: remove, isLoading: isRemoving } = - api.mysql.remove.useMutation(); return (
- {(auth?.rol === "admin" || user?.canDeleteServices) && ( - { - await remove({ mysqlId }) - .then(() => { - router.push( - `/dashboard/project/${data?.projectId}`, - ); - toast.success("Mysql deleted successfully"); - }) - .catch(() => { - toast.error("Error deleting the mysql"); - }); - }} - > - - + {(auth?.role === "owner" || auth?.canDeleteServices) && ( + )}
@@ -221,15 +188,19 @@ const MySql = (
General Environment - {!data?.serverId && ( + {((data?.serverId && isCloud) || !data?.server) && ( Monitoring @@ -252,13 +223,51 @@ const MySql = (
- {!data?.serverId && ( - -
- + +
+
+ {data?.serverId && isCloud ? ( + + ) : ( + <> + {/* {monitoring?.enabledFeatures && ( +
+ + +
+ )} + + {toggleMonitoring ? ( + + ) : ( +
*/} + + {/*
*/} + {/* )} */} + + )}
- - )} +
+
, ) => { + const [_toggleMonitoring, _setToggleMonitoring] = useState(false); const { postgresId, activeTab } = props; const router = useRouter(); const { projectId } = router.query; const [tab, setSab] = useState(activeTab); const { data } = api.postgres.one.useQuery({ postgresId }); - const { data: auth } = api.auth.get.useQuery(); + const { data: auth } = api.user.get.useQuery(); - const { data: user } = api.user.byAuthId.useQuery( - { - authId: auth?.id || "", - }, - { - enabled: !!auth?.id && auth?.rol === "user", - }, - ); - - const { mutateAsync: remove, isLoading: isRemoving } = - api.postgres.remove.useMutation(); + const { data: isCloud } = api.settings.isCloud.useQuery(); return (
@@ -155,33 +144,8 @@ const Postgresql = (
- {(auth?.rol === "admin" || user?.canDeleteServices) && ( - { - await remove({ postgresId }) - .then(() => { - router.push( - `/dashboard/project/${data?.projectId}`, - ); - toast.success("Postgres deleted successfully"); - }) - .catch(() => { - toast.error("Error deleting the postgres"); - }); - }} - > - - + {(auth?.role === "owner" || auth?.canDeleteServices) && ( + )}
@@ -224,12 +188,16 @@ const Postgresql = ( General Environment - {!data?.serverId && ( + {((data?.serverId && isCloud) || !data?.server) && ( Monitoring )} Backups @@ -254,13 +222,51 @@ const Postgresql = (
- {!data?.serverId && ( - -
- + +
+
+ {data?.serverId && isCloud ? ( + + ) : ( + <> + {/* {monitoring?.enabledFeatures && ( +
+ + +
+ )} + + {toggleMonitoring ? ( + + ) : ( +
*/} + + {/*
*/} + {/* )} */} + + )}
- - )} +
+
, ) => { + const [_toggleMonitoring, _setToggleMonitoring] = useState(false); const { redisId, activeTab } = props; const router = useRouter(); const { projectId } = router.query; const [tab, setSab] = useState(activeTab); const { data } = api.redis.one.useQuery({ redisId }); - const { data: auth } = api.auth.get.useQuery(); - const { data: user } = api.user.byAuthId.useQuery( - { - authId: auth?.id || "", - }, - { - enabled: !!auth?.id && auth?.rol === "user", - }, - ); + const { data: auth } = api.user.get.useQuery(); + + const { data: isCloud } = api.settings.isCloud.useQuery(); - const { mutateAsync: remove, isLoading: isRemoving } = - api.redis.remove.useMutation(); return (
- {(auth?.rol === "admin" || user?.canDeleteServices) && ( - { - await remove({ redisId }) - .then(() => { - router.push( - `/dashboard/project/${data?.projectId}`, - ); - toast.success("Redis deleted successfully"); - }) - .catch(() => { - toast.error("Error deleting the redis"); - }); - }} - > - - + {(auth?.role === "owner" || auth?.canDeleteServices) && ( + )}
@@ -221,12 +188,16 @@ const Redis = ( General Environment - {!data?.serverId && ( + {((data?.serverId && isCloud) || !data?.server) && ( Monitoring )} Logs @@ -246,13 +217,51 @@ const Redis = (
- {!data?.serverId && ( - -
- + +
+
+ {data?.serverId && isCloud ? ( + + ) : ( + <> + {/* {monitoring?.enabledFeatures && ( +
+ + +
+ )} + + {toggleMonitoring ? ( + + ) : ( +
*/} + + {/*
*/} + {/* )} */} + + )}
- - )} +
+
, ) { const { req, res } = ctx; - const { user, session } = await validateRequest(req, res); + const { user, session } = await validateRequest(req); const helpers = createServerSideHelpers({ router: appRouter, @@ -46,14 +45,14 @@ export async function getServerSideProps( req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); await helpers.settings.isCloud.prefetch(); - await helpers.auth.get.prefetch(); + await helpers.user.get.prefetch(); if (!user) { return { redirect: { diff --git a/apps/dokploy/pages/dashboard/requests.tsx b/apps/dokploy/pages/dashboard/requests.tsx index d1a927e3..cb454587 100644 --- a/apps/dokploy/pages/dashboard/requests.tsx +++ b/apps/dokploy/pages/dashboard/requests.tsx @@ -1,9 +1,9 @@ import { ShowRequests } from "@/components/dashboard/requests/show-requests"; import { DashboardLayout } from "@/components/layouts/dashboard-layout"; -import { IS_CLOUD, validateRequest } from "@dokploy/server"; +import { IS_CLOUD } from "@dokploy/server/constants"; +import { validateRequest } from "@dokploy/server/lib/auth"; import type { GetServerSidePropsContext } from "next"; import type { ReactElement } from "react"; -import * as React from "react"; export default function Requests() { return ; @@ -22,7 +22,7 @@ export async function getServerSideProps( }, }; } - const { user } = await validateRequest(ctx.req, ctx.res); + const { user } = await validateRequest(ctx.req); if (!user) { return { redirect: { diff --git a/apps/dokploy/pages/dashboard/settings/billing.tsx b/apps/dokploy/pages/dashboard/settings/billing.tsx index 5c58e25a..7ba5717e 100644 --- a/apps/dokploy/pages/dashboard/settings/billing.tsx +++ b/apps/dokploy/pages/dashboard/settings/billing.tsx @@ -2,10 +2,11 @@ import { ShowBilling } from "@/components/dashboard/settings/billing/show-billin import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { appRouter } from "@/server/api/root"; -import { IS_CLOUD, validateRequest } from "@dokploy/server"; +import { IS_CLOUD } from "@dokploy/server/constants"; +import { validateRequest } from "@dokploy/server/lib/auth"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import React, { type ReactElement } from "react"; +import type { ReactElement } from "react"; import superjson from "superjson"; const Page = () => { @@ -29,8 +30,8 @@ export async function getServerSideProps( }; } const { req, res } = ctx; - const { user, session } = await validateRequest(req, res); - if (!user || user.rol === "user") { + const { user, session } = await validateRequest(req); + if (!user || user.role === "member") { return { redirect: { permanent: true, @@ -45,13 +46,13 @@ export async function getServerSideProps( req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); - await helpers.auth.get.prefetch(); + await helpers.user.get.prefetch(); await helpers.settings.isCloud.prefetch(); diff --git a/apps/dokploy/pages/dashboard/settings/certificates.tsx b/apps/dokploy/pages/dashboard/settings/certificates.tsx index 732b6622..0c82ed4f 100644 --- a/apps/dokploy/pages/dashboard/settings/certificates.tsx +++ b/apps/dokploy/pages/dashboard/settings/certificates.tsx @@ -5,7 +5,7 @@ import { appRouter } from "@/server/api/root"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import React, { type ReactElement } from "react"; +import type { ReactElement } from "react"; import superjson from "superjson"; const Page = () => { return ( @@ -24,8 +24,8 @@ export async function getServerSideProps( ctx: GetServerSidePropsContext<{ serviceId: string }>, ) { const { req, res } = ctx; - const { user, session } = await validateRequest(req, res); - if (!user || user.rol === "user") { + const { user, session } = await validateRequest(req); + if (!user || user.role === "member") { return { redirect: { permanent: true, @@ -40,12 +40,12 @@ export async function getServerSideProps( req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); - await helpers.auth.get.prefetch(); + await helpers.user.get.prefetch(); await helpers.settings.isCloud.prefetch(); return { diff --git a/apps/dokploy/pages/dashboard/settings/cluster.tsx b/apps/dokploy/pages/dashboard/settings/cluster.tsx index a6605c57..a1a46bb6 100644 --- a/apps/dokploy/pages/dashboard/settings/cluster.tsx +++ b/apps/dokploy/pages/dashboard/settings/cluster.tsx @@ -5,7 +5,7 @@ import { appRouter } from "@/server/api/root"; import { IS_CLOUD, validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import React, { type ReactElement } from "react"; +import type { ReactElement } from "react"; import superjson from "superjson"; const Page = () => { @@ -33,8 +33,8 @@ export async function getServerSideProps( }, }; } - const { user, session } = await validateRequest(ctx.req, ctx.res); - if (!user || user.rol === "user") { + const { user, session } = await validateRequest(ctx.req); + if (!user || user.role === "member") { return { redirect: { permanent: true, @@ -48,12 +48,12 @@ export async function getServerSideProps( req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); - await helpers.auth.get.prefetch(); + await helpers.user.get.prefetch(); return { props: { diff --git a/apps/dokploy/pages/dashboard/settings/destinations.tsx b/apps/dokploy/pages/dashboard/settings/destinations.tsx index c5c6f2f8..3c906b55 100644 --- a/apps/dokploy/pages/dashboard/settings/destinations.tsx +++ b/apps/dokploy/pages/dashboard/settings/destinations.tsx @@ -5,7 +5,7 @@ import { appRouter } from "@/server/api/root"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import React, { type ReactElement } from "react"; +import type { ReactElement } from "react"; import superjson from "superjson"; const Page = () => { @@ -25,8 +25,8 @@ export async function getServerSideProps( ctx: GetServerSidePropsContext<{ serviceId: string }>, ) { const { req, res } = ctx; - const { user, session } = await validateRequest(req, res); - if (!user || user.rol === "user") { + const { user, session } = await validateRequest(req); + if (!user || user.role === "member") { return { redirect: { permanent: true, @@ -41,12 +41,12 @@ export async function getServerSideProps( req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); - await helpers.auth.get.prefetch(); + await helpers.user.get.prefetch(); await helpers.settings.isCloud.prefetch(); return { diff --git a/apps/dokploy/pages/dashboard/settings/git-providers.tsx b/apps/dokploy/pages/dashboard/settings/git-providers.tsx index dc37522a..7a9b08df 100644 --- a/apps/dokploy/pages/dashboard/settings/git-providers.tsx +++ b/apps/dokploy/pages/dashboard/settings/git-providers.tsx @@ -5,7 +5,7 @@ import { appRouter } from "@/server/api/root"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import React, { type ReactElement } from "react"; +import type { ReactElement } from "react"; import superjson from "superjson"; const Page = () => { @@ -24,7 +24,7 @@ Page.getLayout = (page: ReactElement) => { export async function getServerSideProps( ctx: GetServerSidePropsContext<{ serviceId: string }>, ) { - const { user, session } = await validateRequest(ctx.req, ctx.res); + const { user, session } = await validateRequest(ctx.req); if (!user) { return { redirect: { @@ -40,23 +40,21 @@ export async function getServerSideProps( req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); - await helpers.auth.get.prefetch(); + await helpers.user.get.prefetch(); try { await helpers.project.all.prefetch(); await helpers.settings.isCloud.prefetch(); - const auth = await helpers.auth.get.fetch(); - - if (auth.rol === "user") { - const user = await helpers.user.byAuthId.fetch({ - authId: auth.id, + if (user.role === "member") { + const userR = await helpers.user.one.fetch({ + userId: user.id, }); - if (!user.canAccessToGitProviders) { + if (!userR?.canAccessToGitProviders) { return { redirect: { permanent: true, @@ -70,7 +68,7 @@ export async function getServerSideProps( trpcState: helpers.dehydrate(), }, }; - } catch (error) { + } catch (_error) { return { props: {}, }; diff --git a/apps/dokploy/pages/dashboard/settings/index.tsx b/apps/dokploy/pages/dashboard/settings/index.tsx new file mode 100644 index 00000000..4c060cbb --- /dev/null +++ b/apps/dokploy/pages/dashboard/settings/index.tsx @@ -0,0 +1,219 @@ +import { DashboardLayout } from "@/components/layouts/dashboard-layout"; + +import { AlertBlock } from "@/components/shared/alert-block"; +import { Button } from "@/components/ui/button"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { DialogFooter } from "@/components/ui/dialog"; +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, +} from "@/components/ui/form"; +import { Switch } from "@/components/ui/switch"; +import { appRouter } from "@/server/api/root"; +import { api } from "@/utils/api"; +import { validateRequest } from "@dokploy/server"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { createServerSideHelpers } from "@trpc/react-query/server"; +import { Settings } from "lucide-react"; +import type { GetServerSidePropsContext } from "next"; +import { type ReactElement, useEffect } from "react"; +import { useForm } from "react-hook-form"; +import { toast } from "sonner"; +import superjson from "superjson"; +import { z } from "zod"; + +const settings = z.object({ + cleanCacheOnApplications: z.boolean(), + cleanCacheOnCompose: z.boolean(), + cleanCacheOnPreviews: z.boolean(), +}); + +type SettingsType = z.infer; + +const Page = () => { + const { data, refetch } = api.user.get.useQuery(); + const { mutateAsync, isLoading, isError, error } = + api.user.update.useMutation(); + const form = useForm({ + defaultValues: { + cleanCacheOnApplications: false, + cleanCacheOnCompose: false, + cleanCacheOnPreviews: false, + }, + resolver: zodResolver(settings), + }); + useEffect(() => { + form.reset({ + cleanCacheOnApplications: data?.user.cleanupCacheApplications || false, + cleanCacheOnCompose: data?.user.cleanupCacheOnCompose || false, + cleanCacheOnPreviews: data?.user.cleanupCacheOnPreviews || false, + }); + }, [form, form.reset, form.formState.isSubmitSuccessful, data]); + + const onSubmit = async (values: SettingsType) => { + await mutateAsync({ + cleanupCacheApplications: values.cleanCacheOnApplications, + cleanupCacheOnCompose: values.cleanCacheOnCompose, + cleanupCacheOnPreviews: values.cleanCacheOnPreviews, + }) + .then(() => { + toast.success("Settings updated"); + refetch(); + }) + .catch(() => { + toast.error("Something went wrong"); + }); + }; + return ( +
+ +
+ + + + Settings + + Manage your Dokploy settings + {isError && {error?.message}} + + + + + ( + +
+ Clean Cache on Applications + + Clean the cache after every application deployment + +
+ + + +
+ )} + /> + ( + +
+ Clean Cache on Previews + + Clean the cache after every preview deployment + +
+ + + +
+ )} + /> + ( + +
+ Clean Cache on Compose + + Clean the cache after every compose deployment + +
+ + + +
+ )} + /> + + + + + +
+
+
+
+ ); +}; + +export default Page; + +Page.getLayout = (page: ReactElement) => { + return {page}; +}; +export async function getServerSideProps( + ctx: GetServerSidePropsContext<{ serviceId: string }>, +) { + const { req, res } = ctx; + const { user, session } = await validateRequest(ctx.req); + if (!user) { + return { + redirect: { + permanent: true, + destination: "/", + }, + }; + } + if (user.role === "member") { + return { + redirect: { + permanent: true, + destination: "/dashboard/settings/profile", + }, + }; + } + + const helpers = createServerSideHelpers({ + router: appRouter, + ctx: { + req: req as any, + res: res as any, + db: null as any, + session: session as any, + user: user as any, + }, + transformer: superjson, + }); + await helpers.user.get.prefetch(); + + return { + props: { + trpcState: helpers.dehydrate(), + }, + }; +} diff --git a/apps/dokploy/pages/dashboard/settings/notifications.tsx b/apps/dokploy/pages/dashboard/settings/notifications.tsx index 0b75fc67..fbdc2e20 100644 --- a/apps/dokploy/pages/dashboard/settings/notifications.tsx +++ b/apps/dokploy/pages/dashboard/settings/notifications.tsx @@ -5,7 +5,7 @@ import { appRouter } from "@/server/api/root"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import React, { type ReactElement } from "react"; +import type { ReactElement } from "react"; import superjson from "superjson"; const Page = () => { @@ -25,8 +25,8 @@ export async function getServerSideProps( ctx: GetServerSidePropsContext<{ serviceId: string }>, ) { const { req, res } = ctx; - const { user, session } = await validateRequest(req, res); - if (!user || user.rol === "user") { + const { user, session } = await validateRequest(req); + if (!user || user.role === "member") { return { redirect: { permanent: true, @@ -41,12 +41,12 @@ export async function getServerSideProps( req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); - await helpers.auth.get.prefetch(); + await helpers.user.get.prefetch(); await helpers.settings.isCloud.prefetch(); return { diff --git a/apps/dokploy/pages/dashboard/settings/profile.tsx b/apps/dokploy/pages/dashboard/settings/profile.tsx index 44e007f1..83ff5624 100644 --- a/apps/dokploy/pages/dashboard/settings/profile.tsx +++ b/apps/dokploy/pages/dashboard/settings/profile.tsx @@ -1,6 +1,5 @@ -import { GenerateToken } from "@/components/dashboard/settings/profile/generate-token"; +import { ShowApiKeys } from "@/components/dashboard/settings/api/show-api-keys"; import { ProfileForm } from "@/components/dashboard/settings/profile/profile-form"; -import { RemoveSelfAccount } from "@/components/dashboard/settings/profile/remove-self-account"; import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { appRouter } from "@/server/api/root"; @@ -9,28 +8,20 @@ import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import React, { type ReactElement } from "react"; +import type { ReactElement } from "react"; import superjson from "superjson"; const Page = () => { - const { data } = api.auth.get.useQuery(); - const { data: user } = api.user.byAuthId.useQuery( - { - authId: data?.id || "", - }, - { - enabled: !!data?.id && data?.rol === "user", - }, - ); + const { data } = api.user.get.useQuery(); - const { data: isCloud } = api.settings.isCloud.useQuery(); + // const { data: isCloud } = api.settings.isCloud.useQuery(); return (
- {(user?.canAccessToAPI || data?.rol === "admin") && } + {(data?.canAccessToAPI || data?.role === "owner") && } - {isCloud && } + {/* {isCloud && } */}
); @@ -46,7 +37,7 @@ export async function getServerSideProps( ) { const { req, res } = ctx; const locale = getLocale(req.cookies); - const { user, session } = await validateRequest(req, res); + const { user, session } = await validateRequest(req); const helpers = createServerSideHelpers({ router: appRouter, @@ -54,19 +45,14 @@ export async function getServerSideProps( req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); await helpers.settings.isCloud.prefetch(); - await helpers.auth.get.prefetch(); - if (user?.rol === "user") { - await helpers.user.byAuthId.prefetch({ - authId: user.authId, - }); - } + await helpers.user.get.prefetch(); if (!user) { return { diff --git a/apps/dokploy/pages/dashboard/settings/registry.tsx b/apps/dokploy/pages/dashboard/settings/registry.tsx index 49c9ec20..42f0627f 100644 --- a/apps/dokploy/pages/dashboard/settings/registry.tsx +++ b/apps/dokploy/pages/dashboard/settings/registry.tsx @@ -5,7 +5,7 @@ import { appRouter } from "@/server/api/root"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import React, { type ReactElement } from "react"; +import type { ReactElement } from "react"; import superjson from "superjson"; const Page = () => { @@ -25,8 +25,8 @@ export async function getServerSideProps( ctx: GetServerSidePropsContext<{ serviceId: string }>, ) { const { req, res } = ctx; - const { user, session } = await validateRequest(req, res); - if (!user || user.rol === "user") { + const { user, session } = await validateRequest(req); + if (!user || user.role === "member") { return { redirect: { permanent: true, @@ -40,12 +40,12 @@ export async function getServerSideProps( req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); - await helpers.auth.get.prefetch(); + await helpers.user.get.prefetch(); await helpers.settings.isCloud.prefetch(); return { diff --git a/apps/dokploy/pages/dashboard/settings/server.tsx b/apps/dokploy/pages/dashboard/settings/server.tsx index d501f1fa..0c5e36dc 100644 --- a/apps/dokploy/pages/dashboard/settings/server.tsx +++ b/apps/dokploy/pages/dashboard/settings/server.tsx @@ -1,13 +1,12 @@ import { WebDomain } from "@/components/dashboard/settings/web-domain"; import { WebServer } from "@/components/dashboard/settings/web-server"; import { DashboardLayout } from "@/components/layouts/dashboard-layout"; - import { appRouter } from "@/server/api/root"; import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { IS_CLOUD, validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import React, { type ReactElement } from "react"; +import type { ReactElement } from "react"; import superjson from "superjson"; const Page = () => { @@ -16,6 +15,49 @@ const Page = () => {
+ {/* +
+ + + + Paid Features + + + Enable or disable paid features like monitoring + + + +
+ + Enable Paid Features: + + + { + update({ + enablePaidFeatures: !data?.enablePaidFeatures, + }) + .then(() => { + toast.success( + `Paid features ${ + data?.enablePaidFeatures ? "disabled" : "enabled" + } successfully`, + ); + refetch(); + }) + .catch(() => { + toast.error("Error updating paid features"); + }); + }} + /> +
+
+ {data?.enablePaidFeatures && } +
+
*/} + + {/* */}
); @@ -39,7 +81,7 @@ export async function getServerSideProps( }, }; } - const { user, session } = await validateRequest(ctx.req, ctx.res); + const { user, session } = await validateRequest(ctx.req); if (!user) { return { redirect: { @@ -48,7 +90,7 @@ export async function getServerSideProps( }, }; } - if (user.rol === "user") { + if (user.role === "member") { return { redirect: { permanent: true, @@ -63,12 +105,12 @@ export async function getServerSideProps( req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); - await helpers.auth.get.prefetch(); + await helpers.user.get.prefetch(); return { props: { diff --git a/apps/dokploy/pages/dashboard/settings/servers.tsx b/apps/dokploy/pages/dashboard/settings/servers.tsx index 36fde983..5cc30b83 100644 --- a/apps/dokploy/pages/dashboard/settings/servers.tsx +++ b/apps/dokploy/pages/dashboard/settings/servers.tsx @@ -6,7 +6,7 @@ import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import React, { type ReactElement } from "react"; +import type { ReactElement } from "react"; import superjson from "superjson"; const Page = () => { @@ -27,7 +27,7 @@ export async function getServerSideProps( ) { const { req, res } = ctx; const locale = await getLocale(req.cookies); - const { user, session } = await validateRequest(req, res); + const { user, session } = await validateRequest(req); if (!user) { return { redirect: { @@ -36,7 +36,7 @@ export async function getServerSideProps( }, }; } - if (user.rol === "user") { + if (user.role === "member") { return { redirect: { permanent: true, @@ -51,12 +51,12 @@ export async function getServerSideProps( req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); - await helpers.auth.get.prefetch(); + await helpers.user.get.prefetch(); await helpers.settings.isCloud.prefetch(); return { diff --git a/apps/dokploy/pages/dashboard/settings/ssh-keys.tsx b/apps/dokploy/pages/dashboard/settings/ssh-keys.tsx index 239edac6..2472feab 100644 --- a/apps/dokploy/pages/dashboard/settings/ssh-keys.tsx +++ b/apps/dokploy/pages/dashboard/settings/ssh-keys.tsx @@ -5,7 +5,7 @@ import { appRouter } from "@/server/api/root"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import React, { type ReactElement } from "react"; +import type { ReactElement } from "react"; import superjson from "superjson"; const Page = () => { @@ -24,7 +24,7 @@ Page.getLayout = (page: ReactElement) => { export async function getServerSideProps( ctx: GetServerSidePropsContext<{ serviceId: string }>, ) { - const { user, session } = await validateRequest(ctx.req, ctx.res); + const { user, session } = await validateRequest(ctx.req); if (!user) { return { redirect: { @@ -33,30 +33,29 @@ export async function getServerSideProps( }, }; } - const { req, res, resolvedUrl } = ctx; + const { req, res } = ctx; const helpers = createServerSideHelpers({ router: appRouter, ctx: { req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); try { await helpers.project.all.prefetch(); - const auth = await helpers.auth.get.fetch(); await helpers.settings.isCloud.prefetch(); - if (auth.rol === "user") { - const user = await helpers.user.byAuthId.fetch({ - authId: auth.id, + if (user.role === "member") { + const userR = await helpers.user.one.fetch({ + userId: user.id, }); - if (!user.canAccessToSSHKeys) { + if (!userR?.canAccessToSSHKeys) { return { redirect: { permanent: true, @@ -70,7 +69,7 @@ export async function getServerSideProps( trpcState: helpers.dehydrate(), }, }; - } catch (error) { + } catch (_error) { return { props: {}, }; diff --git a/apps/dokploy/pages/dashboard/settings/users.tsx b/apps/dokploy/pages/dashboard/settings/users.tsx index e7072890..16f90abb 100644 --- a/apps/dokploy/pages/dashboard/settings/users.tsx +++ b/apps/dokploy/pages/dashboard/settings/users.tsx @@ -1,3 +1,4 @@ +import { ShowInvitations } from "@/components/dashboard/settings/users/show-invitations"; import { ShowUsers } from "@/components/dashboard/settings/users/show-users"; import { DashboardLayout } from "@/components/layouts/dashboard-layout"; @@ -5,13 +6,14 @@ import { appRouter } from "@/server/api/root"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import React, { type ReactElement } from "react"; +import type { ReactElement } from "react"; import superjson from "superjson"; const Page = () => { return (
+
); }; @@ -25,8 +27,9 @@ export async function getServerSideProps( ctx: GetServerSidePropsContext<{ serviceId: string }>, ) { const { req, res } = ctx; - const { user, session } = await validateRequest(req, res); - if (!user || user.rol === "user") { + const { user, session } = await validateRequest(req); + + if (!user || user.role === "member") { return { redirect: { permanent: true, @@ -41,12 +44,12 @@ export async function getServerSideProps( req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); - await helpers.auth.get.prefetch(); + await helpers.user.get.prefetch(); await helpers.settings.isCloud.prefetch(); return { diff --git a/apps/dokploy/pages/dashboard/swarm.tsx b/apps/dokploy/pages/dashboard/swarm.tsx index f40a0a83..15553116 100644 --- a/apps/dokploy/pages/dashboard/swarm.tsx +++ b/apps/dokploy/pages/dashboard/swarm.tsx @@ -1,18 +1,15 @@ import SwarmMonitorCard from "@/components/dashboard/swarm/monitoring-card"; import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { appRouter } from "@/server/api/root"; -import { IS_CLOUD, validateRequest } from "@dokploy/server"; +import { IS_CLOUD } from "@dokploy/server/constants"; +import { validateRequest } from "@dokploy/server/lib/auth"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; import type { ReactElement } from "react"; import superjson from "superjson"; const Dashboard = () => { - return ( - <> - - - ); + return ; }; export default Dashboard; @@ -31,7 +28,7 @@ export async function getServerSideProps( }, }; } - const { user, session } = await validateRequest(ctx.req, ctx.res); + const { user, session } = await validateRequest(ctx.req); if (!user) { return { redirect: { @@ -48,21 +45,20 @@ export async function getServerSideProps( req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); try { await helpers.project.all.prefetch(); - const auth = await helpers.auth.get.fetch(); - if (auth.rol === "user") { - const user = await helpers.user.byAuthId.fetch({ - authId: auth.id, + if (user.role === "member") { + const userR = await helpers.user.one.fetch({ + userId: user.id, }); - if (!user.canAccessToDocker) { + if (!userR?.canAccessToDocker) { return { redirect: { permanent: true, @@ -76,7 +72,7 @@ export async function getServerSideProps( trpcState: helpers.dehydrate(), }, }; - } catch (error) { + } catch (_error) { return { props: {}, }; diff --git a/apps/dokploy/pages/dashboard/traefik.tsx b/apps/dokploy/pages/dashboard/traefik.tsx index 9cd7eefc..ce8208be 100644 --- a/apps/dokploy/pages/dashboard/traefik.tsx +++ b/apps/dokploy/pages/dashboard/traefik.tsx @@ -1,10 +1,11 @@ import { ShowTraefikSystem } from "@/components/dashboard/file-system/show-traefik-system"; import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { appRouter } from "@/server/api/root"; -import { IS_CLOUD, validateRequest } from "@dokploy/server"; +import { IS_CLOUD } from "@dokploy/server/constants"; +import { validateRequest } from "@dokploy/server/lib/auth"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; -import React, { type ReactElement } from "react"; +import type { ReactElement } from "react"; import superjson from "superjson"; const Dashboard = () => { @@ -27,7 +28,7 @@ export async function getServerSideProps( }, }; } - const { user, session } = await validateRequest(ctx.req, ctx.res); + const { user, session } = await validateRequest(ctx.req); if (!user) { return { redirect: { @@ -44,21 +45,20 @@ export async function getServerSideProps( req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); try { await helpers.project.all.prefetch(); - const auth = await helpers.auth.get.fetch(); - if (auth.rol === "user") { - const user = await helpers.user.byAuthId.fetch({ - authId: auth.id, + if (user.role === "member") { + const userR = await helpers.user.one.fetch({ + userId: user.id, }); - if (!user.canAccessToTraefikFiles) { + if (!userR?.canAccessToTraefikFiles) { return { redirect: { permanent: true, @@ -72,7 +72,7 @@ export async function getServerSideProps( trpcState: helpers.dehydrate(), }, }; - } catch (error) { + } catch (_error) { return { props: {}, }; diff --git a/apps/dokploy/pages/index.tsx b/apps/dokploy/pages/index.tsx index 2c5ab0bb..200ca8ef 100644 --- a/apps/dokploy/pages/index.tsx +++ b/apps/dokploy/pages/index.tsx @@ -1,9 +1,15 @@ -import { Login2FA } from "@/components/auth/login-2fa"; import { OnboardingLayout } from "@/components/layouts/onboarding-layout"; import { AlertBlock } from "@/components/shared/alert-block"; import { Logo } from "@/components/shared/logo"; -import { Button, buttonVariants } from "@/components/ui/button"; -import { CardContent } from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { CardContent, CardDescription } from "@/components/ui/card"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; import { Form, FormControl, @@ -13,88 +19,186 @@ import { FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; -import { cn } from "@/lib/utils"; -import { api } from "@/utils/api"; -import { IS_CLOUD, isAdminPresent, validateRequest } from "@dokploy/server"; +import { + InputOTP, + InputOTPGroup, + InputOTPSlot, +} from "@/components/ui/input-otp"; +import { Label } from "@/components/ui/label"; +import { authClient } from "@/lib/auth-client"; +import { IS_CLOUD, isAdminPresent } from "@dokploy/server"; +import { validateRequest } from "@dokploy/server/lib/auth"; import { zodResolver } from "@hookform/resolvers/zod"; +import { REGEXP_ONLY_DIGITS } from "input-otp"; import type { GetServerSidePropsContext } from "next"; import Link from "next/link"; import { useRouter } from "next/router"; -import { type ReactElement, useEffect, useState } from "react"; +import { type ReactElement, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; -const loginSchema = z.object({ - email: z - .string() - .min(1, { - message: "Email is required", - }) - .email({ - message: "Email must be a valid email", - }), - - password: z - .string() - .min(1, { - message: "Password is required", - }) - .min(8, { - message: "Password must be at least 8 characters", - }), +const LoginSchema = z.object({ + email: z.string().email(), + password: z.string().min(8), }); -type Login = z.infer; +const _TwoFactorSchema = z.object({ + code: z.string().min(6), +}); -type AuthResponse = { - is2FAEnabled: boolean; - authId: string; -}; +type LoginForm = z.infer; interface Props { IS_CLOUD: boolean; } export default function Home({ IS_CLOUD }: Props) { - const [temp, setTemp] = useState({ - is2FAEnabled: false, - authId: "", - }); - const { mutateAsync, isLoading, error, isError } = - api.auth.login.useMutation(); const router = useRouter(); - const form = useForm({ + const [isLoginLoading, setIsLoginLoading] = useState(false); + const [isTwoFactorLoading, setIsTwoFactorLoading] = useState(false); + const [isBackupCodeLoading, setIsBackupCodeLoading] = useState(false); + const [isTwoFactor, setIsTwoFactor] = useState(false); + const [error, setError] = useState(null); + const [twoFactorCode, setTwoFactorCode] = useState(""); + const [isBackupCodeModalOpen, setIsBackupCodeModalOpen] = useState(false); + const [backupCode, setBackupCode] = useState(""); + const [isGithubLoading, setIsGithubLoading] = useState(false); + const [isGoogleLoading, setIsGoogleLoading] = useState(false); + const loginForm = useForm({ + resolver: zodResolver(LoginSchema), defaultValues: { email: "", password: "", }, - resolver: zodResolver(loginSchema), }); - useEffect(() => { - form.reset(); - }, [form, form.reset, form.formState.isSubmitSuccessful]); - - const onSubmit = async (values: Login) => { - await mutateAsync({ - email: values.email.toLowerCase(), - password: values.password, - }) - .then((data) => { - if (data.is2FAEnabled) { - setTemp(data); - } else { - toast.success("Successfully signed in", { - duration: 2000, - }); - router.push("/dashboard/projects"); - } - }) - .catch(() => { - toast.error("Signin failed", { - duration: 2000, - }); + const onSubmit = async (values: LoginForm) => { + setIsLoginLoading(true); + try { + const { data, error } = await authClient.signIn.email({ + email: values.email, + password: values.password, }); + + if (error) { + toast.error(error.message); + setError(error.message || "An error occurred while logging in"); + return; + } + + // @ts-ignore + if (data?.twoFactorRedirect as boolean) { + setTwoFactorCode(""); + setIsTwoFactor(true); + toast.info("Please enter your 2FA code"); + return; + } + + toast.success("Logged in successfully"); + router.push("/dashboard/projects"); + } catch (_error) { + toast.error("An error occurred while logging in"); + } finally { + setIsLoginLoading(false); + } + }; + + const onTwoFactorSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + if (twoFactorCode.length !== 6) { + toast.error("Please enter a valid 6-digit code"); + return; + } + + setIsTwoFactorLoading(true); + try { + const { error } = await authClient.twoFactor.verifyTotp({ + code: twoFactorCode.replace(/\s/g, ""), + }); + + if (error) { + toast.error(error.message); + setError(error.message || "An error occurred while verifying 2FA code"); + return; + } + + toast.success("Logged in successfully"); + router.push("/dashboard/projects"); + } catch (_error) { + toast.error("An error occurred while verifying 2FA code"); + } finally { + setIsTwoFactorLoading(false); + } + }; + + const onBackupCodeSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + if (backupCode.length < 8) { + toast.error("Please enter a valid backup code"); + return; + } + + setIsBackupCodeLoading(true); + try { + const { error } = await authClient.twoFactor.verifyBackupCode({ + code: backupCode.trim(), + }); + + if (error) { + toast.error(error.message); + setError( + error.message || "An error occurred while verifying backup code", + ); + return; + } + + toast.success("Logged in successfully"); + router.push("/dashboard/projects"); + } catch (_error) { + toast.error("An error occurred while verifying backup code"); + } finally { + setIsBackupCodeLoading(false); + } + }; + + const handleGithubSignIn = async () => { + setIsGithubLoading(true); + try { + const { error } = await authClient.signIn.social({ + provider: "github", + }); + + if (error) { + toast.error(error.message); + return; + } + } catch (error) { + toast.error("An error occurred while signing in with GitHub", { + description: error instanceof Error ? error.message : "Unknown error", + }); + } finally { + setIsGithubLoading(false); + } + }; + + const handleGoogleSignIn = async () => { + setIsGoogleLoading(true); + try { + const { error } = await authClient.signIn.social({ + provider: "google", + }); + + if (error) { + toast.error(error.message); + return; + } + } catch (error) { + toast.error("An error occurred while signing in with Google", { + description: error instanceof Error ? error.message : "Unknown error", + }); + } finally { + setIsGoogleLoading(false); + } }; return ( <> @@ -109,31 +213,81 @@ export default function Home({ IS_CLOUD }: Props) { Enter your email and password to sign in

- {isError && ( + {error && ( - {error?.message} + {error} )} - {!temp.is2FAEnabled ? ( -
- -
+ {!isTwoFactor ? ( + <> + {IS_CLOUD && ( + + )} + {IS_CLOUD && ( + + )} + + ( Email - + )} /> ( @@ -141,7 +295,7 @@ export default function Home({ IS_CLOUD }: Props) { @@ -149,15 +303,127 @@ export default function Home({ IS_CLOUD }: Props) { )} /> - - + + + + ) : ( + <> +
+
+ + + + + + + + + + + + + Enter the 6-digit code from your authenticator app + + +
+ +
+ +
- - ) : ( - + + + + + Enter Backup Code + + Enter one of your backup codes to access your account + + + +
+
+ + setBackupCode(e.target.value)} + placeholder="Enter your backup code" + className="font-mono" + /> + + Enter one of the backup codes you received when setting up + 2FA + +
+ +
+ + +
+
+
+
+ )}
@@ -203,8 +469,7 @@ Home.getLayout = (page: ReactElement) => { export async function getServerSideProps(context: GetServerSidePropsContext) { if (IS_CLOUD) { try { - const { user } = await validateRequest(context.req, context.res); - + const { user } = await validateRequest(context.req); if (user) { return { redirect: { @@ -213,7 +478,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { }, }; } - } catch (error) {} + } catch (_error) {} return { props: { @@ -232,7 +497,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { }; } - const { user } = await validateRequest(context.req, context.res); + const { user } = await validateRequest(context.req); if (user) { return { diff --git a/apps/dokploy/pages/invitation.tsx b/apps/dokploy/pages/invitation.tsx index 77f9f249..32026c0e 100644 --- a/apps/dokploy/pages/invitation.tsx +++ b/apps/dokploy/pages/invitation.tsx @@ -1,12 +1,8 @@ import { OnboardingLayout } from "@/components/layouts/onboarding-layout"; +import { AlertBlock } from "@/components/shared/alert-block"; import { Logo } from "@/components/shared/logo"; import { Button } from "@/components/ui/button"; -import { - Card, - CardContent, - CardDescription, - CardTitle, -} from "@/components/ui/card"; +import { CardContent, CardDescription, CardTitle } from "@/components/ui/card"; import { Form, FormControl, @@ -16,10 +12,10 @@ import { FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; +import { authClient } from "@/lib/auth-client"; import { api } from "@/utils/api"; import { IS_CLOUD, getUserByToken } from "@dokploy/server"; import { zodResolver } from "@hookform/resolvers/zod"; -import { AlertTriangle } from "lucide-react"; import type { GetServerSidePropsContext } from "next"; import Link from "next/link"; import { useRouter } from "next/router"; @@ -30,6 +26,9 @@ import { z } from "zod"; const registerSchema = z .object({ + name: z.string().min(1, { + message: "Name is required", + }), email: z .string() .min(1, { @@ -38,7 +37,6 @@ const registerSchema = z .email({ message: "Email must be a valid email", }), - password: z .string() .min(1, { @@ -71,11 +69,17 @@ interface Props { token: string; invitation: Awaited>; isCloud: boolean; + userAlreadyExists: boolean; } -const Invitation = ({ token, invitation, isCloud }: Props) => { +const Invitation = ({ + token, + invitation, + isCloud, + userAlreadyExists, +}: Props) => { const router = useRouter(); - const { data } = api.admin.getUserByToken.useQuery( + const { data } = api.user.getUserByToken.useQuery( { token, }, @@ -85,11 +89,9 @@ const Invitation = ({ token, invitation, isCloud }: Props) => { }, ); - const { mutateAsync, error, isError, isSuccess } = - api.auth.createUser.useMutation(); - const form = useForm({ defaultValues: { + name: "", email: "", password: "", confirmPassword: "", @@ -98,9 +100,9 @@ const Invitation = ({ token, invitation, isCloud }: Props) => { }); useEffect(() => { - if (data?.auth?.email) { + if (data?.email) { form.reset({ - email: data?.auth?.email || "", + email: data?.email || "", password: "", confirmPassword: "", }); @@ -108,20 +110,32 @@ const Invitation = ({ token, invitation, isCloud }: Props) => { }, [form, form.reset, form.formState.isSubmitSuccessful, data]); const onSubmit = async (values: Register) => { - await mutateAsync({ - id: data?.authId, - password: values.password, - token: token, - }) - .then(() => { - toast.success("User registered successfuly", { - description: - "Please check your inbox or spam folder to confirm your account.", - duration: 100000, - }); - router.push("/dashboard/projects"); - }) - .catch((e) => e); + try { + const { error } = await authClient.signUp.email({ + email: values.email, + password: values.password, + name: values.name, + fetchOptions: { + headers: { + "x-dokploy-token": token, + }, + }, + }); + + if (error) { + toast.error(error.message); + return; + } + + const _result = await authClient.organization.acceptInvitation({ + invitationId: token, + }); + + toast.success("Account created successfully"); + router.push("/dashboard/projects"); + } catch (_error) { + toast.error("An error occurred while creating your account"); + } }; return ( @@ -138,114 +152,155 @@ const Invitation = ({ token, invitation, isCloud }: Props) => { Invitation - - Fill the form below to create your account - -
-
+ {userAlreadyExists ? ( +
+ +
+ Valid Invitation! + + We detected that you already have an account with this + email. Please sign in to accept the invitation. + +
+
- {isError && ( -
- - - {error?.message} - -
- )} + +
+ ) : ( + <> + + Fill the form below to create your account + +
+
- -
- -
- ( - - Email - - - - - - )} - /> - ( - - Password - - - - - - )} - /> + {/* {isError && ( +
+ + + {error?.message} + +
+ )} */} - ( - - Confirm Password - - - - - - )} - /> - - -
+
+ ( + + Name + + + + + + )} + /> + ( + + Email + + + + + + )} + /> + ( + + Password + + + + + + )} + /> -
- {isCloud && ( - <> - ( + + Confirm Password + + + + + + )} + /> + +
- - - -
+ Register + +
+ +
+ {isCloud && ( + <> + + Login + + + Lost your password? + + + )} +
+ + + +
+ + )}
); }; - +// http://localhost:3000/invitation?token=CZK4BLrUdMa32RVkAdZiLsPDdvnPiAgZ +// /f7af93acc1a99eae864972ab4c92fee089f0d83473d415ede8e821e5dbabe79c export default Invitation; Invitation.getLayout = (page: ReactElement) => { return {page}; @@ -255,6 +310,15 @@ export async function getServerSideProps(ctx: GetServerSidePropsContext) { const token = query.token; + // if (IS_CLOUD) { + // return { + // redirect: { + // permanent: true, + // destination: "/", + // }, + // }; + // } + if (typeof token !== "string") { return { redirect: { @@ -267,6 +331,17 @@ export async function getServerSideProps(ctx: GetServerSidePropsContext) { try { const invitation = await getUserByToken(token); + if (invitation.userAlreadyExists) { + return { + props: { + isCloud: IS_CLOUD, + token: token, + invitation: invitation, + userAlreadyExists: true, + }, + }; + } + if (invitation.isExpired) { return { redirect: { @@ -284,6 +359,7 @@ export async function getServerSideProps(ctx: GetServerSidePropsContext) { }, }; } catch (error) { + console.log("error", error); return { redirect: { permanent: true, diff --git a/apps/dokploy/pages/register.tsx b/apps/dokploy/pages/register.tsx index e42231a2..393c2ba2 100644 --- a/apps/dokploy/pages/register.tsx +++ b/apps/dokploy/pages/register.tsx @@ -2,12 +2,7 @@ import { OnboardingLayout } from "@/components/layouts/onboarding-layout"; import { AlertBlock } from "@/components/shared/alert-block"; import { Logo } from "@/components/shared/logo"; import { Button } from "@/components/ui/button"; -import { - Card, - CardContent, - CardDescription, - CardTitle, -} from "@/components/ui/card"; +import { CardContent, CardDescription, CardTitle } from "@/components/ui/card"; import { Form, FormControl, @@ -17,20 +12,23 @@ import { FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; -import { api } from "@/utils/api"; +import { authClient } from "@/lib/auth-client"; import { IS_CLOUD, isAdminPresent, validateRequest } from "@dokploy/server"; import { zodResolver } from "@hookform/resolvers/zod"; import { AlertTriangle } from "lucide-react"; import type { GetServerSidePropsContext } from "next"; import Link from "next/link"; import { useRouter } from "next/router"; -import { type ReactElement, useEffect } from "react"; +import { type ReactElement, useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; const registerSchema = z .object({ + name: z.string().min(1, { + message: "Name is required", + }), email: z .string() .min(1, { @@ -74,11 +72,13 @@ interface Props { const Register = ({ isCloud }: Props) => { const router = useRouter(); - const { mutateAsync, error, isError, data } = - api.auth.createAdmin.useMutation(); + const [isError, setIsError] = useState(false); + const [error, setError] = useState(null); + const [data, setData] = useState(null); const form = useForm({ defaultValues: { + name: "", email: "", password: "", confirmPassword: "", @@ -91,19 +91,25 @@ const Register = ({ isCloud }: Props) => { }, [form, form.reset, form.formState.isSubmitSuccessful]); const onSubmit = async (values: Register) => { - await mutateAsync({ - email: values.email.toLowerCase(), + const { data, error } = await authClient.signUp.email({ + email: values.email, password: values.password, - }) - .then(() => { - toast.success("User registered successfuly", { - duration: 2000, - }); - if (!isCloud) { - router.push("/"); - } - }) - .catch((e) => e); + name: values.name, + }); + + if (error) { + setIsError(true); + setError(error.message || "An error occurred"); + } else { + toast.success("User registered successfuly", { + duration: 2000, + }); + if (!isCloud) { + router.push("/"); + } else { + setData(data); + } + } }; return (
@@ -125,15 +131,15 @@ const Register = ({ isCloud }: Props) => {
{isError && ( -
+
- {error?.message} + {error}
)} - {data?.type === "cloud" && ( - + {isCloud && data && ( + Registered successfully, please check your inbox or spam folder to confirm your account. @@ -147,6 +153,19 @@ const Register = ({ isCloud }: Props) => { className="grid gap-4" >
+ ( + + Name + + + + + + )} + /> { }; export async function getServerSideProps(context: GetServerSidePropsContext) { if (IS_CLOUD) { - const { user } = await validateRequest(context.req, context.res); + const { user } = await validateRequest(context.req); if (user) { return { diff --git a/apps/dokploy/pages/reset-password.tsx b/apps/dokploy/pages/reset-password.tsx index 42e2ce00..0f6cf0b3 100644 --- a/apps/dokploy/pages/reset-password.tsx +++ b/apps/dokploy/pages/reset-password.tsx @@ -12,17 +12,13 @@ import { FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; -import { db } from "@/server/db"; -import { auth } from "@/server/db/schema"; -import { api } from "@/utils/api"; +import { authClient } from "@/lib/auth-client"; import { IS_CLOUD } from "@dokploy/server"; import { zodResolver } from "@hookform/resolvers/zod"; -import { isBefore } from "date-fns"; -import { eq } from "drizzle-orm"; import type { GetServerSidePropsContext } from "next"; import Link from "next/link"; import { useRouter } from "next/router"; -import { type ReactElement, useEffect } from "react"; +import { type ReactElement, useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; @@ -54,11 +50,12 @@ const loginSchema = z type Login = z.infer; interface Props { - token: string; + tokenResetPassword: string; } -export default function Home({ token }: Props) { - const { mutateAsync, isLoading, isError, error } = - api.auth.resetPassword.useMutation(); +export default function Home({ tokenResetPassword }: Props) { + const [token, setToken] = useState(tokenResetPassword); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); const router = useRouter(); const form = useForm({ defaultValues: { @@ -68,26 +65,32 @@ export default function Home({ token }: Props) { resolver: zodResolver(loginSchema), }); + useEffect(() => { + const token = new URLSearchParams(window.location.search).get("token"); + + if (token) { + setToken(token); + } + }, [token]); + useEffect(() => { form.reset(); }, [form, form.reset, form.formState.isSubmitSuccessful]); const onSubmit = async (values: Login) => { - await mutateAsync({ - resetPasswordToken: token, - password: values.password, - }) - .then((data) => { - toast.success("Password reset successfully", { - duration: 2000, - }); - router.push("/"); - }) - .catch(() => { - toast.error("Error resetting password", { - duration: 2000, - }); - }); + setIsLoading(true); + const { error } = await authClient.resetPassword({ + newPassword: values.password, + token: token || "", + }); + + if (error) { + setError(error.message || "An error occurred"); + } else { + toast.success("Password reset successfully"); + router.push("/"); + } + setIsLoading(false); }; return (
@@ -104,9 +107,9 @@ export default function Home({ token }: Props) {
- {isError && ( + {error && ( - {error?.message} + {error} )}
@@ -194,35 +197,9 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { }; } - const authR = await db.query.auth.findFirst({ - where: eq(auth.resetPasswordToken, token), - }); - - if (!authR || authR?.resetPasswordExpiresAt === null) { - return { - redirect: { - permanent: true, - destination: "/", - }, - }; - } - const isExpired = isBefore( - new Date(authR.resetPasswordExpiresAt), - new Date(), - ); - - if (isExpired) { - return { - redirect: { - permanent: true, - destination: "/", - }, - }; - } - return { props: { - token: authR.resetPasswordToken, + tokenResetPassword: token, }, }; } diff --git a/apps/dokploy/pages/send-reset-password.tsx b/apps/dokploy/pages/send-reset-password.tsx index c4cd851c..10d1058a 100644 --- a/apps/dokploy/pages/send-reset-password.tsx +++ b/apps/dokploy/pages/send-reset-password.tsx @@ -1,14 +1,8 @@ -import { Login2FA } from "@/components/auth/login-2fa"; import { OnboardingLayout } from "@/components/layouts/onboarding-layout"; import { AlertBlock } from "@/components/shared/alert-block"; import { Logo } from "@/components/shared/logo"; import { Button } from "@/components/ui/button"; -import { - Card, - CardContent, - CardDescription, - CardTitle, -} from "@/components/ui/card"; +import { CardContent, CardDescription, CardTitle } from "@/components/ui/card"; import { Form, FormControl, @@ -18,7 +12,7 @@ import { FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; -import { api } from "@/utils/api"; +import { authClient } from "@/lib/auth-client"; import { IS_CLOUD } from "@dokploy/server"; import { zodResolver } from "@hookform/resolvers/zod"; import type { GetServerSidePropsContext } from "next"; @@ -48,13 +42,14 @@ type AuthResponse = { }; export default function Home() { - const [temp, setTemp] = useState({ + const [temp, _setTemp] = useState({ is2FAEnabled: false, authId: "", }); - const { mutateAsync, isLoading, isError, error } = - api.auth.sendResetPasswordEmail.useMutation(); - const router = useRouter(); + + const [error, setError] = useState(null); + const [isLoading, setIsLoading] = useState(false); + const _router = useRouter(); const form = useForm({ defaultValues: { email: "", @@ -67,19 +62,20 @@ export default function Home() { }, [form, form.reset, form.formState.isSubmitSuccessful]); const onSubmit = async (values: Login) => { - await mutateAsync({ + setIsLoading(true); + const { error } = await authClient.forgetPassword({ email: values.email, - }) - .then((data) => { - toast.success("Email sent", { - duration: 2000, - }); - }) - .catch(() => { - toast.error("Error sending email", { - duration: 2000, - }); + redirectTo: "/reset-password", + }); + if (error) { + setError(error.message || "An error occurred"); + setIsLoading(false); + } else { + toast.success("Email sent", { + duration: 2000, }); + } + setIsLoading(false); }; return (
@@ -95,9 +91,9 @@ export default function Home() {
- {isError && ( + {error && ( - {error?.message} + {error} )} {!temp.is2FAEnabled ? ( @@ -131,9 +127,7 @@ export default function Home() {
- ) : ( - - )} + ) : null}
@@ -155,7 +149,7 @@ export default function Home() { Home.getLayout = (page: ReactElement) => { return {page}; }; -export async function getServerSideProps(context: GetServerSidePropsContext) { +export async function getServerSideProps(_context: GetServerSidePropsContext) { if (!IS_CLOUD) { return { redirect: { diff --git a/apps/dokploy/pages/swagger.tsx b/apps/dokploy/pages/swagger.tsx index b5deb2ac..11ea0731 100644 --- a/apps/dokploy/pages/swagger.tsx +++ b/apps/dokploy/pages/swagger.tsx @@ -30,7 +30,41 @@ const Home: NextPage = () => { return (
- + (args: any) => { + const result = ori(args); + const apiKey = args?.apiKey?.value; + if (apiKey) { + localStorage.setItem("swagger_api_key", apiKey); + } + return result; + }, + logout: (ori: any) => (args: any) => { + const result = ori(args); + localStorage.removeItem("swagger_api_key"); + return result; + }, + }, + }, + }, + }, + ]} + requestInterceptor={(request: any) => { + const apiKey = localStorage.getItem("swagger_api_key"); + if (apiKey) { + request.headers = request.headers || {}; + request.headers["x-api-key"] = apiKey; + } + return request; + }} + />
); }; @@ -38,7 +72,7 @@ const Home: NextPage = () => { export default Home; export async function getServerSideProps(context: GetServerSidePropsContext) { const { req, res } = context; - const { user, session } = await validateRequest(context.req, context.res); + const { user, session } = await validateRequest(context.req); if (!user) { return { redirect: { @@ -53,17 +87,17 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { req: req as any, res: res as any, db: null as any, - session: session, - user: user, + session: session as any, + user: user as any, }, transformer: superjson, }); - if (user.rol === "user") { - const result = await helpers.user.byAuthId.fetch({ - authId: user.id, + if (user.role === "member") { + const userR = await helpers.user.one.fetch({ + userId: user.id, }); - if (!result.canAccessToAPI) { + if (!userR?.canAccessToAPI) { return { redirect: { permanent: true, diff --git a/apps/dokploy/public/locales/ml/common.json b/apps/dokploy/public/locales/ml/common.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/apps/dokploy/public/locales/ml/common.json @@ -0,0 +1 @@ +{} diff --git a/apps/dokploy/public/locales/ml/settings.json b/apps/dokploy/public/locales/ml/settings.json new file mode 100644 index 00000000..cb62b6ec --- /dev/null +++ b/apps/dokploy/public/locales/ml/settings.json @@ -0,0 +1,58 @@ +{ + "settings.common.save": "സേവ് ചെയ്യുക", + "settings.common.enterTerminal": "ടർമിനലിൽ പ്രവേശിക്കുക", + "settings.server.domain.title": "സർവർ ഡോമെയ്ൻ", + "settings.server.domain.description": "നിങ്ങളുടെ സർവർ അപ്ലിക്കേഷനിൽ ഒരു ഡോമെയ്ൻ ചേർക്കുക.", + "settings.server.domain.form.domain": "ഡോമെയ്ൻ", + "settings.server.domain.form.letsEncryptEmail": "ലെറ്റ്സ് എൻക്രിപ്റ്റ് ഇമെയിൽ", + "settings.server.domain.form.certificate.label": "സർട്ടിഫിക്കറ്റ് പ്രൊവൈഡർ", + "settings.server.domain.form.certificate.placeholder": "ഒരു സർട്ടിഫിക്കറ്റ് തിരഞ്ഞെടുക്കുക", + "settings.server.domain.form.certificateOptions.none": "ഒന്നുമില്ല", + "settings.server.domain.form.certificateOptions.letsencrypt": "ലെറ്റ്സ് എൻക്രിപ്റ്റ്", + + "settings.server.webServer.title": "വെബ് സർവർ", + "settings.server.webServer.description": "വെബ് സർവർ റീലോഡ് ചെയ്യുക അല്ലെങ്കിൽ ശുചീകരിക്കുക.", + "settings.server.webServer.actions": "നടപടികൾ", + "settings.server.webServer.reload": "റീലോഡ് ചെയ്യുക", + "settings.server.webServer.watchLogs": "ലോഗുകൾ കാണുക", + "settings.server.webServer.updateServerIp": "സർവർ IP അപ്ഡേറ്റ് ചെയ്യുക", + "settings.server.webServer.server.label": "സർവർ", + "settings.server.webServer.traefik.label": "ട്രാഫിക്", + "settings.server.webServer.traefik.modifyEnv": "ചുറ്റുപാടുകൾ മാറ്റുക", + "settings.server.webServer.traefik.managePorts": "അധിക പോർട്ട് മാപ്പിംഗ്", + "settings.server.webServer.traefik.managePortsDescription": "ട്രാഫിക്കിനായി അധിക പോർട്ടുകൾ ചേർക്കുക അല്ലെങ്കിൽ നീക്കം ചെയ്യുക", + "settings.server.webServer.traefik.targetPort": "ടാർഗറ്റ് പോർട്ട്", + "settings.server.webServer.traefik.publishedPort": "പ്രസിദ്ധീകരിച്ച പോർട്ട്", + "settings.server.webServer.traefik.addPort": "പോർട്ട് ചേർക്കുക", + "settings.server.webServer.traefik.portsUpdated": "പോർട്ടുകൾ വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തു", + "settings.server.webServer.traefik.portsUpdateError": "പോർട്ടുകൾ അപ്ഡേറ്റ് ചെയ്യാൻ പരാജയപ്പെട്ടു", + "settings.server.webServer.traefik.publishMode": "പ്രസിദ്ധീകരണ മോഡ്", + "settings.server.webServer.storage.label": "ഇടം", + "settings.server.webServer.storage.cleanUnusedImages": "ഉപയോഗിക്കാത്ത ഇമേജുകൾ ശുചീകരിക്കുക", + "settings.server.webServer.storage.cleanUnusedVolumes": "ഉപയോഗിക്കാത്ത വോള്യങ്ങൾ ശുചീകരിക്കുക", + "settings.server.webServer.storage.cleanStoppedContainers": "നിർത്തിയ കണ്ടെയ്‌നറുകൾ ശുചീകരിക്കുക", + "settings.server.webServer.storage.cleanDockerBuilder": "ഡോക്കർ ബിൽഡറും സിസ്റ്റവും ശുചീകരിക്കുക", + "settings.server.webServer.storage.cleanMonitoring": "മോണിറ്ററിംഗ് ശുചീകരിക്കുക", + "settings.server.webServer.storage.cleanAll": "എല്ലാം ശുചീകരിക്കുക", + + "settings.profile.title": "അക്കൗണ്ട്", + "settings.profile.description": "നിങ്ങളുടെ പ്രൊഫൈൽ വിശദാംശങ്ങൾ ഇവിടെ മാറ്റുക.", + "settings.profile.email": "ഇമെയിൽ", + "settings.profile.password": "പാസ്വേഡ്", + "settings.profile.avatar": "അവതാർ", + + "settings.appearance.title": "ദൃശ്യമാനം", + "settings.appearance.description": "നിങ്ങളുടെ ഡാഷ്ബോർഡിന്റെ തീം ഇഷ്ടാനുസൃതമാക്കുക.", + "settings.appearance.theme": "തീം", + "settings.appearance.themeDescription": "നിങ്ങളുടെ ഡാഷ്ബോർഡിന് ഒരു തീം തിരഞ്ഞെടുക്കുക", + "settings.appearance.themes.light": "ലൈറ്റ്", + "settings.appearance.themes.dark": "ഡാർക്ക്", + "settings.appearance.themes.system": "സിസ്റ്റം", + "settings.appearance.language": "ഭാഷ", + "settings.appearance.languageDescription": "നിങ്ങളുടെ ഡാഷ്ബോർഡിന് ഒരു ഭാഷ തിരഞ്ഞെടുക്കുക", + + "settings.terminal.connectionSettings": "കണക്ഷൻ ക്രമീകരണങ്ങൾ", + "settings.terminal.ipAddress": "IP വിലാസം", + "settings.terminal.port": "പോർട്ട്", + "settings.terminal.username": "ഉപയോക്തൃനാമം" +} diff --git a/apps/dokploy/public/locales/ru/settings.json b/apps/dokploy/public/locales/ru/settings.json index 1e71d710..0d87ed15 100644 --- a/apps/dokploy/public/locales/ru/settings.json +++ b/apps/dokploy/public/locales/ru/settings.json @@ -1,5 +1,6 @@ { "settings.common.save": "Сохранить", + "settings.common.enterTerminal": "Открыть терминал", "settings.server.domain.title": "Домен сервера", "settings.server.domain.description": "Установите домен для вашего серверного приложения Dokploy.", "settings.server.domain.form.domain": "Домен", @@ -7,18 +8,26 @@ "settings.server.domain.form.certificate.label": "Сертификат", "settings.server.domain.form.certificate.placeholder": "Выберите сертификат", "settings.server.domain.form.certificateOptions.none": "Нет", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (По умолчанию)", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", "settings.server.webServer.title": "Веб-сервер", "settings.server.webServer.description": "Перезагрузка или очистка веб-сервера.", - "settings.server.webServer.server.label": "Сервер", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.storage.label": "Дисковое пространство", "settings.server.webServer.actions": "Действия", "settings.server.webServer.reload": "Перезагрузить", "settings.server.webServer.watchLogs": "Просмотр логов", "settings.server.webServer.updateServerIp": "Изменить IP адрес", + "settings.server.webServer.server.label": "Сервер", + "settings.server.webServer.traefik.label": "Traefik", "settings.server.webServer.traefik.modifyEnv": "Изменить переменные окружения", + "settings.server.webServer.traefik.managePorts": "Назначение портов", + "settings.server.webServer.traefik.managePortsDescription": "Добавить или удалить дополнительные порты для Traefik", + "settings.server.webServer.traefik.targetPort": "Внутренний порт", + "settings.server.webServer.traefik.publishedPort": "Внешний порт", + "settings.server.webServer.traefik.addPort": "Добавить порт", + "settings.server.webServer.traefik.portsUpdated": "Порты успешно обновлены", + "settings.server.webServer.traefik.portsUpdateError": "Не удалось обновить порты", + "settings.server.webServer.traefik.publishMode": "Режим сопоставления", + "settings.server.webServer.storage.label": "Дисковое пространство", "settings.server.webServer.storage.cleanUnusedImages": "Очистить неиспользуемые образы", "settings.server.webServer.storage.cleanUnusedVolumes": "Очистить неиспользуемые тома", "settings.server.webServer.storage.cleanStoppedContainers": "Очистить остановленные контейнеры", @@ -40,5 +49,10 @@ "settings.appearance.themes.dark": "Темная", "settings.appearance.themes.system": "Системная", "settings.appearance.language": "Язык", - "settings.appearance.languageDescription": "Select a language for your dashboard" + "settings.appearance.languageDescription": "Выберите язык для панели управления", + + "settings.terminal.connectionSettings": "Настройки подключения", + "settings.terminal.ipAddress": "IP адрес", + "settings.terminal.port": "Порт", + "settings.terminal.username": "Имя пользователя" } diff --git a/apps/dokploy/public/locales/uk/common.json b/apps/dokploy/public/locales/uk/common.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/apps/dokploy/public/locales/uk/common.json @@ -0,0 +1 @@ +{} diff --git a/apps/dokploy/public/locales/uk/settings.json b/apps/dokploy/public/locales/uk/settings.json new file mode 100644 index 00000000..766a1bff --- /dev/null +++ b/apps/dokploy/public/locales/uk/settings.json @@ -0,0 +1,58 @@ +{ + "settings.common.save": "Зберегти", + "settings.common.enterTerminal": "Увійти в термінал", + "settings.server.domain.title": "Домен сервера", + "settings.server.domain.description": "Додайте домен до вашого серверного застосунку.", + "settings.server.domain.form.domain": "Домен", + "settings.server.domain.form.letsEncryptEmail": "Електронна пошта для Let's Encrypt", + "settings.server.domain.form.certificate.label": "Постачальник сертифікатів", + "settings.server.domain.form.certificate.placeholder": "Оберіть сертифікат", + "settings.server.domain.form.certificateOptions.none": "Відсутній", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", + + "settings.server.webServer.title": "Веб-сервер", + "settings.server.webServer.description": "Перезавантажте або очистьте веб-сервер.", + "settings.server.webServer.actions": "Дії", + "settings.server.webServer.reload": "Перезавантажити", + "settings.server.webServer.watchLogs": "Перегляд логів", + "settings.server.webServer.updateServerIp": "Оновити IP-адресу сервера", + "settings.server.webServer.server.label": "Сервер", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Змінити середовище", + "settings.server.webServer.traefik.managePorts": "Додаткові порти", + "settings.server.webServer.traefik.managePortsDescription": "Додайте або видаліть порти для Traefik", + "settings.server.webServer.traefik.targetPort": "Цільовий порт", + "settings.server.webServer.traefik.publishedPort": "Опублікований порт", + "settings.server.webServer.traefik.addPort": "Додати порт", + "settings.server.webServer.traefik.portsUpdated": "Порти успішно оновлено", + "settings.server.webServer.traefik.portsUpdateError": "Не вдалося оновити порти", + "settings.server.webServer.traefik.publishMode": "Режим публікації", + "settings.server.webServer.storage.label": "Дисковий простір", + "settings.server.webServer.storage.cleanUnusedImages": "Очистити невикористані образи", + "settings.server.webServer.storage.cleanUnusedVolumes": "Очистити невикористані томи", + "settings.server.webServer.storage.cleanStoppedContainers": "Очистити зупинені контейнери", + "settings.server.webServer.storage.cleanDockerBuilder": "Очистити Docker Builder і систему", + "settings.server.webServer.storage.cleanMonitoring": "Очистити моніторинг", + "settings.server.webServer.storage.cleanAll": "Очистити все", + + "settings.profile.title": "Обліковий запис", + "settings.profile.description": "Змініть дані вашого профілю.", + "settings.profile.email": "Електронна пошта", + "settings.profile.password": "Пароль", + "settings.profile.avatar": "Аватар", + + "settings.appearance.title": "Зовнішній вигляд", + "settings.appearance.description": "Налаштуйте тему вашої панелі керування.", + "settings.appearance.theme": "Тема", + "settings.appearance.themeDescription": "Оберіть тему для вашої панелі керування", + "settings.appearance.themes.light": "Світла", + "settings.appearance.themes.dark": "Темна", + "settings.appearance.themes.system": "Системна", + "settings.appearance.language": "Мова", + "settings.appearance.languageDescription": "Оберіть мову для вашої панелі керування", + + "settings.terminal.connectionSettings": "Налаштування з'єднання", + "settings.terminal.ipAddress": "IP-адреса", + "settings.terminal.port": "Порт", + "settings.terminal.username": "Ім'я користувача" +} diff --git a/apps/dokploy/public/templates/alist.svg b/apps/dokploy/public/templates/alist.svg new file mode 100644 index 00000000..37d5fdcd --- /dev/null +++ b/apps/dokploy/public/templates/alist.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/apps/dokploy/public/templates/answer.png b/apps/dokploy/public/templates/answer.png new file mode 100644 index 0000000000000000000000000000000000000000..3fca604d4895423acefc7a4d9d203592d4a81ae5 GIT binary patch literal 3775 zcmeHK_g7O{+r0^4Vz8jVpd$4ZAtFU3^pXn$A`AqOp;#~|Dp3i&NWY+f6hT2z`c)8= z&VV2-i3J&{fhZwhL_kUi-~@s|D86xKeLs9_eSgCD!?Vt__c>>+yY^alKl>y(5Uh5J z$%p{}u+#da#VG(lIQ*<_zX%!5j0#J*VEj&=4g>({Lq7{)eMDxChhyuW_Kdddx{i;aq*U<&2 zfNGE)qBJqh3dLSA4;N@n*ID^XOI&{ipdE;}wY#{Ickp!WhDv$*q4JjHb?0{9T9F5T z#o$ZrL(7w^Rs&6vGxxo_n)-xLeQ;C8mPn2H9<3X`vbOwsB&DpbT6Az;KWbEtxJJ_1 z9OA|Iby2S<{5Tk8-}hPJ?Il6&4??wg`NRyQHat}nt`#4kwRt)E=pB#z&(bDCmR85M z&pXc2`WUpWQ*xFm-gwx4)?a|(<2DOZ84(dm_h|u%&-dc(iPW-Po+%BIblINU=?wb^ z(@KxPChP7vLBN4yZB!_Ydtu|CXr0YiDyJS(L&(J4k2*kgLHpY;sKV>ZdpVPO7lu)~ z-#(i+v!JP`;c{C4@fq5K9?H9u7^IEp=~|86-Sm0T;13WY~u2KlBWkN zNiU$O%&()ip(9oZI$fHmJsn7Ob}TzcR+UF$1uu0y{M%QE^L0|uU9O{g_Hfn$(3H{V6Ha;hDnsiG zM^O!|{-`IO!9?Ti3x#_utPXE@U6x3_HCp{c8Yy-(bUtC=Bjy7iu1_mP&;qts;$o4wI=vWAY5K-FE1=?{zVDPeT&kN6$hd8L zHfcngC20M^zX^Ca7j0aWrmMMx|6&M~l>9cW4hIieAl=wOGZiI$F&m1};(*J_d1IO4 zy+r_=ow;w9; zlhg{|p};)|Q7q0+RRux@pMPz12Ls5Da$0dh^810p`PYB`KGzx=cjR94 z1qoH&9TJoj^~v>)fwoLr*gZ%_XkPP4?ShMWTN)Z{BWtkb z@V8E*R}`(SJy{EKhhTT-j)!T9-)YgCmWFqyMr(^?Mdl4Verw?h=Zaj~n#PQ}B#AjW z@iMHv`uv!-l1T#NRh`@+t$T-*Hci=!`= zj6>s~g@k^7h8eTh_dKOx^AF?Dcu%;cB>CGoIgKXUCsTs31MN@wWOV zzHlIYV$YQ*t~GymtZ`Bw3uVkLOxKm({i3PP3eCYtF-S=)C%>=TrQf~kJsx{ehWsA| zZg-4p-L#er+NcNB`NaCe)temVtm4aS)Gg(F+*9 z=v%KnRYWfxq|Ni2{FyM;+T^D9aCd+A0SliWRtJ%t?sgYLD(a1n_4KE%>c=mI-Bt-z zge#mV6jKGQ&ELzj*4BzwVoEV}$>Ohz-^*aIxwxcAr)k6JG_&wcJcl`!;Cu0SOOiiD zH_BJ0+mMWM?j5;wPzBi;)rBxgW;K<>*gwuKen}{yF8w{XY?sO1ct=;g8fR?hSi#`F z;x89oY~W?aj0U}r+9PybN#<*j|HFPAS@CG>KbG>3{oH>xkuFQ``TPk17e?^oB*a6PBh{rk_JK5T9`b{8|JXiz{KEySR8w@)1cA87b;!9c2KE zqoh0zsZO_5e2$_MjA>+*tLUx%jr{fzR<=1JYn|F2+ADIVy$?a_nO*hgvD-2HqrgiR zr=8%kH=5z^0C6W756?R*XhzR0I)%6H0IJHW<)>Qr(Pzg6@{l%@U)#KBy}oSEnbZd! zwfG4JK7I6>tQglq(4M^En%>ZXeJ2z@Fod&u2g*9ks?9y9g89cLP!71wx8s8wwnX7_smt1gqk+m8e z`703h@rzCO70H=T6M`^7=UxO|>xg~f={ii%g7DXI9_HAAR9vh0Nfye`OF~po)X&d; zUO-vMzVwb7#iHHrU6KbW1{ou+k|acx+~u2ctJLV+;p;}*z?{MhMWXrDcNsFIBDy{1lQ&y2pM%8?|yZH z*Nu{zNx759ZAukVe&7DV4XlLz#1*+dTQF8LB8+(81T$8PBnIjjDkiH_~iKE}G@cw{^~8;otZ-jlI;93eVDTG}lnIUkNGZ%}{P%TEYd(pFm@S42k^m$}E`OZ3-?ykjOhoTK69V5}XN@85eFB{g(^@O)g8 zCQ_{8td{O=7bTe1JZGyvjgoRp{5)5oC&cb^mwsYWRbr{~gWV1u!LP$&A!MUu?{%Tx z+GFQzz}WIzfrpS{d6K;+P*S^lg&DKOR{xs?cwsMQ`ph=$oW$6PbFx~5Q zlOs|rN;z-E9DHnlYw0`&%a8R#;`qf|hc{)=XL$-si>dDw**voFy$M)b5-h6BJ>vcg Da`o^h literal 0 HcmV?d00001 diff --git a/apps/dokploy/public/templates/appwrite.svg b/apps/dokploy/public/templates/appwrite.svg new file mode 100644 index 00000000..2034a812 --- /dev/null +++ b/apps/dokploy/public/templates/appwrite.svg @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/apps/dokploy/public/templates/convex.svg b/apps/dokploy/public/templates/convex.svg new file mode 100644 index 00000000..8622c4c0 --- /dev/null +++ b/apps/dokploy/public/templates/convex.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/dokploy/public/templates/erpnext.svg b/apps/dokploy/public/templates/erpnext.svg new file mode 100644 index 00000000..d699ea2a --- /dev/null +++ b/apps/dokploy/public/templates/erpnext.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/dokploy/public/templates/evolutionapi.png b/apps/dokploy/public/templates/evolutionapi.png new file mode 100644 index 0000000000000000000000000000000000000000..bd9b3850a53b5524e9c04f1d2cec3a290bcd34d5 GIT binary patch literal 17605 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 + + + + diff --git a/apps/dokploy/public/templates/glance.png b/apps/dokploy/public/templates/glance.png new file mode 100644 index 0000000000000000000000000000000000000000..54fc4131137d09784f3057b58cc18afdaab13ba4 GIT binary patch literal 7946 zcmeHMc{r5o-+z#tRz;<3BSMxql6@H^Nff7&M59BJER!wE45Q_gB}+ua7=mVJsO8Va8Y*gPD2n$M5{E_n+VU?|Z%1^`3v`d9LTV=YGET_x>)Q&*zS`IcL6O ztN2z3f_7M(K6xI3_`xkd^xI}|Sqkc21s6WQ^X4a@LbBvE1WDIfoIHLpD1B}S_p~Pf zzryU>o>jYjc6;XbgeS7iN`I|CNs+?MTee?O78?{1`{T{oz_(wJMHTo`?ZFQo=$U0U3^@$uc#U(Z}E6!LyR&O#z_h(+#OB|1jp6-+U z{hG=4{l8x$aPe;)${H#HX1G%`e~F=jEDa#{9$>{w1C~hbjKO4zi*skTg~p$sAL!CQ zQpetX+1Wzslo)vLe!+0zt6UM5y>PksdSoL1)Qe5f((fNWe9-Wwd`vm!e%>m>Q14W% zWGW`7%(E@Ss3>Il=j952ch##E$1<=BO%xSA;x4FN;MlQabq}_PIxmbj!5_JK>sB+V z^Eh*<%bF2$R|tXqy`rMRm$<231d8u~*K>iedNCcxWp|XJM<_FgKDac-u8;$(MRi87 zex8G+M_Bqcl6+8PPj`1+U8JbXui1W|h68TnD8))KC#=T4BUkn;(%RydXZmO;p{Rq9 z%#$$AYP~sfwd3PbrzLeND~?P$7uPj3B-QdvJx*}jzPjcl6+fatk|H!JW3WE|h1x~n z`a9nKB-qj39*@DJesq{4V&HK&9t+o)VTADogAakhuiw6niB_-HHD2p)qc6J62KPVQ zA>mA?lr!Ox<#uesU|*teqb)<~?c2A&YE)zN)A@Z@gMR!~bo<8%YwiKOf2RdA z3&F{=8&T);-3`5qyXE0QjdoghcErqm7@q1A*p4tZq*u%o>T;I4{D}OdD0B7iLYy^L z++W+o8gibYo@4fgwbkAgp!PbTW2U=uX(+*v7~`0j7^ha!rlrk~r0!g%gssgnGgwuM zEaj?)AkB)GIM&o^))%Ix zroNK4E?q|Pha+F0N2+~h-j;d=Jtsj34c=!?djFMSkz(?-t47F;J+(O!n?qD_|5S4+9*hkVKhgr()R9(LC zK4yPgm^K;7Tc>!uBNSFGoY^fze4)nTZx{WRuBTb}aV(1BA$ifE)H8B!u&j}cH*guP zz59og6Jp1X9q?s&dAYpL;M%QQx5h@eb0aTva^x=&QFx5hlm>Pygqi@~j%F{?XegJO zSxUKP*mAy8JrVp~t_ce@|V}^f~menszv}6HimD>e(fgBu* zRLqFz$+u&0R==Uc{A}E$Lzg;yz|#izT>QSSS7)R71U5@{2MaZWFds8TtlGT)@L>Wa zSS$+W1C=8d<@16-%fP55t2;?sK2wX?t8(ciFt7CL&!0cX3QEXPumKvb%};OMy!o}X zCC!I56xcZN%qau26oO=(e|-K+!?`Yk;<0`=Ha0dz2aR&P)9+g3Tp#uQ zgNGeG=~q*iHBu^YIM~f_zE;4e(?YR6{-CKZ@x7g?sp&B-t@_R!OAz+`A9q6aX&Nr4 z;xI!zdL<*aq|MlXJK@BYM}cIb%*;N6gXq;cytv)f0NeMarIRQ(VzgSt;d939af*kD zHi|#<=C^O(d`3c9%PDOnur)@Lt*N5GO-^*%olyr(AJ+9%|N5XyeXQwA6xqFdrjHo+ z`a*64C_*Wiy{E~R&>k=DI$PsbcOJ##*zG^3Z;t57IqEw zb#8{Z4&}D#F&!NmN*<(+mDq1Db%zB^inx<#t^#XoM{n;w1pBMG^QU`)W=3rDlLc2k zD8D+Jwl7TwO(vaLUv}aJ(D%ydDMEYP$G<))^6W3pd;Pkp^h-mG1odUKnle|h4PdJ} z9H$TG%6V$y=H`}uXTZG(R6|b#lUwJY!=1TE&UAq_7py+;>Z+Y5<)a37L7jK>&g}Om zUXM(7>K#%eEp>V>9uxxK$Sp6|lg7?}%FA!@(`<#KbC}0vnOj;~CbNxtniL6=WkYuy zBtxcN*iV*~l{LaoK)REUBF_8qoA|)B#nYNQH#eu@(y-l{OZ;>BXAd*A4XZG?{_x?$ z6g|HirR@0UQ08G!%zS?QC3YiqsHbOd$&GJOAo^TWMrm$;eNgmH>nt0$j(IQP7V@ee z1;X0=7vaXG>8|Ltyb%Yj>tEw9mwMWR@RKKyK#NP!^?8X@QEuA;)q_p9N>=27Z3d-C z#qh=KeYlrU%Kb`OrS*KTr~5W5+21fd!yoQ!m3maZg+dIS^Dr87)**c}Vo^llesdH9 zy0!h}iH$LMeJyq?Ji|S~Z3%5}qj2kuxK>|@>wG3#HbG{(03^69O?5QUP@o&okCh=x z(Ie7u(M@bK`t{v~I)}z#7Ruujpv>QZ|GgJdt&Ns1VtH#L*2ZPGysMZEL0mR1u`OV$ zNzWE2DxSK`BjPwS!z+Q1A#Z&Vbgim!KS9Wr<`RB!7zC^Hx93_GL{1HW1-cVYFTBjp zSLtt6&Lj?{1m#tAH}ZythCt8zoULg&4`$F|Td51!xblZL8_d1$N+3Iw+=yx8 zAT|jbE!h+})fi8=g0?G<7gE{+DSOS2eri%zti0ZokiB>&VbwKUF3#|%xVU%%`N73a zP|}^*qDBRR60|cT$MTs1A(hJ5l`RA1y$2vp9$)6(^(yG+>)ZsgYEv7IyZF7-%b_z> zPfbQp={HFE$g(w>Me(!l43@tFHoP;KKm3gdbn(hh=yJKQD|iawZ0JOgFtj0>8 zcv9GK-lQ`aK?8_s7zJH8c6@pGgG*BRUfN(Qjml0%Z# zy?qUscMq6%o&fz8?tjI>A#vE-9@_Ze8zRwKJ0EN=oYtPG>59tAEYK(W4b}PnWl%7G z`@q0+&wc8a!DF&eo-ChGOT2L8L$EDG_(qna-~d-dwo^%9xAV1g~-w=54p0OG>f^ZKHUAUr8{OJ+%lCj4Lh zimL43&1XlL^C=g+T~0HYGWjk&_juC%oD`r=7xTRA8kHO*aP#H}%EkSy_bk6=Iv zw;qC^OcTIo{~z64e1_r6yGN(fDJoTk9);x!8&n|%g(j!#6}h$~Q#@+<1KQ_H|(hFOQ)JJ3z`uqvKF*YpA?|H0str#(vnu2A|kk) zHATE4lqddoR6Pg2P6VSjj+Hny-zC2P)lm9z?!`h9?oxxuo?yv;)LaEJML7AY5K0ow}02Y)EUF^&IBP)SC zSQYH|@0xFiXv)_v>Xi2I8kRf|K@$d3<%iTTlYULgI zG#vm1_k-G09GvqeKR>!7%N*=(fByjq9d9db;q$wpivxgeKldM2%1ux3M@0@V7Y3Sn zc~v|rY((G;`&Ca{KsN5Loi+yn;F$*ApU1_KxYoA7=sAF}PwS({>LS6{4==MWLpHYj z;b$y4qedZ1H|;hVMy#?J2x>!&rGA$L^jewEB!>f6bmK0i+E1E*JHynaGxZ#l2fqS! zS|uZRGBsOMu=Z2pDkhD}5Y7gbu&NvR2_MjFZ-KseA<9(P=os06QI)M}SLm4PFTK&} z2%K3r3z`%FJ!hw$Ya9ZW`^&tzf8S@W@{dVM;R@5Ux3NHB3=)>a+@Kj8xC_1;0kPKYMkN1X~0g5rmbM7 zJg8(;8?amT{3Z_(>}_#tWwmOk#6KlwoPT!denkq+CD zZvz#~1L$M!;o-4R4pVEwQpK|EQjU7461(+mnszy~D~a|bQr15(&`nQpKR`IxaXEyA zahY;M9D*>h*;0>NXmSgno$(MG9))HsX8Le@)6q(u89<7X30zai<~KeQjY|cWcdJ*; zpI9h|p&VzqPmwS<7)tjeLQx+20_9{_00<{VtSC z2n%U_uBFm4D}k=kK!r@_0Q8o#ArjJ1{O5z$21le>BRE`g^wKQYHkg(IJbcc$Qs)4W zX;hu64Il25dXBvV_{(Dn9kn}*VLVnldva6wOG5zE`wQup0BzhRruGY@t7*$>=-iBuTdiq2ZOeS9i3Cfv$W%?Y8)>*fuQD@W4h(P2WulJZ zxa$RrZD4y~deq(1<2sa;`*HN%wy|waD&`oYrup zj3NREuRZIlS8stmvxgX_H52(22AXNwUd`GFUtstQkRn=1C(^@KroS{nh(E<7 zsZNsdX>-oV8pcBj@2@2OLyFMh-j`<4&Y&8U_eD_SkjDGeQIfFvblZdjAZ01o#c%fX z1=g*W27H`yAA;7pm@ zdx!hIgY~Grc8izFm(a!ZeQW1(@X#eo%@SjH2`>`1`3bRU2N5) zCOddHks1*FfSzJOnTdwwspKOLzQmHYQ!(Ou;ibE*uQ1E)*aCPwUL$y6d}W!4!(;Y- zJq3t%^=c2XK~T&w9uw0CwsJ4b3DH=pL=m77fHA*-qf6JvxfO^RWc`@}>EKUUGli98 z1D;X_6mAFH*--4-@-LyVS>j5Ov)TH%A~I6mGI=RaVjHYK!LI!{|9KlVLN4|zi98bm zR0QXr-LJuR%x;3#GeByWnL8pzzlAI`DN+@YY>R@+MY1guF==UO)Gr9`ZL2ixBMpxa zBx1SM10`udrq*btBjpy7ZCs+ws?9($!u(fA1_CbSg8qOVL_fwaq*A#^ZH=JP;kL6SaPvcurqwm_rY2{KH%-pf-%Nrx3L8l{Vgb8`zpS8E8}s zNJ5!M8|xg(ykkbVzsi^tzqWcn;3Z&`{Qmv>IzTI&*M7|v`O(O5cj)fxGY9M+TpD3v z3)H7LAi&)8_KpQyt>MQbM8;ZKv6FYj^s5z6!qYK3rZj-z4`D5mRm0;*`xJ@)8UX?f ztY0!aE!BaL67o2M^~-UJ4`ja-V35A|Q?>>zb(m9&ThtcEg^9AzXaEom8k{&iPUYrU z^%=3KQvqmOEYi|!%`?qc{U5c(iEUbY={klA&2-N+~=P?`BY5; z+bRd$enAV44v$_{yVd(TzzJtBR|WaN+DAu6#}mw6?gQ}ml__(i_=XCzb?GMfL^guA z(g<&G5Xf#{;^!GSvZNR|-WnCG8a5;dbmdR#Va({2S|Q_IaY$|u-8LwR#~I$rb57J=sX!L2E3uL>-vDOjbn%K^FF73S`k zU$Y+<$p)}AnP9H^-FgH>!qA^;MIdDB#+wqUcZH;3`S1!|5E44=<>loFdY(ogodOG0 zq;v9K!&Q2)%*Ut+7pUC=Ny?~`md>j>e*7Ku7eus}IuMj|`~w2&b*h;$`;lQ)ia1>p z0AG$D^%<*Mq2ahRT>xu*iJkeN?;@jBh*d{>iB1H}-n>10kkB8Yp`k$ZRWx3HZ4Knw zJ~j~FM0u-3o;X|@fXP5>mbnWUTD_Ur)jhDX00L|hm1~Zf|0G0xmF68a(eiBVCPMNg zKO_PJ7CpJQyhx$fV8I z!9gMy2ol3xce7&km04%d18|}NMFbZ18pi6QT^1+5mD};7%penW4Ip}K98v&v5C&!p z4y~b~!P8)_zeG{no3bA$3*Cs&0Du4MgWFcRz;T5yET;kLO^>+;ACdfh?&7oZ;}L^J z905|5!JXL%DT6z3@#KzL40D7tSt5{)4`^5&-Q9Zt5&)O?ERXN+{@hJ;yusojn_yKg zj8!=@7y23P;n6}ez8(J?IQ_FpMHp`m|NPJS-#_Pn|Ka@ae>fZFAm7tmR(-xI84Vd;FcCpa{*Q?zyf$QsDSk=I}|Ix!N2Qb#rrk00UY`r!aIzE z|0^geWj~b2;Q~+$(ommnXlMvE!5~p4C_36CkQSf^MH`~g28N~vC}Vvz8oOsN)(8dt z>w$|Mav6bG7n1c~?!+e?JebD|!5SFw`FtdQ50b+TGC*N47z0DJ0UE6@M(Brzvw1Xu zK06fgLxBW@(z(nK9+Sg{t|`(2IAJ^-TpaAbvS5Y$Ez1u5t5V{c83<@01}LQAT2?=R z6w3dGvRHqkLwPR1zvKO{!l7>AA%KAk5XuST(#5?CM69_A!4kOujmP1-aX7#JDCGWN z4v!NW%n5;_jgW>=ZBHhf!QqGMd?!#SSX*`|kH)40wj>-}EP-S)8CX+{>0UgVh{2$& z(I}J^iGacriN@B}c#O5Rp`n$@4=#yA4`Tsr-VZM0-(37pxohLV3K4rI0bJ%$fMLz$ zu%O>_#xj2%i^)&*{^Bxz9*gNuxd!534AwgPAD#YT5|7W?_V3XZAO0SGfGwVQu6VS2 z1%x393F+T$Nq9HGz&jt=DtFf%zKb4HqAUhMJyW%ki~!q(TcZ`hF7!JF-2w;g#4|zR z?k2>y&b~P9)8M^f(^@?V88!@a;tp4JE6>G0EynMUJ>y&U4MpaKe!kadGS@lv{zl)x zH}6*wE0N_3m3HWJsnukV9ZQKy(9?s79PW28$)e`)pBRXSMa*re7bvUgRQVa2ofp_54Cg(PeXS@ zZxl2KEo8{M{r+jQ^}YzEmY3{pS+r7i^z*4s^x| zpZloytv%Uq;<{E?CRX<~bbZRfmSL^0kd_TXDX1CQ>SpHcQRxA}fN zdInD&(T)QGj79>`Bi18xnU4%j8i1iMsy!-`F-UD#Pu=o94`T2_Su8k)=|>@xsoXlFai^fuCMU%+B^M6GQ^2tPrKq)m`5~vIyPVW1^Un z;o-BZ<>39rO$t3~c=rxOZt)zn)9%qz3nsJ4VY}x0eS-=LkuOR&2bv}Icei}_M=Y;U zelT~gWFr^ba~I+)m%+_6>X2*+Dt8*R?h$q>JgKwl=)?(+GTjKz+KdUR^(!m-47k4b z9sfd`i1c>PeUD&{lvG&NKhTF7E(SP_EY;hr1a7{U!THUb#8%AM^-JSTy*;zf-zi)v z%DM%qK5w683DaMV;3p@+A&ZgABw8iya9-?o*5fC?H70#ZraP*pE>adwc5>2m(or!N z3TVirXoyQ?LMnHD<1S_53Ev~-WlfUzU5_6T@(ZZ_QHoUE>Ia|xG`gVC@k)1=ys>>H zy%(QyHmuZ&oL$VWArHmI^|z9ORi8j&_>0LeaL{sTxE<9)BZPpMi8V;<1+CJ-^J<$r8!#4n+e5 zwi9jBZ6Dt0_^VO!)ug8{cWzGM*3^P@rqp_Gng<%Il$za0Xc>qZ%tL$YB3ygTtWR|u zsnYu6p6xTWhngE@Fq`!`or?3I_aG2j=w5=AwI>%zZg~D?NQ6D~7Z{@-58512F*D*Ko+Oo==cH&fRUHI@81s}cfitRZYkjS2{E{M|Nfd^Xi zGYTu-m-{Wf4^6y)>kep!eAO;?v?sSbfa_Mdu9MagIUWq~qMm}qk6#mQw@ucl_^NDw zCj3446gI!V)G=58~YPHD84Z$R$E-_#!!A@viYpO2SLj92k4hJmG) zyRHPJH+Qlf3vS@vbY$O2om7@8dlC9FYS`}u=6N9`J; z)LxNoB9`68=t_4Wbq=%3&du?MpmEJGicFCkIF_4}a)vI$Q@krNny-BLoPq3D`^mayAyX)2H5&!oA`crr6!*he!>Dw9B75lG4zd~x?& zh0qMT%i3sRpgF8|yIipkw4QLZgGrrl8+C;7x5lKtUE2MDsaakRB#cy+mia|%2VKe7 z(Waj4uYLLcawYx#&Ln)pCWOOS)b>?0=uH0A8_6|ZW!KziB|l?_R(%qSz(= zm|lrUYh^wyPkl?Rzkk7n#N##dvLi(S5cS;B2XTI*h}DXEd9}`?OT#NBrwe2yc{DD+ ztmp00SqZeM-m$CI>UN1*L|eqwICWQ8{W8@@@8MY?V4w?QPg@QOR3`C_NcjrqPoi7K z(p9|hp1dzwQc+}@msYUo?nFXJPlpflu4kE{3A)y=;aX>c6p~v=3i9@k4@DZ1r$Ioku6~Rvp|`5-B+7&%t=^b z?>8y)+yO*)!oG(1>~BTw3tNfXSfAT$pp^}Utp}9hI($gsL6OR5+|A%im-6=PcKvqu zXx@nr*ausN{8NPvT7`NUQeW=Zc>Vu75+p{}Py+vla>n{&P0?%rIJQ=fqzZz6+&=+I CNyW7Q literal 0 HcmV?d00001 diff --git a/apps/dokploy/public/templates/linkwarden.png b/apps/dokploy/public/templates/linkwarden.png new file mode 100644 index 0000000000000000000000000000000000000000..843f681eb9fe01e745aa4a4d2935b69ebde0c825 GIT binary patch literal 80831 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 BDb)Y~ literal 0 HcmV?d00001 diff --git a/apps/dokploy/public/templates/mailpit.svg b/apps/dokploy/public/templates/mailpit.svg new file mode 100644 index 00000000..58675a26 --- /dev/null +++ b/apps/dokploy/public/templates/mailpit.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/apps/dokploy/public/templates/maybe.svg b/apps/dokploy/public/templates/maybe.svg new file mode 100644 index 00000000..a4a87736 --- /dev/null +++ b/apps/dokploy/public/templates/maybe.svg @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/apps/dokploy/public/templates/outline.png b/apps/dokploy/public/templates/outline.png new file mode 100644 index 0000000000000000000000000000000000000000..b241f01d77ba1fc7f829ff3a577a94b69136ee8b GIT binary patch literal 2158 zcmcIl`CF5B5}!9A31GxXMG=w^v=QXcAS#GJ;>uQ#DtHn>G>9&72^c`}BFSrM70_ZI zs$dl~D+*L@EK!a^ST1cUQV};*0x=OhV#o$axkF$3H|#$1!^|`D`Ofvs%r`T9`#$g?0P0;8E>Z?5?-_=NEBLjN`tqI!#|F&PFBFQ<@rdbhlJvH_li;+t0Jl`| zoj&wn)Ey~HoA4ZC& zBQb>al00t#ff3ZMF<;%-_3zEpfz+Sx;UK+STAOAnC$iWhNmT8{%Cc!YBFq@cvO_-> zY%i`Uv*vKKF3@!1@0Z&GF=}J}@G&B9=uGd)SD?1-im}fPZKiXMY_tbC&zE&xda@-1J~GxJla;#*TdN(ReN^KhIF|_KFufS^Z61m-ubfUxLB85*CxU7s%lAS zL9@BBTf1d#c5EZrGf;iPcyrTC!YN=FdGk=yHwRK$y}*hX1p-OoQg}j^0hb=D?XyB< zn9k#jSWINhVZf=?SZcqd5kIsU>kv-uGEc;WqN9;?lJ^1`xayGb=Bd$J!+4M`?8#S&d> z%{agRFV4GOq@xNDkW1>>19__t%4TU5o!X=ukE?%bZ7>s~^mK%ZG>K>Hdsll^+@gk_ zou`}b=as6Kqs!&vhJk`%OyqbROfOHp4E@A)N^I($G{qoQ33JDHw$>8VgM)Xcy;cr7 zH)zJUU1{4us3Dbbr&5?n0O8eR2uSTfad!d0x4>N`0^nQ7li%ZkgNNKuCjbWsPpVxB z@rc?AFTYF433dJ){(oeF{trp6*C&h*-x;~^>b227AYj%nJ*RQlCtjnAxbhi?ke=fY zP;w|dhXk;PymbUXnzbo}4zSzH^)Vh$HzM;i)}eOk8!~`}{Ez6K&$-Df+eSxITtwGG zof8ui`;$&TO{=LGD|Y<@3{70U*(|ov}8bAnqqNP^!E@N`oC` z&l7F%;9x-s@b^D%H%QM%fHTWwjGOHNhGykcriGcrIJl%e6?kiPUMM*YN}7)a{N4d* zduUjG2Hoa@);O`t9y}HhT3N?UdVgQM6h{Ph3}wl$gMIc8z7Q@RHEJ$BQj<}xZ6>0` zRC6y<-C?ozE8qAwK)F`s2se=&i3O&(bUZ=0tc)Z7l=Q7YPvg5+po1OKmX@VpY{c^< zeXi)_pcDE9DGu811E(8Q9M6f($2x zN)JNygiE0XjNNYfrLYHW^~=I+DMf$qWSh{Dhhx_B8_jyA|p86B{&CQQ#&VV;eCp zT2$&13?Hw5d+uy1!tzyEGsKr*_hDf!mGf~Klsr;LRDG7`=FI-C5BYcXN1!H`b01h$Y(Qh{yIfO^A)odgA=P zY69Bw!$uiYd6n>~o!DTqgpUKUpeCpLs~|^zSygR=d2ipceG$?<)WImC=x@&AdBRk` zf-K;t#8UFJAlTnGrFj|V&G7KU>q1qfB@pdyRo!62PsxTuWz$Ut_6RKs_{NyRlsv_t i$|u1J``@kLy`=Yc-sU1JeJD225c2o!K^1@Fef1~y9Dh>) literal 0 HcmV?d00001 diff --git a/apps/dokploy/public/templates/pocket-id.svg b/apps/dokploy/public/templates/pocket-id.svg new file mode 100644 index 00000000..0ee89b14 --- /dev/null +++ b/apps/dokploy/public/templates/pocket-id.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/dokploy/public/templates/registry.png b/apps/dokploy/public/templates/registry.png new file mode 100644 index 0000000000000000000000000000000000000000..39418022e3363b38db53f6ed913ef9ec66099877 GIT binary patch literal 28962 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 + + + + + + + \ No newline at end of file diff --git a/apps/dokploy/public/templates/spacedrive.png b/apps/dokploy/public/templates/spacedrive.png new file mode 100644 index 0000000000000000000000000000000000000000..a10fffd526c657f7efa794fb53dbb1654c9d8478 GIT binary patch literal 326880 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 )L6Ejfy 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%0AO$4 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 literal 0 HcmV?d00001 diff --git a/apps/dokploy/public/templates/superset.svg b/apps/dokploy/public/templates/superset.svg new file mode 100644 index 00000000..522c3b28 --- /dev/null +++ b/apps/dokploy/public/templates/superset.svg @@ -0,0 +1,9 @@ + + + Superset + + + + + + diff --git a/apps/dokploy/public/templates/trilium.png b/apps/dokploy/public/templates/trilium.png new file mode 100644 index 0000000000000000000000000000000000000000..f6afe82f803216b790a16658874b018ee7931447 GIT binary patch literal 24381 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 literal 0 HcmV?d00001 diff --git a/apps/dokploy/public/templates/twenty.svg b/apps/dokploy/public/templates/twenty.svg index cf5223b9..bad18fab 100644 --- a/apps/dokploy/public/templates/twenty.svg +++ b/apps/dokploy/public/templates/twenty.svg @@ -1,6 +1,12 @@ - - - - - + + + + + + + + + + + diff --git a/apps/dokploy/public/templates/wikijs.svg b/apps/dokploy/public/templates/wikijs.svg new file mode 100644 index 00000000..78073b23 --- /dev/null +++ b/apps/dokploy/public/templates/wikijs.svg @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/dokploy/reset-password.ts b/apps/dokploy/reset-password.ts index 43b11fdf..32cab433 100644 --- a/apps/dokploy/reset-password.ts +++ b/apps/dokploy/reset-password.ts @@ -1,6 +1,8 @@ import { findAdmin } from "@dokploy/server"; -import { updateAuthById } from "@dokploy/server"; import { generateRandomPassword } from "@dokploy/server"; +import { db } from "@dokploy/server/db"; +import { account } from "@dokploy/server/db/schema"; +import { eq } from "drizzle-orm"; (async () => { try { @@ -8,9 +10,12 @@ import { generateRandomPassword } from "@dokploy/server"; const result = await findAdmin(); - const update = await updateAuthById(result.authId, { - password: randomPassword.hashedPassword, - }); + const update = await db + .update(account) + .set({ + password: randomPassword.hashedPassword, + }) + .where(eq(account.userId, result.userId)); if (update) { console.log("Password reset successful"); diff --git a/apps/dokploy/server/api/root.ts b/apps/dokploy/server/api/root.ts index 6119ee85..8120b319 100644 --- a/apps/dokploy/server/api/root.ts +++ b/apps/dokploy/server/api/root.ts @@ -20,6 +20,7 @@ import { mongoRouter } from "./routers/mongo"; import { mountRouter } from "./routers/mount"; import { mysqlRouter } from "./routers/mysql"; import { notificationRouter } from "./routers/notification"; +import { organizationRouter } from "./routers/organization"; import { portRouter } from "./routers/port"; import { postgresRouter } from "./routers/postgres"; import { previewDeploymentRouter } from "./routers/preview-deployment"; @@ -34,7 +35,6 @@ import { sshRouter } from "./routers/ssh-key"; import { stripeRouter } from "./routers/stripe"; import { swarmRouter } from "./routers/swarm"; import { userRouter } from "./routers/user"; - /** * This is the primary router for your server. * @@ -77,6 +77,7 @@ export const appRouter = createTRPCRouter({ stripe: stripeRouter, swarm: swarmRouter, ai: aiRouter, + organization: organizationRouter, }); // export type definition of API diff --git a/apps/dokploy/server/api/routers/admin.ts b/apps/dokploy/server/api/routers/admin.ts index 696f3c79..47bd9cd9 100644 --- a/apps/dokploy/server/api/routers/admin.ts +++ b/apps/dokploy/server/api/routers/admin.ts @@ -1,103 +1,59 @@ -import { db } from "@/server/db"; +import { apiUpdateWebServerMonitoring } from "@/server/db/schema"; import { - apiAssignPermissions, - apiCreateUserInvitation, - apiFindOneToken, - apiRemoveUser, - apiUpdateAdmin, - users, -} from "@/server/db/schema"; -import { - createInvitation, - findAdminById, - findUserByAuthId, + IS_CLOUD, findUserById, - getUserByToken, - removeUserByAuthId, - updateAdmin, + setupWebMonitoring, + updateUser, } from "@dokploy/server"; import { TRPCError } from "@trpc/server"; -import { eq } from "drizzle-orm"; -import { adminProcedure, createTRPCRouter, publicProcedure } from "../trpc"; +import { adminProcedure, createTRPCRouter } from "../trpc"; export const adminRouter = createTRPCRouter({ - one: adminProcedure.query(async ({ ctx }) => { - const { sshPrivateKey, ...rest } = await findAdminById(ctx.user.adminId); - return { - haveSSH: !!sshPrivateKey, - ...rest, - }; - }), - update: adminProcedure - .input(apiUpdateAdmin) - .mutation(async ({ input, ctx }) => { - if (ctx.user.rol === "user") { - throw new TRPCError({ - code: "UNAUTHORIZED", - message: "You are not allowed to update this admin", - }); - } - const { authId } = await findAdminById(ctx.user.adminId); - return updateAdmin(authId, input); - }), - createUserInvitation: adminProcedure - .input(apiCreateUserInvitation) + setupMonitoring: adminProcedure + .input(apiUpdateWebServerMonitoring) .mutation(async ({ input, ctx }) => { try { - await createInvitation(input, ctx.user.adminId); - } catch (error) { - throw new TRPCError({ - code: "BAD_REQUEST", - message: - "Error creating this user\ncheck if the email is not registered", - cause: error, - }); - } - }), - removeUser: adminProcedure - .input(apiRemoveUser) - .mutation(async ({ input, ctx }) => { - try { - const user = await findUserByAuthId(input.authId); - - if (user.adminId !== ctx.user.adminId) { + if (IS_CLOUD) { throw new TRPCError({ code: "UNAUTHORIZED", - message: "You are not allowed to delete this user", + message: "Feature disabled on cloud", }); } - return await removeUserByAuthId(input.authId); - } catch (error) { - throw new TRPCError({ - code: "BAD_REQUEST", - message: "Error deleting this user", - cause: error, - }); - } - }), - getUserByToken: publicProcedure - .input(apiFindOneToken) - .query(async ({ input }) => { - return await getUserByToken(input.token); - }), - assignPermissions: adminProcedure - .input(apiAssignPermissions) - .mutation(async ({ input, ctx }) => { - try { - const user = await findUserById(input.userId); - - if (user.adminId !== ctx.user.adminId) { + const user = await findUserById(ctx.user.ownerId); + if (user.id !== ctx.user.ownerId) { throw new TRPCError({ code: "UNAUTHORIZED", - message: "You are not allowed to assign permissions", + message: "You are not authorized to setup the monitoring", }); } - await db - .update(users) - .set({ - ...input, - }) - .where(eq(users.userId, input.userId)); + + await updateUser(user.id, { + metricsConfig: { + server: { + type: "Dokploy", + refreshRate: input.metricsConfig.server.refreshRate, + port: input.metricsConfig.server.port, + token: input.metricsConfig.server.token, + cronJob: input.metricsConfig.server.cronJob, + urlCallback: input.metricsConfig.server.urlCallback, + retentionDays: input.metricsConfig.server.retentionDays, + thresholds: { + cpu: input.metricsConfig.server.thresholds.cpu, + memory: input.metricsConfig.server.thresholds.memory, + }, + }, + containers: { + refreshRate: input.metricsConfig.containers.refreshRate, + services: { + include: input.metricsConfig.containers.services.include || [], + exclude: input.metricsConfig.containers.services.exclude || [], + }, + }, + }, + }); + + const currentServer = await setupWebMonitoring(user.id); + return currentServer; } catch (error) { throw error; } diff --git a/apps/dokploy/server/api/routers/application.ts b/apps/dokploy/server/api/routers/application.ts index 13b7c80d..e1629b4c 100644 --- a/apps/dokploy/server/api/routers/application.ts +++ b/apps/dokploy/server/api/routers/application.ts @@ -60,8 +60,13 @@ export const applicationRouter = createTRPCRouter({ .input(apiCreateApplication) .mutation(async ({ input, ctx }) => { try { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.projectId, "create"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.projectId, + ctx.session.activeOrganizationId, + "create", + ); } if (IS_CLOUD && !input.serverId) { @@ -72,7 +77,7 @@ export const applicationRouter = createTRPCRouter({ } const project = await findProjectById(input.projectId); - if (project.adminId !== ctx.user.adminId) { + if (project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this project", @@ -80,8 +85,12 @@ export const applicationRouter = createTRPCRouter({ } const newApplication = await createApplication(input); - if (ctx.user.rol === "user") { - await addNewService(ctx.user.authId, newApplication.applicationId); + if (ctx.user.rol === "member") { + await addNewService( + ctx.user.id, + newApplication.applicationId, + project.organizationId, + ); } return newApplication; } catch (error: unknown) { @@ -98,15 +107,18 @@ export const applicationRouter = createTRPCRouter({ one: protectedProcedure .input(apiFindOneApplication) .query(async ({ input, ctx }) => { - if (ctx.user.rol === "user") { + if (ctx.user.rol === "member") { await checkServiceAccess( - ctx.user.authId, + ctx.user.id, input.applicationId, + ctx.session.activeOrganizationId, "access", ); } const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this application", @@ -119,7 +131,9 @@ export const applicationRouter = createTRPCRouter({ .input(apiReloadApplication) .mutation(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to reload this application", @@ -144,16 +158,19 @@ export const applicationRouter = createTRPCRouter({ delete: protectedProcedure .input(apiFindOneApplication) .mutation(async ({ input, ctx }) => { - if (ctx.user.rol === "user") { + if (ctx.user.rol === "member") { await checkServiceAccess( - ctx.user.authId, + ctx.user.id, input.applicationId, + ctx.session.activeOrganizationId, "delete", ); } const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to delete this application", @@ -184,7 +201,7 @@ export const applicationRouter = createTRPCRouter({ for (const operation of cleanupOperations) { try { await operation(); - } catch (error) {} + } catch (_) {} } return result[0]; @@ -194,7 +211,7 @@ export const applicationRouter = createTRPCRouter({ .input(apiFindOneApplication) .mutation(async ({ input, ctx }) => { const service = await findApplicationById(input.applicationId); - if (service.project.adminId !== ctx.user.adminId) { + if (service.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to stop this application", @@ -214,7 +231,7 @@ export const applicationRouter = createTRPCRouter({ .input(apiFindOneApplication) .mutation(async ({ input, ctx }) => { const service = await findApplicationById(input.applicationId); - if (service.project.adminId !== ctx.user.adminId) { + if (service.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to start this application", @@ -235,7 +252,9 @@ export const applicationRouter = createTRPCRouter({ .input(apiFindOneApplication) .mutation(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to redeploy this application", @@ -268,7 +287,9 @@ export const applicationRouter = createTRPCRouter({ .input(apiSaveEnvironmentVariables) .mutation(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to save this environment", @@ -284,7 +305,9 @@ export const applicationRouter = createTRPCRouter({ .input(apiSaveBuildType) .mutation(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to save this build type", @@ -305,7 +328,9 @@ export const applicationRouter = createTRPCRouter({ .input(apiSaveGithubProvider) .mutation(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to save this github provider", @@ -327,7 +352,9 @@ export const applicationRouter = createTRPCRouter({ .input(apiSaveGitlabProvider) .mutation(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to save this gitlab provider", @@ -351,7 +378,9 @@ export const applicationRouter = createTRPCRouter({ .input(apiSaveBitbucketProvider) .mutation(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to save this bitbucket provider", @@ -373,7 +402,9 @@ export const applicationRouter = createTRPCRouter({ .input(apiSaveDockerProvider) .mutation(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to save this docker provider", @@ -394,7 +425,9 @@ export const applicationRouter = createTRPCRouter({ .input(apiSaveGitProvider) .mutation(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to save this git provider", @@ -415,7 +448,9 @@ export const applicationRouter = createTRPCRouter({ .input(apiFindOneApplication) .mutation(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to mark this application as running", @@ -427,7 +462,9 @@ export const applicationRouter = createTRPCRouter({ .input(apiUpdateApplication) .mutation(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to update this application", @@ -451,7 +488,9 @@ export const applicationRouter = createTRPCRouter({ .input(apiFindOneApplication) .mutation(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to refresh this application", @@ -466,7 +505,9 @@ export const applicationRouter = createTRPCRouter({ .input(apiFindOneApplication) .mutation(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to deploy this application", @@ -500,7 +541,9 @@ export const applicationRouter = createTRPCRouter({ .input(apiFindOneApplication) .mutation(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to clean this application", @@ -513,7 +556,9 @@ export const applicationRouter = createTRPCRouter({ .input(apiFindOneApplication) .query(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to read this application", @@ -548,7 +593,7 @@ export const applicationRouter = createTRPCRouter({ const app = await findApplicationById(input.applicationId as string); - if (app.project.adminId !== ctx.user.adminId) { + if (app.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to deploy this application", @@ -590,7 +635,9 @@ export const applicationRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to update this application", @@ -610,7 +657,7 @@ export const applicationRouter = createTRPCRouter({ }), readAppMonitoring: protectedProcedure .input(apiFindMonitoringStats) - .query(async ({ input, ctx }) => { + .query(async ({ input }) => { if (IS_CLOUD) { throw new TRPCError({ code: "UNAUTHORIZED", diff --git a/apps/dokploy/server/api/routers/auth.ts b/apps/dokploy/server/api/routers/auth.ts index f8bbfa9b..2c7469c3 100644 --- a/apps/dokploy/server/api/routers/auth.ts +++ b/apps/dokploy/server/api/routers/auth.ts @@ -1,523 +1,326 @@ -import { - apiCreateAdmin, - apiCreateUser, - apiFindOneAuth, - apiLogin, - apiUpdateAuth, - apiVerify2FA, - apiVerifyLogin2FA, - auth, -} from "@/server/db/schema"; -import { WEBSITE_URL } from "@/server/utils/stripe"; -import { - type Auth, - IS_CLOUD, - createAdmin, - createUser, - findAuthByEmail, - findAuthById, - generate2FASecret, - getUserByToken, - lucia, - luciaToken, - removeAdminByAuthId, - removeUserByAuthId, - sendDiscordNotification, - sendEmailNotification, - updateAuthById, - validateRequest, - verify2FA, -} from "@dokploy/server"; -import { TRPCError } from "@trpc/server"; -import * as bcrypt from "bcrypt"; -import { isBefore } from "date-fns"; -import { eq } from "drizzle-orm"; -import { nanoid } from "nanoid"; -import { z } from "zod"; -import { db } from "../../db"; -import { - adminProcedure, - createTRPCRouter, - protectedProcedure, - publicProcedure, -} from "../trpc"; +import { createTRPCRouter } from "../trpc"; export const authRouter = createTRPCRouter({ - createAdmin: publicProcedure - .input(apiCreateAdmin) - .mutation(async ({ ctx, input }) => { - try { - if (!IS_CLOUD) { - const admin = await db.query.admins.findFirst({}); - if (admin) { - throw new TRPCError({ - code: "BAD_REQUEST", - message: "Admin already exists", - }); - } - } - const newAdmin = await createAdmin(input); - - if (IS_CLOUD) { - await sendDiscordNotificationWelcome(newAdmin); - await sendVerificationEmail(newAdmin.id); - return { - status: "success", - type: "cloud", - }; - } - const session = await lucia.createSession(newAdmin.id || "", {}); - ctx.res.appendHeader( - "Set-Cookie", - lucia.createSessionCookie(session.id).serialize(), - ); - return { - status: "success", - type: "selfhosted", - }; - } catch (error) { - throw new TRPCError({ - code: "BAD_REQUEST", - // @ts-ignore - message: `Error: ${error?.code === "23505" ? "Email already exists" : "Error creating admin"}`, - cause: error, - }); - } - }), - createUser: publicProcedure - .input(apiCreateUser) - .mutation(async ({ ctx, input }) => { - try { - const token = await getUserByToken(input.token); - if (token.isExpired) { - throw new TRPCError({ - code: "BAD_REQUEST", - message: "Invalid token", - }); - } - - const newUser = await createUser(input); - - if (IS_CLOUD) { - await sendVerificationEmail(token.authId); - return true; - } - const session = await lucia.createSession(newUser?.authId || "", {}); - ctx.res.appendHeader( - "Set-Cookie", - lucia.createSessionCookie(session.id).serialize(), - ); - return true; - } catch (error) { - throw new TRPCError({ - code: "BAD_REQUEST", - message: "Error creating the user", - cause: error, - }); - } - }), - - login: publicProcedure.input(apiLogin).mutation(async ({ ctx, input }) => { - try { - const auth = await findAuthByEmail(input.email); - - const correctPassword = bcrypt.compareSync( - input.password, - auth?.password || "", - ); - - if (!correctPassword) { - throw new TRPCError({ - code: "BAD_REQUEST", - message: "Credentials do not match", - }); - } - - if (auth?.confirmationToken && IS_CLOUD) { - await sendVerificationEmail(auth.id); - throw new TRPCError({ - code: "BAD_REQUEST", - message: - "Email not confirmed, we have sent you a confirmation email please check your inbox.", - }); - } - - if (auth?.is2FAEnabled) { - return { - is2FAEnabled: true, - authId: auth.id, - }; - } - - const session = await lucia.createSession(auth?.id || "", {}); - - ctx.res.appendHeader( - "Set-Cookie", - lucia.createSessionCookie(session.id).serialize(), - ); - return { - is2FAEnabled: false, - authId: auth?.id, - }; - } catch (error) { - throw new TRPCError({ - code: "BAD_REQUEST", - message: `Error: ${error instanceof Error ? error.message : "Login error"}`, - cause: error, - }); - } - }), - - get: protectedProcedure.query(async ({ ctx }) => { - const auth = await findAuthById(ctx.user.authId); - return auth; - }), - - logout: protectedProcedure.mutation(async ({ ctx }) => { - const { req, res } = ctx; - const { session } = await validateRequest(req, res); - if (!session) return false; - - await lucia.invalidateSession(session.id); - res.setHeader("Set-Cookie", lucia.createBlankSessionCookie().serialize()); - return true; - }), - - update: protectedProcedure - .input(apiUpdateAuth) - .mutation(async ({ ctx, input }) => { - const currentAuth = await findAuthByEmail(ctx.user.email); - - if (input.currentPassword || input.password) { - const correctPassword = bcrypt.compareSync( - input.currentPassword || "", - currentAuth?.password || "", - ); - if (!correctPassword) { - throw new TRPCError({ - code: "BAD_REQUEST", - message: "Current password is incorrect", - }); - } - } - const auth = await updateAuthById(ctx.user.authId, { - ...(input.email && { email: input.email.toLowerCase() }), - ...(input.password && { - password: bcrypt.hashSync(input.password, 10), - }), - ...(input.image && { image: input.image }), - }); - - return auth; - }), - removeSelfAccount: protectedProcedure - .input( - z.object({ - password: z.string().min(1), - }), - ) - .mutation(async ({ ctx, input }) => { - if (!IS_CLOUD) { - throw new TRPCError({ - code: "NOT_FOUND", - message: "This feature is only available in the cloud version", - }); - } - const currentAuth = await findAuthByEmail(ctx.user.email); - - const correctPassword = bcrypt.compareSync( - input.password, - currentAuth?.password || "", - ); - - if (!correctPassword) { - throw new TRPCError({ - code: "BAD_REQUEST", - message: "Password is incorrect", - }); - } - const { req, res } = ctx; - const { session } = await validateRequest(req, res); - if (!session) return false; - - await lucia.invalidateSession(session.id); - res.setHeader("Set-Cookie", lucia.createBlankSessionCookie().serialize()); - - if (ctx.user.rol === "admin") { - await removeAdminByAuthId(ctx.user.authId); - } else { - await removeUserByAuthId(ctx.user.authId); - } - - return true; - }), - - generateToken: protectedProcedure.mutation(async ({ ctx, input }) => { - const auth = await findAuthById(ctx.user.authId); - - if (auth.token) { - await luciaToken.invalidateSession(auth.token); - } - const session = await luciaToken.createSession(auth?.id || "", { - expiresIn: 60 * 60 * 24 * 30, - }); - - await updateAuthById(auth.id, { - token: session.id, - }); - - return auth; - }), - verifyToken: protectedProcedure.mutation(async () => { - return true; - }), - one: adminProcedure.input(apiFindOneAuth).query(async ({ input }) => { - const auth = await findAuthById(input.id); - return auth; - }), - - generate2FASecret: protectedProcedure.query(async ({ ctx }) => { - return await generate2FASecret(ctx.user.authId); - }), - verify2FASetup: protectedProcedure - .input(apiVerify2FA) - .mutation(async ({ ctx, input }) => { - const auth = await findAuthById(ctx.user.authId); - - await verify2FA(auth, input.secret, input.pin); - await updateAuthById(auth.id, { - is2FAEnabled: true, - secret: input.secret, - }); - return auth; - }), - - verifyLogin2FA: publicProcedure - .input(apiVerifyLogin2FA) - .mutation(async ({ ctx, input }) => { - const auth = await findAuthById(input.id); - - await verify2FA(auth, auth.secret || "", input.pin); - - const session = await lucia.createSession(auth.id, {}); - - ctx.res.appendHeader( - "Set-Cookie", - lucia.createSessionCookie(session.id).serialize(), - ); - - return true; - }), - disable2FA: protectedProcedure.mutation(async ({ ctx }) => { - const auth = await findAuthById(ctx.user.authId); - await updateAuthById(auth.id, { - is2FAEnabled: false, - secret: null, - }); - return auth; - }), - sendResetPasswordEmail: publicProcedure - .input( - z.object({ - email: z.string().min(1).email(), - }), - ) - .mutation(async ({ ctx, input }) => { - if (!IS_CLOUD) { - throw new TRPCError({ - code: "NOT_FOUND", - message: "This feature is only available in the cloud version", - }); - } - const authR = await db.query.auth.findFirst({ - where: eq(auth.email, input.email), - }); - if (!authR) { - throw new TRPCError({ - code: "NOT_FOUND", - message: "User not found", - }); - } - const token = nanoid(); - await updateAuthById(authR.id, { - resetPasswordToken: token, - // Make resetPassword in 24 hours - resetPasswordExpiresAt: new Date( - new Date().getTime() + 24 * 60 * 60 * 1000, - ).toISOString(), - }); - - await sendEmailNotification( - { - fromAddress: process.env.SMTP_FROM_ADDRESS!, - toAddresses: [authR.email], - smtpServer: process.env.SMTP_SERVER!, - smtpPort: Number(process.env.SMTP_PORT), - username: process.env.SMTP_USERNAME!, - password: process.env.SMTP_PASSWORD!, - }, - "Reset Password", - ` - Reset your password by clicking the link below: - The link will expire in 24 hours. - - Reset Password - - - `, - ); - }), - - resetPassword: publicProcedure - .input( - z.object({ - resetPasswordToken: z.string().min(1), - password: z.string().min(1), - }), - ) - .mutation(async ({ ctx, input }) => { - if (!IS_CLOUD) { - throw new TRPCError({ - code: "NOT_FOUND", - message: "This feature is only available in the cloud version", - }); - } - const authR = await db.query.auth.findFirst({ - where: eq(auth.resetPasswordToken, input.resetPasswordToken), - }); - - if (!authR || authR.resetPasswordExpiresAt === null) { - throw new TRPCError({ - code: "NOT_FOUND", - message: "Token not found", - }); - } - - const isExpired = isBefore( - new Date(authR.resetPasswordExpiresAt), - new Date(), - ); - - if (isExpired) { - throw new TRPCError({ - code: "NOT_FOUND", - message: "Token expired", - }); - } - - await updateAuthById(authR.id, { - resetPasswordExpiresAt: null, - resetPasswordToken: null, - password: bcrypt.hashSync(input.password, 10), - }); - - return true; - }), - confirmEmail: adminProcedure - .input( - z.object({ - confirmationToken: z.string().min(1), - }), - ) - .mutation(async ({ ctx, input }) => { - if (!IS_CLOUD) { - throw new TRPCError({ - code: "NOT_FOUND", - message: "Functionality not available in cloud version", - }); - } - const authR = await db.query.auth.findFirst({ - where: eq(auth.confirmationToken, input.confirmationToken), - }); - if (!authR || authR.confirmationExpiresAt === null) { - throw new TRPCError({ - code: "NOT_FOUND", - message: "Token not found", - }); - } - if (authR.confirmationToken !== input.confirmationToken) { - throw new TRPCError({ - code: "NOT_FOUND", - message: "Confirmation Token not found", - }); - } - - const isExpired = isBefore( - new Date(authR.confirmationExpiresAt), - new Date(), - ); - - if (isExpired) { - throw new TRPCError({ - code: "NOT_FOUND", - message: "Confirmation Token expired", - }); - } - 1; - await updateAuthById(authR.id, { - confirmationToken: null, - confirmationExpiresAt: null, - }); - return true; - }), + // createAdmin: publicProcedure.mutation(async ({ input }) => { + // try { + // if (!IS_CLOUD) { + // const admin = await db.query.admins.findFirst({}); + // if (admin) { + // throw new TRPCError({ + // code: "BAD_REQUEST", + // message: "Admin already exists", + // }); + // } + // } + // const newAdmin = await createAdmin(input); + // if (IS_CLOUD) { + // await sendDiscordNotificationWelcome(newAdmin); + // await sendVerificationEmail(newAdmin.id); + // return { + // status: "success", + // type: "cloud", + // }; + // } + // // const session = await lucia.createSession(newAdmin.id || "", {}); + // // ctx.res.appendHeader( + // // "Set-Cookie", + // // lucia.createSessionCookie(session.id).serialize(), + // // ); + // return { + // status: "success", + // type: "selfhosted", + // }; + // } catch (error) { + // throw new TRPCError({ + // code: "BAD_REQUEST", + // // @ts-ignore + // message: `Error: ${error?.code === "23505" ? "Email already exists" : "Error creating admin"}`, + // cause: error, + // }); + // } + // }), + // createUser: publicProcedure.mutation(async ({ input }) => { + // try { + // const _token = await getUserByToken(input.token); + // // if (token.isExpired) { + // // throw new TRPCError({ + // // code: "BAD_REQUEST", + // // message: "Invalid token", + // // }); + // // } + // // const newUser = await createUser(input); + // // if (IS_CLOUD) { + // // await sendVerificationEmail(token.authId); + // // return true; + // // } + // // const session = await lucia.createSession(newUser?.authId || "", {}); + // // ctx.res.appendHeader( + // // "Set-Cookie", + // // lucia.createSessionCookie(session.id).serialize(), + // // ); + // return true; + // } catch (error) { + // throw new TRPCError({ + // code: "BAD_REQUEST", + // message: "Error creating the user", + // cause: error, + // }); + // } + // }), + // login: publicProcedure.mutation(async ({ input }) => { + // try { + // const auth = await findAuthByEmail(input.email); + // const correctPassword = bcrypt.compareSync( + // input.password, + // auth?.password || "", + // ); + // if (!correctPassword) { + // throw new TRPCError({ + // code: "BAD_REQUEST", + // message: "Credentials do not match", + // }); + // } + // if (auth?.confirmationToken && IS_CLOUD) { + // await sendVerificationEmail(auth.id); + // throw new TRPCError({ + // code: "BAD_REQUEST", + // message: + // "Email not confirmed, we have sent you a confirmation email please check your inbox.", + // }); + // } + // if (auth?.is2FAEnabled) { + // return { + // is2FAEnabled: true, + // authId: auth.id, + // }; + // } + // // const session = await lucia.createSession(auth?.id || "", {}); + // // ctx.res.appendHeader( + // // "Set-Cookie", + // // lucia.createSessionCookie(session.id).serialize(), + // // ); + // return { + // is2FAEnabled: false, + // authId: auth?.id, + // }; + // } catch (error) { + // throw new TRPCError({ + // code: "BAD_REQUEST", + // message: `Error: ${error instanceof Error ? error.message : "Login error"}`, + // cause: error, + // }); + // } + // }), + // get: protectedProcedure.query(async ({ ctx }) => { + // const memberResult = await db.query.member.findFirst({ + // where: and( + // eq(member.userId, ctx.user.id), + // eq(member.organizationId, ctx.session?.activeOrganizationId || ""), + // ), + // with: { + // user: true, + // }, + // }); + // return memberResult; + // }), + // logout: protectedProcedure.mutation(async ({ ctx }) => { + // const { req } = ctx; + // const { session } = await validateRequest(req); + // if (!session) return false; + // // await lucia.invalidateSession(session.id); + // // res.setHeader("Set-Cookie", lucia.createBlankSessionCookie().serialize()); + // return true; + // }), + // update: protectedProcedure.mutation(async ({ ctx, input }) => { + // const currentAuth = await findAuthByEmail(ctx.user.email); + // if (input.currentPassword || input.password) { + // const correctPassword = bcrypt.compareSync( + // input.currentPassword || "", + // currentAuth?.password || "", + // ); + // if (!correctPassword) { + // throw new TRPCError({ + // code: "BAD_REQUEST", + // message: "Current password is incorrect", + // }); + // } + // } + // // const auth = await updateAuthById(ctx.user.authId, { + // // ...(input.email && { email: input.email.toLowerCase() }), + // // ...(input.password && { + // // password: bcrypt.hashSync(input.password, 10), + // // }), + // // ...(input.image && { image: input.image }), + // // }); + // return auth; + // }), + // removeSelfAccount: protectedProcedure + // .input( + // z.object({ + // password: z.string().min(1), + // }), + // ) + // .mutation(async ({ ctx, input }) => { + // if (!IS_CLOUD) { + // throw new TRPCError({ + // code: "NOT_FOUND", + // message: "This feature is only available in the cloud version", + // }); + // } + // const currentAuth = await findAuthByEmail(ctx.user.email); + // const correctPassword = bcrypt.compareSync( + // input.password, + // currentAuth?.password || "", + // ); + // if (!correctPassword) { + // throw new TRPCError({ + // code: "BAD_REQUEST", + // message: "Password is incorrect", + // }); + // } + // const { req } = ctx; + // const { session } = await validateRequest(req); + // if (!session) return false; + // // await lucia.invalidateSession(session.id); + // // res.setHeader("Set-Cookie", lucia.createBlankSessionCookie().serialize()); + // // if (ctx.user.rol === "owner") { + // // await removeAdminByAuthId(ctx.user.authId); + // // } else { + // // await removeUserByAuthId(ctx.user.authId); + // // } + // return true; + // }), + // generateToken: protectedProcedure.mutation(async ({ ctx }) => { + // const auth = await findUserById(ctx.user.id); + // console.log(auth); + // // if (auth.token) { + // // await luciaToken.invalidateSession(auth.token); + // // } + // // const session = await luciaToken.createSession(auth?.id || "", { + // // expiresIn: 60 * 60 * 24 * 30, + // // }); + // // await updateUser(auth.id, { + // // token: session.id, + // // }); + // return auth; + // }), + // verifyToken: protectedProcedure.mutation(async () => { + // return true; + // }), + // one: adminProcedure + // .input(z.object({ userId: z.string().min(1) })) + // .query(async ({ input }) => { + // // TODO: Check if the user is admin or member + // const user = await findUserById(input.userId); + // return user; + // }), + // sendResetPasswordEmail: publicProcedure + // .input( + // z.object({ + // email: z.string().min(1).email(), + // }), + // ) + // .mutation(async ({ input }) => { + // if (!IS_CLOUD) { + // throw new TRPCError({ + // code: "NOT_FOUND", + // message: "This feature is only available in the cloud version", + // }); + // } + // const authR = await db.query.auth.findFirst({ + // where: eq(auth.email, input.email), + // }); + // if (!authR) { + // throw new TRPCError({ + // code: "NOT_FOUND", + // message: "User not found", + // }); + // } + // const token = nanoid(); + // await updateAuthById(authR.id, { + // resetPasswordToken: token, + // // Make resetPassword in 24 hours + // resetPasswordExpiresAt: new Date( + // new Date().getTime() + 24 * 60 * 60 * 1000, + // ).toISOString(), + // }); + // await sendEmailNotification( + // { + // fromAddress: process.env.SMTP_FROM_ADDRESS!, + // toAddresses: [authR.email], + // smtpServer: process.env.SMTP_SERVER!, + // smtpPort: Number(process.env.SMTP_PORT), + // username: process.env.SMTP_USERNAME!, + // password: process.env.SMTP_PASSWORD!, + // }, + // "Reset Password", + // ` + // Reset your password by clicking the link below: + // The link will expire in 24 hours. + // + // Reset Password + // + // `, + // ); + // }), }); -export const sendVerificationEmail = async (authId: string) => { - const token = nanoid(); - const result = await updateAuthById(authId, { - confirmationToken: token, - confirmationExpiresAt: new Date( - new Date().getTime() + 24 * 60 * 60 * 1000, - ).toISOString(), - }); +// export const sendVerificationEmail = async (authId: string) => { +// const token = nanoid(); +// const result = await updateAuthById(authId, { +// confirmationToken: token, +// confirmationExpiresAt: new Date( +// new Date().getTime() + 24 * 60 * 60 * 1000, +// ).toISOString(), +// }); - if (!result) { - throw new TRPCError({ - code: "BAD_REQUEST", - message: "User not found", - }); - } - await sendEmailNotification( - { - fromAddress: process.env.SMTP_FROM_ADDRESS || "", - toAddresses: [result?.email], - smtpServer: process.env.SMTP_SERVER || "", - smtpPort: Number(process.env.SMTP_PORT), - username: process.env.SMTP_USERNAME || "", - password: process.env.SMTP_PASSWORD || "", - }, - "Confirm your email | Dokploy", - ` - Welcome to Dokploy! - Please confirm your email by clicking the link below: - - Confirm Email - - `, - ); +// if (!result) { +// throw new TRPCError({ +// code: "BAD_REQUEST", +// message: "User not found", +// }); +// } +// await sendEmailNotification( +// { +// fromAddress: process.env.SMTP_FROM_ADDRESS || "", +// toAddresses: [result?.email], +// smtpServer: process.env.SMTP_SERVER || "", +// smtpPort: Number(process.env.SMTP_PORT), +// username: process.env.SMTP_USERNAME || "", +// password: process.env.SMTP_PASSWORD || "", +// }, +// "Confirm your email | Dokploy", +// ` +// Welcome to Dokploy! +// Please confirm your email by clicking the link below: +// +// Confirm Email +// +// `, +// ); - return true; -}; +// return true; +// }; -export const sendDiscordNotificationWelcome = async (newAdmin: Auth) => { - await sendDiscordNotification( - { - webhookUrl: process.env.DISCORD_WEBHOOK_URL || "", - }, - { - title: "New User Registered", - color: 0x00ff00, - fields: [ - { - name: "Email", - value: newAdmin.email, - inline: true, - }, - ], - timestamp: newAdmin.createdAt, - footer: { - text: "Dokploy User Registration Notification", - }, - }, - ); -}; +// export const sendDiscordNotificationWelcome = async (newAdmin: Auth) => { +// await sendDiscordNotification( +// { +// webhookUrl: process.env.DISCORD_WEBHOOK_URL || "", +// }, +// { +// title: "New User Registered", +// color: 0x00ff00, +// fields: [ +// { +// name: "Email", +// value: newAdmin.email, +// inline: true, +// }, +// ], +// timestamp: newAdmin.createdAt, +// footer: { +// text: "Dokploy User Registration Notification", +// }, +// }, +// ); +// }; diff --git a/apps/dokploy/server/api/routers/backup.ts b/apps/dokploy/server/api/routers/backup.ts index 0b8d7ab1..8a7a5f22 100644 --- a/apps/dokploy/server/api/routers/backup.ts +++ b/apps/dokploy/server/api/routers/backup.ts @@ -30,7 +30,7 @@ import { TRPCError } from "@trpc/server"; export const backupRouter = createTRPCRouter({ create: protectedProcedure .input(apiCreateBackup) - .mutation(async ({ input, ctx }) => { + .mutation(async ({ input }) => { try { const newBackup = await createBackup(input); @@ -74,16 +74,14 @@ export const backupRouter = createTRPCRouter({ }); } }), - one: protectedProcedure - .input(apiFindOneBackup) - .query(async ({ input, ctx }) => { - const backup = await findBackupById(input.backupId); + one: protectedProcedure.input(apiFindOneBackup).query(async ({ input }) => { + const backup = await findBackupById(input.backupId); - return backup; - }), + return backup; + }), update: protectedProcedure .input(apiUpdateBackup) - .mutation(async ({ input, ctx }) => { + .mutation(async ({ input }) => { try { await updateBackupById(input.backupId, input); const backup = await findBackupById(input.backupId); @@ -111,15 +109,17 @@ export const backupRouter = createTRPCRouter({ } } } catch (error) { + const message = + error instanceof Error ? error.message : "Error updating this Backup"; throw new TRPCError({ code: "BAD_REQUEST", - message: "Error updating this Backup", + message, }); } }), remove: protectedProcedure .input(apiRemoveBackup) - .mutation(async ({ input, ctx }) => { + .mutation(async ({ input }) => { try { const value = await removeBackupById(input.backupId); if (IS_CLOUD && value) { @@ -133,10 +133,11 @@ export const backupRouter = createTRPCRouter({ } return value; } catch (error) { + const message = + error instanceof Error ? error.message : "Error deleting this Backup"; throw new TRPCError({ code: "BAD_REQUEST", - message: "Error deleting this Backup", - cause: error, + message, }); } }), @@ -149,11 +150,13 @@ export const backupRouter = createTRPCRouter({ await runPostgresBackup(postgres, backup); return true; } catch (error) { - console.log(error); + const message = + error instanceof Error + ? error.message + : "Error running manual Postgres backup "; throw new TRPCError({ code: "BAD_REQUEST", - message: "Error running manual Postgres backup ", - cause: error, + message, }); } }), diff --git a/apps/dokploy/server/api/routers/bitbucket.ts b/apps/dokploy/server/api/routers/bitbucket.ts index c66716d3..fa02be8d 100644 --- a/apps/dokploy/server/api/routers/bitbucket.ts +++ b/apps/dokploy/server/api/routers/bitbucket.ts @@ -8,7 +8,6 @@ import { apiUpdateBitbucket, } from "@/server/db/schema"; import { - IS_CLOUD, createBitbucket, findBitbucketById, getBitbucketBranches, @@ -23,7 +22,7 @@ export const bitbucketRouter = createTRPCRouter({ .input(apiCreateBitbucket) .mutation(async ({ input, ctx }) => { try { - return await createBitbucket(input, ctx.user.adminId); + return await createBitbucket(input, ctx.session.activeOrganizationId); } catch (error) { throw new TRPCError({ code: "BAD_REQUEST", @@ -37,10 +36,9 @@ export const bitbucketRouter = createTRPCRouter({ .query(async ({ input, ctx }) => { const bitbucketProvider = await findBitbucketById(input.bitbucketId); if ( - IS_CLOUD && - bitbucketProvider.gitProvider.adminId !== ctx.user.adminId + bitbucketProvider.gitProvider.organizationId !== + ctx.session.activeOrganizationId ) { - //TODO: Remove this line when the cloud version is ready throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to access this bitbucket provider", @@ -58,12 +56,11 @@ export const bitbucketRouter = createTRPCRouter({ }, }); - if (IS_CLOUD) { - // TODO: mAyBe a rEfaCtoR 🤫 - result = result.filter( - (provider) => provider.gitProvider.adminId === ctx.user.adminId, - ); - } + result = result.filter( + (provider) => + provider.gitProvider.organizationId === + ctx.session.activeOrganizationId, + ); return result; }), @@ -72,10 +69,9 @@ export const bitbucketRouter = createTRPCRouter({ .query(async ({ input, ctx }) => { const bitbucketProvider = await findBitbucketById(input.bitbucketId); if ( - IS_CLOUD && - bitbucketProvider.gitProvider.adminId !== ctx.user.adminId + bitbucketProvider.gitProvider.organizationId !== + ctx.session.activeOrganizationId ) { - //TODO: Remove this line when the cloud version is ready throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to access this bitbucket provider", @@ -90,10 +86,9 @@ export const bitbucketRouter = createTRPCRouter({ input.bitbucketId || "", ); if ( - IS_CLOUD && - bitbucketProvider.gitProvider.adminId !== ctx.user.adminId + bitbucketProvider.gitProvider.organizationId !== + ctx.session.activeOrganizationId ) { - //TODO: Remove this line when the cloud version is ready throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to access this bitbucket provider", @@ -107,10 +102,9 @@ export const bitbucketRouter = createTRPCRouter({ try { const bitbucketProvider = await findBitbucketById(input.bitbucketId); if ( - IS_CLOUD && - bitbucketProvider.gitProvider.adminId !== ctx.user.adminId + bitbucketProvider.gitProvider.organizationId !== + ctx.session.activeOrganizationId ) { - //TODO: Remove this line when the cloud version is ready throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to access this bitbucket provider", @@ -131,10 +125,9 @@ export const bitbucketRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { const bitbucketProvider = await findBitbucketById(input.bitbucketId); if ( - IS_CLOUD && - bitbucketProvider.gitProvider.adminId !== ctx.user.adminId + bitbucketProvider.gitProvider.organizationId !== + ctx.session.activeOrganizationId ) { - //TODO: Remove this line when the cloud version is ready throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to access this bitbucket provider", @@ -142,7 +135,7 @@ export const bitbucketRouter = createTRPCRouter({ } return await updateBitbucket(input.bitbucketId, { ...input, - adminId: ctx.user.adminId, + organizationId: ctx.session.activeOrganizationId, }); }), }); diff --git a/apps/dokploy/server/api/routers/certificate.ts b/apps/dokploy/server/api/routers/certificate.ts index 0f8d6fd9..3dc944ac 100644 --- a/apps/dokploy/server/api/routers/certificate.ts +++ b/apps/dokploy/server/api/routers/certificate.ts @@ -25,14 +25,14 @@ export const certificateRouter = createTRPCRouter({ message: "Please set a server to create a certificate", }); } - return await createCertificate(input, ctx.user.adminId); + return await createCertificate(input, ctx.session.activeOrganizationId); }), one: adminProcedure .input(apiFindCertificate) .query(async ({ input, ctx }) => { const certificates = await findCertificateById(input.certificateId); - if (IS_CLOUD && certificates.adminId !== ctx.user.adminId) { + if (certificates.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to access this certificate", @@ -44,7 +44,7 @@ export const certificateRouter = createTRPCRouter({ .input(apiFindCertificate) .mutation(async ({ input, ctx }) => { const certificates = await findCertificateById(input.certificateId); - if (IS_CLOUD && certificates.adminId !== ctx.user.adminId) { + if (certificates.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to delete this certificate", @@ -55,8 +55,7 @@ export const certificateRouter = createTRPCRouter({ }), all: adminProcedure.query(async ({ ctx }) => { return await db.query.certificates.findMany({ - // TODO: Remove this line when the cloud version is ready - ...(IS_CLOUD && { where: eq(certificates.adminId, ctx.user.adminId) }), + where: eq(certificates.organizationId, ctx.session.activeOrganizationId), }); }), }); diff --git a/apps/dokploy/server/api/routers/cluster.ts b/apps/dokploy/server/api/routers/cluster.ts index 7ded632c..0d840757 100644 --- a/apps/dokploy/server/api/routers/cluster.ts +++ b/apps/dokploy/server/api/routers/cluster.ts @@ -40,7 +40,7 @@ export const clusterRouter = createTRPCRouter({ }); } }), - addWorker: protectedProcedure.query(async ({ input }) => { + addWorker: protectedProcedure.query(async () => { if (IS_CLOUD) { return { command: "", @@ -57,7 +57,7 @@ export const clusterRouter = createTRPCRouter({ version: docker_version.Version, }; }), - addManager: protectedProcedure.query(async ({ input }) => { + addManager: protectedProcedure.query(async () => { if (IS_CLOUD) { return { command: "", diff --git a/apps/dokploy/server/api/routers/compose.ts b/apps/dokploy/server/api/routers/compose.ts index dab37e78..bae926d0 100644 --- a/apps/dokploy/server/api/routers/compose.ts +++ b/apps/dokploy/server/api/routers/compose.ts @@ -39,13 +39,14 @@ import { createComposeByTemplate, createDomain, createMount, - findAdminById, findComposeById, findDomainsByComposeId, findProjectById, findServerById, + findUserById, loadServices, randomizeComposeFile, + randomizeIsolatedDeploymentComposeFile, removeCompose, removeComposeDirectory, removeDeploymentsByComposeId, @@ -59,8 +60,13 @@ export const composeRouter = createTRPCRouter({ .input(apiCreateCompose) .mutation(async ({ ctx, input }) => { try { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.projectId, "create"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.projectId, + ctx.session.activeOrganizationId, + "create", + ); } if (IS_CLOUD && !input.serverId) { @@ -70,7 +76,7 @@ export const composeRouter = createTRPCRouter({ }); } const project = await findProjectById(input.projectId); - if (project.adminId !== ctx.user.adminId) { + if (project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this project", @@ -78,8 +84,12 @@ export const composeRouter = createTRPCRouter({ } const newService = await createCompose(input); - if (ctx.user.rol === "user") { - await addNewService(ctx.user.authId, newService.composeId); + if (ctx.user.rol === "member") { + await addNewService( + ctx.user.id, + newService.composeId, + project.organizationId, + ); } return newService; @@ -91,12 +101,17 @@ export const composeRouter = createTRPCRouter({ one: protectedProcedure .input(apiFindCompose) .query(async ({ input, ctx }) => { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.composeId, "access"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.composeId, + ctx.session.activeOrganizationId, + "access", + ); } const compose = await findComposeById(input.composeId); - if (compose.project.adminId !== ctx.user.adminId) { + if (compose.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this compose", @@ -109,7 +124,7 @@ export const composeRouter = createTRPCRouter({ .input(apiUpdateCompose) .mutation(async ({ input, ctx }) => { const compose = await findComposeById(input.composeId); - if (compose.project.adminId !== ctx.user.adminId) { + if (compose.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to update this compose", @@ -120,12 +135,20 @@ export const composeRouter = createTRPCRouter({ delete: protectedProcedure .input(apiDeleteCompose) .mutation(async ({ input, ctx }) => { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.composeId, "delete"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.composeId, + ctx.session.activeOrganizationId, + "delete", + ); } const composeResult = await findComposeById(input.composeId); - if (composeResult.project.adminId !== ctx.user.adminId) { + if ( + composeResult.project.organizationId !== + ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to delete this compose", @@ -147,7 +170,7 @@ export const composeRouter = createTRPCRouter({ for (const operation of cleanupOperations) { try { await operation(); - } catch (error) {} + } catch (_) {} } return result[0]; @@ -156,7 +179,7 @@ export const composeRouter = createTRPCRouter({ .input(apiFindCompose) .mutation(async ({ input, ctx }) => { const compose = await findComposeById(input.composeId); - if (compose.project.adminId !== ctx.user.adminId) { + if (compose.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to clean this compose", @@ -169,7 +192,7 @@ export const composeRouter = createTRPCRouter({ .input(apiFetchServices) .query(async ({ input, ctx }) => { const compose = await findComposeById(input.composeId); - if (compose.project.adminId !== ctx.user.adminId) { + if (compose.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to load this compose", @@ -183,7 +206,9 @@ export const composeRouter = createTRPCRouter({ try { const compose = await findComposeById(input.composeId); - if (compose.project.adminId !== ctx.user.adminId) { + if ( + compose.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to fetch this compose", @@ -208,7 +233,7 @@ export const composeRouter = createTRPCRouter({ .input(apiRandomizeCompose) .mutation(async ({ input, ctx }) => { const compose = await findComposeById(input.composeId); - if (compose.project.adminId !== ctx.user.adminId) { + if (compose.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to randomize this compose", @@ -216,11 +241,26 @@ export const composeRouter = createTRPCRouter({ } return await randomizeComposeFile(input.composeId, input.suffix); }), + isolatedDeployment: protectedProcedure + .input(apiRandomizeCompose) + .mutation(async ({ input, ctx }) => { + const compose = await findComposeById(input.composeId); + if (compose.project.organizationId !== ctx.session.activeOrganizationId) { + throw new TRPCError({ + code: "UNAUTHORIZED", + message: "You are not authorized to randomize this compose", + }); + } + return await randomizeIsolatedDeploymentComposeFile( + input.composeId, + input.suffix, + ); + }), getConvertedCompose: protectedProcedure .input(apiFindCompose) .query(async ({ input, ctx }) => { const compose = await findComposeById(input.composeId); - if (compose.project.adminId !== ctx.user.adminId) { + if (compose.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to get this compose", @@ -238,7 +278,7 @@ export const composeRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { const compose = await findComposeById(input.composeId); - if (compose.project.adminId !== ctx.user.adminId) { + if (compose.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to deploy this compose", @@ -271,7 +311,7 @@ export const composeRouter = createTRPCRouter({ .input(apiFindCompose) .mutation(async ({ input, ctx }) => { const compose = await findComposeById(input.composeId); - if (compose.project.adminId !== ctx.user.adminId) { + if (compose.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to redeploy this compose", @@ -303,7 +343,7 @@ export const composeRouter = createTRPCRouter({ .input(apiFindCompose) .mutation(async ({ input, ctx }) => { const compose = await findComposeById(input.composeId); - if (compose.project.adminId !== ctx.user.adminId) { + if (compose.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to stop this compose", @@ -317,7 +357,7 @@ export const composeRouter = createTRPCRouter({ .input(apiFindCompose) .mutation(async ({ input, ctx }) => { const compose = await findComposeById(input.composeId); - if (compose.project.adminId !== ctx.user.adminId) { + if (compose.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to stop this compose", @@ -332,7 +372,7 @@ export const composeRouter = createTRPCRouter({ .query(async ({ input, ctx }) => { const compose = await findComposeById(input.composeId); - if (compose.project.adminId !== ctx.user.adminId) { + if (compose.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to get this compose", @@ -345,7 +385,7 @@ export const composeRouter = createTRPCRouter({ .input(apiFindCompose) .mutation(async ({ input, ctx }) => { const compose = await findComposeById(input.composeId); - if (compose.project.adminId !== ctx.user.adminId) { + if (compose.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to refresh this compose", @@ -359,8 +399,13 @@ export const composeRouter = createTRPCRouter({ deployTemplate: protectedProcedure .input(apiCreateComposeByTemplate) .mutation(async ({ ctx, input }) => { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.projectId, "create"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.projectId, + ctx.session.activeOrganizationId, + "create", + ); } if (IS_CLOUD && !input.serverId) { @@ -374,7 +419,7 @@ export const composeRouter = createTRPCRouter({ const generate = await loadTemplateModule(input.id as TemplatesKeys); - const admin = await findAdminById(ctx.user.adminId); + const admin = await findUserById(ctx.user.ownerId); let serverIp = admin.serverIp || "127.0.0.1"; const project = await findProjectById(input.projectId); @@ -399,10 +444,15 @@ export const composeRouter = createTRPCRouter({ name: input.id, sourceType: "raw", appName: `${projectName}-${generatePassword(6)}`, + isolatedDeployment: true, }); - if (ctx.user.rol === "user") { - await addNewService(ctx.user.authId, compose.composeId); + if (ctx.user.rol === "member") { + await addNewService( + ctx.user.id, + compose.composeId, + project.organizationId, + ); } if (mounts && mounts?.length > 0) { @@ -446,7 +496,7 @@ export const composeRouter = createTRPCRouter({ return templatesData; }), - getTags: protectedProcedure.query(async ({ input }) => { + getTags: protectedProcedure.query(async () => { const allTags = templates.flatMap((template) => template.tags); const uniqueTags = _.uniq(allTags); return uniqueTags; diff --git a/apps/dokploy/server/api/routers/deployment.ts b/apps/dokploy/server/api/routers/deployment.ts index bf981c6d..8d95c121 100644 --- a/apps/dokploy/server/api/routers/deployment.ts +++ b/apps/dokploy/server/api/routers/deployment.ts @@ -19,7 +19,9 @@ export const deploymentRouter = createTRPCRouter({ .input(apiFindAllByApplication) .query(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this application", @@ -32,7 +34,7 @@ export const deploymentRouter = createTRPCRouter({ .input(apiFindAllByCompose) .query(async ({ input, ctx }) => { const compose = await findComposeById(input.composeId); - if (compose.project.adminId !== ctx.user.adminId) { + if (compose.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this compose", @@ -44,7 +46,7 @@ export const deploymentRouter = createTRPCRouter({ .input(apiFindAllByServer) .query(async ({ input, ctx }) => { const server = await findServerById(input.serverId); - if (server.adminId !== ctx.user.adminId) { + if (server.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this server", diff --git a/apps/dokploy/server/api/routers/destination.ts b/apps/dokploy/server/api/routers/destination.ts index d13928be..f1d582c5 100644 --- a/apps/dokploy/server/api/routers/destination.ts +++ b/apps/dokploy/server/api/routers/destination.ts @@ -28,7 +28,10 @@ export const destinationRouter = createTRPCRouter({ .input(apiCreateDestination) .mutation(async ({ input, ctx }) => { try { - return await createDestintation(input, ctx.user.adminId); + return await createDestintation( + input, + ctx.session.activeOrganizationId, + ); } catch (error) { throw new TRPCError({ code: "BAD_REQUEST", @@ -84,7 +87,7 @@ export const destinationRouter = createTRPCRouter({ .input(apiFindOneDestination) .query(async ({ input, ctx }) => { const destination = await findDestinationById(input.destinationId); - if (destination.adminId !== ctx.user.adminId) { + if (destination.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to access this destination", @@ -94,7 +97,7 @@ export const destinationRouter = createTRPCRouter({ }), all: protectedProcedure.query(async ({ ctx }) => { return await db.query.destinations.findMany({ - where: eq(destinations.adminId, ctx.user.adminId), + where: eq(destinations.organizationId, ctx.session.activeOrganizationId), }); }), remove: adminProcedure @@ -103,7 +106,7 @@ export const destinationRouter = createTRPCRouter({ try { const destination = await findDestinationById(input.destinationId); - if (destination.adminId !== ctx.user.adminId) { + if (destination.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to delete this destination", @@ -111,7 +114,7 @@ export const destinationRouter = createTRPCRouter({ } return await removeDestinationById( input.destinationId, - ctx.user.adminId, + ctx.session.activeOrganizationId, ); } catch (error) { throw error; @@ -122,7 +125,7 @@ export const destinationRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { try { const destination = await findDestinationById(input.destinationId); - if (destination.adminId !== ctx.user.adminId) { + if (destination.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to update this destination", @@ -130,7 +133,7 @@ export const destinationRouter = createTRPCRouter({ } return await updateDestinationById(input.destinationId, { ...input, - adminId: ctx.user.adminId, + organizationId: ctx.session.activeOrganizationId, }); } catch (error) { throw error; diff --git a/apps/dokploy/server/api/routers/domain.ts b/apps/dokploy/server/api/routers/domain.ts index f122cf86..aac2a016 100644 --- a/apps/dokploy/server/api/routers/domain.ts +++ b/apps/dokploy/server/api/routers/domain.ts @@ -30,7 +30,9 @@ export const domainRouter = createTRPCRouter({ try { if (input.domainType === "compose" && input.composeId) { const compose = await findComposeById(input.composeId); - if (compose.project.adminId !== ctx.user.adminId) { + if ( + compose.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this compose", @@ -38,7 +40,10 @@ export const domainRouter = createTRPCRouter({ } } else if (input.domainType === "application" && input.applicationId) { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== + ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this application", @@ -58,7 +63,9 @@ export const domainRouter = createTRPCRouter({ .input(apiFindOneApplication) .query(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this application", @@ -70,7 +77,7 @@ export const domainRouter = createTRPCRouter({ .input(apiFindCompose) .query(async ({ input, ctx }) => { const compose = await findComposeById(input.composeId); - if (compose.project.adminId !== ctx.user.adminId) { + if (compose.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this compose", @@ -83,7 +90,7 @@ export const domainRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { return generateTraefikMeDomain( input.appName, - ctx.user.adminId, + ctx.user.ownerId, input.serverId, ); }), @@ -95,7 +102,9 @@ export const domainRouter = createTRPCRouter({ if (currentDomain.applicationId) { const newApp = await findApplicationById(currentDomain.applicationId); - if (newApp.project.adminId !== ctx.user.adminId) { + if ( + newApp.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this application", @@ -103,7 +112,9 @@ export const domainRouter = createTRPCRouter({ } } else if (currentDomain.composeId) { const newCompose = await findComposeById(currentDomain.composeId); - if (newCompose.project.adminId !== ctx.user.adminId) { + if ( + newCompose.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this compose", @@ -114,7 +125,8 @@ export const domainRouter = createTRPCRouter({ currentDomain.previewDeploymentId, ); if ( - newPreviewDeployment.application.project.adminId !== ctx.user.adminId + newPreviewDeployment.application.project.organizationId !== + ctx.session.activeOrganizationId ) { throw new TRPCError({ code: "UNAUTHORIZED", @@ -143,7 +155,9 @@ export const domainRouter = createTRPCRouter({ const domain = await findDomainById(input.domainId); if (domain.applicationId) { const application = await findApplicationById(domain.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this application", @@ -151,7 +165,7 @@ export const domainRouter = createTRPCRouter({ } } else if (domain.composeId) { const compose = await findComposeById(domain.composeId); - if (compose.project.adminId !== ctx.user.adminId) { + if (compose.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this compose", @@ -166,7 +180,10 @@ export const domainRouter = createTRPCRouter({ const domain = await findDomainById(input.domainId); if (domain.applicationId) { const application = await findApplicationById(domain.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== + ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this application", @@ -174,7 +191,9 @@ export const domainRouter = createTRPCRouter({ } } else if (domain.composeId) { const compose = await findComposeById(domain.composeId); - if (compose.project.adminId !== ctx.user.adminId) { + if ( + compose.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this compose", diff --git a/apps/dokploy/server/api/routers/git-provider.ts b/apps/dokploy/server/api/routers/git-provider.ts index abd93392..ed37869d 100644 --- a/apps/dokploy/server/api/routers/git-provider.ts +++ b/apps/dokploy/server/api/routers/git-provider.ts @@ -1,11 +1,7 @@ import { createTRPCRouter, protectedProcedure } from "@/server/api/trpc"; import { db } from "@/server/db"; import { apiRemoveGitProvider, gitProvider } from "@/server/db/schema"; -import { - IS_CLOUD, - findGitProviderById, - removeGitProvider, -} from "@dokploy/server"; +import { findGitProviderById, removeGitProvider } from "@dokploy/server"; import { TRPCError } from "@trpc/server"; import { desc, eq } from "drizzle-orm"; @@ -18,8 +14,7 @@ export const gitProviderRouter = createTRPCRouter({ github: true, }, orderBy: desc(gitProvider.createdAt), - ...(IS_CLOUD && { where: eq(gitProvider.adminId, ctx.user.adminId) }), - //TODO: Remove this line when the cloud version is ready + where: eq(gitProvider.organizationId, ctx.session.activeOrganizationId), }); }), remove: protectedProcedure @@ -28,8 +23,7 @@ export const gitProviderRouter = createTRPCRouter({ try { const gitProvider = await findGitProviderById(input.gitProviderId); - if (IS_CLOUD && gitProvider.adminId !== ctx.user.adminId) { - // TODO: Remove isCloud in the next versions of dokploy + if (gitProvider.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to delete this Git provider", @@ -37,9 +31,13 @@ export const gitProviderRouter = createTRPCRouter({ } return await removeGitProvider(input.gitProviderId); } catch (error) { + const message = + error instanceof Error + ? error.message + : "Error deleting this Git provider"; throw new TRPCError({ code: "BAD_REQUEST", - message: "Error deleting this Git provider", + message, }); } }), diff --git a/apps/dokploy/server/api/routers/github.ts b/apps/dokploy/server/api/routers/github.ts index 56222577..691030e2 100644 --- a/apps/dokploy/server/api/routers/github.ts +++ b/apps/dokploy/server/api/routers/github.ts @@ -6,7 +6,6 @@ import { apiUpdateGithub, } from "@/server/db/schema"; import { - IS_CLOUD, findGithubById, getGithubBranches, getGithubRepositories, @@ -20,8 +19,10 @@ export const githubRouter = createTRPCRouter({ .input(apiFindOneGithub) .query(async ({ input, ctx }) => { const githubProvider = await findGithubById(input.githubId); - if (IS_CLOUD && githubProvider.gitProvider.adminId !== ctx.user.adminId) { - //TODO: Remove this line when the cloud version is ready + if ( + githubProvider.gitProvider.organizationId !== + ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to access this github provider", @@ -33,8 +34,10 @@ export const githubRouter = createTRPCRouter({ .input(apiFindOneGithub) .query(async ({ input, ctx }) => { const githubProvider = await findGithubById(input.githubId); - if (IS_CLOUD && githubProvider.gitProvider.adminId !== ctx.user.adminId) { - //TODO: Remove this line when the cloud version is ready + if ( + githubProvider.gitProvider.organizationId !== + ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to access this github provider", @@ -46,7 +49,10 @@ export const githubRouter = createTRPCRouter({ .input(apiFindGithubBranches) .query(async ({ input, ctx }) => { const githubProvider = await findGithubById(input.githubId || ""); - if (IS_CLOUD && githubProvider.gitProvider.adminId !== ctx.user.adminId) { + if ( + githubProvider.gitProvider.organizationId !== + ctx.session.activeOrganizationId + ) { //TODO: Remove this line when the cloud version is ready throw new TRPCError({ code: "UNAUTHORIZED", @@ -62,12 +68,11 @@ export const githubRouter = createTRPCRouter({ }, }); - if (IS_CLOUD) { - // TODO: mAyBe a rEfaCtoR 🤫 - result = result.filter( - (provider) => provider.gitProvider.adminId === ctx.user.adminId, - ); - } + result = result.filter( + (provider) => + provider.gitProvider.organizationId === + ctx.session.activeOrganizationId, + ); const filtered = result .filter((provider) => haveGithubRequirements(provider)) @@ -89,10 +94,9 @@ export const githubRouter = createTRPCRouter({ try { const githubProvider = await findGithubById(input.githubId); if ( - IS_CLOUD && - githubProvider.gitProvider.adminId !== ctx.user.adminId + githubProvider.gitProvider.organizationId !== + ctx.session.activeOrganizationId ) { - //TODO: Remove this line when the cloud version is ready throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to access this github provider", @@ -111,8 +115,10 @@ export const githubRouter = createTRPCRouter({ .input(apiUpdateGithub) .mutation(async ({ input, ctx }) => { const githubProvider = await findGithubById(input.githubId); - if (IS_CLOUD && githubProvider.gitProvider.adminId !== ctx.user.adminId) { - //TODO: Remove this line when the cloud version is ready + if ( + githubProvider.gitProvider.organizationId !== + ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to access this github provider", @@ -120,7 +126,7 @@ export const githubRouter = createTRPCRouter({ } await updateGitProvider(input.gitProviderId, { name: input.name, - adminId: ctx.user.adminId, + organizationId: ctx.session.activeOrganizationId, }); }), }); diff --git a/apps/dokploy/server/api/routers/gitlab.ts b/apps/dokploy/server/api/routers/gitlab.ts index 6d35f4a2..daae68a5 100644 --- a/apps/dokploy/server/api/routers/gitlab.ts +++ b/apps/dokploy/server/api/routers/gitlab.ts @@ -9,7 +9,6 @@ import { import { db } from "@/server/db"; import { - IS_CLOUD, createGitlab, findGitlabById, getGitlabBranches, @@ -26,7 +25,7 @@ export const gitlabRouter = createTRPCRouter({ .input(apiCreateGitlab) .mutation(async ({ input, ctx }) => { try { - return await createGitlab(input, ctx.user.adminId); + return await createGitlab(input, ctx.session.activeOrganizationId); } catch (error) { throw new TRPCError({ code: "BAD_REQUEST", @@ -39,8 +38,10 @@ export const gitlabRouter = createTRPCRouter({ .input(apiFindOneGitlab) .query(async ({ input, ctx }) => { const gitlabProvider = await findGitlabById(input.gitlabId); - if (IS_CLOUD && gitlabProvider.gitProvider.adminId !== ctx.user.adminId) { - //TODO: Remove this line when the cloud version is ready + if ( + gitlabProvider.gitProvider.organizationId !== + ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to access this Gitlab provider", @@ -55,12 +56,11 @@ export const gitlabRouter = createTRPCRouter({ }, }); - if (IS_CLOUD) { - // TODO: mAyBe a rEfaCtoR 🤫 - result = result.filter( - (provider) => provider.gitProvider.adminId === ctx.user.adminId, - ); - } + result = result.filter( + (provider) => + provider.gitProvider.organizationId === + ctx.session.activeOrganizationId, + ); const filtered = result .filter((provider) => haveGitlabRequirements(provider)) .map((provider) => { @@ -78,8 +78,10 @@ export const gitlabRouter = createTRPCRouter({ .input(apiFindOneGitlab) .query(async ({ input, ctx }) => { const gitlabProvider = await findGitlabById(input.gitlabId); - if (IS_CLOUD && gitlabProvider.gitProvider.adminId !== ctx.user.adminId) { - //TODO: Remove this line when the cloud version is ready + if ( + gitlabProvider.gitProvider.organizationId !== + ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to access this Gitlab provider", @@ -92,8 +94,10 @@ export const gitlabRouter = createTRPCRouter({ .input(apiFindGitlabBranches) .query(async ({ input, ctx }) => { const gitlabProvider = await findGitlabById(input.gitlabId || ""); - if (IS_CLOUD && gitlabProvider.gitProvider.adminId !== ctx.user.adminId) { - //TODO: Remove this line when the cloud version is ready + if ( + gitlabProvider.gitProvider.organizationId !== + ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to access this Gitlab provider", @@ -107,10 +111,9 @@ export const gitlabRouter = createTRPCRouter({ try { const gitlabProvider = await findGitlabById(input.gitlabId || ""); if ( - IS_CLOUD && - gitlabProvider.gitProvider.adminId !== ctx.user.adminId + gitlabProvider.gitProvider.organizationId !== + ctx.session.activeOrganizationId ) { - //TODO: Remove this line when the cloud version is ready throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to access this Gitlab provider", @@ -130,8 +133,10 @@ export const gitlabRouter = createTRPCRouter({ .input(apiUpdateGitlab) .mutation(async ({ input, ctx }) => { const gitlabProvider = await findGitlabById(input.gitlabId); - if (IS_CLOUD && gitlabProvider.gitProvider.adminId !== ctx.user.adminId) { - //TODO: Remove this line when the cloud version is ready + if ( + gitlabProvider.gitProvider.organizationId !== + ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to access this Gitlab provider", @@ -140,7 +145,7 @@ export const gitlabRouter = createTRPCRouter({ if (input.name) { await updateGitProvider(input.gitProviderId, { name: input.name, - adminId: ctx.user.adminId, + organizationId: ctx.session.activeOrganizationId, }); await updateGitlab(input.gitlabId, { diff --git a/apps/dokploy/server/api/routers/mariadb.ts b/apps/dokploy/server/api/routers/mariadb.ts index 09f4d675..be0ffd39 100644 --- a/apps/dokploy/server/api/routers/mariadb.ts +++ b/apps/dokploy/server/api/routers/mariadb.ts @@ -9,6 +9,7 @@ import { apiSaveExternalPortMariaDB, apiUpdateMariaDB, } from "@/server/db/schema"; +import { cancelJobs } from "@/server/utils/backup"; import { IS_CLOUD, addNewService, @@ -16,9 +17,9 @@ import { createMariadb, createMount, deployMariadb, + findBackupsByDbId, findMariadbById, findProjectById, - findServerById, removeMariadbById, removeService, startService, @@ -35,8 +36,13 @@ export const mariadbRouter = createTRPCRouter({ .input(apiCreateMariaDB) .mutation(async ({ input, ctx }) => { try { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.projectId, "create"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.projectId, + ctx.session.activeOrganizationId, + "create", + ); } if (IS_CLOUD && !input.serverId) { @@ -47,15 +53,19 @@ export const mariadbRouter = createTRPCRouter({ } const project = await findProjectById(input.projectId); - if (project.adminId !== ctx.user.adminId) { + if (project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this project", }); } const newMariadb = await createMariadb(input); - if (ctx.user.rol === "user") { - await addNewService(ctx.user.authId, newMariadb.mariadbId); + if (ctx.user.rol === "member") { + await addNewService( + ctx.user.id, + newMariadb.mariadbId, + project.organizationId, + ); } await createMount({ @@ -77,11 +87,16 @@ export const mariadbRouter = createTRPCRouter({ one: protectedProcedure .input(apiFindOneMariaDB) .query(async ({ input, ctx }) => { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.mariadbId, "access"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.mariadbId, + ctx.session.activeOrganizationId, + "access", + ); } const mariadb = await findMariadbById(input.mariadbId); - if (mariadb.project.adminId !== ctx.user.adminId) { + if (mariadb.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this Mariadb", @@ -94,7 +109,7 @@ export const mariadbRouter = createTRPCRouter({ .input(apiFindOneMariaDB) .mutation(async ({ input, ctx }) => { const service = await findMariadbById(input.mariadbId); - if (service.project.adminId !== ctx.user.adminId) { + if (service.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to start this Mariadb", @@ -131,7 +146,7 @@ export const mariadbRouter = createTRPCRouter({ .input(apiSaveExternalPortMariaDB) .mutation(async ({ input, ctx }) => { const mongo = await findMariadbById(input.mariadbId); - if (mongo.project.adminId !== ctx.user.adminId) { + if (mongo.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to save this external port", @@ -147,7 +162,7 @@ export const mariadbRouter = createTRPCRouter({ .input(apiDeployMariaDB) .mutation(async ({ input, ctx }) => { const mariadb = await findMariadbById(input.mariadbId); - if (mariadb.project.adminId !== ctx.user.adminId) { + if (mariadb.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to deploy this Mariadb", @@ -168,7 +183,7 @@ export const mariadbRouter = createTRPCRouter({ .input(apiDeployMariaDB) .subscription(async ({ input, ctx }) => { const mariadb = await findMariadbById(input.mariadbId); - if (mariadb.project.adminId !== ctx.user.adminId) { + if (mariadb.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to deploy this Mariadb", @@ -185,7 +200,7 @@ export const mariadbRouter = createTRPCRouter({ .input(apiChangeMariaDBStatus) .mutation(async ({ input, ctx }) => { const mongo = await findMariadbById(input.mariadbId); - if (mongo.project.adminId !== ctx.user.adminId) { + if (mongo.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to change this Mariadb status", @@ -199,27 +214,34 @@ export const mariadbRouter = createTRPCRouter({ remove: protectedProcedure .input(apiFindOneMariaDB) .mutation(async ({ input, ctx }) => { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.mariadbId, "delete"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.mariadbId, + ctx.session.activeOrganizationId, + "delete", + ); } const mongo = await findMariadbById(input.mariadbId); - if (mongo.project.adminId !== ctx.user.adminId) { + if (mongo.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to delete this Mariadb", }); } + const backups = await findBackupsByDbId(input.mariadbId, "mariadb"); const cleanupOperations = [ async () => await removeService(mongo?.appName, mongo.serverId), + async () => await cancelJobs(backups), async () => await removeMariadbById(input.mariadbId), ]; for (const operation of cleanupOperations) { try { await operation(); - } catch (error) {} + } catch (_) {} } return mongo; @@ -228,7 +250,7 @@ export const mariadbRouter = createTRPCRouter({ .input(apiSaveEnvironmentVariablesMariaDB) .mutation(async ({ input, ctx }) => { const mariadb = await findMariadbById(input.mariadbId); - if (mariadb.project.adminId !== ctx.user.adminId) { + if (mariadb.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to save this environment", @@ -251,7 +273,7 @@ export const mariadbRouter = createTRPCRouter({ .input(apiResetMariadb) .mutation(async ({ input, ctx }) => { const mariadb = await findMariadbById(input.mariadbId); - if (mariadb.project.adminId !== ctx.user.adminId) { + if (mariadb.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to reload this Mariadb", @@ -281,7 +303,7 @@ export const mariadbRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { const { mariadbId, ...rest } = input; const mariadb = await findMariadbById(mariadbId); - if (mariadb.project.adminId !== ctx.user.adminId) { + if (mariadb.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to update this Mariadb", diff --git a/apps/dokploy/server/api/routers/mongo.ts b/apps/dokploy/server/api/routers/mongo.ts index b114b8d8..1c3ba6bb 100644 --- a/apps/dokploy/server/api/routers/mongo.ts +++ b/apps/dokploy/server/api/routers/mongo.ts @@ -9,6 +9,7 @@ import { apiSaveExternalPortMongo, apiUpdateMongo, } from "@/server/db/schema"; +import { cancelJobs } from "@/server/utils/backup"; import { IS_CLOUD, addNewService, @@ -16,6 +17,7 @@ import { createMongo, createMount, deployMongo, + findBackupsByDbId, findMongoById, findProjectById, removeMongoById, @@ -34,8 +36,13 @@ export const mongoRouter = createTRPCRouter({ .input(apiCreateMongo) .mutation(async ({ input, ctx }) => { try { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.projectId, "create"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.projectId, + ctx.session.activeOrganizationId, + "create", + ); } if (IS_CLOUD && !input.serverId) { @@ -46,15 +53,19 @@ export const mongoRouter = createTRPCRouter({ } const project = await findProjectById(input.projectId); - if (project.adminId !== ctx.user.adminId) { + if (project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this project", }); } const newMongo = await createMongo(input); - if (ctx.user.rol === "user") { - await addNewService(ctx.user.authId, newMongo.mongoId); + if (ctx.user.rol === "member") { + await addNewService( + ctx.user.id, + newMongo.mongoId, + project.organizationId, + ); } await createMount({ @@ -80,12 +91,17 @@ export const mongoRouter = createTRPCRouter({ one: protectedProcedure .input(apiFindOneMongo) .query(async ({ input, ctx }) => { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.mongoId, "access"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.mongoId, + ctx.session.activeOrganizationId, + "access", + ); } const mongo = await findMongoById(input.mongoId); - if (mongo.project.adminId !== ctx.user.adminId) { + if (mongo.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this mongo", @@ -99,7 +115,7 @@ export const mongoRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { const service = await findMongoById(input.mongoId); - if (service.project.adminId !== ctx.user.adminId) { + if (service.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to start this mongo", @@ -122,7 +138,7 @@ export const mongoRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { const mongo = await findMongoById(input.mongoId); - if (mongo.project.adminId !== ctx.user.adminId) { + if (mongo.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to stop this mongo", @@ -144,7 +160,7 @@ export const mongoRouter = createTRPCRouter({ .input(apiSaveExternalPortMongo) .mutation(async ({ input, ctx }) => { const mongo = await findMongoById(input.mongoId); - if (mongo.project.adminId !== ctx.user.adminId) { + if (mongo.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to save this external port", @@ -160,7 +176,7 @@ export const mongoRouter = createTRPCRouter({ .input(apiDeployMongo) .mutation(async ({ input, ctx }) => { const mongo = await findMongoById(input.mongoId); - if (mongo.project.adminId !== ctx.user.adminId) { + if (mongo.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to deploy this mongo", @@ -180,7 +196,7 @@ export const mongoRouter = createTRPCRouter({ .input(apiDeployMongo) .subscription(async ({ input, ctx }) => { const mongo = await findMongoById(input.mongoId); - if (mongo.project.adminId !== ctx.user.adminId) { + if (mongo.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to deploy this mongo", @@ -197,7 +213,7 @@ export const mongoRouter = createTRPCRouter({ .input(apiChangeMongoStatus) .mutation(async ({ input, ctx }) => { const mongo = await findMongoById(input.mongoId); - if (mongo.project.adminId !== ctx.user.adminId) { + if (mongo.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to change this mongo status", @@ -212,7 +228,7 @@ export const mongoRouter = createTRPCRouter({ .input(apiResetMongo) .mutation(async ({ input, ctx }) => { const mongo = await findMongoById(input.mongoId); - if (mongo.project.adminId !== ctx.user.adminId) { + if (mongo.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to reload this mongo", @@ -240,28 +256,35 @@ export const mongoRouter = createTRPCRouter({ remove: protectedProcedure .input(apiFindOneMongo) .mutation(async ({ input, ctx }) => { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.mongoId, "delete"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.mongoId, + ctx.session.activeOrganizationId, + "delete", + ); } const mongo = await findMongoById(input.mongoId); - if (mongo.project.adminId !== ctx.user.adminId) { + if (mongo.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to delete this mongo", }); } + const backups = await findBackupsByDbId(input.mongoId, "mongo"); const cleanupOperations = [ async () => await removeService(mongo?.appName, mongo.serverId), + async () => await cancelJobs(backups), async () => await removeMongoById(input.mongoId), ]; for (const operation of cleanupOperations) { try { await operation(); - } catch (error) {} + } catch (_) {} } return mongo; @@ -270,7 +293,7 @@ export const mongoRouter = createTRPCRouter({ .input(apiSaveEnvironmentVariablesMongo) .mutation(async ({ input, ctx }) => { const mongo = await findMongoById(input.mongoId); - if (mongo.project.adminId !== ctx.user.adminId) { + if (mongo.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to save this environment", @@ -294,7 +317,7 @@ export const mongoRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { const { mongoId, ...rest } = input; const mongo = await findMongoById(mongoId); - if (mongo.project.adminId !== ctx.user.adminId) { + if (mongo.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to update this mongo", diff --git a/apps/dokploy/server/api/routers/mysql.ts b/apps/dokploy/server/api/routers/mysql.ts index 44d2537a..594403f2 100644 --- a/apps/dokploy/server/api/routers/mysql.ts +++ b/apps/dokploy/server/api/routers/mysql.ts @@ -12,6 +12,7 @@ import { import { TRPCError } from "@trpc/server"; +import { cancelJobs } from "@/server/utils/backup"; import { IS_CLOUD, addNewService, @@ -19,6 +20,7 @@ import { createMount, createMysql, deployMySql, + findBackupsByDbId, findMySqlById, findProjectById, removeMySqlById, @@ -36,8 +38,13 @@ export const mysqlRouter = createTRPCRouter({ .input(apiCreateMySql) .mutation(async ({ input, ctx }) => { try { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.projectId, "create"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.projectId, + ctx.session.activeOrganizationId, + "create", + ); } if (IS_CLOUD && !input.serverId) { @@ -48,7 +55,7 @@ export const mysqlRouter = createTRPCRouter({ } 1; const project = await findProjectById(input.projectId); - if (project.adminId !== ctx.user.adminId) { + if (project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this project", @@ -56,8 +63,12 @@ export const mysqlRouter = createTRPCRouter({ } const newMysql = await createMysql(input); - if (ctx.user.rol === "user") { - await addNewService(ctx.user.authId, newMysql.mysqlId); + if (ctx.user.rol === "member") { + await addNewService( + ctx.user.id, + newMysql.mysqlId, + project.organizationId, + ); } await createMount({ @@ -83,11 +94,16 @@ export const mysqlRouter = createTRPCRouter({ one: protectedProcedure .input(apiFindOneMySql) .query(async ({ input, ctx }) => { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.mysqlId, "access"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.mysqlId, + ctx.session.activeOrganizationId, + "access", + ); } const mysql = await findMySqlById(input.mysqlId); - if (mysql.project.adminId !== ctx.user.adminId) { + if (mysql.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this MySQL", @@ -100,7 +116,7 @@ export const mysqlRouter = createTRPCRouter({ .input(apiFindOneMySql) .mutation(async ({ input, ctx }) => { const service = await findMySqlById(input.mysqlId); - if (service.project.adminId !== ctx.user.adminId) { + if (service.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to start this MySQL", @@ -122,7 +138,7 @@ export const mysqlRouter = createTRPCRouter({ .input(apiFindOneMySql) .mutation(async ({ input, ctx }) => { const mongo = await findMySqlById(input.mysqlId); - if (mongo.project.adminId !== ctx.user.adminId) { + if (mongo.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to stop this MySQL", @@ -143,7 +159,7 @@ export const mysqlRouter = createTRPCRouter({ .input(apiSaveExternalPortMySql) .mutation(async ({ input, ctx }) => { const mongo = await findMySqlById(input.mysqlId); - if (mongo.project.adminId !== ctx.user.adminId) { + if (mongo.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to save this external port", @@ -159,7 +175,7 @@ export const mysqlRouter = createTRPCRouter({ .input(apiDeployMySql) .mutation(async ({ input, ctx }) => { const mysql = await findMySqlById(input.mysqlId); - if (mysql.project.adminId !== ctx.user.adminId) { + if (mysql.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to deploy this MySQL", @@ -179,7 +195,7 @@ export const mysqlRouter = createTRPCRouter({ .input(apiDeployMySql) .subscription(async ({ input, ctx }) => { const mysql = await findMySqlById(input.mysqlId); - if (mysql.project.adminId !== ctx.user.adminId) { + if (mysql.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to deploy this MySQL", @@ -196,7 +212,7 @@ export const mysqlRouter = createTRPCRouter({ .input(apiChangeMySqlStatus) .mutation(async ({ input, ctx }) => { const mongo = await findMySqlById(input.mysqlId); - if (mongo.project.adminId !== ctx.user.adminId) { + if (mongo.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to change this MySQL status", @@ -211,7 +227,7 @@ export const mysqlRouter = createTRPCRouter({ .input(apiResetMysql) .mutation(async ({ input, ctx }) => { const mysql = await findMySqlById(input.mysqlId); - if (mysql.project.adminId !== ctx.user.adminId) { + if (mysql.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to reload this MySQL", @@ -238,26 +254,33 @@ export const mysqlRouter = createTRPCRouter({ remove: protectedProcedure .input(apiFindOneMySql) .mutation(async ({ input, ctx }) => { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.mysqlId, "delete"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.mysqlId, + ctx.session.activeOrganizationId, + "delete", + ); } const mongo = await findMySqlById(input.mysqlId); - if (mongo.project.adminId !== ctx.user.adminId) { + if (mongo.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to delete this MySQL", }); } + const backups = await findBackupsByDbId(input.mysqlId, "mysql"); const cleanupOperations = [ async () => await removeService(mongo?.appName, mongo.serverId), + async () => await cancelJobs(backups), async () => await removeMySqlById(input.mysqlId), ]; for (const operation of cleanupOperations) { try { await operation(); - } catch (error) {} + } catch (_) {} } return mongo; @@ -266,7 +289,7 @@ export const mysqlRouter = createTRPCRouter({ .input(apiSaveEnvironmentVariablesMySql) .mutation(async ({ input, ctx }) => { const mysql = await findMySqlById(input.mysqlId); - if (mysql.project.adminId !== ctx.user.adminId) { + if (mysql.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to save this environment", @@ -290,7 +313,7 @@ export const mysqlRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { const { mysqlId, ...rest } = input; const mysql = await findMySqlById(mysqlId); - if (mysql.project.adminId !== ctx.user.adminId) { + if (mysql.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to update this MySQL", diff --git a/apps/dokploy/server/api/routers/notification.ts b/apps/dokploy/server/api/routers/notification.ts index 2eafc66d..23283d97 100644 --- a/apps/dokploy/server/api/routers/notification.ts +++ b/apps/dokploy/server/api/routers/notification.ts @@ -23,6 +23,8 @@ import { apiUpdateSlack, apiUpdateTelegram, notifications, + server, + users_temp, } from "@/server/db/schema"; import { IS_CLOUD, @@ -36,6 +38,7 @@ import { sendDiscordNotification, sendEmailNotification, sendGotifyNotification, + sendServerThresholdNotifications, sendSlackNotification, sendTelegramNotification, updateDiscordNotification, @@ -45,15 +48,18 @@ import { updateTelegramNotification, } from "@dokploy/server"; import { TRPCError } from "@trpc/server"; -import { desc, eq } from "drizzle-orm"; +import { desc, eq, sql } from "drizzle-orm"; +import { z } from "zod"; -// TODO: Uncomment the validations when is cloud ready export const notificationRouter = createTRPCRouter({ createSlack: adminProcedure .input(apiCreateSlack) .mutation(async ({ input, ctx }) => { try { - return await createSlackNotification(input, ctx.user.adminId); + return await createSlackNotification( + input, + ctx.session.activeOrganizationId, + ); } catch (error) { throw new TRPCError({ code: "BAD_REQUEST", @@ -67,8 +73,7 @@ export const notificationRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { try { const notification = await findNotificationById(input.notificationId); - if (IS_CLOUD && notification.adminId !== ctx.user.adminId) { - // TODO: Remove isCloud in the next versions of dokploy + if (notification.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to update this notification", @@ -76,7 +81,7 @@ export const notificationRouter = createTRPCRouter({ } return await updateSlackNotification({ ...input, - adminId: ctx.user.adminId, + organizationId: ctx.session.activeOrganizationId, }); } catch (error) { throw error; @@ -103,7 +108,10 @@ export const notificationRouter = createTRPCRouter({ .input(apiCreateTelegram) .mutation(async ({ input, ctx }) => { try { - return await createTelegramNotification(input, ctx.user.adminId); + return await createTelegramNotification( + input, + ctx.session.activeOrganizationId, + ); } catch (error) { throw new TRPCError({ code: "BAD_REQUEST", @@ -118,8 +126,7 @@ export const notificationRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { try { const notification = await findNotificationById(input.notificationId); - if (IS_CLOUD && notification.adminId !== ctx.user.adminId) { - // TODO: Remove isCloud in the next versions of dokploy + if (notification.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to update this notification", @@ -127,7 +134,7 @@ export const notificationRouter = createTRPCRouter({ } return await updateTelegramNotification({ ...input, - adminId: ctx.user.adminId, + organizationId: ctx.session.activeOrganizationId, }); } catch (error) { throw new TRPCError({ @@ -155,7 +162,10 @@ export const notificationRouter = createTRPCRouter({ .input(apiCreateDiscord) .mutation(async ({ input, ctx }) => { try { - return await createDiscordNotification(input, ctx.user.adminId); + return await createDiscordNotification( + input, + ctx.session.activeOrganizationId, + ); } catch (error) { throw new TRPCError({ code: "BAD_REQUEST", @@ -170,8 +180,7 @@ export const notificationRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { try { const notification = await findNotificationById(input.notificationId); - if (IS_CLOUD && notification.adminId !== ctx.user.adminId) { - // TODO: Remove isCloud in the next versions of dokploy + if (notification.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to update this notification", @@ -179,7 +188,7 @@ export const notificationRouter = createTRPCRouter({ } return await updateDiscordNotification({ ...input, - adminId: ctx.user.adminId, + organizationId: ctx.session.activeOrganizationId, }); } catch (error) { throw new TRPCError({ @@ -216,7 +225,10 @@ export const notificationRouter = createTRPCRouter({ .input(apiCreateEmail) .mutation(async ({ input, ctx }) => { try { - return await createEmailNotification(input, ctx.user.adminId); + return await createEmailNotification( + input, + ctx.session.activeOrganizationId, + ); } catch (error) { throw new TRPCError({ code: "BAD_REQUEST", @@ -230,8 +242,7 @@ export const notificationRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { try { const notification = await findNotificationById(input.notificationId); - if (IS_CLOUD && notification.adminId !== ctx.user.adminId) { - // TODO: Remove isCloud in the next versions of dokploy + if (notification.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to update this notification", @@ -239,7 +250,7 @@ export const notificationRouter = createTRPCRouter({ } return await updateEmailNotification({ ...input, - adminId: ctx.user.adminId, + organizationId: ctx.session.activeOrganizationId, }); } catch (error) { throw new TRPCError({ @@ -272,8 +283,7 @@ export const notificationRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { try { const notification = await findNotificationById(input.notificationId); - if (IS_CLOUD && notification.adminId !== ctx.user.adminId) { - // TODO: Remove isCloud in the next versions of dokploy + if (notification.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to delete this notification", @@ -281,9 +291,13 @@ export const notificationRouter = createTRPCRouter({ } return await removeNotificationById(input.notificationId); } catch (error) { + const message = + error instanceof Error + ? error.message + : "Error deleting this notification"; throw new TRPCError({ code: "BAD_REQUEST", - message: "Error deleting this notification", + message, }); } }), @@ -291,8 +305,7 @@ export const notificationRouter = createTRPCRouter({ .input(apiFindOneNotification) .query(async ({ input, ctx }) => { const notification = await findNotificationById(input.notificationId); - if (IS_CLOUD && notification.adminId !== ctx.user.adminId) { - // TODO: Remove isCloud in the next versions of dokploy + if (notification.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this notification", @@ -310,15 +323,81 @@ export const notificationRouter = createTRPCRouter({ gotify: true, }, orderBy: desc(notifications.createdAt), - ...(IS_CLOUD && { where: eq(notifications.adminId, ctx.user.adminId) }), - // TODO: Remove this line when the cloud version is ready + where: eq(notifications.organizationId, ctx.session.activeOrganizationId), }); }), + receiveNotification: publicProcedure + .input( + z.object({ + ServerType: z.enum(["Dokploy", "Remote"]).default("Dokploy"), + Type: z.enum(["Memory", "CPU"]), + Value: z.number(), + Threshold: z.number(), + Message: z.string(), + Timestamp: z.string(), + Token: z.string(), + }), + ) + .mutation(async ({ input }) => { + try { + let organizationId = ""; + let ServerName = ""; + if (input.ServerType === "Dokploy") { + const result = await db + .select() + .from(users_temp) + .where( + sql`${users_temp.metricsConfig}::jsonb -> 'server' ->> 'token' = ${input.Token}`, + ); + + if (!result?.[0]?.id) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Token not found", + }); + } + + organizationId = result?.[0]?.id; + ServerName = "Dokploy"; + } else { + const result = await db + .select() + .from(server) + .where( + sql`${server.metricsConfig}::jsonb -> 'server' ->> 'token' = ${input.Token}`, + ); + + if (!result?.[0]?.organizationId) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Token not found", + }); + } + + organizationId = result?.[0]?.organizationId; + ServerName = "Remote"; + } + + await sendServerThresholdNotifications(organizationId, { + ...input, + ServerName, + }); + } catch (error) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Error sending the notification", + cause: error, + }); + } + }), createGotify: adminProcedure .input(apiCreateGotify) .mutation(async ({ input, ctx }) => { try { - return await createGotifyNotification(input, ctx.user.adminId); + return await createGotifyNotification( + input, + ctx.session.activeOrganizationId, + ); } catch (error) { throw new TRPCError({ code: "BAD_REQUEST", @@ -332,7 +411,10 @@ export const notificationRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { try { const notification = await findNotificationById(input.notificationId); - if (IS_CLOUD && notification.adminId !== ctx.user.adminId) { + if ( + IS_CLOUD && + notification.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to update this notification", @@ -340,7 +422,7 @@ export const notificationRouter = createTRPCRouter({ } return await updateGotifyNotification({ ...input, - adminId: ctx.user.adminId, + organizationId: ctx.session.activeOrganizationId, }); } catch (error) { throw error; diff --git a/apps/dokploy/server/api/routers/organization.ts b/apps/dokploy/server/api/routers/organization.ts new file mode 100644 index 00000000..6f7a9c67 --- /dev/null +++ b/apps/dokploy/server/api/routers/organization.ts @@ -0,0 +1,148 @@ +import { db } from "@/server/db"; +import { invitation, member, organization } from "@/server/db/schema"; +import { IS_CLOUD } from "@dokploy/server/index"; +import { TRPCError } from "@trpc/server"; +import { and, desc, eq, exists } from "drizzle-orm"; +import { nanoid } from "nanoid"; +import { z } from "zod"; +import { adminProcedure, createTRPCRouter, protectedProcedure } from "../trpc"; +export const organizationRouter = createTRPCRouter({ + create: protectedProcedure + .input( + z.object({ + name: z.string(), + logo: z.string().optional(), + }), + ) + .mutation(async ({ ctx, input }) => { + if (ctx.user.rol !== "owner" && !IS_CLOUD) { + throw new TRPCError({ + code: "FORBIDDEN", + message: "Only the organization owner can create an organization", + }); + } + const result = await db + .insert(organization) + .values({ + ...input, + slug: nanoid(), + createdAt: new Date(), + ownerId: ctx.user.id, + }) + .returning() + .then((res) => res[0]); + + console.log("result", result); + + if (!result) { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "Failed to create organization", + }); + } + + await db.insert(member).values({ + organizationId: result.id, + role: "owner", + createdAt: new Date(), + userId: ctx.user.id, + }); + return result; + }), + all: protectedProcedure.query(async ({ ctx }) => { + const memberResult = await db.query.organization.findMany({ + where: (organization) => + exists( + db + .select() + .from(member) + .where( + and( + eq(member.organizationId, organization.id), + eq(member.userId, ctx.user.id), + ), + ), + ), + }); + return memberResult; + }), + one: protectedProcedure + .input( + z.object({ + organizationId: z.string(), + }), + ) + .query(async ({ input }) => { + return await db.query.organization.findFirst({ + where: eq(organization.id, input.organizationId), + }); + }), + update: protectedProcedure + .input( + z.object({ + organizationId: z.string(), + name: z.string(), + logo: z.string().optional(), + }), + ) + .mutation(async ({ ctx, input }) => { + if (ctx.user.rol !== "owner" && !IS_CLOUD) { + throw new TRPCError({ + code: "FORBIDDEN", + message: "Only the organization owner can update it", + }); + } + const result = await db + .update(organization) + .set({ + name: input.name, + logo: input.logo, + }) + .where(eq(organization.id, input.organizationId)) + .returning(); + return result[0]; + }), + delete: protectedProcedure + .input( + z.object({ + organizationId: z.string(), + }), + ) + .mutation(async ({ ctx, input }) => { + if (ctx.user.rol !== "owner" && !IS_CLOUD) { + throw new TRPCError({ + code: "FORBIDDEN", + message: "Only the organization owner can delete it", + }); + } + const org = await db.query.organization.findFirst({ + where: eq(organization.id, input.organizationId), + }); + + if (!org) { + throw new TRPCError({ + code: "NOT_FOUND", + message: "Organization not found", + }); + } + + if (org.ownerId !== ctx.user.id) { + throw new TRPCError({ + code: "FORBIDDEN", + message: "Only the organization owner can delete it", + }); + } + + const result = await db + .delete(organization) + .where(eq(organization.id, input.organizationId)); + + return result; + }), + allInvitations: adminProcedure.query(async ({ ctx }) => { + return await db.query.invitation.findMany({ + where: eq(invitation.organizationId, ctx.session.activeOrganizationId), + orderBy: [desc(invitation.status), desc(invitation.expiresAt)], + }); + }), +}); diff --git a/apps/dokploy/server/api/routers/port.ts b/apps/dokploy/server/api/routers/port.ts index bfbc9863..923fea57 100644 --- a/apps/dokploy/server/api/routers/port.ts +++ b/apps/dokploy/server/api/routers/port.ts @@ -44,9 +44,11 @@ export const portRouter = createTRPCRouter({ try { return removePortById(input.portId); } catch (error) { + const message = + error instanceof Error ? error.message : "Error input: Deleting port"; throw new TRPCError({ code: "BAD_REQUEST", - message: "Error input: Deleting port", + message, }); } }), @@ -56,9 +58,11 @@ export const portRouter = createTRPCRouter({ try { return updatePortById(input.portId, input); } catch (error) { + const message = + error instanceof Error ? error.message : "Error updating the port"; throw new TRPCError({ code: "BAD_REQUEST", - message: "Error updating the port", + message, }); } }), diff --git a/apps/dokploy/server/api/routers/postgres.ts b/apps/dokploy/server/api/routers/postgres.ts index 7d178943..cf3221b4 100644 --- a/apps/dokploy/server/api/routers/postgres.ts +++ b/apps/dokploy/server/api/routers/postgres.ts @@ -1,9 +1,4 @@ -import { EventEmitter } from "node:events"; -import { - createTRPCRouter, - protectedProcedure, - publicProcedure, -} from "@/server/api/trpc"; +import { createTRPCRouter, protectedProcedure } from "@/server/api/trpc"; import { apiChangePostgresStatus, apiCreatePostgres, @@ -14,6 +9,7 @@ import { apiSaveExternalPortPostgres, apiUpdatePostgres, } from "@/server/db/schema"; +import { cancelJobs } from "@/server/utils/backup"; import { IS_CLOUD, addNewService, @@ -21,6 +17,7 @@ import { createMount, createPostgres, deployPostgres, + findBackupsByDbId, findPostgresById, findProjectById, removePostgresById, @@ -33,17 +30,19 @@ import { } from "@dokploy/server"; import { TRPCError } from "@trpc/server"; import { observable } from "@trpc/server/observable"; -import { z } from "zod"; - -const ee = new EventEmitter(); export const postgresRouter = createTRPCRouter({ create: protectedProcedure .input(apiCreatePostgres) .mutation(async ({ input, ctx }) => { try { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.projectId, "create"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.projectId, + ctx.session.activeOrganizationId, + "create", + ); } if (IS_CLOUD && !input.serverId) { @@ -54,15 +53,19 @@ export const postgresRouter = createTRPCRouter({ } const project = await findProjectById(input.projectId); - if (project.adminId !== ctx.user.adminId) { + if (project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this project", }); } const newPostgres = await createPostgres(input); - if (ctx.user.rol === "user") { - await addNewService(ctx.user.authId, newPostgres.postgresId); + if (ctx.user.rol === "member") { + await addNewService( + ctx.user.id, + newPostgres.postgresId, + project.organizationId, + ); } await createMount({ @@ -88,12 +91,19 @@ export const postgresRouter = createTRPCRouter({ one: protectedProcedure .input(apiFindOnePostgres) .query(async ({ input, ctx }) => { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.postgresId, "access"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.postgresId, + ctx.session.activeOrganizationId, + "access", + ); } const postgres = await findPostgresById(input.postgresId); - if (postgres.project.adminId !== ctx.user.adminId) { + if ( + postgres.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this Postgres", @@ -107,7 +117,7 @@ export const postgresRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { const service = await findPostgresById(input.postgresId); - if (service.project.adminId !== ctx.user.adminId) { + if (service.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to start this Postgres", @@ -129,7 +139,9 @@ export const postgresRouter = createTRPCRouter({ .input(apiFindOnePostgres) .mutation(async ({ input, ctx }) => { const postgres = await findPostgresById(input.postgresId); - if (postgres.project.adminId !== ctx.user.adminId) { + if ( + postgres.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to stop this Postgres", @@ -151,7 +163,9 @@ export const postgresRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { const postgres = await findPostgresById(input.postgresId); - if (postgres.project.adminId !== ctx.user.adminId) { + if ( + postgres.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to save this external port", @@ -167,7 +181,9 @@ export const postgresRouter = createTRPCRouter({ .input(apiDeployPostgres) .mutation(async ({ input, ctx }) => { const postgres = await findPostgresById(input.postgresId); - if (postgres.project.adminId !== ctx.user.adminId) { + if ( + postgres.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to deploy this Postgres", @@ -188,7 +204,9 @@ export const postgresRouter = createTRPCRouter({ .input(apiDeployPostgres) .subscription(async ({ input, ctx }) => { const postgres = await findPostgresById(input.postgresId); - if (postgres.project.adminId !== ctx.user.adminId) { + if ( + postgres.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to deploy this Postgres", @@ -205,7 +223,9 @@ export const postgresRouter = createTRPCRouter({ .input(apiChangePostgresStatus) .mutation(async ({ input, ctx }) => { const postgres = await findPostgresById(input.postgresId); - if (postgres.project.adminId !== ctx.user.adminId) { + if ( + postgres.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to change this Postgres status", @@ -219,20 +239,30 @@ export const postgresRouter = createTRPCRouter({ remove: protectedProcedure .input(apiFindOnePostgres) .mutation(async ({ input, ctx }) => { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.postgresId, "delete"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.postgresId, + ctx.session.activeOrganizationId, + "delete", + ); } const postgres = await findPostgresById(input.postgresId); - if (postgres.project.adminId !== ctx.user.adminId) { + if ( + postgres.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to delete this Postgres", }); } + const backups = await findBackupsByDbId(input.postgresId, "postgres"); + const cleanupOperations = [ removeService(postgres.appName, postgres.serverId), + cancelJobs(backups), removePostgresById(input.postgresId), ]; @@ -244,7 +274,9 @@ export const postgresRouter = createTRPCRouter({ .input(apiSaveEnvironmentVariablesPostgres) .mutation(async ({ input, ctx }) => { const postgres = await findPostgresById(input.postgresId); - if (postgres.project.adminId !== ctx.user.adminId) { + if ( + postgres.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to save this environment", @@ -267,7 +299,9 @@ export const postgresRouter = createTRPCRouter({ .input(apiResetPostgres) .mutation(async ({ input, ctx }) => { const postgres = await findPostgresById(input.postgresId); - if (postgres.project.adminId !== ctx.user.adminId) { + if ( + postgres.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to reload this Postgres", @@ -297,7 +331,9 @@ export const postgresRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { const { postgresId, ...rest } = input; const postgres = await findPostgresById(postgresId); - if (postgres.project.adminId !== ctx.user.adminId) { + if ( + postgres.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to update this Postgres", diff --git a/apps/dokploy/server/api/routers/preview-deployment.ts b/apps/dokploy/server/api/routers/preview-deployment.ts index 74b8461a..f833e9f9 100644 --- a/apps/dokploy/server/api/routers/preview-deployment.ts +++ b/apps/dokploy/server/api/routers/preview-deployment.ts @@ -14,7 +14,9 @@ export const previewDeploymentRouter = createTRPCRouter({ .input(apiFindAllByApplication) .query(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this application", @@ -28,7 +30,10 @@ export const previewDeploymentRouter = createTRPCRouter({ const previewDeployment = await findPreviewDeploymentById( input.previewDeploymentId, ); - if (previewDeployment.application.project.adminId !== ctx.user.adminId) { + if ( + previewDeployment.application.project.organizationId !== + ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to delete this preview deployment", @@ -43,7 +48,10 @@ export const previewDeploymentRouter = createTRPCRouter({ const previewDeployment = await findPreviewDeploymentById( input.previewDeploymentId, ); - if (previewDeployment.application.project.adminId !== ctx.user.adminId) { + if ( + previewDeployment.application.project.organizationId !== + ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this preview deployment", diff --git a/apps/dokploy/server/api/routers/project.ts b/apps/dokploy/server/api/routers/project.ts index 9c2608cc..438a3f07 100644 --- a/apps/dokploy/server/api/routers/project.ts +++ b/apps/dokploy/server/api/routers/project.ts @@ -15,32 +15,34 @@ import { redis, } from "@/server/db/schema"; -import { TRPCError } from "@trpc/server"; -import { and, desc, eq, sql } from "drizzle-orm"; -import type { AnyPgColumn } from "drizzle-orm/pg-core"; - import { IS_CLOUD, addNewProject, checkProjectAccess, createProject, deleteProject, - findAdminById, + findMemberById, findProjectById, - findUserByAuthId, + findUserById, updateProjectById, } from "@dokploy/server"; - +import { TRPCError } from "@trpc/server"; +import { and, desc, eq, sql } from "drizzle-orm"; +import type { AnyPgColumn } from "drizzle-orm/pg-core"; export const projectRouter = createTRPCRouter({ create: protectedProcedure .input(apiCreateProject) .mutation(async ({ ctx, input }) => { try { - if (ctx.user.rol === "user") { - await checkProjectAccess(ctx.user.authId, "create"); + if (ctx.user.rol === "member") { + await checkProjectAccess( + ctx.user.id, + "create", + ctx.session.activeOrganizationId, + ); } - const admin = await findAdminById(ctx.user.adminId); + const admin = await findUserById(ctx.user.ownerId); if (admin.serversQuantity === 0 && IS_CLOUD) { throw new TRPCError({ @@ -49,9 +51,16 @@ export const projectRouter = createTRPCRouter({ }); } - const project = await createProject(input, ctx.user.adminId); - if (ctx.user.rol === "user") { - await addNewProject(ctx.user.authId, project.projectId); + const project = await createProject( + input, + ctx.session.activeOrganizationId, + ); + if (ctx.user.rol === "member") { + await addNewProject( + ctx.user.id, + project.projectId, + ctx.session.activeOrganizationId, + ); } return project; @@ -67,15 +76,23 @@ export const projectRouter = createTRPCRouter({ one: protectedProcedure .input(apiFindOneProject) .query(async ({ input, ctx }) => { - if (ctx.user.rol === "user") { - const { accessedServices } = await findUserByAuthId(ctx.user.authId); + if (ctx.user.rol === "member") { + const { accessedServices } = await findMemberById( + ctx.user.id, + ctx.session.activeOrganizationId, + ); - await checkProjectAccess(ctx.user.authId, "access", input.projectId); + await checkProjectAccess( + ctx.user.id, + "access", + ctx.session.activeOrganizationId, + input.projectId, + ); const project = await db.query.projects.findFirst({ where: and( eq(projects.projectId, input.projectId), - eq(projects.adminId, ctx.user.adminId), + eq(projects.organizationId, ctx.session.activeOrganizationId), ), with: { compose: { @@ -115,7 +132,7 @@ export const projectRouter = createTRPCRouter({ } const project = await findProjectById(input.projectId); - if (project.adminId !== ctx.user.adminId) { + if (project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this project", @@ -124,9 +141,11 @@ export const projectRouter = createTRPCRouter({ return project; }), all: protectedProcedure.query(async ({ ctx }) => { - if (ctx.user.rol === "user") { - const { accessedProjects, accessedServices } = await findUserByAuthId( - ctx.user.authId, + // console.log(ctx.user); + if (ctx.user.rol === "member") { + const { accessedProjects, accessedServices } = await findMemberById( + ctx.user.id, + ctx.session.activeOrganizationId, ); if (accessedProjects.length === 0) { @@ -139,7 +158,7 @@ export const projectRouter = createTRPCRouter({ accessedProjects.map((projectId) => sql`${projectId}`), sql`, `, )})`, - eq(projects.adminId, ctx.user.adminId), + eq(projects.organizationId, ctx.session.activeOrganizationId), ), with: { applications: { @@ -193,19 +212,26 @@ export const projectRouter = createTRPCRouter({ }, }, }, - where: eq(projects.adminId, ctx.user.adminId), + where: eq(projects.organizationId, ctx.session.activeOrganizationId), orderBy: desc(projects.createdAt), }); }), + remove: protectedProcedure .input(apiRemoveProject) .mutation(async ({ input, ctx }) => { try { - if (ctx.user.rol === "user") { - await checkProjectAccess(ctx.user.authId, "delete"); + if (ctx.user.rol === "member") { + await checkProjectAccess( + ctx.user.id, + "delete", + ctx.session.activeOrganizationId, + ); } const currentProject = await findProjectById(input.projectId); - if (currentProject.adminId !== ctx.user.adminId) { + if ( + currentProject.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to delete this project", @@ -223,7 +249,9 @@ export const projectRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { try { const currentProject = await findProjectById(input.projectId); - if (currentProject.adminId !== ctx.user.adminId) { + if ( + currentProject.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to update this project", diff --git a/apps/dokploy/server/api/routers/redirects.ts b/apps/dokploy/server/api/routers/redirects.ts index bcd7962a..2d520cc4 100644 --- a/apps/dokploy/server/api/routers/redirects.ts +++ b/apps/dokploy/server/api/routers/redirects.ts @@ -18,7 +18,9 @@ export const redirectsRouter = createTRPCRouter({ .input(apiCreateRedirect) .mutation(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this application", @@ -31,7 +33,9 @@ export const redirectsRouter = createTRPCRouter({ .query(async ({ input, ctx }) => { const redirect = await findRedirectById(input.redirectId); const application = await findApplicationById(redirect.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this application", @@ -44,7 +48,9 @@ export const redirectsRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { const redirect = await findRedirectById(input.redirectId); const application = await findApplicationById(redirect.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this application", @@ -57,7 +63,9 @@ export const redirectsRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { const redirect = await findRedirectById(input.redirectId); const application = await findApplicationById(redirect.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this application", diff --git a/apps/dokploy/server/api/routers/redis.ts b/apps/dokploy/server/api/routers/redis.ts index 5883e50b..a80660bf 100644 --- a/apps/dokploy/server/api/routers/redis.ts +++ b/apps/dokploy/server/api/routers/redis.ts @@ -36,8 +36,13 @@ export const redisRouter = createTRPCRouter({ .input(apiCreateRedis) .mutation(async ({ input, ctx }) => { try { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.projectId, "create"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.projectId, + ctx.session.activeOrganizationId, + "create", + ); } if (IS_CLOUD && !input.serverId) { @@ -48,15 +53,19 @@ export const redisRouter = createTRPCRouter({ } const project = await findProjectById(input.projectId); - if (project.adminId !== ctx.user.adminId) { + if (project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this project", }); } const newRedis = await createRedis(input); - if (ctx.user.rol === "user") { - await addNewService(ctx.user.authId, newRedis.redisId); + if (ctx.user.rol === "member") { + await addNewService( + ctx.user.id, + newRedis.redisId, + project.organizationId, + ); } await createMount({ @@ -75,12 +84,17 @@ export const redisRouter = createTRPCRouter({ one: protectedProcedure .input(apiFindOneRedis) .query(async ({ input, ctx }) => { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.redisId, "access"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.redisId, + ctx.session.activeOrganizationId, + "access", + ); } const redis = await findRedisById(input.redisId); - if (redis.project.adminId !== ctx.user.adminId) { + if (redis.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this Redis", @@ -93,7 +107,7 @@ export const redisRouter = createTRPCRouter({ .input(apiFindOneRedis) .mutation(async ({ input, ctx }) => { const redis = await findRedisById(input.redisId); - if (redis.project.adminId !== ctx.user.adminId) { + if (redis.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to start this Redis", @@ -115,7 +129,7 @@ export const redisRouter = createTRPCRouter({ .input(apiResetRedis) .mutation(async ({ input, ctx }) => { const redis = await findRedisById(input.redisId); - if (redis.project.adminId !== ctx.user.adminId) { + if (redis.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to reload this Redis", @@ -145,7 +159,7 @@ export const redisRouter = createTRPCRouter({ .input(apiFindOneRedis) .mutation(async ({ input, ctx }) => { const redis = await findRedisById(input.redisId); - if (redis.project.adminId !== ctx.user.adminId) { + if (redis.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to stop this Redis", @@ -166,7 +180,7 @@ export const redisRouter = createTRPCRouter({ .input(apiSaveExternalPortRedis) .mutation(async ({ input, ctx }) => { const mongo = await findRedisById(input.redisId); - if (mongo.project.adminId !== ctx.user.adminId) { + if (mongo.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to save this external port", @@ -182,7 +196,7 @@ export const redisRouter = createTRPCRouter({ .input(apiDeployRedis) .mutation(async ({ input, ctx }) => { const redis = await findRedisById(input.redisId); - if (redis.project.adminId !== ctx.user.adminId) { + if (redis.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to deploy this Redis", @@ -202,7 +216,7 @@ export const redisRouter = createTRPCRouter({ .input(apiDeployRedis) .subscription(async ({ input, ctx }) => { const redis = await findRedisById(input.redisId); - if (redis.project.adminId !== ctx.user.adminId) { + if (redis.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to deploy this Redis", @@ -218,7 +232,7 @@ export const redisRouter = createTRPCRouter({ .input(apiChangeRedisStatus) .mutation(async ({ input, ctx }) => { const mongo = await findRedisById(input.redisId); - if (mongo.project.adminId !== ctx.user.adminId) { + if (mongo.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to change this Redis status", @@ -232,19 +246,23 @@ export const redisRouter = createTRPCRouter({ remove: protectedProcedure .input(apiFindOneRedis) .mutation(async ({ input, ctx }) => { - if (ctx.user.rol === "user") { - await checkServiceAccess(ctx.user.authId, input.redisId, "delete"); + if (ctx.user.rol === "member") { + await checkServiceAccess( + ctx.user.id, + input.redisId, + ctx.session.activeOrganizationId, + "delete", + ); } const redis = await findRedisById(input.redisId); - if (redis.project.adminId !== ctx.user.adminId) { + if (redis.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to delete this Redis", }); } - const cleanupOperations = [ async () => await removeService(redis?.appName, redis.serverId), async () => await removeRedisById(input.redisId), @@ -253,7 +271,7 @@ export const redisRouter = createTRPCRouter({ for (const operation of cleanupOperations) { try { await operation(); - } catch (error) {} + } catch (_) {} } return redis; @@ -262,7 +280,7 @@ export const redisRouter = createTRPCRouter({ .input(apiSaveEnvironmentVariablesRedis) .mutation(async ({ input, ctx }) => { const redis = await findRedisById(input.redisId); - if (redis.project.adminId !== ctx.user.adminId) { + if (redis.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to save this environment", diff --git a/apps/dokploy/server/api/routers/registry.ts b/apps/dokploy/server/api/routers/registry.ts index f66ed4ae..a9a6be89 100644 --- a/apps/dokploy/server/api/routers/registry.ts +++ b/apps/dokploy/server/api/routers/registry.ts @@ -1,34 +1,35 @@ +import { db } from "@/server/db"; import { apiCreateRegistry, apiFindOneRegistry, apiRemoveRegistry, apiTestRegistry, apiUpdateRegistry, + registry, } from "@/server/db/schema"; import { IS_CLOUD, createRegistry, execAsync, execAsyncRemote, - findAllRegistryByAdminId, findRegistryById, removeRegistry, updateRegistry, } from "@dokploy/server"; import { TRPCError } from "@trpc/server"; +import { eq } from "drizzle-orm"; import { adminProcedure, createTRPCRouter, protectedProcedure } from "../trpc"; - export const registryRouter = createTRPCRouter({ create: adminProcedure .input(apiCreateRegistry) .mutation(async ({ ctx, input }) => { - return await createRegistry(input, ctx.user.adminId); + return await createRegistry(input, ctx.session.activeOrganizationId); }), remove: adminProcedure .input(apiRemoveRegistry) .mutation(async ({ ctx, input }) => { const registry = await findRegistryById(input.registryId); - if (registry.adminId !== ctx.user.adminId) { + if (registry.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to delete this registry", @@ -41,7 +42,7 @@ export const registryRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { const { registryId, ...rest } = input; const registry = await findRegistryById(registryId); - if (registry.adminId !== ctx.user.adminId) { + if (registry.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to update this registry", @@ -61,13 +62,16 @@ export const registryRouter = createTRPCRouter({ return true; }), all: protectedProcedure.query(async ({ ctx }) => { - return await findAllRegistryByAdminId(ctx.user.adminId); + const registryResponse = await db.query.registry.findMany({ + where: eq(registry.organizationId, ctx.session.activeOrganizationId), + }); + return registryResponse; }), one: adminProcedure .input(apiFindOneRegistry) .query(async ({ input, ctx }) => { const registry = await findRegistryById(input.registryId); - if (registry.adminId !== ctx.user.adminId) { + if (registry.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to access this registry", diff --git a/apps/dokploy/server/api/routers/security.ts b/apps/dokploy/server/api/routers/security.ts index 5318a293..b8e70bbb 100644 --- a/apps/dokploy/server/api/routers/security.ts +++ b/apps/dokploy/server/api/routers/security.ts @@ -18,7 +18,9 @@ export const securityRouter = createTRPCRouter({ .input(apiCreateSecurity) .mutation(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this application", @@ -31,7 +33,9 @@ export const securityRouter = createTRPCRouter({ .query(async ({ input, ctx }) => { const security = await findSecurityById(input.securityId); const application = await findApplicationById(security.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this application", @@ -44,7 +48,9 @@ export const securityRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { const security = await findSecurityById(input.securityId); const application = await findApplicationById(security.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this application", @@ -57,7 +63,9 @@ export const securityRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { const security = await findSecurityById(input.securityId); const application = await findApplicationById(security.applicationId); - if (application.project.adminId !== ctx.user.adminId) { + if ( + application.project.organizationId !== ctx.session.activeOrganizationId + ) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this application", diff --git a/apps/dokploy/server/api/routers/server.ts b/apps/dokploy/server/api/routers/server.ts index 382bb98a..1a9ebc0a 100644 --- a/apps/dokploy/server/api/routers/server.ts +++ b/apps/dokploy/server/api/routers/server.ts @@ -6,11 +6,13 @@ import { apiFindOneServer, apiRemoveServer, apiUpdateServer, + apiUpdateServerMonitoring, applications, compose, mariadb, mongo, mysql, + organization, postgres, redis, server, @@ -20,35 +22,40 @@ import { createServer, defaultCommand, deleteServer, - findAdminById, findServerById, - findServersByAdminId, + findServersByUserId, + findUserById, getPublicIpWithFallback, haveActiveServices, removeDeploymentsByServerId, serverAudit, serverSetup, serverValidate, + setupMonitoring, updateServerById, } from "@dokploy/server"; import { TRPCError } from "@trpc/server"; import { observable } from "@trpc/server/observable"; import { and, desc, eq, getTableColumns, isNotNull, sql } from "drizzle-orm"; +import { z } from "zod"; export const serverRouter = createTRPCRouter({ create: protectedProcedure .input(apiCreateServer) .mutation(async ({ ctx, input }) => { try { - const admin = await findAdminById(ctx.user.adminId); - const servers = await findServersByAdminId(admin.adminId); - if (IS_CLOUD && servers.length >= admin.serversQuantity) { + const user = await findUserById(ctx.user.ownerId); + const servers = await findServersByUserId(user.id); + if (IS_CLOUD && servers.length >= user.serversQuantity) { throw new TRPCError({ code: "BAD_REQUEST", message: "You cannot create more servers", }); } - const project = await createServer(input, ctx.user.adminId); + const project = await createServer( + input, + ctx.session.activeOrganizationId, + ); return project; } catch (error) { throw new TRPCError({ @@ -63,7 +70,7 @@ export const serverRouter = createTRPCRouter({ .input(apiFindOneServer) .query(async ({ input, ctx }) => { const server = await findServerById(input.serverId); - if (server.adminId !== ctx.user.adminId) { + if (server.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this server", @@ -74,7 +81,7 @@ export const serverRouter = createTRPCRouter({ }), getDefaultCommand: protectedProcedure .input(apiFindOneServer) - .query(async ({ input, ctx }) => { + .query(async () => { return defaultCommand(); }), all: protectedProcedure.query(async ({ ctx }) => { @@ -91,22 +98,37 @@ export const serverRouter = createTRPCRouter({ .leftJoin(mongo, eq(mongo.serverId, server.serverId)) .leftJoin(mysql, eq(mysql.serverId, server.serverId)) .leftJoin(postgres, eq(postgres.serverId, server.serverId)) - .where(eq(server.adminId, ctx.user.adminId)) + .where(eq(server.organizationId, ctx.session.activeOrganizationId)) .orderBy(desc(server.createdAt)) .groupBy(server.serverId); return result; }), + count: protectedProcedure.query(async ({ ctx }) => { + const organizations = await db.query.organization.findMany({ + where: eq(organization.ownerId, ctx.user.id), + with: { + servers: true, + }, + }); + + const servers = organizations.flatMap((org) => org.servers); + + return servers.length ?? 0; + }), withSSHKey: protectedProcedure.query(async ({ ctx }) => { const result = await db.query.server.findMany({ orderBy: desc(server.createdAt), where: IS_CLOUD ? and( isNotNull(server.sshKeyId), - eq(server.adminId, ctx.user.adminId), + eq(server.organizationId, ctx.session.activeOrganizationId), eq(server.serverStatus, "active"), ) - : and(isNotNull(server.sshKeyId), eq(server.adminId, ctx.user.adminId)), + : and( + isNotNull(server.sshKeyId), + eq(server.organizationId, ctx.session.activeOrganizationId), + ), }); return result; }), @@ -115,7 +137,7 @@ export const serverRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { try { const server = await findServerById(input.serverId); - if (server.adminId !== ctx.user.adminId) { + if (server.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to setup this server", @@ -140,7 +162,7 @@ export const serverRouter = createTRPCRouter({ .subscription(async ({ input, ctx }) => { try { const server = await findServerById(input.serverId); - if (server.adminId !== ctx.user.adminId) { + if (server.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to setup this server", @@ -160,7 +182,7 @@ export const serverRouter = createTRPCRouter({ .query(async ({ input, ctx }) => { try { const server = await findServerById(input.serverId); - if (server.adminId !== ctx.user.adminId) { + if (server.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to validate this server", @@ -202,7 +224,7 @@ export const serverRouter = createTRPCRouter({ .query(async ({ input, ctx }) => { try { const server = await findServerById(input.serverId); - if (server.adminId !== ctx.user.adminId) { + if (server.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to validate this server", @@ -247,12 +269,54 @@ export const serverRouter = createTRPCRouter({ }); } }), + setupMonitoring: protectedProcedure + .input(apiUpdateServerMonitoring) + .mutation(async ({ input, ctx }) => { + try { + const server = await findServerById(input.serverId); + if (server.organizationId !== ctx.session.activeOrganizationId) { + throw new TRPCError({ + code: "UNAUTHORIZED", + message: "You are not authorized to setup this server", + }); + } + + await updateServerById(input.serverId, { + metricsConfig: { + server: { + type: "Remote", + refreshRate: input.metricsConfig.server.refreshRate, + retentionDays: input.metricsConfig.server.retentionDays, + port: input.metricsConfig.server.port, + token: input.metricsConfig.server.token, + urlCallback: input.metricsConfig.server.urlCallback, + cronJob: input.metricsConfig.server.cronJob, + thresholds: { + cpu: input.metricsConfig.server.thresholds.cpu, + memory: input.metricsConfig.server.thresholds.memory, + }, + }, + containers: { + refreshRate: input.metricsConfig.containers.refreshRate, + services: { + include: input.metricsConfig.containers.services.include || [], + exclude: input.metricsConfig.containers.services.exclude || [], + }, + }, + }, + }); + const currentServer = await setupMonitoring(input.serverId); + return currentServer; + } catch (error) { + throw error; + } + }), remove: protectedProcedure .input(apiRemoveServer) .mutation(async ({ input, ctx }) => { try { const server = await findServerById(input.serverId); - if (server.adminId !== ctx.user.adminId) { + if (server.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to delete this server", @@ -271,12 +335,9 @@ export const serverRouter = createTRPCRouter({ await deleteServer(input.serverId); if (IS_CLOUD) { - const admin = await findAdminById(ctx.user.adminId); + const admin = await findUserById(ctx.user.ownerId); - await updateServersBasedOnQuantity( - admin.adminId, - admin.serversQuantity, - ); + await updateServersBasedOnQuantity(admin.id, admin.serversQuantity); } return currentServer; @@ -289,7 +350,7 @@ export const serverRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { try { const server = await findServerById(input.serverId); - if (server.adminId !== ctx.user.adminId) { + if (server.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to update this server", @@ -311,11 +372,69 @@ export const serverRouter = createTRPCRouter({ throw error; } }), - publicIp: protectedProcedure.query(async ({ ctx }) => { + publicIp: protectedProcedure.query(async () => { if (IS_CLOUD) { return ""; } const ip = await getPublicIpWithFallback(); return ip; }), + getServerMetrics: protectedProcedure + .input( + z.object({ + url: z.string(), + token: z.string(), + dataPoints: z.string(), + }), + ) + .query(async ({ input }) => { + try { + const url = new URL(input.url); + url.searchParams.append("limit", input.dataPoints); + const response = await fetch(url.toString(), { + headers: { + Authorization: `Bearer ${input.token}`, + }, + }); + if (!response.ok) { + throw new Error( + `Error ${response.status}: ${response.statusText}. Ensure the container is running and this service is included in the monitoring configuration.`, + ); + } + + const data = await response.json(); + if (!Array.isArray(data) || data.length === 0) { + throw new Error( + [ + "No monitoring data available. This could be because:", + "", + "1. You don't have setup the monitoring service, you can do in web server section.", + "2. If you already have setup the monitoring service, wait a few minutes and refresh the page.", + ].join("\n"), + ); + } + return data as { + cpu: string; + cpuModel: string; + cpuCores: number; + cpuPhysicalCores: number; + cpuSpeed: number; + os: string; + distro: string; + kernel: string; + arch: string; + memUsed: string; + memUsedGB: string; + memTotal: string; + uptime: number; + diskUsed: string; + totalDisk: string; + networkIn: string; + networkOut: string; + timestamp: string; + }[]; + } catch (error) { + throw error; + } + }), }); diff --git a/apps/dokploy/server/api/routers/settings.ts b/apps/dokploy/server/api/routers/settings.ts index 449a2233..fc1255fc 100644 --- a/apps/dokploy/server/api/routers/settings.ts +++ b/apps/dokploy/server/api/routers/settings.ts @@ -22,9 +22,8 @@ import { cleanUpUnusedVolumes, execAsync, execAsyncRemote, - findAdmin, - findAdminById, findServerById, + findUserById, getDokployImage, getDokployImageTag, getUpdateData, @@ -47,10 +46,10 @@ import { startServiceRemote, stopService, stopServiceRemote, - updateAdmin, updateLetsEncryptEmail, updateServerById, updateServerTraefik, + updateUser, writeConfig, writeMainConfig, writeTraefikConfigInPath, @@ -164,7 +163,7 @@ export const settingsRouter = createTRPCRouter({ if (IS_CLOUD) { return true; } - await updateAdmin(ctx.user.authId, { + await updateUser(ctx.user.id, { sshPrivateKey: input.sshPrivateKey, }); @@ -176,7 +175,7 @@ export const settingsRouter = createTRPCRouter({ if (IS_CLOUD) { return true; } - const admin = await updateAdmin(ctx.user.authId, { + const user = await updateUser(ctx.user.id, { host: input.host, ...(input.letsEncryptEmail && { letsEncryptEmail: input.letsEncryptEmail, @@ -184,25 +183,25 @@ export const settingsRouter = createTRPCRouter({ certificateType: input.certificateType, }); - if (!admin) { + if (!user) { throw new TRPCError({ code: "NOT_FOUND", - message: "Admin not found", + message: "User not found", }); } - updateServerTraefik(admin, input.host); + updateServerTraefik(user, input.host); if (input.letsEncryptEmail) { updateLetsEncryptEmail(input.letsEncryptEmail); } - return admin; + return user; }), cleanSSHPrivateKey: adminProcedure.mutation(async ({ ctx }) => { if (IS_CLOUD) { return true; } - await updateAdmin(ctx.user.authId, { + await updateUser(ctx.user.id, { sshPrivateKey: null, }); return true; @@ -217,7 +216,7 @@ export const settingsRouter = createTRPCRouter({ const server = await findServerById(input.serverId); - if (server.adminId !== ctx.user.adminId) { + if (server.organizationId !== ctx.session?.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this server", @@ -246,7 +245,7 @@ export const settingsRouter = createTRPCRouter({ await cleanUpUnusedImages(server.serverId); await cleanUpDockerBuilder(server.serverId); await cleanUpSystemPrune(server.serverId); - await sendDockerCleanupNotifications(server.adminId); + await sendDockerCleanupNotifications(server.organizationId); }); } } else { @@ -262,19 +261,11 @@ export const settingsRouter = createTRPCRouter({ } } } else if (!IS_CLOUD) { - const admin = await findAdminById(ctx.user.adminId); - - if (admin.adminId !== ctx.user.adminId) { - throw new TRPCError({ - code: "UNAUTHORIZED", - message: "You are not authorized to access this admin", - }); - } - const adminUpdated = await updateAdmin(ctx.user.authId, { + const userUpdated = await updateUser(ctx.user.id, { enableDockerCleanup: input.enableDockerCleanup, }); - if (adminUpdated?.enableDockerCleanup) { + if (userUpdated?.enableDockerCleanup) { scheduleJob("docker-cleanup", "0 0 * * *", async () => { console.log( `Docker Cleanup ${new Date().toLocaleString()}] Running...`, @@ -282,7 +273,9 @@ export const settingsRouter = createTRPCRouter({ await cleanUpUnusedImages(); await cleanUpDockerBuilder(); await cleanUpSystemPrune(); - await sendDockerCleanupNotifications(admin.adminId); + await sendDockerCleanupNotifications( + ctx.session.activeOrganizationId, + ); }); } else { const currentJob = scheduledJobs["docker-cleanup"]; @@ -345,7 +338,7 @@ export const settingsRouter = createTRPCRouter({ writeConfig("middlewares", input.traefikConfig); return true; }), - getUpdateData: adminProcedure.mutation(async () => { + getUpdateData: protectedProcedure.mutation(async () => { if (IS_CLOUD) { return DEFAULT_UPDATE_DATA; } @@ -373,18 +366,21 @@ export const settingsRouter = createTRPCRouter({ return true; }), - getDokployVersion: adminProcedure.query(() => { + getDokployVersion: protectedProcedure.query(() => { return packageInfo.version; }), - getReleaseTag: adminProcedure.query(() => { + getReleaseTag: protectedProcedure.query(() => { return getDokployImageTag(); }), readDirectories: protectedProcedure .input(apiServerSchema) .query(async ({ ctx, input }) => { try { - if (ctx.user.rol === "user") { - const canAccess = await canAccessToTraefikFiles(ctx.user.authId); + if (ctx.user.rol === "member") { + const canAccess = await canAccessToTraefikFiles( + ctx.user.id, + ctx.session.activeOrganizationId, + ); if (!canAccess) { throw new TRPCError({ code: "UNAUTHORIZED" }); @@ -401,8 +397,11 @@ export const settingsRouter = createTRPCRouter({ updateTraefikFile: protectedProcedure .input(apiModifyTraefikConfig) .mutation(async ({ input, ctx }) => { - if (ctx.user.rol === "user") { - const canAccess = await canAccessToTraefikFiles(ctx.user.authId); + if (ctx.user.rol === "member") { + const canAccess = await canAccessToTraefikFiles( + ctx.user.id, + ctx.session.activeOrganizationId, + ); if (!canAccess) { throw new TRPCError({ code: "UNAUTHORIZED" }); @@ -419,8 +418,11 @@ export const settingsRouter = createTRPCRouter({ readTraefikFile: protectedProcedure .input(apiReadTraefikConfig) .query(async ({ input, ctx }) => { - if (ctx.user.rol === "user") { - const canAccess = await canAccessToTraefikFiles(ctx.user.authId); + if (ctx.user.rol === "member") { + const canAccess = await canAccessToTraefikFiles( + ctx.user.id, + ctx.session.activeOrganizationId, + ); if (!canAccess) { throw new TRPCError({ code: "UNAUTHORIZED" }); @@ -428,12 +430,12 @@ export const settingsRouter = createTRPCRouter({ } return readConfigInPath(input.path, input.serverId); }), - getIp: protectedProcedure.query(async () => { + getIp: protectedProcedure.query(async ({ ctx }) => { if (IS_CLOUD) { return true; } - const admin = await findAdmin(); - return admin.serverIp; + const user = await findUserById(ctx.user.ownerId); + return user.serverIp; }), getOpenApiDocument: protectedProcedure.query( @@ -480,10 +482,28 @@ export const settingsRouter = createTRPCRouter({ openApiDocument.info = { title: "Dokploy API", description: "Endpoints for dokploy", - // TODO: get version from package.json version: "1.0.0", }; + // Add security schemes configuration + openApiDocument.components = { + ...openApiDocument.components, + securitySchemes: { + apiKey: { + type: "apiKey", + in: "header", + name: "x-api-key", + description: "API key authentication", + }, + }, + }; + + // Apply security globally to all endpoints + openApiDocument.security = [ + { + apiKey: [], + }, + ]; return openApiDocument; }, ), @@ -655,7 +675,7 @@ export const settingsRouter = createTRPCRouter({ return true; }), - isCloud: protectedProcedure.query(async () => { + isCloud: publicProcedure.query(async () => { return IS_CLOUD; }), health: publicProcedure.query(async () => { @@ -715,7 +735,12 @@ export const settingsRouter = createTRPCRouter({ try { return await checkGPUStatus(input.serverId || ""); } catch (error) { - throw new Error("Failed to check GPU status"); + const message = + error instanceof Error ? error.message : "Failed to check GPU status"; + throw new TRPCError({ + code: "BAD_REQUEST", + message, + }); } }), updateTraefikPorts: adminProcedure diff --git a/apps/dokploy/server/api/routers/ssh-key.ts b/apps/dokploy/server/api/routers/ssh-key.ts index fe2f24f9..4663af8f 100644 --- a/apps/dokploy/server/api/routers/ssh-key.ts +++ b/apps/dokploy/server/api/routers/ssh-key.ts @@ -9,7 +9,6 @@ import { sshKeys, } from "@/server/db/schema"; import { - IS_CLOUD, createSshKey, findSSHKeyById, generateSSHKey, @@ -26,7 +25,7 @@ export const sshRouter = createTRPCRouter({ try { await createSshKey({ ...input, - adminId: ctx.user.adminId, + organizationId: ctx.session.activeOrganizationId, }); } catch (error) { throw new TRPCError({ @@ -41,8 +40,7 @@ export const sshRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { try { const sshKey = await findSSHKeyById(input.sshKeyId); - if (IS_CLOUD && sshKey.adminId !== ctx.user.adminId) { - // TODO: Remove isCloud in the next versions of dokploy + if (sshKey.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to delete this SSH key", @@ -59,8 +57,7 @@ export const sshRouter = createTRPCRouter({ .query(async ({ input, ctx }) => { const sshKey = await findSSHKeyById(input.sshKeyId); - if (IS_CLOUD && sshKey.adminId !== ctx.user.adminId) { - // TODO: Remove isCloud in the next versions of dokploy + if (sshKey.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to access this SSH key", @@ -70,10 +67,9 @@ export const sshRouter = createTRPCRouter({ }), all: protectedProcedure.query(async ({ ctx }) => { return await db.query.sshKeys.findMany({ - ...(IS_CLOUD && { where: eq(sshKeys.adminId, ctx.user.adminId) }), + where: eq(sshKeys.organizationId, ctx.session.activeOrganizationId), orderBy: desc(sshKeys.createdAt), }); - // TODO: Remove this line when the cloud version is ready }), generate: protectedProcedure .input(apiGenerateSSHKey) @@ -85,8 +81,7 @@ export const sshRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { try { const sshKey = await findSSHKeyById(input.sshKeyId); - if (IS_CLOUD && sshKey.adminId !== ctx.user.adminId) { - // TODO: Remove isCloud in the next versions of dokploy + if (sshKey.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not allowed to update this SSH key", diff --git a/apps/dokploy/server/api/routers/stripe.ts b/apps/dokploy/server/api/routers/stripe.ts index 7a8a537c..a226eeac 100644 --- a/apps/dokploy/server/api/routers/stripe.ts +++ b/apps/dokploy/server/api/routers/stripe.ts @@ -1,9 +1,9 @@ import { WEBSITE_URL, getStripeItems } from "@/server/utils/stripe"; import { IS_CLOUD, - findAdminById, - findServersByAdminId, - updateAdmin, + findServersByUserId, + findUserById, + updateUser, } from "@dokploy/server"; import { TRPCError } from "@trpc/server"; import Stripe from "stripe"; @@ -12,8 +12,8 @@ import { adminProcedure, createTRPCRouter } from "../trpc"; export const stripeRouter = createTRPCRouter({ getProducts: adminProcedure.query(async ({ ctx }) => { - const admin = await findAdminById(ctx.user.adminId); - const stripeCustomerId = admin.stripeCustomerId; + const user = await findUserById(ctx.user.ownerId); + const stripeCustomerId = user.stripeCustomerId; const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, { apiVersion: "2024-09-30.acacia", @@ -56,15 +56,15 @@ export const stripeRouter = createTRPCRouter({ }); const items = getStripeItems(input.serverQuantity, input.isAnnual); - const admin = await findAdminById(ctx.user.adminId); + const user = await findUserById(ctx.user.id); - let stripeCustomerId = admin.stripeCustomerId; + let stripeCustomerId = user.stripeCustomerId; if (stripeCustomerId) { const customer = await stripe.customers.retrieve(stripeCustomerId); if (customer.deleted) { - await updateAdmin(admin.authId, { + await updateUser(user.id, { stripeCustomerId: null, }); stripeCustomerId = null; @@ -78,7 +78,7 @@ export const stripeRouter = createTRPCRouter({ customer: stripeCustomerId, }), metadata: { - adminId: admin.adminId, + adminId: user.id, }, allow_promotion_codes: true, success_url: `${WEBSITE_URL}/dashboard/settings/servers?success=true`, @@ -87,45 +87,43 @@ export const stripeRouter = createTRPCRouter({ return { sessionId: session.id }; }), - createCustomerPortalSession: adminProcedure.mutation( - async ({ ctx, input }) => { - const admin = await findAdminById(ctx.user.adminId); + createCustomerPortalSession: adminProcedure.mutation(async ({ ctx }) => { + const user = await findUserById(ctx.user.id); - if (!admin.stripeCustomerId) { - throw new TRPCError({ - code: "BAD_REQUEST", - message: "Stripe Customer ID not found", - }); - } - const stripeCustomerId = admin.stripeCustomerId; + if (!user.stripeCustomerId) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Stripe Customer ID not found", + }); + } + const stripeCustomerId = user.stripeCustomerId; - const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, { - apiVersion: "2024-09-30.acacia", + const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, { + apiVersion: "2024-09-30.acacia", + }); + + try { + const session = await stripe.billingPortal.sessions.create({ + customer: stripeCustomerId, + return_url: `${WEBSITE_URL}/dashboard/settings/billing`, }); - try { - const session = await stripe.billingPortal.sessions.create({ - customer: stripeCustomerId, - return_url: `${WEBSITE_URL}/dashboard/settings/billing`, - }); - - return { url: session.url }; - } catch (error) { - return { - url: "", - }; - } - }, - ), + return { url: session.url }; + } catch (_) { + return { + url: "", + }; + } + }), canCreateMoreServers: adminProcedure.query(async ({ ctx }) => { - const admin = await findAdminById(ctx.user.adminId); - const servers = await findServersByAdminId(admin.adminId); + const user = await findUserById(ctx.user.ownerId); + const servers = await findServersByUserId(user.id); if (!IS_CLOUD) { return true; } - return servers.length < admin.serversQuantity; + return servers.length < user.serversQuantity; }), }); diff --git a/apps/dokploy/server/api/routers/user.ts b/apps/dokploy/server/api/routers/user.ts index 91db9826..0b740ab7 100644 --- a/apps/dokploy/server/api/routers/user.ts +++ b/apps/dokploy/server/api/routers/user.ts @@ -1,34 +1,330 @@ -import { apiFindOneUser, apiFindOneUserByAuth } from "@/server/db/schema"; -import { findUserByAuthId, findUserById, findUsers } from "@dokploy/server"; +import { + IS_CLOUD, + findOrganizationById, + findUserById, + getUserByToken, + removeUserById, + updateUser, + createApiKey, +} from "@dokploy/server"; +import { db } from "@dokploy/server/db"; +import { + account, + apiAssignPermissions, + apiFindOneToken, + apiUpdateUser, + invitation, + member, + apikey, +} from "@dokploy/server/db/schema"; +import * as bcrypt from "bcrypt"; import { TRPCError } from "@trpc/server"; -import { adminProcedure, createTRPCRouter, protectedProcedure } from "../trpc"; +import { and, asc, eq, gt } from "drizzle-orm"; +import { z } from "zod"; +import { + adminProcedure, + createTRPCRouter, + protectedProcedure, + publicProcedure, +} from "../trpc"; + +const apiCreateApiKey = z.object({ + name: z.string().min(1), + prefix: z.string().optional(), + expiresIn: z.number().optional(), + metadata: z.object({ + organizationId: z.string(), + }), + // Rate limiting + rateLimitEnabled: z.boolean().optional(), + rateLimitTimeWindow: z.number().optional(), + rateLimitMax: z.number().optional(), + // Request limiting + remaining: z.number().optional(), + refillAmount: z.number().optional(), + refillInterval: z.number().optional(), +}); export const userRouter = createTRPCRouter({ all: adminProcedure.query(async ({ ctx }) => { - return await findUsers(ctx.user.adminId); + return await db.query.member.findMany({ + where: eq(member.organizationId, ctx.session.activeOrganizationId), + with: { + user: true, + }, + orderBy: [asc(member.createdAt)], + }); }), - byAuthId: protectedProcedure - .input(apiFindOneUserByAuth) + one: protectedProcedure + .input( + z.object({ + userId: z.string(), + }), + ) .query(async ({ input, ctx }) => { - const user = await findUserByAuthId(input.authId); - if (user.adminId !== ctx.user.adminId) { - throw new TRPCError({ - code: "UNAUTHORIZED", - message: "You are not allowed to access this user", - }); - } - return user; + const memberResult = await db.query.member.findFirst({ + where: and( + eq(member.userId, input.userId), + eq(member.organizationId, ctx.session?.activeOrganizationId || ""), + ), + with: { + user: true, + }, + }); + + return memberResult; }), - byUserId: protectedProcedure - .input(apiFindOneUser) - .query(async ({ input, ctx }) => { - const user = await findUserById(input.userId); - if (user.adminId !== ctx.user.adminId) { - throw new TRPCError({ - code: "UNAUTHORIZED", - message: "You are not allowed to access this user", + get: protectedProcedure.query(async ({ ctx }) => { + const memberResult = await db.query.member.findFirst({ + where: and( + eq(member.userId, ctx.user.id), + eq(member.organizationId, ctx.session?.activeOrganizationId || ""), + ), + with: { + user: { + with: { + apiKeys: true, + }, + }, + }, + }); + + return memberResult; + }), + getServerMetrics: protectedProcedure.query(async ({ ctx }) => { + const memberResult = await db.query.member.findFirst({ + where: and( + eq(member.userId, ctx.user.id), + eq(member.organizationId, ctx.session?.activeOrganizationId || ""), + ), + with: { + user: true, + }, + }); + + return memberResult?.user; + }), + update: protectedProcedure + .input(apiUpdateUser) + .mutation(async ({ input, ctx }) => { + if (input.password || input.currentPassword) { + const currentAuth = await db.query.account.findFirst({ + where: eq(account.userId, ctx.user.id), }); + const correctPassword = bcrypt.compareSync( + input.currentPassword || "", + currentAuth?.password || "", + ); + + if (!correctPassword) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Current password is incorrect", + }); + } + + if (!input.password) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "New password is required", + }); + } + await db + .update(account) + .set({ + password: bcrypt.hashSync(input.password, 10), + }) + .where(eq(account.userId, ctx.user.id)); } - return user; + return await updateUser(ctx.user.id, input); + }), + getUserByToken: publicProcedure + .input(apiFindOneToken) + .query(async ({ input }) => { + return await getUserByToken(input.token); + }), + getMetricsToken: protectedProcedure.query(async ({ ctx }) => { + const user = await findUserById(ctx.user.ownerId); + return { + serverIp: user.serverIp, + enabledFeatures: user.enablePaidFeatures, + metricsConfig: user?.metricsConfig, + }; + }), + remove: protectedProcedure + .input( + z.object({ + userId: z.string(), + }), + ) + .mutation(async ({ input }) => { + if (IS_CLOUD) { + return true; + } + return await removeUserById(input.userId); + }), + assignPermissions: adminProcedure + .input(apiAssignPermissions) + .mutation(async ({ input, ctx }) => { + try { + const organization = await findOrganizationById( + ctx.session?.activeOrganizationId || "", + ); + + if (organization?.ownerId !== ctx.user.ownerId) { + throw new TRPCError({ + code: "UNAUTHORIZED", + message: "You are not allowed to assign permissions", + }); + } + + const { id, ...rest } = input; + + await db + .update(member) + .set({ + ...rest, + }) + .where( + and( + eq(member.userId, input.id), + eq( + member.organizationId, + ctx.session?.activeOrganizationId || "", + ), + ), + ); + } catch (error) { + throw error; + } + }), + getInvitations: protectedProcedure.query(async ({ ctx }) => { + return await db.query.invitation.findMany({ + where: and( + eq(invitation.email, ctx.user.email), + gt(invitation.expiresAt, new Date()), + eq(invitation.status, "pending"), + ), + with: { + organization: true, + }, + }); + }), + + getContainerMetrics: protectedProcedure + .input( + z.object({ + url: z.string(), + token: z.string(), + appName: z.string(), + dataPoints: z.string(), + }), + ) + .query(async ({ input }) => { + try { + if (!input.appName) { + throw new Error( + [ + "No Application Selected:", + "", + "Make Sure to select an application to monitor.", + ].join("\n"), + ); + } + const url = new URL(`${input.url}/metrics/containers`); + url.searchParams.append("limit", input.dataPoints); + url.searchParams.append("appName", input.appName); + const response = await fetch(url.toString(), { + headers: { + Authorization: `Bearer ${input.token}`, + }, + }); + if (!response.ok) { + throw new Error( + `Error ${response.status}: ${response.statusText}. Please verify that the application "${input.appName}" is running and this service is included in the monitoring configuration.`, + ); + } + + const data = await response.json(); + if (!Array.isArray(data) || data.length === 0) { + throw new Error( + [ + `No monitoring data available for "${input.appName}". This could be because:`, + "", + "1. The container was recently started - wait a few minutes for data to be collected", + "2. The container is not running - verify its status", + "3. The service is not included in your monitoring configuration", + ].join("\n"), + ); + } + return data as { + containerId: string; + containerName: string; + containerImage: string; + containerLabels: string; + containerCommand: string; + containerCreated: string; + }[]; + } catch (error) { + throw error; + } + }), + + generateToken: protectedProcedure.mutation(async () => { + return "token"; + }), + + deleteApiKey: protectedProcedure + .input( + z.object({ + apiKeyId: z.string(), + }), + ) + .mutation(async ({ input, ctx }) => { + try { + const apiKeyToDelete = await db.query.apikey.findFirst({ + where: eq(apikey.id, input.apiKeyId), + }); + + if (!apiKeyToDelete) { + throw new TRPCError({ + code: "NOT_FOUND", + message: "API key not found", + }); + } + + if (apiKeyToDelete.userId !== ctx.user.id) { + throw new TRPCError({ + code: "UNAUTHORIZED", + message: "You are not authorized to delete this API key", + }); + } + + await db.delete(apikey).where(eq(apikey.id, input.apiKeyId)); + return true; + } catch (error) { + throw error; + } + }), + + createApiKey: protectedProcedure + .input(apiCreateApiKey) + .mutation(async ({ input, ctx }) => { + const apiKey = await createApiKey(ctx.user.id, input); + return apiKey; + }), + + checkUserOrganizations: protectedProcedure + .input( + z.object({ + userId: z.string(), + }), + ) + .query(async ({ input }) => { + const organizations = await db.query.member.findMany({ + where: eq(member.userId, input.userId), + }); + + return organizations.length; }), }); diff --git a/apps/dokploy/server/api/trpc.ts b/apps/dokploy/server/api/trpc.ts index db4f7adf..4c88eb22 100644 --- a/apps/dokploy/server/api/trpc.ts +++ b/apps/dokploy/server/api/trpc.ts @@ -9,7 +9,7 @@ // import { getServerAuthSession } from "@/server/auth"; import { db } from "@/server/db"; -import { validateBearerToken, validateRequest } from "@dokploy/server"; +import { validateRequest } from "@dokploy/server/lib/auth"; import type { OpenApiMeta } from "@dokploy/trpc-openapi"; import { TRPCError, initTRPC } from "@trpc/server"; import type { CreateNextContextOptions } from "@trpc/server/adapters/next"; @@ -18,7 +18,7 @@ import { experimental_isMultipartFormDataRequest, experimental_parseMultipartFormData, } from "@trpc/server/adapters/node-http/content-type/form-data"; -import type { Session, User } from "lucia"; +import type { Session, User } from "better-auth"; import superjson from "superjson"; import { ZodError } from "zod"; /** @@ -30,8 +30,8 @@ import { ZodError } from "zod"; */ interface CreateContextOptions { - user: (User & { authId: string; adminId: string }) | null; - session: Session | null; + user: (User & { rol: "member" | "admin" | "owner"; ownerId: string }) | null; + session: (Session & { activeOrganizationId: string }) | null; req: CreateNextContextOptions["req"]; res: CreateNextContextOptions["res"]; } @@ -65,30 +65,29 @@ const createInnerTRPCContext = (opts: CreateContextOptions) => { export const createTRPCContext = async (opts: CreateNextContextOptions) => { const { req, res } = opts; - let { session, user } = await validateBearerToken(req); - - if (!session) { - const cookieResult = await validateRequest(req, res); - session = cookieResult.session; - user = cookieResult.user; - } + // Get from the request + const { session, user } = await validateRequest(req); return createInnerTRPCContext({ req, res, - session: session, - ...((user && { - user: { - authId: user.id, - email: user.email, - rol: user.rol, - id: user.id, - secret: user.secret, - adminId: user.adminId, - }, - }) || { - user: null, - }), + // @ts-ignore + session: session + ? { + ...session, + activeOrganizationId: session.activeOrganizationId || "", + } + : null, + // @ts-ignore + user: user + ? { + ...user, + email: user.email, + rol: user.role as "owner" | "member" | "admin", + id: user.id, + ownerId: user.ownerId, + } + : null, }); }; @@ -181,7 +180,7 @@ export const uploadProcedure = async (opts: any) => { }; export const cliProcedure = t.procedure.use(({ ctx, next }) => { - if (!ctx.session || !ctx.user || ctx.user.rol !== "admin") { + if (!ctx.session || !ctx.user || ctx.user.rol !== "owner") { throw new TRPCError({ code: "UNAUTHORIZED" }); } return next({ @@ -195,7 +194,7 @@ export const cliProcedure = t.procedure.use(({ ctx, next }) => { }); export const adminProcedure = t.procedure.use(({ ctx, next }) => { - if (!ctx.session || !ctx.user || ctx.user.rol !== "admin") { + if (!ctx.session || !ctx.user || ctx.user.rol !== "owner") { throw new TRPCError({ code: "UNAUTHORIZED" }); } return next({ diff --git a/apps/dokploy/server/db/seed.ts b/apps/dokploy/server/db/seed.ts index b7935079..5b3eb6c6 100644 --- a/apps/dokploy/server/db/seed.ts +++ b/apps/dokploy/server/db/seed.ts @@ -1,16 +1,10 @@ -import bc from "bcrypt"; import { drizzle } from "drizzle-orm/postgres-js"; import postgres from "postgres"; -import { users } from "./schema"; const connectionString = process.env.DATABASE_URL!; const pg = postgres(connectionString, { max: 1 }); -const db = drizzle(pg); - -function password(txt: string) { - return bc.hashSync(txt, 10); -} +const _db = drizzle(pg); async function seed() { console.log("> Seed:", process.env.DATABASE_PATH, "\n"); diff --git a/apps/dokploy/server/utils/backup.ts b/apps/dokploy/server/utils/backup.ts index a178063f..4fc9db93 100644 --- a/apps/dokploy/server/utils/backup.ts +++ b/apps/dokploy/server/utils/backup.ts @@ -1,3 +1,9 @@ +import { + type BackupScheduleList, + IS_CLOUD, + removeScheduleBackup, +} from "@dokploy/server/index"; + type QueueJob = | { type: "backup"; @@ -59,3 +65,19 @@ export const updateJob = async (job: QueueJob) => { throw error; } }; + +export const cancelJobs = async (backups: BackupScheduleList) => { + for (const backup of backups) { + if (backup.enabled) { + if (IS_CLOUD) { + await removeJob({ + cronSchedule: backup.schedule, + backupId: backup.backupId, + type: "backup", + }); + } else { + removeScheduleBackup(backup.backupId); + } + } + } +}; diff --git a/apps/dokploy/server/utils/docker.ts b/apps/dokploy/server/utils/docker.ts index 92008678..3314eb62 100644 --- a/apps/dokploy/server/utils/docker.ts +++ b/apps/dokploy/server/utils/docker.ts @@ -6,7 +6,7 @@ export const isWSL = async () => { const { stdout } = await execAsync("uname -r"); const isWSL = stdout.includes("microsoft"); return isWSL; - } catch (error) { + } catch (_error) { return false; } }; diff --git a/apps/dokploy/server/wss/docker-container-logs.ts b/apps/dokploy/server/wss/docker-container-logs.ts index 092f3973..8d08ebd4 100644 --- a/apps/dokploy/server/wss/docker-container-logs.ts +++ b/apps/dokploy/server/wss/docker-container-logs.ts @@ -1,5 +1,5 @@ import type http from "node:http"; -import { findServerById, validateWebSocketRequest } from "@dokploy/server"; +import { findServerById, validateRequest } from "@dokploy/server"; import { spawn } from "node-pty"; import { Client } from "ssh2"; import { WebSocketServer } from "ws"; @@ -35,7 +35,7 @@ export const setupDockerContainerLogsWebSocketServer = ( const since = url.searchParams.get("since"); const serverId = url.searchParams.get("serverId"); const runType = url.searchParams.get("runType"); - const { user, session } = await validateWebSocketRequest(req); + const { user, session } = await validateRequest(req); if (!containerId) { ws.close(4000, "containerId no provided"); diff --git a/apps/dokploy/server/wss/docker-container-terminal.ts b/apps/dokploy/server/wss/docker-container-terminal.ts index 8981ccbc..2f25edb1 100644 --- a/apps/dokploy/server/wss/docker-container-terminal.ts +++ b/apps/dokploy/server/wss/docker-container-terminal.ts @@ -1,5 +1,5 @@ import type http from "node:http"; -import { findServerById, validateWebSocketRequest } from "@dokploy/server"; +import { findServerById, validateRequest } from "@dokploy/server"; import { spawn } from "node-pty"; import { Client } from "ssh2"; import { WebSocketServer } from "ws"; @@ -32,7 +32,7 @@ export const setupDockerContainerTerminalWebSocketServer = ( const containerId = url.searchParams.get("containerId"); const activeWay = url.searchParams.get("activeWay"); const serverId = url.searchParams.get("serverId"); - const { user, session } = await validateWebSocketRequest(req); + const { user, session } = await validateRequest(req); if (!containerId) { ws.close(4000, "containerId no provided"); @@ -50,8 +50,8 @@ export const setupDockerContainerTerminalWebSocketServer = ( throw new Error("No SSH key available for this server"); const conn = new Client(); - let stdout = ""; - let stderr = ""; + let _stdout = ""; + let _stderr = ""; conn .once("ready", () => { conn.exec( @@ -61,16 +61,16 @@ export const setupDockerContainerTerminalWebSocketServer = ( if (err) throw err; stream - .on("close", (code: number, signal: string) => { + .on("close", (code: number, _signal: string) => { ws.send(`\nContainer closed with code: ${code}\n`); conn.end(); }) .on("data", (data: string) => { - stdout += data.toString(); + _stdout += data.toString(); ws.send(data.toString()); }) .stderr.on("data", (data) => { - stderr += data.toString(); + _stderr += data.toString(); ws.send(data.toString()); console.error("Error: ", data.toString()); }); diff --git a/apps/dokploy/server/wss/docker-stats.ts b/apps/dokploy/server/wss/docker-stats.ts index 89d94687..99e993dc 100644 --- a/apps/dokploy/server/wss/docker-stats.ts +++ b/apps/dokploy/server/wss/docker-stats.ts @@ -1,9 +1,10 @@ import type http from "node:http"; import { docker, + execAsync, getLastAdvancedStatsFile, recordAdvancedStats, - validateWebSocketRequest, + validateRequest, } from "@dokploy/server"; import { WebSocketServer } from "ws"; @@ -35,7 +36,7 @@ export const setupDockerStatsMonitoringSocketServer = ( | "application" | "stack" | "docker-compose"; - const { user, session } = await validateWebSocketRequest(req); + const { user, session } = await validateRequest(req); if (!appName) { ws.close(4000, "appName no provided"); @@ -70,12 +71,16 @@ export const setupDockerStatsMonitoringSocketServer = ( ws.close(4000, "Container not running"); return; } + const { stdout, stderr } = await execAsync( + `docker stats ${container.Id} --no-stream --format \'{"BlockIO":"{{.BlockIO}}","CPUPerc":"{{.CPUPerc}}","Container":"{{.Container}}","ID":"{{.ID}}","MemPerc":"{{.MemPerc}}","MemUsage":"{{.MemUsage}}","Name":"{{.Name}}","NetIO":"{{.NetIO}}"}\'`, + ); + if (stderr) { + console.error("Docker stats error:", stderr); + return; + } + const stat = JSON.parse(stdout); - const stats = await docker.getContainer(container.Id).stats({ - stream: false, - }); - - await recordAdvancedStats(stats, appName); + await recordAdvancedStats(stat, appName); const data = await getLastAdvancedStatsFile(appName); ws.send( diff --git a/apps/dokploy/server/wss/drawer-logs.ts b/apps/dokploy/server/wss/drawer-logs.ts index c1dec315..404dfeee 100644 --- a/apps/dokploy/server/wss/drawer-logs.ts +++ b/apps/dokploy/server/wss/drawer-logs.ts @@ -1,4 +1,5 @@ import type http from "node:http"; +import { validateRequest } from "@dokploy/server/index"; import { applyWSSHandler } from "@trpc/server/adapters/ws"; import { WebSocketServer } from "ws"; import { appRouter } from "../api/root"; @@ -31,6 +32,12 @@ export const setupDrawerLogsWebSocketServer = ( }); wssTerm.on("connection", async (ws, req) => { - const url = new URL(req.url || "", `http://${req.headers.host}`); + const _url = new URL(req.url || "", `http://${req.headers.host}`); + const { user, session } = await validateRequest(req); + + if (!user || !session) { + ws.close(); + return; + } }); }; diff --git a/apps/dokploy/server/wss/listen-deployment.ts b/apps/dokploy/server/wss/listen-deployment.ts index df77ceb4..4a25c6f0 100644 --- a/apps/dokploy/server/wss/listen-deployment.ts +++ b/apps/dokploy/server/wss/listen-deployment.ts @@ -1,6 +1,6 @@ import { spawn } from "node:child_process"; import type http from "node:http"; -import { findServerById, validateWebSocketRequest } from "@dokploy/server"; +import { findServerById, validateRequest } from "@dokploy/server"; import { Client } from "ssh2"; import { WebSocketServer } from "ws"; @@ -29,7 +29,7 @@ export const setupDeploymentLogsWebSocketServer = ( const url = new URL(req.url || "", `http://${req.headers.host}`); const logPath = url.searchParams.get("logPath"); const serverId = url.searchParams.get("serverId"); - const { user, session } = await validateWebSocketRequest(req); + const { user, session } = await validateRequest(req); if (!logPath) { console.log("logPath no provided"); @@ -103,7 +103,7 @@ export const setupDeploymentLogsWebSocketServer = ( ws.close(); }); } - } catch (error) { + } catch (_error) { // @ts-ignore // const errorMessage = error?.message as unknown as string; // ws.send(errorMessage); diff --git a/apps/dokploy/server/wss/terminal.ts b/apps/dokploy/server/wss/terminal.ts index 5fa1accc..094c5e15 100644 --- a/apps/dokploy/server/wss/terminal.ts +++ b/apps/dokploy/server/wss/terminal.ts @@ -1,9 +1,5 @@ import type http from "node:http"; -import { - IS_CLOUD, - findServerById, - validateWebSocketRequest, -} from "@dokploy/server"; +import { IS_CLOUD, findServerById, validateRequest } from "@dokploy/server"; import { publicIpv4, publicIpv6 } from "public-ip"; import { Client, type ConnectConfig } from "ssh2"; import { WebSocketServer } from "ws"; @@ -71,7 +67,7 @@ export const setupTerminalWebSocketServer = ( wssTerm.on("connection", async (ws, req) => { const url = new URL(req.url || "", `http://${req.headers.host}`); const serverId = url.searchParams.get("serverId"); - const { user, session } = await validateWebSocketRequest(req); + const { user, session } = await validateRequest(req); if (!user || !session || !serverId) { ws.close(); return; @@ -148,8 +144,8 @@ export const setupTerminalWebSocketServer = ( } const conn = new Client(); - let stdout = ""; - let stderr = ""; + let _stdout = ""; + let _stderr = ""; ws.send("Connecting...\n"); @@ -162,16 +158,16 @@ export const setupTerminalWebSocketServer = ( if (err) throw err; stream - .on("close", (code: number, signal: string) => { + .on("close", (code: number, _signal: string) => { ws.send(`\nContainer closed with code: ${code}\n`); conn.end(); }) .on("data", (data: string) => { - stdout += data.toString(); + _stdout += data.toString(); ws.send(data.toString()); }) .stderr.on("data", (data) => { - stderr += data.toString(); + _stderr += data.toString(); ws.send(data.toString()); console.error("Error: ", data.toString()); }); diff --git a/apps/dokploy/styles/globals.css b/apps/dokploy/styles/globals.css index 7b7977b9..74a1d276 100644 --- a/apps/dokploy/styles/globals.css +++ b/apps/dokploy/styles/globals.css @@ -4,6 +4,7 @@ @layer base { :root { + --terminal-paste: rgba(0, 0, 0, 0.2); --background: 0 0% 100%; --foreground: 240 10% 3.9%; @@ -51,6 +52,7 @@ } .dark { + --terminal-paste: rgba(255, 255, 255, 0.2); --background: 0 0% 0%; --foreground: 0 0% 98%; @@ -235,3 +237,8 @@ background-color: hsl(var(--muted-foreground) / 0.5); } } + +.xterm-bg-257.xterm-fg-257 { + background-color: var(--terminal-paste) !important; + color: currentColor !important; +} diff --git a/apps/dokploy/templates/activepieces/docker-compose.yml b/apps/dokploy/templates/activepieces/docker-compose.yml index e990379b..a5511e7f 100644 --- a/apps/dokploy/templates/activepieces/docker-compose.yml +++ b/apps/dokploy/templates/activepieces/docker-compose.yml @@ -4,8 +4,7 @@ services: activepieces: image: activepieces/activepieces:0.35.0 restart: unless-stopped - networks: - - dokploy-network + depends_on: postgres: condition: service_healthy @@ -35,8 +34,7 @@ services: postgres: image: postgres:14 restart: unless-stopped - networks: - - dokploy-network + environment: POSTGRES_DB: activepieces POSTGRES_PASSWORD: ${AP_POSTGRES_PASSWORD} @@ -52,8 +50,7 @@ services: redis: image: redis:7 restart: unless-stopped - networks: - - dokploy-network + volumes: - redis_data:/data healthcheck: diff --git a/apps/dokploy/templates/alist/docker-compose.yml b/apps/dokploy/templates/alist/docker-compose.yml new file mode 100644 index 00000000..9ff67c94 --- /dev/null +++ b/apps/dokploy/templates/alist/docker-compose.yml @@ -0,0 +1,14 @@ +version: '3.3' +services: + alist: + image: xhofe/alist:v3.41.0 + volumes: + - alist-data:/opt/alist/data + environment: + - PUID=0 + - PGID=0 + - UMASK=022 + restart: unless-stopped + +volumes: + alist-data: \ No newline at end of file diff --git a/apps/dokploy/templates/alist/index.ts b/apps/dokploy/templates/alist/index.ts new file mode 100644 index 00000000..2a27f570 --- /dev/null +++ b/apps/dokploy/templates/alist/index.ts @@ -0,0 +1,22 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainDomain = generateRandomDomain(schema); + + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 5244, + serviceName: "alist", + }, + ]; + + return { + domains, + }; +} diff --git a/apps/dokploy/templates/answer/docker-compose.yml b/apps/dokploy/templates/answer/docker-compose.yml new file mode 100644 index 00000000..2b9fc344 --- /dev/null +++ b/apps/dokploy/templates/answer/docker-compose.yml @@ -0,0 +1,30 @@ +services: + answer: + image: apache/answer:1.4.1 + ports: + - '80' + restart: on-failure + volumes: + - answer-data:/data + depends_on: + db: + condition: service_healthy + db: + image: postgres:16 + restart: always + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] + interval: 5s + timeout: 5s + retries: 5 + + volumes: + - db-data:/var/lib/postgresql/data + environment: + POSTGRES_DB: answer + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + +volumes: + answer-data: + db-data: diff --git a/apps/dokploy/templates/answer/index.ts b/apps/dokploy/templates/answer/index.ts new file mode 100644 index 00000000..36d48cb3 --- /dev/null +++ b/apps/dokploy/templates/answer/index.ts @@ -0,0 +1,33 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateHash, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainServiceHash = generateHash(schema.projectName); + const mainDomain = generateRandomDomain(schema); + + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 9080, + serviceName: "answer", + }, + ]; + + const envs = [ + `ANSWER_HOST=http://${mainDomain}`, + `SERVICE_HASH=${mainServiceHash}`, + ]; + + const mounts: Template["mounts"] = []; + + return { + envs, + mounts, + domains, + }; +} diff --git a/apps/dokploy/templates/appsmith/index.ts b/apps/dokploy/templates/appsmith/index.ts index ff744a24..73279e91 100644 --- a/apps/dokploy/templates/appsmith/index.ts +++ b/apps/dokploy/templates/appsmith/index.ts @@ -7,7 +7,7 @@ import { } from "../utils"; export function generate(schema: Schema): Template { - const mainServiceHash = generateHash(schema.projectName); + const _mainServiceHash = generateHash(schema.projectName); const domains: DomainSchema[] = [ { diff --git a/apps/dokploy/templates/appwrite/docker-compose.yml b/apps/dokploy/templates/appwrite/docker-compose.yml new file mode 100644 index 00000000..163cb3d0 --- /dev/null +++ b/apps/dokploy/templates/appwrite/docker-compose.yml @@ -0,0 +1,887 @@ +version: "3.8" + +x-logging: &x-logging + logging: + driver: "json-file" + options: + max-file: "5" + max-size: "10m" + +services: + appwrite: + image: appwrite/appwrite:1.6.0 + container_name: appwrite + <<: *x-logging + restart: unless-stopped + networks: + - dokploy-network + labels: + - traefik.enable=true + - traefik.constraint-label-stack=appwrite + volumes: + - appwrite-uploads:/storage/uploads:rw + - appwrite-cache:/storage/cache:rw + - appwrite-config:/storage/config:rw + - appwrite-certificates:/storage/certificates:rw + - appwrite-functions:/storage/functions:rw + depends_on: + - mariadb + - redis + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_LOCALE + - _APP_CONSOLE_WHITELIST_ROOT + - _APP_CONSOLE_WHITELIST_EMAILS + - _APP_CONSOLE_SESSION_ALERTS + - _APP_CONSOLE_WHITELIST_IPS + - _APP_CONSOLE_HOSTNAMES + - _APP_SYSTEM_EMAIL_NAME + - _APP_SYSTEM_EMAIL_ADDRESS + - _APP_EMAIL_SECURITY + - _APP_SYSTEM_RESPONSE_FORMAT + - _APP_OPTIONS_ABUSE + - _APP_OPTIONS_ROUTER_PROTECTION + - _APP_OPTIONS_FORCE_HTTPS + - _APP_OPTIONS_FUNCTIONS_FORCE_HTTPS + - _APP_OPENSSL_KEY_V1 + - _APP_DOMAIN + - _APP_DOMAIN_TARGET + - _APP_DOMAIN_FUNCTIONS + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_SMTP_HOST + - _APP_SMTP_PORT + - _APP_SMTP_SECURE + - _APP_SMTP_USERNAME + - _APP_SMTP_PASSWORD + - _APP_USAGE_STATS + - _APP_STORAGE_LIMIT + - _APP_STORAGE_PREVIEW_LIMIT + - _APP_STORAGE_ANTIVIRUS + - _APP_STORAGE_ANTIVIRUS_HOST + - _APP_STORAGE_ANTIVIRUS_PORT + - _APP_STORAGE_DEVICE + - _APP_STORAGE_S3_ACCESS_KEY + - _APP_STORAGE_S3_SECRET + - _APP_STORAGE_S3_REGION + - _APP_STORAGE_S3_BUCKET + - _APP_STORAGE_DO_SPACES_ACCESS_KEY + - _APP_STORAGE_DO_SPACES_SECRET + - _APP_STORAGE_DO_SPACES_REGION + - _APP_STORAGE_DO_SPACES_BUCKET + - _APP_STORAGE_BACKBLAZE_ACCESS_KEY + - _APP_STORAGE_BACKBLAZE_SECRET + - _APP_STORAGE_BACKBLAZE_REGION + - _APP_STORAGE_BACKBLAZE_BUCKET + - _APP_STORAGE_LINODE_ACCESS_KEY + - _APP_STORAGE_LINODE_SECRET + - _APP_STORAGE_LINODE_REGION + - _APP_STORAGE_LINODE_BUCKET + - _APP_STORAGE_WASABI_ACCESS_KEY + - _APP_STORAGE_WASABI_SECRET + - _APP_STORAGE_WASABI_REGION + - _APP_STORAGE_WASABI_BUCKET + - _APP_FUNCTIONS_SIZE_LIMIT + - _APP_FUNCTIONS_TIMEOUT + - _APP_FUNCTIONS_BUILD_TIMEOUT + - _APP_FUNCTIONS_CPUS + - _APP_FUNCTIONS_MEMORY + - _APP_FUNCTIONS_RUNTIMES + - _APP_EXECUTOR_SECRET + - _APP_EXECUTOR_HOST + - _APP_LOGGING_CONFIG + - _APP_MAINTENANCE_INTERVAL + - _APP_MAINTENANCE_DELAY + - _APP_MAINTENANCE_RETENTION_EXECUTION + - _APP_MAINTENANCE_RETENTION_CACHE + - _APP_MAINTENANCE_RETENTION_ABUSE + - _APP_MAINTENANCE_RETENTION_AUDIT + - _APP_MAINTENANCE_RETENTION_USAGE_HOURLY + - _APP_MAINTENANCE_RETENTION_SCHEDULES + - _APP_SMS_PROVIDER + - _APP_SMS_FROM + - _APP_GRAPHQL_MAX_BATCH_SIZE + - _APP_GRAPHQL_MAX_COMPLEXITY + - _APP_GRAPHQL_MAX_DEPTH + - _APP_VCS_GITHUB_APP_NAME + - _APP_VCS_GITHUB_PRIVATE_KEY + - _APP_VCS_GITHUB_APP_ID + - _APP_VCS_GITHUB_WEBHOOK_SECRET + - _APP_VCS_GITHUB_CLIENT_SECRET + - _APP_VCS_GITHUB_CLIENT_ID + - _APP_MIGRATIONS_FIREBASE_CLIENT_ID + - _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET + - _APP_ASSISTANT_OPENAI_API_KEY + + appwrite-console: + image: appwrite/console:5.0.12 + container_name: appwrite-console + <<: *x-logging + restart: unless-stopped + networks: + - dokploy-network + labels: + - "traefik.enable=true" + - "traefik.constraint-label-stack=appwrite" + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_LOCALE + - _APP_CONSOLE_WHITELIST_ROOT + - _APP_CONSOLE_WHITELIST_EMAILS + - _APP_CONSOLE_SESSION_ALERTS + - _APP_CONSOLE_WHITELIST_IPS + - _APP_CONSOLE_HOSTNAMES + - _APP_SYSTEM_EMAIL_NAME + - _APP_SYSTEM_EMAIL_ADDRESS + - _APP_EMAIL_SECURITY + - _APP_SYSTEM_RESPONSE_FORMAT + - _APP_OPTIONS_ABUSE + - _APP_OPTIONS_ROUTER_PROTECTION + - _APP_OPTIONS_FORCE_HTTPS + - _APP_OPTIONS_FUNCTIONS_FORCE_HTTPS + - _APP_OPENSSL_KEY_V1 + - _APP_DOMAIN + - _APP_DOMAIN_TARGET + - _APP_DOMAIN_FUNCTIONS + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_SMTP_HOST + - _APP_SMTP_PORT + - _APP_SMTP_SECURE + - _APP_SMTP_USERNAME + - _APP_SMTP_PASSWORD + - _APP_USAGE_STATS + - _APP_STORAGE_LIMIT + - _APP_STORAGE_PREVIEW_LIMIT + - _APP_STORAGE_ANTIVIRUS + - _APP_STORAGE_ANTIVIRUS_HOST + - _APP_STORAGE_ANTIVIRUS_PORT + - _APP_STORAGE_DEVICE + - _APP_STORAGE_S3_ACCESS_KEY + - _APP_STORAGE_S3_SECRET + - _APP_STORAGE_S3_REGION + - _APP_STORAGE_S3_BUCKET + - _APP_STORAGE_DO_SPACES_ACCESS_KEY + - _APP_STORAGE_DO_SPACES_SECRET + - _APP_STORAGE_DO_SPACES_REGION + - _APP_STORAGE_DO_SPACES_BUCKET + - _APP_STORAGE_BACKBLAZE_ACCESS_KEY + - _APP_STORAGE_BACKBLAZE_SECRET + - _APP_STORAGE_BACKBLAZE_REGION + - _APP_STORAGE_BACKBLAZE_BUCKET + - _APP_STORAGE_LINODE_ACCESS_KEY + - _APP_STORAGE_LINODE_SECRET + - _APP_STORAGE_LINODE_REGION + - _APP_STORAGE_LINODE_BUCKET + - _APP_STORAGE_WASABI_ACCESS_KEY + - _APP_STORAGE_WASABI_SECRET + - _APP_STORAGE_WASABI_REGION + - _APP_STORAGE_WASABI_BUCKET + + appwrite-realtime: + image: appwrite/appwrite:1.6.0 + entrypoint: realtime + container_name: appwrite-realtime + <<: *x-logging + restart: unless-stopped + networks: + - dokploy-network + depends_on: + - mariadb + - redis + labels: + - "traefik.enable=true" + - "traefik.constraint-label-stack=appwrite" + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_OPTIONS_ABUSE + - _APP_OPTIONS_ROUTER_PROTECTION + - _APP_OPENSSL_KEY_V1 + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_USAGE_STATS + - _APP_LOGGING_CONFIG + + appwrite-worker-audits: + image: appwrite/appwrite:1.6.0 + entrypoint: worker-audits + <<: *x-logging + container_name: appwrite-worker-audits + restart: unless-stopped + networks: + - dokploy-network + depends_on: + - redis + - mariadb + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_LOGGING_CONFIG + + appwrite-worker-webhooks: + image: appwrite/appwrite:1.6.0 + entrypoint: worker-webhooks + <<: *x-logging + container_name: appwrite-worker-webhooks + restart: unless-stopped + networks: + - dokploy-network + depends_on: + - redis + - mariadb + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_EMAIL_SECURITY + - _APP_SYSTEM_SECURITY_EMAIL_ADDRESS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_LOGGING_CONFIG + + appwrite-worker-deletes: + image: appwrite/appwrite:1.6.0 + entrypoint: worker-deletes + <<: *x-logging + container_name: appwrite-worker-deletes + restart: unless-stopped + networks: + - dokploy-network + depends_on: + - redis + - mariadb + volumes: + - appwrite-uploads:/storage/uploads:rw + - appwrite-cache:/storage/cache:rw + - appwrite-functions:/storage/functions:rw + - appwrite-builds:/storage/builds:rw + - appwrite-certificates:/storage/certificates:rw + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_STORAGE_DEVICE + - _APP_STORAGE_S3_ACCESS_KEY + - _APP_STORAGE_S3_SECRET + - _APP_STORAGE_S3_REGION + - _APP_STORAGE_S3_BUCKET + - _APP_STORAGE_DO_SPACES_ACCESS_KEY + - _APP_STORAGE_DO_SPACES_SECRET + - _APP_STORAGE_DO_SPACES_REGION + - _APP_STORAGE_DO_SPACES_BUCKET + - _APP_STORAGE_BACKBLAZE_ACCESS_KEY + - _APP_STORAGE_BACKBLAZE_SECRET + - _APP_STORAGE_BACKBLAZE_REGION + - _APP_STORAGE_BACKBLAZE_BUCKET + - _APP_STORAGE_LINODE_ACCESS_KEY + - _APP_STORAGE_LINODE_SECRET + - _APP_STORAGE_LINODE_REGION + - _APP_STORAGE_LINODE_BUCKET + - _APP_STORAGE_WASABI_ACCESS_KEY + - _APP_STORAGE_WASABI_SECRET + - _APP_STORAGE_WASABI_REGION + - _APP_STORAGE_WASABI_BUCKET + - _APP_LOGGING_CONFIG + - _APP_EXECUTOR_SECRET + - _APP_EXECUTOR_HOST + - _APP_MAINTENANCE_RETENTION_ABUSE + - _APP_MAINTENANCE_RETENTION_AUDIT + - _APP_MAINTENANCE_RETENTION_EXECUTION + + appwrite-worker-databases: + image: appwrite/appwrite:1.6.0 + entrypoint: worker-databases + <<: *x-logging + container_name: appwrite-worker-databases + restart: unless-stopped + networks: + - dokploy-network + depends_on: + - redis + - mariadb + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_LOGGING_CONFIG + + appwrite-worker-builds: + image: appwrite/appwrite:1.6.0 + entrypoint: worker-builds + <<: *x-logging + container_name: appwrite-worker-builds + restart: unless-stopped + networks: + - dokploy-network + depends_on: + - redis + - mariadb + volumes: + - appwrite-functions:/storage/functions:rw + - appwrite-builds:/storage/builds:rw + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_EXECUTOR_SECRET + - _APP_EXECUTOR_HOST + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_LOGGING_CONFIG + - _APP_VCS_GITHUB_APP_NAME + - _APP_VCS_GITHUB_PRIVATE_KEY + - _APP_VCS_GITHUB_APP_ID + - _APP_FUNCTIONS_TIMEOUT + - _APP_FUNCTIONS_BUILD_TIMEOUT + - _APP_FUNCTIONS_CPUS + - _APP_FUNCTIONS_MEMORY + - _APP_FUNCTIONS_SIZE_LIMIT + - _APP_OPTIONS_FORCE_HTTPS + - _APP_OPTIONS_FUNCTIONS_FORCE_HTTPS + - _APP_DOMAIN + - _APP_STORAGE_DEVICE + - _APP_STORAGE_S3_ACCESS_KEY + - _APP_STORAGE_S3_SECRET + - _APP_STORAGE_S3_REGION + - _APP_STORAGE_S3_BUCKET + - _APP_STORAGE_DO_SPACES_ACCESS_KEY + - _APP_STORAGE_DO_SPACES_SECRET + - _APP_STORAGE_DO_SPACES_REGION + - _APP_STORAGE_DO_SPACES_BUCKET + - _APP_STORAGE_BACKBLAZE_ACCESS_KEY + - _APP_STORAGE_BACKBLAZE_SECRET + - _APP_STORAGE_BACKBLAZE_REGION + - _APP_STORAGE_BACKBLAZE_BUCKET + - _APP_STORAGE_LINODE_ACCESS_KEY + - _APP_STORAGE_LINODE_SECRET + - _APP_STORAGE_LINODE_REGION + - _APP_STORAGE_LINODE_BUCKET + - _APP_STORAGE_WASABI_ACCESS_KEY + - _APP_STORAGE_WASABI_SECRET + - _APP_STORAGE_WASABI_REGION + - _APP_STORAGE_WASABI_BUCKET + + appwrite-worker-certificates: + image: appwrite/appwrite:1.6.0 + entrypoint: worker-certificates + <<: *x-logging + container_name: appwrite-worker-certificates + restart: unless-stopped + networks: + - dokploy-network + depends_on: + - redis + - mariadb + volumes: + - appwrite-config:/storage/config:rw + - appwrite-certificates:/storage/certificates:rw + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_DOMAIN + - _APP_DOMAIN_TARGET + - _APP_DOMAIN_FUNCTIONS + - _APP_EMAIL_CERTIFICATES + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_LOGGING_CONFIG + + appwrite-worker-functions: + image: appwrite/appwrite:1.6.0 + entrypoint: worker-functions + <<: *x-logging + container_name: appwrite-worker-functions + restart: unless-stopped + networks: + - dokploy-network + depends_on: + - redis + - mariadb + - openruntimes-executor + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_DOMAIN + - _APP_OPTIONS_FORCE_HTTPS + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_FUNCTIONS_TIMEOUT + - _APP_FUNCTIONS_BUILD_TIMEOUT + - _APP_FUNCTIONS_CPUS + - _APP_FUNCTIONS_MEMORY + - _APP_EXECUTOR_SECRET + - _APP_EXECUTOR_HOST + - _APP_USAGE_STATS + - _APP_DOCKER_HUB_USERNAME + - _APP_DOCKER_HUB_PASSWORD + - _APP_LOGGING_CONFIG + + appwrite-worker-mails: + image: appwrite/appwrite:1.6.0 + entrypoint: worker-mails + <<: *x-logging + container_name: appwrite-worker-mails + restart: unless-stopped + networks: + - dokploy-network + depends_on: + - redis + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_SYSTEM_EMAIL_NAME + - _APP_SYSTEM_EMAIL_ADDRESS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_SMTP_HOST + - _APP_SMTP_PORT + - _APP_SMTP_SECURE + - _APP_SMTP_USERNAME + - _APP_SMTP_PASSWORD + - _APP_LOGGING_CONFIG + + appwrite-worker-messaging: + image: appwrite/appwrite:1.6.0 + entrypoint: worker-messaging + container_name: appwrite-worker-messaging + <<: *x-logging + restart: unless-stopped + networks: + - dokploy-network + volumes: + - appwrite-uploads:/storage/uploads:rw + depends_on: + - redis + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_LOGGING_CONFIG + - _APP_SMS_FROM + - _APP_SMS_PROVIDER + - _APP_STORAGE_DEVICE + - _APP_STORAGE_S3_ACCESS_KEY + - _APP_STORAGE_S3_SECRET + - _APP_STORAGE_S3_REGION + - _APP_STORAGE_S3_BUCKET + - _APP_STORAGE_DO_SPACES_ACCESS_KEY + - _APP_STORAGE_DO_SPACES_SECRET + - _APP_STORAGE_DO_SPACES_REGION + - _APP_STORAGE_DO_SPACES_BUCKET + - _APP_STORAGE_BACKBLAZE_ACCESS_KEY + - _APP_STORAGE_BACKBLAZE_SECRET + - _APP_STORAGE_BACKBLAZE_REGION + - _APP_STORAGE_BACKBLAZE_BUCKET + - _APP_STORAGE_LINODE_ACCESS_KEY + - _APP_STORAGE_LINODE_SECRET + - _APP_STORAGE_LINODE_REGION + - _APP_STORAGE_LINODE_BUCKET + - _APP_STORAGE_WASABI_ACCESS_KEY + - _APP_STORAGE_WASABI_SECRET + - _APP_STORAGE_WASABI_REGION + - _APP_STORAGE_WASABI_BUCKET + + appwrite-worker-migrations: + image: appwrite/appwrite:1.6.0 + entrypoint: worker-migrations + <<: *x-logging + container_name: appwrite-worker-migrations + restart: unless-stopped + networks: + - dokploy-network + depends_on: + - mariadb + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_DOMAIN + - _APP_DOMAIN_TARGET + - _APP_EMAIL_SECURITY + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_LOGGING_CONFIG + - _APP_MIGRATIONS_FIREBASE_CLIENT_ID + - _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET + + appwrite-task-maintenance: + image: appwrite/appwrite:1.6.0 + entrypoint: maintenance + <<: *x-logging + container_name: appwrite-task-maintenance + restart: unless-stopped + networks: + - dokploy-network + depends_on: + - redis + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_DOMAIN + - _APP_DOMAIN_TARGET + - _APP_DOMAIN_FUNCTIONS + - _APP_OPENSSL_KEY_V1 + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_MAINTENANCE_INTERVAL + - _APP_MAINTENANCE_RETENTION_EXECUTION + - _APP_MAINTENANCE_RETENTION_CACHE + - _APP_MAINTENANCE_RETENTION_ABUSE + - _APP_MAINTENANCE_RETENTION_AUDIT + - _APP_MAINTENANCE_RETENTION_USAGE_HOURLY + - _APP_MAINTENANCE_RETENTION_SCHEDULES + + appwrite-worker-usage: + image: appwrite/appwrite:1.6.0 + entrypoint: worker-usage + container_name: appwrite-worker-usage + <<: *x-logging + restart: unless-stopped + networks: + - dokploy-network + depends_on: + - redis + - mariadb + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_USAGE_STATS + - _APP_LOGGING_CONFIG + - _APP_USAGE_AGGREGATION_INTERVAL + + appwrite-worker-usage-dump: + image: appwrite/appwrite:1.6.0 + entrypoint: worker-usage-dump + container_name: appwrite-worker-usage-dump + <<: *x-logging + networks: + - dokploy-network + depends_on: + - redis + - mariadb + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_USAGE_STATS + - _APP_LOGGING_CONFIG + - _APP_USAGE_AGGREGATION_INTERVAL + + appwrite-task-scheduler-functions: + image: appwrite/appwrite:1.6.0 + entrypoint: schedule-functions + container_name: appwrite-task-scheduler-functions + <<: *x-logging + restart: unless-stopped + networks: + - dokploy-network + depends_on: + - mariadb + - redis + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + + appwrite-task-scheduler-executions: + image: appwrite/appwrite:1.6.0 + entrypoint: schedule-executions + container_name: appwrite-task-scheduler-executions + <<: *x-logging + restart: unless-stopped + networks: + - dokploy-network + depends_on: + - mariadb + - redis + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + + appwrite-task-scheduler-messages: + image: appwrite/appwrite:1.6.0 + entrypoint: schedule-messages + container_name: appwrite-task-scheduler-messages + <<: *x-logging + restart: unless-stopped + networks: + - dokploy-network + depends_on: + - mariadb + - redis + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + + appwrite-assistant: + image: appwrite/assistant:0.4.0 + container_name: appwrite-assistant + <<: *x-logging + restart: unless-stopped + networks: + - dokploy-network + environment: + - _APP_ASSISTANT_OPENAI_API_KEY + + openruntimes-executor: + container_name: openruntimes-executor + hostname: exc1 + <<: *x-logging + restart: unless-stopped + stop_signal: SIGINT + image: openruntimes/executor:0.6.11 + networks: + - dokploy-network + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - appwrite-builds:/storage/builds:rw + - appwrite-functions:/storage/functions:rw + - /tmp:/tmp:rw + environment: + - OPR_EXECUTOR_INACTIVE_TRESHOLD=$_APP_FUNCTIONS_INACTIVE_THRESHOLD + - OPR_EXECUTOR_MAINTENANCE_INTERVAL=$_APP_FUNCTIONS_MAINTENANCE_INTERVAL + - OPR_EXECUTOR_NETWORK=$_APP_FUNCTIONS_RUNTIMES_NETWORK + - OPR_EXECUTOR_DOCKER_HUB_USERNAME=$_APP_DOCKER_HUB_USERNAME + - OPR_EXECUTOR_DOCKER_HUB_PASSWORD=$_APP_DOCKER_HUB_PASSWORD + - OPR_EXECUTOR_ENV=$_APP_ENV + - OPR_EXECUTOR_RUNTIMES=$_APP_FUNCTIONS_RUNTIMES + - OPR_EXECUTOR_SECRET=$_APP_EXECUTOR_SECRET + - OPR_EXECUTOR_LOGGING_CONFIG=$_APP_LOGGING_CONFIG + - OPR_EXECUTOR_STORAGE_DEVICE=$_APP_STORAGE_DEVICE + - OPR_EXECUTOR_STORAGE_S3_ACCESS_KEY=$_APP_STORAGE_S3_ACCESS_KEY + - OPR_EXECUTOR_STORAGE_S3_SECRET=$_APP_STORAGE_S3_SECRET + - OPR_EXECUTOR_STORAGE_S3_REGION=$_APP_STORAGE_S3_REGION + - OPR_EXECUTOR_STORAGE_S3_BUCKET=$_APP_STORAGE_S3_BUCKET + - OPR_EXECUTOR_STORAGE_DO_SPACES_ACCESS_KEY=$_APP_STORAGE_DO_SPACES_ACCESS_KEY + - OPR_EXECUTOR_STORAGE_DO_SPACES_SECRET=$_APP_STORAGE_DO_SPACES_SECRET + - OPR_EXECUTOR_STORAGE_DO_SPACES_REGION=$_APP_STORAGE_DO_SPACES_REGION + - OPR_EXECUTOR_STORAGE_DO_SPACES_BUCKET=$_APP_STORAGE_DO_SPACES_BUCKET + - OPR_EXECUTOR_STORAGE_BACKBLAZE_ACCESS_KEY=$_APP_STORAGE_BACKBLAZE_ACCESS_KEY + - OPR_EXECUTOR_STORAGE_BACKBLAZE_SECRET=$_APP_STORAGE_BACKBLAZE_SECRET + - OPR_EXECUTOR_STORAGE_BACKBLAZE_REGION=$_APP_STORAGE_BACKBLAZE_REGION + - OPR_EXECUTOR_STORAGE_BACKBLAZE_BUCKET=$_APP_STORAGE_BACKBLAZE_BUCKET + - OPR_EXECUTOR_STORAGE_LINODE_ACCESS_KEY=$_APP_STORAGE_LINODE_ACCESS_KEY + - OPR_EXECUTOR_STORAGE_LINODE_SECRET=$_APP_STORAGE_LINODE_SECRET + - OPR_EXECUTOR_STORAGE_LINODE_REGION=$_APP_STORAGE_LINODE_REGION + - OPR_EXECUTOR_STORAGE_LINODE_BUCKET=$_APP_STORAGE_LINODE_BUCKET + - OPR_EXECUTOR_STORAGE_WASABI_ACCESS_KEY=$_APP_STORAGE_WASABI_ACCESS_KEY + - OPR_EXECUTOR_STORAGE_WASABI_SECRET=$_APP_STORAGE_WASABI_SECRET + - OPR_EXECUTOR_STORAGE_WASABI_REGION=$_APP_STORAGE_WASABI_REGION + - OPR_EXECUTOR_STORAGE_WASABI_BUCKET=$_APP_STORAGE_WASABI_BUCKET + + mariadb: + image: mariadb:10.11 + container_name: appwrite-mariadb + <<: *x-logging + restart: unless-stopped + networks: + - dokploy-network + volumes: + - appwrite-mariadb:/var/lib/mysql:rw + environment: + - MYSQL_ROOT_PASSWORD=${_APP_DB_ROOT_PASS} + - MYSQL_DATABASE=${_APP_DB_SCHEMA} + - MYSQL_USER=${_APP_DB_USER} + - MYSQL_PASSWORD=${_APP_DB_PASS} + - MARIADB_AUTO_UPGRADE=1 + command: "mysqld --innodb-flush-method=fsync" + + redis: + image: redis:7.2.4-alpine + container_name: appwrite-redis + <<: *x-logging + restart: unless-stopped + command: > + redis-server + --maxmemory 512mb + --maxmemory-policy allkeys-lru + --maxmemory-samples 5 + networks: + - dokploy-network + volumes: + - appwrite-redis:/data:rw + +# Uncomment and configure if ClamAV is needed +# clamav: +# image: appwrite/clamav:1.2.0 +# container_name: appwrite-clamav +# restart: unless-stopped +# networks: +# - dokploy-network +# volumes: +# - appwrite-uploads:/storage/uploads + +volumes: + appwrite-mariadb: + appwrite-redis: + appwrite-cache: + appwrite-uploads: + appwrite-certificates: + appwrite-functions: + appwrite-builds: + appwrite-config: + +networks: + dokploy-network: + external: true diff --git a/apps/dokploy/templates/appwrite/index.ts b/apps/dokploy/templates/appwrite/index.ts new file mode 100644 index 00000000..4e671324 --- /dev/null +++ b/apps/dokploy/templates/appwrite/index.ts @@ -0,0 +1,153 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainDomain = generateRandomDomain(schema); + + const domains: DomainSchema[] = [ + { host: mainDomain, port: 80, serviceName: "appwrite", path: "/" }, + { + host: mainDomain, + port: 80, + serviceName: "appwrite-console", + path: "/console", + }, + { + host: mainDomain, + port: 80, + serviceName: "appwrite-realtime", + path: "/v1/realtime", + }, + ]; + + const envs = [ + "_APP_ENV=production", + "_APP_LOCALE=en", + "_APP_OPTIONS_ABUSE=enabled", + "_APP_OPTIONS_FORCE_HTTPS=disabled", + "_APP_OPTIONS_FUNCTIONS_FORCE_HTTPS=disabled", + "_APP_OPTIONS_ROUTER_PROTECTION=disabled", + "_APP_OPENSSL_KEY_V1=your-secret-key", + `_APP_DOMAIN=${mainDomain}`, + `_APP_DOMAIN_FUNCTIONS=${mainDomain}`, + `_APP_DOMAIN_TARGET=${mainDomain}`, + "_APP_CONSOLE_WHITELIST_ROOT=enabled", + "_APP_CONSOLE_WHITELIST_EMAILS=", + "_APP_CONSOLE_WHITELIST_IPS=", + "_APP_CONSOLE_HOSTNAMES=", + "_APP_SYSTEM_EMAIL_NAME=Appwrite", + "_APP_SYSTEM_EMAIL_ADDRESS=noreply@appwrite.io", + "_APP_SYSTEM_TEAM_EMAIL=team@appwrite.io", + "_APP_SYSTEM_RESPONSE_FORMAT=", + "_APP_SYSTEM_SECURITY_EMAIL_ADDRESS=certs@appwrite.io", + "_APP_EMAIL_SECURITY=", + "_APP_EMAIL_CERTIFICATES=", + "_APP_USAGE_STATS=enabled", + "_APP_LOGGING_PROVIDER=", + "_APP_LOGGING_CONFIG=", + "_APP_USAGE_AGGREGATION_INTERVAL=30", + "_APP_USAGE_TIMESERIES_INTERVAL=30", + "_APP_USAGE_DATABASE_INTERVAL=900", + "_APP_WORKER_PER_CORE=6", + "_APP_CONSOLE_SESSION_ALERTS=disabled", + "_APP_REDIS_HOST=redis", + "_APP_REDIS_PORT=6379", + "_APP_REDIS_USER=", + "_APP_REDIS_PASS=", + "_APP_DB_HOST=mariadb", + "_APP_DB_PORT=3306", + "_APP_DB_SCHEMA=appwrite", + "_APP_DB_USER=user", + "_APP_DB_PASS=password", + "_APP_DB_ROOT_PASS=rootsecretpassword", + "_APP_INFLUXDB_HOST=influxdb", + "_APP_INFLUXDB_PORT=8086", + "_APP_STATSD_HOST=telegraf", + "_APP_STATSD_PORT=8125", + "_APP_SMTP_HOST=", + "_APP_SMTP_PORT=", + "_APP_SMTP_SECURE=", + "_APP_SMTP_USERNAME=", + "_APP_SMTP_PASSWORD=", + "_APP_SMS_PROVIDER=", + "_APP_SMS_FROM=", + "_APP_STORAGE_LIMIT=30000000", + "_APP_STORAGE_PREVIEW_LIMIT=20000000", + "_APP_STORAGE_ANTIVIRUS=disabled", + "_APP_STORAGE_ANTIVIRUS_HOST=clamav", + "_APP_STORAGE_ANTIVIRUS_PORT=3310", + "_APP_STORAGE_DEVICE=local", + "_APP_STORAGE_S3_ACCESS_KEY=", + "_APP_STORAGE_S3_SECRET=", + "_APP_STORAGE_S3_REGION=us-east-1", + "_APP_STORAGE_S3_BUCKET=", + "_APP_STORAGE_DO_SPACES_ACCESS_KEY=", + "_APP_STORAGE_DO_SPACES_SECRET=", + "_APP_STORAGE_DO_SPACES_REGION=us-east-1", + "_APP_STORAGE_DO_SPACES_BUCKET=", + "_APP_STORAGE_BACKBLAZE_ACCESS_KEY=", + "_APP_STORAGE_BACKBLAZE_SECRET=", + "_APP_STORAGE_BACKBLAZE_REGION=us-west-004", + "_APP_STORAGE_BACKBLAZE_BUCKET=", + "_APP_STORAGE_LINODE_ACCESS_KEY=", + "_APP_STORAGE_LINODE_SECRET=", + "_APP_STORAGE_LINODE_REGION=eu-central-1", + "_APP_STORAGE_LINODE_BUCKET=", + "_APP_STORAGE_WASABI_ACCESS_KEY=", + "_APP_STORAGE_WASABI_SECRET=", + "_APP_STORAGE_WASABI_REGION=eu-central-1", + "_APP_STORAGE_WASABI_BUCKET=", + "_APP_FUNCTIONS_SIZE_LIMIT=30000000", + "_APP_FUNCTIONS_BUILD_SIZE_LIMIT=2000000000", + "_APP_FUNCTIONS_TIMEOUT=900", + "_APP_FUNCTIONS_BUILD_TIMEOUT=900", + "_APP_FUNCTIONS_CONTAINERS=10", + "_APP_FUNCTIONS_CPUS=0", + "_APP_FUNCTIONS_MEMORY=0", + "_APP_FUNCTIONS_MEMORY_SWAP=0", + "_APP_FUNCTIONS_RUNTIMES=node-16.0,php-8.0,python-3.9,ruby-3.0", + "_APP_EXECUTOR_SECRET=your-secret-key", + "_APP_EXECUTOR_HOST=http://exc1/v1", + "_APP_EXECUTOR_RUNTIME_NETWORK=appwrite_runtimes", + "_APP_FUNCTIONS_ENVS=node-16.0,php-7.4,python-3.9,ruby-3.0", + "_APP_FUNCTIONS_INACTIVE_THRESHOLD=60", + "DOCKERHUB_PULL_USERNAME=", + "DOCKERHUB_PULL_PASSWORD=", + "DOCKERHUB_PULL_EMAIL=", + "OPEN_RUNTIMES_NETWORK=appwrite_runtimes", + "_APP_FUNCTIONS_RUNTIMES_NETWORK=runtimes", + "_APP_DOCKER_HUB_USERNAME=", + "_APP_DOCKER_HUB_PASSWORD=", + "_APP_FUNCTIONS_MAINTENANCE_INTERVAL=3600", + "_APP_VCS_GITHUB_APP_NAME=", + "_APP_VCS_GITHUB_PRIVATE_KEY=", + "_APP_VCS_GITHUB_APP_ID=", + "_APP_VCS_GITHUB_CLIENT_ID=", + "_APP_VCS_GITHUB_CLIENT_SECRET=", + "_APP_VCS_GITHUB_WEBHOOK_SECRET=", + "_APP_MAINTENANCE_INTERVAL=86400", + "_APP_MAINTENANCE_DELAY=0", + "_APP_MAINTENANCE_RETENTION_CACHE=2592000", + "_APP_MAINTENANCE_RETENTION_EXECUTION=1209600", + "_APP_MAINTENANCE_RETENTION_AUDIT=1209600", + "_APP_MAINTENANCE_RETENTION_ABUSE=86400", + "_APP_MAINTENANCE_RETENTION_USAGE_HOURLY=8640000", + "_APP_MAINTENANCE_RETENTION_SCHEDULES=86400", + "_APP_GRAPHQL_MAX_BATCH_SIZE=10", + "_APP_GRAPHQL_MAX_COMPLEXITY=250", + "_APP_GRAPHQL_MAX_DEPTH=3", + "_APP_MIGRATIONS_FIREBASE_CLIENT_ID=", + "_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET=", + "_APP_ASSISTANT_OPENAI_API_KEY=", + ]; + + return { + domains, + envs, + mounts: [], + }; +} diff --git a/apps/dokploy/templates/aptabase/docker-compose.yml b/apps/dokploy/templates/aptabase/docker-compose.yml index 934fd1ee..dfde1cae 100644 --- a/apps/dokploy/templates/aptabase/docker-compose.yml +++ b/apps/dokploy/templates/aptabase/docker-compose.yml @@ -7,8 +7,7 @@ services: environment: POSTGRES_USER: aptabase POSTGRES_PASSWORD: sTr0NGp4ssw0rd - networks: - - dokploy-network + healthcheck: test: ["CMD-SHELL", "pg_isready -U aptabase"] interval: 10s @@ -27,8 +26,7 @@ services: nofile: soft: 262144 hard: 262144 - networks: - - dokploy-network + healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:8123 || exit 1"] interval: 10s diff --git a/apps/dokploy/templates/blender/index.ts b/apps/dokploy/templates/blender/index.ts index 84e52755..79508bed 100644 --- a/apps/dokploy/templates/blender/index.ts +++ b/apps/dokploy/templates/blender/index.ts @@ -7,7 +7,7 @@ import { } from "../utils"; export function generate(schema: Schema): Template { - const mainServiceHash = generateHash(schema.projectName); + const _mainServiceHash = generateHash(schema.projectName); const mainDomain = generateRandomDomain(schema); const domains: DomainSchema[] = [ diff --git a/apps/dokploy/templates/budibase/docker-compose.yml b/apps/dokploy/templates/budibase/docker-compose.yml index 3f82de3e..d1d6744a 100644 --- a/apps/dokploy/templates/budibase/docker-compose.yml +++ b/apps/dokploy/templates/budibase/docker-compose.yml @@ -2,8 +2,7 @@ services: apps: image: budibase.docker.scarf.sh/budibase/apps:3.2.25 restart: unless-stopped - networks: - - dokploy-network + environment: SELF_HOSTED: 1 LOG_LEVEL: info @@ -43,8 +42,7 @@ services: worker: image: budibase.docker.scarf.sh/budibase/worker:3.2.25 restart: unless-stopped - networks: - - dokploy-network + environment: SELF_HOSTED: 1 LOG_LEVEL: info @@ -83,8 +81,7 @@ services: minio: image: minio/minio:RELEASE.2024-11-07T00-52-20Z restart: unless-stopped - networks: - - dokploy-network + volumes: - 'minio_data:/data' environment: @@ -104,8 +101,7 @@ services: proxy: image: budibase/proxy:3.2.25 restart: unless-stopped - networks: - - dokploy-network + environment: PROXY_RATE_LIMIT_WEBHOOKS_PER_SECOND: 10 PROXY_RATE_LIMIT_API_PER_SECOND: 20 @@ -137,8 +133,7 @@ services: couchdb: image: budibase/couchdb:v3.3.3 restart: unless-stopped - networks: - - dokploy-network + environment: COUCHDB_USER: budibase COUCHDB_PASSWORD: ${BB_COUCHDB_PASSWORD} @@ -157,8 +152,7 @@ services: - 'couchdb3_data:/opt/couchdb/data' redis: image: redis:7.2-alpine - networks: - - dokploy-network + restart: unless-stopped command: 'redis-server --requirepass "${BB_REDIS_PASSWORD}"' volumes: @@ -176,8 +170,7 @@ services: start_period: 10s watchtower: restart: unless-stopped - networks: - - dokploy-network + image: containrrr/watchtower:1.7.1 volumes: - '/var/run/docker.sock:/var/run/docker.sock' diff --git a/apps/dokploy/templates/calcom/docker-compose.yml b/apps/dokploy/templates/calcom/docker-compose.yml index 7a1d8c92..a309a1da 100644 --- a/apps/dokploy/templates/calcom/docker-compose.yml +++ b/apps/dokploy/templates/calcom/docker-compose.yml @@ -1,8 +1,7 @@ services: postgres: image: postgres:16-alpine - networks: - - dokploy-network + volumes: - calcom-data:/var/lib/postgresql/data environment: diff --git a/apps/dokploy/templates/chatwoot/docker-compose.yml b/apps/dokploy/templates/chatwoot/docker-compose.yml index 8b762e36..b24ca0b5 100644 --- a/apps/dokploy/templates/chatwoot/docker-compose.yml +++ b/apps/dokploy/templates/chatwoot/docker-compose.yml @@ -51,8 +51,7 @@ services: restart: always volumes: - chatwoot-postgres-data:/var/lib/postgresql/data - networks: - - dokploy-network + environment: - POSTGRES_DB=${POSTGRES_DATABASE} - POSTGRES_USER=${POSTGRES_USERNAME} @@ -63,8 +62,7 @@ services: restart: always volumes: - chatwoot-redis-data:/data - networks: - - dokploy-network + networks: dokploy-network: diff --git a/apps/dokploy/templates/checkmate/docker-compose.yml b/apps/dokploy/templates/checkmate/docker-compose.yml index dc83a28f..7a5fc898 100644 --- a/apps/dokploy/templates/checkmate/docker-compose.yml +++ b/apps/dokploy/templates/checkmate/docker-compose.yml @@ -9,8 +9,7 @@ services: - 443 depends_on: - server - networks: - - dokploy-network + server: image: bluewaveuptime/uptime_server:latest restart: always @@ -22,8 +21,7 @@ services: environment: - DB_CONNECTION_STRING=mongodb://mongodb:27017/uptime_db - REDIS_HOST=redis - networks: - - dokploy-network + # volumes: # - /var/run/docker.sock:/var/run/docker.sock:ro redis: @@ -33,8 +31,7 @@ services: - 6379 volumes: - ../files/redis/data:/data - networks: - - dokploy-network + mongodb: image: bluewaveuptime/uptime_database_mongo:latest restart: always @@ -43,5 +40,3 @@ services: command: ["mongod", "--quiet"] ports: - 27017 - networks: - - dokploy-network \ No newline at end of file diff --git a/apps/dokploy/templates/cloudflared/index.ts b/apps/dokploy/templates/cloudflared/index.ts index 661fa31d..93ea091c 100644 --- a/apps/dokploy/templates/cloudflared/index.ts +++ b/apps/dokploy/templates/cloudflared/index.ts @@ -1,6 +1,6 @@ import type { Schema, Template } from "../utils"; -export function generate(schema: Schema): Template { +export function generate(_schema: Schema): Template { const envs = [`CLOUDFLARE_TUNNEL_TOKEN=""`]; return { diff --git a/apps/dokploy/templates/coder/docker-compose.yml b/apps/dokploy/templates/coder/docker-compose.yml index 27bb14bd..875c7ae8 100644 --- a/apps/dokploy/templates/coder/docker-compose.yml +++ b/apps/dokploy/templates/coder/docker-compose.yml @@ -1,8 +1,7 @@ services: coder: image: ghcr.io/coder/coder:v2.15.3 - networks: - - dokploy-network + volumes: - /var/run/docker.sock:/var/run/docker.sock group_add: @@ -17,8 +16,7 @@ services: db: image: postgres:17 - networks: - - dokploy-network + environment: - POSTGRES_PASSWORD - POSTGRES_USER diff --git a/apps/dokploy/templates/convex/docker-compose.yml b/apps/dokploy/templates/convex/docker-compose.yml new file mode 100644 index 00000000..12e2b5ad --- /dev/null +++ b/apps/dokploy/templates/convex/docker-compose.yml @@ -0,0 +1,37 @@ +services: + backend: + image: ghcr.io/get-convex/convex-backend:6c974d219776b753cd23d26f4a296629ff7c2cad + ports: + - "${PORT:-3210}:3210" + - "${SITE_PROXY_PORT:-3211}:3211" + volumes: + - data:/convex/data + environment: + - INSTANCE_NAME=${INSTANCE_NAME:-} + - INSTANCE_SECRET=${INSTANCE_SECRET:-} + - CONVEX_RELEASE_VERSION_DEV=${CONVEX_RELEASE_VERSION_DEV:-} + - ACTIONS_USER_TIMEOUT_SECS=${ACTIONS_USER_TIMEOUT_SECS:-} + - CONVEX_CLOUD_ORIGIN=${CONVEX_CLOUD_ORIGIN:-http://127.0.0.1:3210} + - CONVEX_SITE_ORIGIN=${CONVEX_SITE_ORIGIN:-http://127.0.0.1:3211} + - DATABASE_URL=${DATABASE_URL:-} + - DISABLE_BEACON=${DISABLE_BEACON:-} + - REDACT_LOGS_TO_CLIENT=${REDACT_LOGS_TO_CLIENT:-} + - RUST_LOG=${RUST_LOG:-info} + - RUST_BACKTRACE=${RUST_BACKTRACE:-} + healthcheck: + test: curl -f http://localhost:3210/version + interval: 5s + start_period: 5s + + dashboard: + image: ghcr.io/get-convex/convex-dashboard:4499dd4fd7f2148687a7774599c613d052950f46 + ports: + - "${DASHBOARD_PORT:-6791}:6791" + environment: + - NEXT_PUBLIC_DEPLOYMENT_URL=${NEXT_PUBLIC_DEPLOYMENT_URL:-http://127.0.0.1:3210} + depends_on: + backend: + condition: service_healthy + +volumes: + data: diff --git a/apps/dokploy/templates/convex/index.ts b/apps/dokploy/templates/convex/index.ts new file mode 100644 index 00000000..badfe732 --- /dev/null +++ b/apps/dokploy/templates/convex/index.ts @@ -0,0 +1,38 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const dashboardDomain = generateRandomDomain(schema); + const backendDomain = generateRandomDomain(schema); + const actionsDomain = generateRandomDomain(schema); + + const domains: DomainSchema[] = [ + { + host: dashboardDomain, + port: 6791, + serviceName: "dashboard", + }, + { + host: backendDomain, + port: 3210, + serviceName: "backend", + }, + { + host: actionsDomain, + port: 3211, + serviceName: "backend", + }, + ]; + + const envs = [ + `NEXT_PUBLIC_DEPLOYMENT_URL=http://${backendDomain}`, + `CONVEX_CLOUD_ORIGIN=http://${backendDomain}`, + `CONVEX_SITE_ORIGIN=http://${actionsDomain}`, + ]; + + return { envs, domains }; +} diff --git a/apps/dokploy/templates/directus/docker-compose.yml b/apps/dokploy/templates/directus/docker-compose.yml index 20f1b45d..52e64baf 100644 --- a/apps/dokploy/templates/directus/docker-compose.yml +++ b/apps/dokploy/templates/directus/docker-compose.yml @@ -3,8 +3,7 @@ services: image: postgis/postgis:13-master volumes: - directus_database:/var/lib/postgresql/data - networks: - - dokploy-network + environment: POSTGRES_USER: "directus" POSTGRES_PASSWORD: ${DATABASE_PASSWORD} @@ -26,8 +25,7 @@ services: retries: 5 start_interval: 5s start_period: 30s - networks: - - dokploy-network + directus: image: directus/directus:11.0.2 diff --git a/apps/dokploy/templates/discord-tickets/docker-compose.yml b/apps/dokploy/templates/discord-tickets/docker-compose.yml index e6e41288..f797a77b 100644 --- a/apps/dokploy/templates/discord-tickets/docker-compose.yml +++ b/apps/dokploy/templates/discord-tickets/docker-compose.yml @@ -4,8 +4,7 @@ services: tickets-postgres: image: mysql:8 restart: unless-stopped - networks: - - dokploy-network + volumes: - tickets-mysql-data:/var/lib/mysql environment: @@ -25,8 +24,7 @@ services: tickets-postgres: condition: service_healthy restart: unless-stopped - networks: - - dokploy-network + volumes: - tickets-app-data:/home/container/user - /etc/timezone:/etc/timezone:ro diff --git a/apps/dokploy/templates/discourse/docker-compose.yml b/apps/dokploy/templates/discourse/docker-compose.yml index ce6106be..2b938b85 100644 --- a/apps/dokploy/templates/discourse/docker-compose.yml +++ b/apps/dokploy/templates/discourse/docker-compose.yml @@ -3,8 +3,7 @@ version: '3.7' services: discourse-db: image: docker.io/bitnami/postgresql:17 - networks: - - dokploy-network + volumes: - discourse-postgresql-data:/bitnami/postgresql environment: @@ -20,8 +19,7 @@ services: discourse-redis: image: docker.io/bitnami/redis:7.4 - networks: - - dokploy-network + volumes: - discourse-redis-data:/bitnami/redis environment: @@ -35,8 +33,7 @@ services: discourse-app: image: docker.io/bitnami/discourse:3.3.2 - networks: - - dokploy-network + volumes: - discourse-data:/bitnami/discourse depends_on: @@ -63,8 +60,7 @@ services: discourse-sidekiq: image: docker.io/bitnami/discourse:3.3.2 - networks: - - dokploy-network + volumes: - discourse-sidekiq-data:/bitnami/discourse depends_on: diff --git a/apps/dokploy/templates/docmost/docker-compose.yml b/apps/dokploy/templates/docmost/docker-compose.yml index a6ebbd4f..b5995594 100644 --- a/apps/dokploy/templates/docmost/docker-compose.yml +++ b/apps/dokploy/templates/docmost/docker-compose.yml @@ -12,8 +12,7 @@ services: - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?schema=public - REDIS_URL=redis://redis:6379 restart: unless-stopped - networks: - - dokploy-network + volumes: - docmost:/app/data/storage @@ -24,16 +23,14 @@ services: - POSTGRES_USER - POSTGRES_PASSWORD restart: unless-stopped - networks: - - dokploy-network + volumes: - db_docmost_data:/var/lib/postgresql/data redis: image: redis:7.2-alpine restart: unless-stopped - networks: - - dokploy-network + volumes: - redis_docmost_data:/data diff --git a/apps/dokploy/templates/documenso/docker-compose.yml b/apps/dokploy/templates/documenso/docker-compose.yml index 562fe498..9b8e8ed8 100644 --- a/apps/dokploy/templates/documenso/docker-compose.yml +++ b/apps/dokploy/templates/documenso/docker-compose.yml @@ -2,8 +2,7 @@ version: "3.8" services: postgres: image: postgres:16 - networks: - - dokploy-network + volumes: - documenso-data:/var/lib/postgresql/data environment: diff --git a/apps/dokploy/templates/drawio/docker-compose.yml b/apps/dokploy/templates/drawio/docker-compose.yml index 1712363f..a7d7b578 100644 --- a/apps/dokploy/templates/drawio/docker-compose.yml +++ b/apps/dokploy/templates/drawio/docker-compose.yml @@ -4,16 +4,14 @@ services: image: plantuml/plantuml-server ports: - "8080" - networks: - - dokploy-network + volumes: - fonts_volume:/usr/share/fonts/drawio image-export: image: jgraph/export-server ports: - "8000" - networks: - - dokploy-network + volumes: - fonts_volume:/usr/share/fonts/drawio environment: @@ -28,8 +26,7 @@ services: depends_on: - plantuml-server - image-export - networks: - - dokploy-network + environment: RAWIO_SELF_CONTAINED: 1 DRAWIO_USE_HTTP: 1 diff --git a/apps/dokploy/templates/drawio/index.ts b/apps/dokploy/templates/drawio/index.ts index e3c57c5a..701283c8 100644 --- a/apps/dokploy/templates/drawio/index.ts +++ b/apps/dokploy/templates/drawio/index.ts @@ -8,7 +8,7 @@ import { export function generate(schema: Schema): Template { const mainDomain = generateRandomDomain(schema); - const secretKeyBase = generateBase64(64); + const _secretKeyBase = generateBase64(64); const domains: DomainSchema[] = [ { diff --git a/apps/dokploy/templates/erpnext/docker-compose.yml b/apps/dokploy/templates/erpnext/docker-compose.yml new file mode 100644 index 00000000..28cd8f6a --- /dev/null +++ b/apps/dokploy/templates/erpnext/docker-compose.yml @@ -0,0 +1,354 @@ +x-custom-image: &custom_image + image: ${IMAGE_NAME:-docker.io/frappe/erpnext}:${VERSION:-version-15} + pull_policy: ${PULL_POLICY:-always} + deploy: + restart_policy: + condition: always + +services: + backend: + <<: *custom_image + volumes: + - sites:/home/frappe/frappe-bench/sites + networks: + - bench-network + healthcheck: + test: + - CMD + - wait-for-it + - '0.0.0.0:8000' + interval: 2s + timeout: 10s + retries: 30 + + frontend: + <<: *custom_image + command: + - nginx-entrypoint.sh + depends_on: + backend: + condition: service_started + required: true + websocket: + condition: service_started + required: true + environment: + BACKEND: backend:8000 + FRAPPE_SITE_NAME_HEADER: ${FRAPPE_SITE_NAME_HEADER:-$$host} + SOCKETIO: websocket:9000 + UPSTREAM_REAL_IP_ADDRESS: 127.0.0.1 + UPSTREAM_REAL_IP_HEADER: X-Forwarded-For + UPSTREAM_REAL_IP_RECURSIVE: "off" + volumes: + - sites:/home/frappe/frappe-bench/sites + + networks: + - bench-network + + healthcheck: + test: + - CMD + - wait-for-it + - '0.0.0.0:8080' + interval: 2s + timeout: 30s + retries: 30 + + queue-default: + <<: *custom_image + command: + - bench + - worker + - --queue + - default + volumes: + - sites:/home/frappe/frappe-bench/sites + networks: + - bench-network + healthcheck: + test: + - CMD + - wait-for-it + - 'redis-queue:6379' + interval: 2s + timeout: 10s + retries: 30 + depends_on: + configurator: + condition: service_completed_successfully + required: true + + queue-long: + <<: *custom_image + command: + - bench + - worker + - --queue + - long + volumes: + - sites:/home/frappe/frappe-bench/sites + networks: + - bench-network + healthcheck: + test: + - CMD + - wait-for-it + - 'redis-queue:6379' + interval: 2s + timeout: 10s + retries: 30 + depends_on: + configurator: + condition: service_completed_successfully + required: true + + queue-short: + <<: *custom_image + command: + - bench + - worker + - --queue + - short + volumes: + - sites:/home/frappe/frappe-bench/sites + networks: + - bench-network + healthcheck: + test: + - CMD + - wait-for-it + - 'redis-queue:6379' + interval: 2s + timeout: 10s + retries: 30 + depends_on: + configurator: + condition: service_completed_successfully + required: true + + scheduler: + <<: *custom_image + healthcheck: + test: + - CMD + - wait-for-it + - 'redis-queue:6379' + interval: 2s + timeout: 10s + retries: 30 + command: + - bench + - schedule + depends_on: + configurator: + condition: service_completed_successfully + required: true + volumes: + - sites:/home/frappe/frappe-bench/sites + networks: + - bench-network + + websocket: + <<: *custom_image + healthcheck: + test: + - CMD + - wait-for-it + - '0.0.0.0:9000' + interval: 2s + timeout: 10s + retries: 30 + command: + - node + - /home/frappe/frappe-bench/apps/frappe/socketio.js + depends_on: + configurator: + condition: service_completed_successfully + required: true + volumes: + - sites:/home/frappe/frappe-bench/sites + networks: + - bench-network + + configurator: + <<: *custom_image + deploy: + mode: replicated + replicas: ${CONFIGURE:-0} + restart_policy: + condition: none + entrypoint: ["bash", "-c"] + command: + - > + [[ $${REGENERATE_APPS_TXT} == "1" ]] && ls -1 apps > sites/apps.txt; + [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".db_host // empty"` ]] && exit 0; + bench set-config -g db_host $$DB_HOST; + bench set-config -gp db_port $$DB_PORT; + bench set-config -g redis_cache "redis://$$REDIS_CACHE"; + bench set-config -g redis_queue "redis://$$REDIS_QUEUE"; + bench set-config -g redis_socketio "redis://$$REDIS_QUEUE"; + bench set-config -gp socketio_port $$SOCKETIO_PORT; + environment: + DB_HOST: "${DB_HOST:-db}" + DB_PORT: "3306" + REDIS_CACHE: redis-cache:6379 + REDIS_QUEUE: redis-queue:6379 + SOCKETIO_PORT: "9000" + REGENERATE_APPS_TXT: "${REGENERATE_APPS_TXT:-0}" + volumes: + - sites:/home/frappe/frappe-bench/sites + networks: + - bench-network + + create-site: + <<: *custom_image + deploy: + mode: replicated + replicas: ${CREATE_SITE:-0} + restart_policy: + condition: none + entrypoint: ["bash", "-c"] + command: + - > + wait-for-it -t 120 $$DB_HOST:$$DB_PORT; + wait-for-it -t 120 redis-cache:6379; + wait-for-it -t 120 redis-queue:6379; + export start=`date +%s`; + until [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".db_host // empty"` ]] && \ + [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".redis_cache // empty"` ]] && \ + [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".redis_queue // empty"` ]]; + do + echo "Waiting for sites/common_site_config.json to be created"; + sleep 5; + if (( `date +%s`-start > 120 )); then + echo "could not find sites/common_site_config.json with required keys"; + exit 1 + fi + done; + echo "sites/common_site_config.json found"; + [[ -d "sites/${SITE_NAME}" ]] && echo "${SITE_NAME} already exists" && exit 0; + bench new-site --mariadb-user-host-login-scope='%' --admin-password=$${ADMIN_PASSWORD} --db-root-username=root --db-root-password=$${DB_ROOT_PASSWORD} $${INSTALL_APP_ARGS} $${SITE_NAME}; + volumes: + - sites:/home/frappe/frappe-bench/sites + environment: + SITE_NAME: ${SITE_NAME} + ADMIN_PASSWORD: ${ADMIN_PASSWORD} + DB_HOST: ${DB_HOST:-db} + DB_PORT: "${DB_PORT:-3306}" + DB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} + INSTALL_APP_ARGS: ${INSTALL_APP_ARGS} + networks: + - bench-network + + migration: + <<: *custom_image + deploy: + mode: replicated + replicas: ${MIGRATE:-0} + restart_policy: + condition: none + entrypoint: ["bash", "-c"] + command: + - > + curl -f http://${SITE_NAME}:8080/api/method/ping || echo "Site busy" && exit 0; + bench --site all set-config -p maintenance_mode 1; + bench --site all set-config -p pause_scheduler 1; + bench --site all migrate; + bench --site all set-config -p maintenance_mode 0; + bench --site all set-config -p pause_scheduler 0; + volumes: + - sites:/home/frappe/frappe-bench/sites + networks: + - bench-network + + db: + image: mariadb:10.6 + deploy: + mode: replicated + replicas: ${ENABLE_DB:-0} + restart_policy: + condition: always + healthcheck: + test: mysqladmin ping -h localhost --password=${DB_ROOT_PASSWORD} + interval: 1s + retries: 20 + command: + - --character-set-server=utf8mb4 + - --collation-server=utf8mb4_unicode_ci + - --skip-character-set-client-handshake + - --skip-innodb-read-only-compressed + environment: + - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD} + - MARIADB_ROOT_PASSWORD=${DB_ROOT_PASSWORD} + volumes: + - db-data:/var/lib/mysql + networks: + - bench-network + + redis-cache: + deploy: + restart_policy: + condition: always + image: redis:6.2-alpine + volumes: + - redis-cache-data:/data + networks: + - bench-network + healthcheck: + test: + - CMD + - redis-cli + - ping + interval: 5s + timeout: 5s + retries: 3 + + redis-queue: + deploy: + restart_policy: + condition: always + image: redis:6.2-alpine + volumes: + - redis-queue-data:/data + networks: + - bench-network + healthcheck: + test: + - CMD + - redis-cli + - ping + interval: 5s + timeout: 5s + retries: 3 + + redis-socketio: + deploy: + restart_policy: + condition: always + image: redis:6.2-alpine + volumes: + - redis-socketio-data:/data + networks: + - bench-network + healthcheck: + test: + - CMD + - redis-cli + - ping + interval: 5s + timeout: 5s + retries: 3 + +volumes: + db-data: + redis-cache-data: + redis-queue-data: + redis-socketio-data: + sites: + driver_opts: + type: "${SITE_VOLUME_TYPE}" + o: "${SITE_VOLUME_OPTS}" + device: "${SITE_VOLUME_DEV}" + +networks: + bench-network: \ No newline at end of file diff --git a/apps/dokploy/templates/erpnext/index.ts b/apps/dokploy/templates/erpnext/index.ts new file mode 100644 index 00000000..5b7543b9 --- /dev/null +++ b/apps/dokploy/templates/erpnext/index.ts @@ -0,0 +1,39 @@ +import { + type DomainSchema, + type Schema, + type Template, + generatePassword, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const dbRootPassword = generatePassword(32); + const adminPassword = generatePassword(32); + const mainDomain = generateRandomDomain(schema); + + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 8080, + serviceName: "frontend", + }, + ]; + + const envs = [ + `SITE_NAME=${mainDomain}`, + `ADMIN_PASSWORD=${adminPassword}`, + `DB_ROOT_PASSWORD=${dbRootPassword}`, + "MIGRATE=1", + "ENABLE_DB=1", + "DB_HOST=db", + "CREATE_SITE=1", + "CONFIGURE=1", + "REGENERATE_APPS_TXT=1", + "INSTALL_APP_ARGS=--install-app erpnext", + "IMAGE_NAME=docker.io/frappe/erpnext", + "VERSION=version-15", + "FRAPPE_SITE_NAME_HEADER=", + ]; + + return { envs, domains }; +} diff --git a/apps/dokploy/templates/evolutionapi/docker-compose.yml b/apps/dokploy/templates/evolutionapi/docker-compose.yml new file mode 100644 index 00000000..d4803de1 --- /dev/null +++ b/apps/dokploy/templates/evolutionapi/docker-compose.yml @@ -0,0 +1,58 @@ +services: + evolution-api: + image: atendai/evolution-api:v2.1.2 + restart: always + volumes: + - evolution-instances:/evolution/instances + + environment: + - SERVER_URL=${SERVER_URL} + - AUTHENTICATION_TYPE=${AUTHENTICATION_TYPE} + - AUTHENTICATION_API_KEY=${AUTHENTICATION_API_KEY} + - AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=${AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES} + - LANGUAGE=${LANGUAGE} + - CONFIG_SESSION_PHONE_CLIENT=${CONFIG_SESSION_PHONE_CLIENT} + - CONFIG_SESSION_PHONE_NAME=${CONFIG_SESSION_PHONE_NAME} + - TELEMETRY=${TELEMETRY} + - TELEMETRY_URL=${TELEMETRY_URL} + - DATABASE_ENABLED=${DATABASE_ENABLED} + - DATABASE_PROVIDER=${DATABASE_PROVIDER} + - DATABASE_CONNECTION_URI=${DATABASE_CONNECTION_URI} + - DATABASE_SAVE_DATA_INSTANCE=${DATABASE_SAVE_DATA_INSTANCE} + - DATABASE_SAVE_DATA_NEW_MESSAGE=${DATABASE_SAVE_DATA_NEW_MESSAGE} + - DATABASE_SAVE_MESSAGE_UPDATE=${DATABASE_SAVE_MESSAGE_UPDATE} + - DATABASE_SAVE_DATA_CONTACTS=${DATABASE_SAVE_DATA_CONTACTS} + - DATABASE_SAVE_DATA_CHATS=${DATABASE_SAVE_DATA_CHATS} + - DATABASE_SAVE_DATA_LABELS=${DATABASE_SAVE_DATA_LABELS} + - DATABASE_SAVE_DATA_HISTORIC=${DATABASE_SAVE_DATA_HISTORIC} + - CACHE_REDIS_ENABLED=${CACHE_REDIS_ENABLED} + - CACHE_REDIS_URI=${CACHE_REDIS_URI} + - CACHE_REDIS_PREFIX_KEY=${CACHE_REDIS_PREFIX_KEY} + - CACHE_REDIS_SAVE_INSTANCES=${CACHE_REDIS_SAVE_INSTANCES} + + evolution-postgres: + image: postgres:16-alpine + restart: always + volumes: + - evolution-postgres-data:/var/lib/postgresql/data + + environment: + - POSTGRES_DB=${POSTGRES_DATABASE} + - POSTGRES_USER=${POSTGRES_USERNAME} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + + evolution-redis: + image: redis:alpine + restart: always + volumes: + - evolution-redis-data:/data + + +networks: + dokploy-network: + external: true + +volumes: + evolution-instances: + evolution-postgres-data: + evolution-redis-data: \ No newline at end of file diff --git a/apps/dokploy/templates/evolutionapi/index.ts b/apps/dokploy/templates/evolutionapi/index.ts new file mode 100644 index 00000000..6ca7a3b6 --- /dev/null +++ b/apps/dokploy/templates/evolutionapi/index.ts @@ -0,0 +1,59 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateBase64, + generatePassword, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainDomain = generateRandomDomain(schema); + const apiKey = generateBase64(64); + const postgresPassword = generatePassword(); + + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 8080, + serviceName: "evolution-api", + }, + ]; + + const envs = [ + `SERVER_URL=https://${mainDomain}`, + "AUTHENTICATION_TYPE=apikey", + `AUTHENTICATION_API_KEY=${apiKey}`, + "AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true", + + "LANGUAGE=en", + "CONFIG_SESSION_PHONE_CLIENT=Evolution API", + "CONFIG_SESSION_PHONE_NAME=Chrome", + "TELEMETRY=false", + "TELEMETRY_URL=", + + "POSTGRES_DATABASE=evolution", + "POSTGRES_USERNAME=postgresql", + `POSTGRES_PASSWORD=${postgresPassword}`, + "DATABASE_ENABLED=true", + "DATABASE_PROVIDER=postgresql", + `DATABASE_CONNECTION_URI=postgres://postgresql:${postgresPassword}@evolution-postgres:5432/evolution`, + "DATABASE_SAVE_DATA_INSTANCE=true", + "DATABASE_SAVE_DATA_NEW_MESSAGE=true", + "DATABASE_SAVE_MESSAGE_UPDATE=true", + "DATABASE_SAVE_DATA_CONTACTS=true", + "DATABASE_SAVE_DATA_CHATS=true", + "DATABASE_SAVE_DATA_LABELS=true", + "DATABASE_SAVE_DATA_HISTORIC=true", + + "CACHE_REDIS_ENABLED=true", + "CACHE_REDIS_URI=redis://evolution-redis:6379", + "CACHE_REDIS_PREFIX_KEY=evolution", + "CACHE_REDIS_SAVE_INSTANCES=true", + ]; + + return { + domains, + envs, + }; +} diff --git a/apps/dokploy/templates/excalidraw/docker-compose.yml b/apps/dokploy/templates/excalidraw/docker-compose.yml index 8743434b..3cf2fb1d 100644 --- a/apps/dokploy/templates/excalidraw/docker-compose.yml +++ b/apps/dokploy/templates/excalidraw/docker-compose.yml @@ -2,6 +2,5 @@ version: "3.8" services: excalidraw: - networks: - - dokploy-network + image: excalidraw/excalidraw:latest diff --git a/apps/dokploy/templates/excalidraw/index.ts b/apps/dokploy/templates/excalidraw/index.ts index 13a43c44..7f73f395 100644 --- a/apps/dokploy/templates/excalidraw/index.ts +++ b/apps/dokploy/templates/excalidraw/index.ts @@ -2,7 +2,6 @@ import { type DomainSchema, type Schema, type Template, - generateHash, generateRandomDomain, } from "../utils"; diff --git a/apps/dokploy/templates/formbricks/docker-compose.yml b/apps/dokploy/templates/formbricks/docker-compose.yml new file mode 100644 index 00000000..ad1dcbcf --- /dev/null +++ b/apps/dokploy/templates/formbricks/docker-compose.yml @@ -0,0 +1,37 @@ +x-environment: &environment + environment: + WEBAPP_URL: ${WEBAPP_URL} + NEXTAUTH_URL: ${NEXTAUTH_URL} + DATABASE_URL: "postgresql://postgres:postgres@postgres:5432/formbricks?schema=public" + NEXTAUTH_SECRET: ${NEXTAUTH_SECRET} + ENCRYPTION_KEY: ${ENCRYPTION_KEY} + CRON_SECRET: ${CRON_SECRET} + EMAIL_VERIFICATION_DISABLED: 1 + PASSWORD_RESET_DISABLED: 1 + S3_FORCE_PATH_STYLE: 0 + +services: + postgres: + restart: always + image: pgvector/pgvector:pg17 + volumes: + - postgres:/var/lib/postgresql/data + environment: + - POSTGRES_PASSWORD=postgres + + + formbricks: + restart: always + image: ghcr.io/formbricks/formbricks:v3.1.3 + depends_on: + - postgres + ports: + - 3000 + volumes: + - ../files/uploads:/home/nextjs/apps/web/uploads/ + <<: *environment + +volumes: + postgres: + driver: local + uploads: diff --git a/apps/dokploy/templates/formbricks/index.ts b/apps/dokploy/templates/formbricks/index.ts new file mode 100644 index 00000000..fc179f49 --- /dev/null +++ b/apps/dokploy/templates/formbricks/index.ts @@ -0,0 +1,38 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateBase64, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainDomain = generateRandomDomain(schema); + const secretBase = generateBase64(64); + const encryptionKey = generateBase64(48); + const cronSecret = generateBase64(32); + + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 3000, + serviceName: "formbricks", + }, + ]; + + const envs = [ + `WEBAPP_URL=http://${mainDomain}`, + `NEXTAUTH_URL=http://${mainDomain}`, + `NEXTAUTH_SECRET=${secretBase}`, + `ENCRYPTION_KEY=${encryptionKey}`, + `CRON_SECRET=${cronSecret}`, + ]; + + const mounts: Template["mounts"] = []; + + return { + envs, + mounts, + domains, + }; +} diff --git a/apps/dokploy/templates/frappe-hr/docker-compose.yml b/apps/dokploy/templates/frappe-hr/docker-compose.yml new file mode 100644 index 00000000..a7ce9b26 --- /dev/null +++ b/apps/dokploy/templates/frappe-hr/docker-compose.yml @@ -0,0 +1,354 @@ +x-custom-image: &custom_image + image: ${IMAGE_NAME:-ghcr.io/frappe/hrms}:${VERSION:-version-15} + pull_policy: ${PULL_POLICY:-always} + deploy: + restart_policy: + condition: always + +services: + backend: + <<: *custom_image + volumes: + - sites:/home/frappe/frappe-bench/sites + networks: + - bench-network + healthcheck: + test: + - CMD + - wait-for-it + - '0.0.0.0:8000' + interval: 2s + timeout: 10s + retries: 30 + + frontend: + <<: *custom_image + command: + - nginx-entrypoint.sh + depends_on: + backend: + condition: service_started + required: true + websocket: + condition: service_started + required: true + environment: + BACKEND: backend:8000 + FRAPPE_SITE_NAME_HEADER: ${FRAPPE_SITE_NAME_HEADER:-$$host} + SOCKETIO: websocket:9000 + UPSTREAM_REAL_IP_ADDRESS: 127.0.0.1 + UPSTREAM_REAL_IP_HEADER: X-Forwarded-For + UPSTREAM_REAL_IP_RECURSIVE: "off" + volumes: + - sites:/home/frappe/frappe-bench/sites + + networks: + - bench-network + + healthcheck: + test: + - CMD + - wait-for-it + - '0.0.0.0:8080' + interval: 2s + timeout: 30s + retries: 30 + + queue-default: + <<: *custom_image + command: + - bench + - worker + - --queue + - default + volumes: + - sites:/home/frappe/frappe-bench/sites + networks: + - bench-network + healthcheck: + test: + - CMD + - wait-for-it + - 'redis-queue:6379' + interval: 2s + timeout: 10s + retries: 30 + depends_on: + configurator: + condition: service_completed_successfully + required: true + + queue-long: + <<: *custom_image + command: + - bench + - worker + - --queue + - long + volumes: + - sites:/home/frappe/frappe-bench/sites + networks: + - bench-network + healthcheck: + test: + - CMD + - wait-for-it + - 'redis-queue:6379' + interval: 2s + timeout: 10s + retries: 30 + depends_on: + configurator: + condition: service_completed_successfully + required: true + + queue-short: + <<: *custom_image + command: + - bench + - worker + - --queue + - short + volumes: + - sites:/home/frappe/frappe-bench/sites + networks: + - bench-network + healthcheck: + test: + - CMD + - wait-for-it + - 'redis-queue:6379' + interval: 2s + timeout: 10s + retries: 30 + depends_on: + configurator: + condition: service_completed_successfully + required: true + + scheduler: + <<: *custom_image + healthcheck: + test: + - CMD + - wait-for-it + - 'redis-queue:6379' + interval: 2s + timeout: 10s + retries: 30 + command: + - bench + - schedule + depends_on: + configurator: + condition: service_completed_successfully + required: true + volumes: + - sites:/home/frappe/frappe-bench/sites + networks: + - bench-network + + websocket: + <<: *custom_image + healthcheck: + test: + - CMD + - wait-for-it + - '0.0.0.0:9000' + interval: 2s + timeout: 10s + retries: 30 + command: + - node + - /home/frappe/frappe-bench/apps/frappe/socketio.js + depends_on: + configurator: + condition: service_completed_successfully + required: true + volumes: + - sites:/home/frappe/frappe-bench/sites + networks: + - bench-network + + configurator: + <<: *custom_image + deploy: + mode: replicated + replicas: ${CONFIGURE:-0} + restart_policy: + condition: none + entrypoint: ["bash", "-c"] + command: + - > + [[ $${REGENERATE_APPS_TXT} == "1" ]] && ls -1 apps > sites/apps.txt; + [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".db_host // empty"` ]] && exit 0; + bench set-config -g db_host $$DB_HOST; + bench set-config -gp db_port $$DB_PORT; + bench set-config -g redis_cache "redis://$$REDIS_CACHE"; + bench set-config -g redis_queue "redis://$$REDIS_QUEUE"; + bench set-config -g redis_socketio "redis://$$REDIS_QUEUE"; + bench set-config -gp socketio_port $$SOCKETIO_PORT; + environment: + DB_HOST: "${DB_HOST:-db}" + DB_PORT: "3306" + REDIS_CACHE: redis-cache:6379 + REDIS_QUEUE: redis-queue:6379 + SOCKETIO_PORT: "9000" + REGENERATE_APPS_TXT: "${REGENERATE_APPS_TXT:-0}" + volumes: + - sites:/home/frappe/frappe-bench/sites + networks: + - bench-network + + create-site: + <<: *custom_image + deploy: + mode: replicated + replicas: ${CREATE_SITE:-0} + restart_policy: + condition: none + entrypoint: ["bash", "-c"] + command: + - > + wait-for-it -t 120 $$DB_HOST:$$DB_PORT; + wait-for-it -t 120 redis-cache:6379; + wait-for-it -t 120 redis-queue:6379; + export start=`date +%s`; + until [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".db_host // empty"` ]] && \ + [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".redis_cache // empty"` ]] && \ + [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".redis_queue // empty"` ]]; + do + echo "Waiting for sites/common_site_config.json to be created"; + sleep 5; + if (( `date +%s`-start > 120 )); then + echo "could not find sites/common_site_config.json with required keys"; + exit 1 + fi + done; + echo "sites/common_site_config.json found"; + [[ -d "sites/${SITE_NAME}" ]] && echo "${SITE_NAME} already exists" && exit 0; + bench new-site --mariadb-user-host-login-scope='%' --admin-password=$${ADMIN_PASSWORD} --db-root-username=root --db-root-password=$${DB_ROOT_PASSWORD} $${INSTALL_APP_ARGS} $${SITE_NAME}; + volumes: + - sites:/home/frappe/frappe-bench/sites + environment: + SITE_NAME: ${SITE_NAME} + ADMIN_PASSWORD: ${ADMIN_PASSWORD} + DB_HOST: ${DB_HOST:-db} + DB_PORT: "${DB_PORT:-3306}" + DB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} + INSTALL_APP_ARGS: ${INSTALL_APP_ARGS} + networks: + - bench-network + + migration: + <<: *custom_image + deploy: + mode: replicated + replicas: ${MIGRATE:-0} + restart_policy: + condition: none + entrypoint: ["bash", "-c"] + command: + - > + curl -f http://${SITE_NAME}:8080/api/method/ping || echo "Site busy" && exit 0; + bench --site all set-config -p maintenance_mode 1; + bench --site all set-config -p pause_scheduler 1; + bench --site all migrate; + bench --site all set-config -p maintenance_mode 0; + bench --site all set-config -p pause_scheduler 0; + volumes: + - sites:/home/frappe/frappe-bench/sites + networks: + - bench-network + + db: + image: mariadb:10.6 + deploy: + mode: replicated + replicas: ${ENABLE_DB:-0} + restart_policy: + condition: always + healthcheck: + test: mysqladmin ping -h localhost --password=${DB_ROOT_PASSWORD} + interval: 1s + retries: 20 + command: + - --character-set-server=utf8mb4 + - --collation-server=utf8mb4_unicode_ci + - --skip-character-set-client-handshake + - --skip-innodb-read-only-compressed + environment: + - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD} + - MARIADB_ROOT_PASSWORD=${DB_ROOT_PASSWORD} + volumes: + - db-data:/var/lib/mysql + networks: + - bench-network + + redis-cache: + deploy: + restart_policy: + condition: always + image: redis:6.2-alpine + volumes: + - redis-cache-data:/data + networks: + - bench-network + healthcheck: + test: + - CMD + - redis-cli + - ping + interval: 5s + timeout: 5s + retries: 3 + + redis-queue: + deploy: + restart_policy: + condition: always + image: redis:6.2-alpine + volumes: + - redis-queue-data:/data + networks: + - bench-network + healthcheck: + test: + - CMD + - redis-cli + - ping + interval: 5s + timeout: 5s + retries: 3 + + redis-socketio: + deploy: + restart_policy: + condition: always + image: redis:6.2-alpine + volumes: + - redis-socketio-data:/data + networks: + - bench-network + healthcheck: + test: + - CMD + - redis-cli + - ping + interval: 5s + timeout: 5s + retries: 3 + +volumes: + db-data: + redis-cache-data: + redis-queue-data: + redis-socketio-data: + sites: + driver_opts: + type: "${SITE_VOLUME_TYPE}" + o: "${SITE_VOLUME_OPTS}" + device: "${SITE_VOLUME_DEV}" + +networks: + bench-network: \ No newline at end of file diff --git a/apps/dokploy/templates/frappe-hr/index.ts b/apps/dokploy/templates/frappe-hr/index.ts new file mode 100644 index 00000000..1e6b9474 --- /dev/null +++ b/apps/dokploy/templates/frappe-hr/index.ts @@ -0,0 +1,39 @@ +import { + type DomainSchema, + type Schema, + type Template, + generatePassword, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const dbRootPassword = generatePassword(32); + const adminPassword = generatePassword(32); + const mainDomain = generateRandomDomain(schema); + + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 8080, + serviceName: "frontend", + }, + ]; + + const envs = [ + `SITE_NAME=${mainDomain}`, + `ADMIN_PASSWORD=${adminPassword}`, + `DB_ROOT_PASSWORD=${dbRootPassword}`, + "MIGRATE=1", + "ENABLE_DB=1", + "DB_HOST=db", + "CREATE_SITE=1", + "CONFIGURE=1", + "REGENERATE_APPS_TXT=1", + "INSTALL_APP_ARGS=--install-app hrms", + "IMAGE_NAME=ghcr.io/frappe/hrms", + "VERSION=version-15", + "FRAPPE_SITE_NAME_HEADER=", + ]; + + return { envs, domains }; +} diff --git a/apps/dokploy/templates/ghost/docker-compose.yml b/apps/dokploy/templates/ghost/docker-compose.yml index 288c59e5..33c47f7f 100644 --- a/apps/dokploy/templates/ghost/docker-compose.yml +++ b/apps/dokploy/templates/ghost/docker-compose.yml @@ -17,8 +17,7 @@ services: db: image: mysql:8.0 restart: always - networks: - - dokploy-network + environment: MYSQL_ROOT_PASSWORD: example volumes: diff --git a/apps/dokploy/templates/ghost/index.ts b/apps/dokploy/templates/ghost/index.ts index 1a88c362..052b7c6b 100644 --- a/apps/dokploy/templates/ghost/index.ts +++ b/apps/dokploy/templates/ghost/index.ts @@ -2,7 +2,6 @@ import { type DomainSchema, type Schema, type Template, - generateHash, generateRandomDomain, } from "../utils"; diff --git a/apps/dokploy/templates/gitea/docker-compose.yml b/apps/dokploy/templates/gitea/docker-compose.yml index 72e0754e..5127224c 100644 --- a/apps/dokploy/templates/gitea/docker-compose.yml +++ b/apps/dokploy/templates/gitea/docker-compose.yml @@ -11,8 +11,7 @@ services: - GITEA__database__USER=gitea - GITEA__database__PASSWD=gitea restart: always - networks: - - dokploy-network + volumes: - gitea_server:/data - /etc/timezone:/etc/timezone:ro @@ -27,8 +26,7 @@ services: - POSTGRES_USER=gitea - POSTGRES_PASSWORD=gitea - POSTGRES_DB=gitea - networks: - - dokploy-network + volumes: - gitea_db:/var/lib/postgresql/data diff --git a/apps/dokploy/templates/glance/docker-compose.yml b/apps/dokploy/templates/glance/docker-compose.yml new file mode 100644 index 00000000..ace8bc94 --- /dev/null +++ b/apps/dokploy/templates/glance/docker-compose.yml @@ -0,0 +1,11 @@ +services: + glance: + image: glanceapp/glance + volumes: + - ../files/app/config/:/app/config + - ../files/app/assets:/app/assets + # Optionally, also mount docker socket if you want to use the docker containers widget + # - /var/run/docker.sock:/var/run/docker.sock:ro + ports: + - 8080 + env_file: .env \ No newline at end of file diff --git a/apps/dokploy/templates/glance/index.ts b/apps/dokploy/templates/glance/index.ts new file mode 100644 index 00000000..a0ab1b67 --- /dev/null +++ b/apps/dokploy/templates/glance/index.ts @@ -0,0 +1,108 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainDomain = generateRandomDomain(schema); + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 8080, + serviceName: "glance", + }, + ]; + + const mounts: Template["mounts"] = [ + { + filePath: "/app/config/glance.yml", + content: ` +branding: + hide-footer: true + logo-text: P + +pages: + - name: Home + columns: + - size: small + widgets: + - type: calendar + + - type: releases + show-source-icon: true + repositories: + - Dokploy/dokploy + - n8n-io/n8n + - Budibase/budibase + - home-assistant/core + - tidbyt/pixlet + + - type: twitch-channels + channels: + - nmplol + - extraemily + - qtcinderella + - ludwig + - timthetatman + - mizkif + + - size: full + widgets: + - type: hacker-news + + - type: videos + style: grid-cards + channels: + - UC3GzdWYwUYI1ACxuP9Nm-eg + - UCGbg3DjQdcqWwqOLHpYHXIg + - UC24RSoLcjiNZbQcT54j5l7Q + limit: 3 + + - type: rss + limit: 10 + collapse-after: 3 + cache: 3h + feeds: + - url: https://daringfireball.net/feeds/main + title: Daring Fireball + + - size: small + widgets: + - type: weather + location: Gansevoort, New York, United States + show-area-name: false + units: imperial + hour-format: 12h + + - type: markets + markets: + - symbol: SPY + name: S&P 500 + - symbol: VOO + name: Vanguard + - symbol: BTC-USD + name: Bitcoin + - symbol: ETH-USD + name: Etherium + - symbol: NVDA + name: NVIDIA + - symbol: AAPL + name: Apple + - symbol: MSFT + name: Microsoft + - symbol: GOOGL + name: Google + - symbol: AMD + name: AMD + - symbol: TSLA + name: Tesla`, + }, + ]; + + return { + domains, + mounts, + }; +} diff --git a/apps/dokploy/templates/glitchtip/docker-compose.yml b/apps/dokploy/templates/glitchtip/docker-compose.yml index e45c7662..f47742f0 100644 --- a/apps/dokploy/templates/glitchtip/docker-compose.yml +++ b/apps/dokploy/templates/glitchtip/docker-compose.yml @@ -20,13 +20,11 @@ services: restart: unless-stopped volumes: - pg-data:/var/lib/postgresql/data - networks: - - dokploy-network + redis: image: redis restart: unless-stopped - networks: - - dokploy-network + web: image: glitchtip/glitchtip:v4.0 depends_on: *default-depends_on @@ -44,15 +42,13 @@ services: restart: unless-stopped volumes: - uploads:/code/uploads - networks: - - dokploy-network + migrate: image: glitchtip/glitchtip:v4.0 depends_on: *default-depends_on command: "./manage.py migrate" environment: *default-environment - networks: - - dokploy-network + volumes: pg-data: diff --git a/apps/dokploy/templates/glpi/docker-compose.yml b/apps/dokploy/templates/glpi/docker-compose.yml index f15cdafe..fa732fa3 100644 --- a/apps/dokploy/templates/glpi/docker-compose.yml +++ b/apps/dokploy/templates/glpi/docker-compose.yml @@ -4,8 +4,7 @@ services: restart: always volumes: - glpi-mysql-data:/var/lib/mysql - networks: - - dokploy-network + glpi-web: image: elestio/glpi:10.0.16 @@ -16,8 +15,7 @@ services: - glpi-www-data:/var/www/html/glpi environment: - TIMEZONE=Europe/Brussels - networks: - - dokploy-network + volumes: glpi-mysql-data: diff --git a/apps/dokploy/templates/hi-events/docker-compose.yml b/apps/dokploy/templates/hi-events/docker-compose.yml index 0ce5b7e7..cce45fec 100644 --- a/apps/dokploy/templates/hi-events/docker-compose.yml +++ b/apps/dokploy/templates/hi-events/docker-compose.yml @@ -28,8 +28,7 @@ services: postgres: image: elestio/postgres:16 restart: always - networks: - - dokploy-network + environment: - POSTGRES_DB - POSTGRES_USER diff --git a/apps/dokploy/templates/homarr/docker-compose.yml b/apps/dokploy/templates/homarr/docker-compose.yml new file mode 100644 index 00000000..876ea3f6 --- /dev/null +++ b/apps/dokploy/templates/homarr/docker-compose.yml @@ -0,0 +1,11 @@ +services: + homarr: + image: ghcr.io/homarr-labs/homarr:latest + restart: unless-stopped + volumes: + # - /var/run/docker.sock:/var/run/docker.sock # Optional, only if you want docker integration + - ../homarr/appdata:/appdata + environment: + - SECRET_ENCRYPTION_KEY=${SECRET_ENCRYPTION_KEY} + ports: + - 7575 diff --git a/apps/dokploy/templates/homarr/index.ts b/apps/dokploy/templates/homarr/index.ts new file mode 100644 index 00000000..eb5a9f82 --- /dev/null +++ b/apps/dokploy/templates/homarr/index.ts @@ -0,0 +1,27 @@ +import { + type DomainSchema, + type Schema, + type Template, + generatePassword, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainDomain = generateRandomDomain(schema); + const secretKey = generatePassword(64); + + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 7575, + serviceName: "homarr", + }, + ]; + + const envs = [`SECRET_ENCRYPTION_KEY=${secretKey}`]; + + return { + domains, + envs, + }; +} diff --git a/apps/dokploy/templates/huly/docker-compose.yml b/apps/dokploy/templates/huly/docker-compose.yml index 471ee7e9..639b10d2 100644 --- a/apps/dokploy/templates/huly/docker-compose.yml +++ b/apps/dokploy/templates/huly/docker-compose.yml @@ -2,8 +2,7 @@ name: ${DOCKER_NAME} version: "3" services: nginx: - networks: - - dokploy-network + image: "nginx:1.21.3" ports: - 80 @@ -12,8 +11,7 @@ services: restart: unless-stopped mongodb: - networks: - - dokploy-network + image: "mongo:7-jammy" environment: - PUID=1000 @@ -23,8 +21,7 @@ services: restart: unless-stopped minio: - networks: - - dokploy-network + image: "minio/minio:RELEASE.2024-11-07T00-52-20Z" command: server /data --address ":9000" --console-address ":9001" volumes: @@ -32,8 +29,7 @@ services: restart: unless-stopped elastic: - networks: - - dokploy-network + image: "elasticsearch:7.14.2" command: | /bin/sh -c "./bin/elasticsearch-plugin list | grep -q ingest-attachment || yes | ./bin/elasticsearch-plugin install --silent ingest-attachment; @@ -54,8 +50,7 @@ services: restart: unless-stopped rekoni: - networks: - - dokploy-network + image: hardcoreeng/rekoni-service:${HULY_VERSION} environment: - SECRET=${SECRET} @@ -66,8 +61,7 @@ services: restart: unless-stopped transactor: - networks: - - dokploy-network + image: hardcoreeng/transactor:${HULY_VERSION} environment: - SERVER_PORT=3333 @@ -84,8 +78,7 @@ services: restart: unless-stopped collaborator: - networks: - - dokploy-network + image: hardcoreeng/collaborator:${HULY_VERSION} environment: - COLLABORATOR_PORT=3078 @@ -97,8 +90,7 @@ services: restart: unless-stopped account: - networks: - - dokploy-network + image: hardcoreeng/account:${HULY_VERSION} environment: - SERVER_PORT=3000 @@ -115,8 +107,7 @@ services: restart: unless-stopped workspace: - networks: - - dokploy-network + image: hardcoreeng/workspace:${HULY_VERSION} environment: - SERVER_SECRET=${SECRET} @@ -130,8 +121,7 @@ services: restart: unless-stopped front: - networks: - - dokploy-network + image: hardcoreeng/front:${HULY_VERSION} environment: - SERVER_PORT=8080 @@ -156,8 +146,7 @@ services: restart: unless-stopped fulltext: - networks: - - dokploy-network + image: hardcoreeng/fulltext:${HULY_VERSION} environment: - SERVER_SECRET=${SECRET} @@ -171,8 +160,7 @@ services: restart: unless-stopped stats: - networks: - - dokploy-network + image: hardcoreeng/stats:${HULY_VERSION} environment: - PORT=4900 diff --git a/apps/dokploy/templates/immich/docker-compose.yml b/apps/dokploy/templates/immich/docker-compose.yml index 2a9fb00b..743f70ac 100644 --- a/apps/dokploy/templates/immich/docker-compose.yml +++ b/apps/dokploy/templates/immich/docker-compose.yml @@ -3,8 +3,7 @@ version: "3.9" services: immich-server: image: ghcr.io/immich-app/immich-server:v1.121.0 - networks: - - dokploy-network + volumes: - immich-library:/usr/src/app/upload - /etc/localtime:/etc/localtime:ro @@ -38,8 +37,7 @@ services: immich-machine-learning: image: ghcr.io/immich-app/immich-machine-learning:v1.121.0 - networks: - - dokploy-network + volumes: - immich-model-cache:/cache environment: @@ -55,8 +53,7 @@ services: immich-redis: image: redis:6.2-alpine - networks: - - dokploy-network + volumes: - immich-redis-data:/data healthcheck: @@ -68,8 +65,7 @@ services: immich-database: image: tensorchord/pgvecto-rs:pg14-v0.2.0 - networks: - - dokploy-network + volumes: - immich-postgres:/var/lib/postgresql/data environment: diff --git a/apps/dokploy/templates/immich/index.ts b/apps/dokploy/templates/immich/index.ts index b1b11afb..4beca87d 100644 --- a/apps/dokploy/templates/immich/index.ts +++ b/apps/dokploy/templates/immich/index.ts @@ -11,7 +11,7 @@ export function generate(schema: Schema): Template { const mainDomain = generateRandomDomain(schema); const dbPassword = generatePassword(); const dbUser = "immich"; - const appSecret = generateBase64(32); + const _appSecret = generateBase64(32); const domains: DomainSchema[] = [ { diff --git a/apps/dokploy/templates/infisical/docker-compose.yml b/apps/dokploy/templates/infisical/docker-compose.yml index 3baca926..7566c898 100644 --- a/apps/dokploy/templates/infisical/docker-compose.yml +++ b/apps/dokploy/templates/infisical/docker-compose.yml @@ -19,8 +19,7 @@ services: - SMTP_SECURE=true command: npm run migration:latest pull_policy: always - networks: - - dokploy-network + backend: restart: unless-stopped @@ -46,8 +45,7 @@ services: - SMTP_USERNAME - SMTP_PASSWORD - SMTP_SECURE=true - networks: - - dokploy-network + redis: image: redis:7.4.1 @@ -55,8 +53,7 @@ services: restart: always environment: - ALLOW_EMPTY_PASSWORD=yes - networks: - - dokploy-network + volumes: - redis_infisical_data:/data @@ -69,8 +66,7 @@ services: - POSTGRES_DB volumes: - pg_infisical_data:/var/lib/postgresql/data - networks: - - dokploy-network + healthcheck: test: "pg_isready --username=${POSTGRES_USER} && psql --username=${POSTGRES_USER} --list" interval: 5s diff --git a/apps/dokploy/templates/invoiceshelf/docker-compose.yml b/apps/dokploy/templates/invoiceshelf/docker-compose.yml index 5afdd152..ef47f1c0 100644 --- a/apps/dokploy/templates/invoiceshelf/docker-compose.yml +++ b/apps/dokploy/templates/invoiceshelf/docker-compose.yml @@ -3,8 +3,7 @@ version: "3.8" services: invoiceshelf-postgres: image: postgres:15 - networks: - - dokploy-network + volumes: - invoiceshelf-postgres-data:/var/lib/postgresql/data environment: @@ -19,8 +18,7 @@ services: invoiceshelf-app: image: invoiceshelf/invoiceshelf:latest - networks: - - dokploy-network + volumes: - invoiceshelf-app-data:/data - invoiceshelf-app-conf:/conf diff --git a/apps/dokploy/templates/kimai/docker-compose.yml b/apps/dokploy/templates/kimai/docker-compose.yml index 6a04b3b9..253ecb00 100644 --- a/apps/dokploy/templates/kimai/docker-compose.yml +++ b/apps/dokploy/templates/kimai/docker-compose.yml @@ -16,8 +16,7 @@ services: depends_on: db: condition: service_healthy - networks: - - dokploy-network + db: image: mariadb:10.11 restart: unless-stopped @@ -39,8 +38,7 @@ services: timeout: 5s retries: 5 start_period: 30s - networks: - - dokploy-network + networks: dokploy-network: diff --git a/apps/dokploy/templates/langflow/docker-compose.yml b/apps/dokploy/templates/langflow/docker-compose.yml index 75bb73dd..a9628286 100644 --- a/apps/dokploy/templates/langflow/docker-compose.yml +++ b/apps/dokploy/templates/langflow/docker-compose.yml @@ -12,8 +12,7 @@ services: # This variable defines where the logs, file storage, monitor data and secret keys are stored. volumes: - langflow-data:/app/langflow - networks: - - dokploy-network + postgres-langflow: image: postgres:16 @@ -25,8 +24,7 @@ services: - 5432 volumes: - langflow-postgres:/var/lib/postgresql/data - networks: - - dokploy-network + volumes: langflow-postgres: diff --git a/apps/dokploy/templates/linkwarden/docker-compose.yml b/apps/dokploy/templates/linkwarden/docker-compose.yml new file mode 100644 index 00000000..05ffb8a0 --- /dev/null +++ b/apps/dokploy/templates/linkwarden/docker-compose.yml @@ -0,0 +1,40 @@ +services: + linkwarden: + environment: + - NEXTAUTH_SECRET + - NEXTAUTH_URL + - DATABASE_URL=postgresql://linkwarden:${POSTGRES_PASSWORD}@postgres:5432/linkwarden + restart: unless-stopped + image: ghcr.io/linkwarden/linkwarden:v2.9.3 + ports: + - 3000 + volumes: + - linkwarden-data:/data/data + depends_on: + - postgres + healthcheck: + test: curl --fail http://localhost:3000 || exit 1 + interval: 60s + retries: 2 + start_period: 60s + timeout: 15s + + postgres: + image: postgres:17-alpine + restart: unless-stopped + user: postgres + environment: + POSTGRES_USER: linkwarden + POSTGRES_DB: linkwarden + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + - postgres-data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready"] + interval: 10s + timeout: 5s + retries: 5 + +volumes: + linkwarden-data: + postgres-data: diff --git a/apps/dokploy/templates/linkwarden/index.ts b/apps/dokploy/templates/linkwarden/index.ts new file mode 100644 index 00000000..86025035 --- /dev/null +++ b/apps/dokploy/templates/linkwarden/index.ts @@ -0,0 +1,33 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateBase64, + generatePassword, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainDomain = generateRandomDomain(schema); + const postgresPassword = generatePassword(); + const nextSecret = generateBase64(32); + + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 3000, + serviceName: "linkwarden", + }, + ]; + + const envs = [ + `POSTGRES_PASSWORD=${postgresPassword}`, + `NEXTAUTH_SECRET=${nextSecret}`, + `NEXTAUTH_URL=http://${mainDomain}/api/v1/auth`, + ]; + + return { + domains, + envs, + }; +} diff --git a/apps/dokploy/templates/listmonk/docker-compose.yml b/apps/dokploy/templates/listmonk/docker-compose.yml index 725d0a09..d9da8b50 100644 --- a/apps/dokploy/templates/listmonk/docker-compose.yml +++ b/apps/dokploy/templates/listmonk/docker-compose.yml @@ -1,10 +1,9 @@ services: db: - image: postgres:13 + image: postgres:17-alpine ports: - 5432 - networks: - - dokploy-network + environment: - POSTGRES_PASSWORD=listmonk - POSTGRES_USER=listmonk @@ -19,9 +18,8 @@ services: - listmonk-data:/var/lib/postgresql/data setup: - image: listmonk/listmonk:v3.0.0 - networks: - - dokploy-network + image: listmonk/listmonk:v4.1.0 + volumes: - ../files/config.toml:/listmonk/config.toml depends_on: @@ -35,7 +33,7 @@ services: app: restart: unless-stopped - image: listmonk/listmonk:v3.0.0 + image: listmonk/listmonk:v4.1.0 environment: - TZ=Etc/UTC depends_on: @@ -43,7 +41,9 @@ services: - setup volumes: - ../files/config.toml:/listmonk/config.toml + - listmonk-uploads:/listmonk/uploads volumes: + listmonk-uploads: listmonk-data: driver: local diff --git a/apps/dokploy/templates/listmonk/index.ts b/apps/dokploy/templates/listmonk/index.ts index 725659ca..2a25efca 100644 --- a/apps/dokploy/templates/listmonk/index.ts +++ b/apps/dokploy/templates/listmonk/index.ts @@ -2,13 +2,11 @@ import { type DomainSchema, type Schema, type Template, - generatePassword, generateRandomDomain, } from "../utils"; export function generate(schema: Schema): Template { const randomDomain = generateRandomDomain(schema); - const adminPassword = generatePassword(32); const domains: DomainSchema[] = [ { @@ -19,7 +17,7 @@ export function generate(schema: Schema): Template { ]; const envs = [ - `# login with admin:${adminPassword}`, + "# visit the page to setup your super admin user", "# check config.toml in Advanced / Volumes for more options", ]; @@ -29,9 +27,6 @@ export function generate(schema: Schema): Template { content: `[app] address = "0.0.0.0:9000" -admin_username = "admin" -admin_password = "${adminPassword}" - [db] host = "db" port = 5432 diff --git a/apps/dokploy/templates/logto/docker-compose.yml b/apps/dokploy/templates/logto/docker-compose.yml index e1f7c46a..6f2b920a 100644 --- a/apps/dokploy/templates/logto/docker-compose.yml +++ b/apps/dokploy/templates/logto/docker-compose.yml @@ -8,8 +8,7 @@ services: ports: - 3001 - 3002 - networks: - - dokploy-network + environment: TRUST_PROXY_HEADER: 1 DB_URL: postgres://logto:${LOGTO_POSTGRES_PASSWORD}@postgres:5432/logto @@ -20,8 +19,7 @@ services: postgres: image: postgres:17-alpine user: postgres - networks: - - dokploy-network + environment: POSTGRES_USER: logto POSTGRES_PASSWORD: ${LOGTO_POSTGRES_PASSWORD} diff --git a/apps/dokploy/templates/mailpit/docker-compose.yml b/apps/dokploy/templates/mailpit/docker-compose.yml new file mode 100644 index 00000000..d0dbdb8e --- /dev/null +++ b/apps/dokploy/templates/mailpit/docker-compose.yml @@ -0,0 +1,25 @@ +services: + mailpit: + image: axllent/mailpit:v1.22.3 + restart: unless-stopped + ports: + - '1025:1025' + volumes: + - 'mailpit-data:/data' + environment: + - MP_SMTP_AUTH_ALLOW_INSECURE=true + - MP_MAX_MESSAGES=5000 + - MP_DATABASE=/data/mailpit.db + - MP_UI_AUTH=${MP_UI_AUTH} + - MP_SMTP_AUTH=${MP_SMTP_AUTH} + healthcheck: + test: + - CMD + - /mailpit + - readyz + interval: 5s + timeout: 20s + retries: 10 + +volumes: + mailpit-data: \ No newline at end of file diff --git a/apps/dokploy/templates/mailpit/index.ts b/apps/dokploy/templates/mailpit/index.ts new file mode 100644 index 00000000..25f18f7e --- /dev/null +++ b/apps/dokploy/templates/mailpit/index.ts @@ -0,0 +1,31 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateBase64, + generatePassword, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const domains: DomainSchema[] = [ + { + host: generateRandomDomain(schema), + port: 8025, + serviceName: "mailpit", + }, + ]; + + const defaultPassword = generatePassword(); + + const envs = [ + "# Uncomment below if you want basic auth on UI and SMTP", + `#MP_UI_AUTH=mailpit:${defaultPassword}`, + `#MP_SMTP_AUTH=mailpit:${defaultPassword}`, + ]; + + return { + domains, + envs, + }; +} diff --git a/apps/dokploy/templates/maybe/docker-compose.yml b/apps/dokploy/templates/maybe/docker-compose.yml new file mode 100644 index 00000000..db529e0a --- /dev/null +++ b/apps/dokploy/templates/maybe/docker-compose.yml @@ -0,0 +1,36 @@ +services: + app: + image: ghcr.io/maybe-finance/maybe:sha-68c570eed8810fd59b5b33cca51bbad5eabb4cb4 + restart: unless-stopped + volumes: + - ../files/uploads:/app/uploads + environment: + DATABASE_URL: postgresql://maybe:maybe@db:5432/maybe + SECRET_KEY_BASE: ${SECRET_KEY_BASE} + SELF_HOSTED: true + SYNTH_API_KEY: ${SYNTH_API_KEY} + RAILS_FORCE_SSL: "false" + RAILS_ASSUME_SSL: "false" + GOOD_JOB_EXECUTION_MODE: async + depends_on: + db: + condition: service_healthy + + db: + image: postgres:16 + restart: always + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] + interval: 5s + timeout: 5s + retries: 5 + + volumes: + - db-data:/var/lib/postgresql/data + environment: + POSTGRES_DB: maybe + POSTGRES_USER: maybe + POSTGRES_PASSWORD: maybe + +volumes: + db-data: diff --git a/apps/dokploy/templates/maybe/index.ts b/apps/dokploy/templates/maybe/index.ts new file mode 100644 index 00000000..5eaf7a81 --- /dev/null +++ b/apps/dokploy/templates/maybe/index.ts @@ -0,0 +1,43 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateBase64, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainDomain = generateRandomDomain(schema); + const secretKeyBase = generateBase64(64); + const synthApiKey = generateBase64(32); + + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 3000, + serviceName: "app", + }, + ]; + + const envs = [ + `SECRET_KEY_BASE=${secretKeyBase}`, + "SELF_HOSTED=true", + `SYNTH_API_KEY=${synthApiKey}`, + "RAILS_FORCE_SSL=false", + "RAILS_ASSUME_SSL=false", + "GOOD_JOB_EXECUTION_MODE=async", + ]; + + const mounts: Template["mounts"] = [ + { + filePath: "./uploads", + content: "This is where user uploads will be stored", + }, + ]; + + return { + envs, + mounts, + domains, + }; +} diff --git a/apps/dokploy/templates/metabase/docker-compose.yml b/apps/dokploy/templates/metabase/docker-compose.yml index 4dca4d01..43a03987 100644 --- a/apps/dokploy/templates/metabase/docker-compose.yml +++ b/apps/dokploy/templates/metabase/docker-compose.yml @@ -22,5 +22,4 @@ services: POSTGRES_USER: metabase POSTGRES_DB: metabaseappdb POSTGRES_PASSWORD: mysecretpassword - networks: - - dokploy-network + diff --git a/apps/dokploy/templates/nextcloud-aio/docker-compose.yml b/apps/dokploy/templates/nextcloud-aio/docker-compose.yml index e8381d2b..1e6d00fe 100644 --- a/apps/dokploy/templates/nextcloud-aio/docker-compose.yml +++ b/apps/dokploy/templates/nextcloud-aio/docker-compose.yml @@ -2,8 +2,7 @@ services: nextcloud: image: nextcloud:30.0.2 restart: always - networks: - - dokploy-network + ports: - 80 volumes: @@ -19,8 +18,7 @@ services: nextcloud_db: image: mariadb restart: always - networks: - - dokploy-network + volumes: - nextcloud_db_data:/var/lib/mysql environment: diff --git a/apps/dokploy/templates/nocodb/docker-compose.yml b/apps/dokploy/templates/nocodb/docker-compose.yml index 3d5c9ee7..7c4fd1e9 100644 --- a/apps/dokploy/templates/nocodb/docker-compose.yml +++ b/apps/dokploy/templates/nocodb/docker-compose.yml @@ -13,8 +13,7 @@ services: root_db: image: postgres:17 restart: always - networks: - - dokploy-network + environment: POSTGRES_DB: root_db POSTGRES_PASSWORD: password diff --git a/apps/dokploy/templates/odoo/docker-compose.yml b/apps/dokploy/templates/odoo/docker-compose.yml index 80b34f0c..7c1c7d3c 100644 --- a/apps/dokploy/templates/odoo/docker-compose.yml +++ b/apps/dokploy/templates/odoo/docker-compose.yml @@ -15,8 +15,7 @@ services: db: image: postgres:13 - networks: - - dokploy-network + environment: - POSTGRES_DB=postgres - POSTGRES_USER=odoo diff --git a/apps/dokploy/templates/open-webui/docker-compose.yml b/apps/dokploy/templates/open-webui/docker-compose.yml index d396dacc..ee179721 100644 --- a/apps/dokploy/templates/open-webui/docker-compose.yml +++ b/apps/dokploy/templates/open-webui/docker-compose.yml @@ -3,8 +3,7 @@ services: ollama: volumes: - ollama:/root/.ollama - networks: - - dokploy-network + pull_policy: always tty: true restart: unless-stopped diff --git a/apps/dokploy/templates/outline/docker-compose.yml b/apps/dokploy/templates/outline/docker-compose.yml new file mode 100644 index 00000000..aaf98ac0 --- /dev/null +++ b/apps/dokploy/templates/outline/docker-compose.yml @@ -0,0 +1,57 @@ +services: + outline: + image: outlinewiki/outline:0.82.0 + restart: always + depends_on: + - postgres + - redis + - dex + ports: + - 3000 + environment: + NODE_ENV: production + URL: ${URL} + FORCE_HTTPS: 'false' + SECRET_KEY: ${SECRET_KEY} + UTILS_SECRET: ${UTILS_SECRET} + DATABASE_URL: postgres://outline:${POSTGRES_PASSWORD}@postgres:5432/outline + PGSSLMODE: disable + REDIS_URL: redis://redis:6379 + OIDC_CLIENT_ID: outline + OIDC_CLIENT_SECRET: ${CLIENT_SECRET} + OIDC_AUTH_URI: ${DEX_URL}/auth + OIDC_TOKEN_URI: ${DEX_URL}/token + OIDC_USERINFO_URI: ${DEX_URL}/userinfo + + dex: + image: ghcr.io/dexidp/dex:v2.37.0 + restart: always + volumes: + - ../files/etc/dex/config.yaml:/etc/dex/config.yaml + command: + - dex + - serve + - /etc/dex/config.yaml + ports: + - 5556 + + postgres: + image: postgres:15 + restart: always + environment: + POSTGRES_DB: outline + POSTGRES_USER: outline + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + - postgres_data-test-outline-khufpx:/var/lib/postgresql/data + + redis: + image: redis:latest + restart: always + command: redis-server --appendonly yes + volumes: + - redis_data-test-outline-khufpx:/data + +volumes: + postgres_data-test-outline-khufpx: + redis_data-test-outline-khufpx: \ No newline at end of file diff --git a/apps/dokploy/templates/outline/index.ts b/apps/dokploy/templates/outline/index.ts new file mode 100644 index 00000000..8431e568 --- /dev/null +++ b/apps/dokploy/templates/outline/index.ts @@ -0,0 +1,90 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateBase64, + generatePassword, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainDomain = generateRandomDomain(schema); + const dexDomain = generateRandomDomain(schema); + const SECRET_KEY = generateBase64(32); + const UTILS_SECRET = generateBase64(32); + const CLIENT_SECRET = generateBase64(32); + const POSTGRES_PASSWORD = generatePassword(); + + const mainURL = `http://${mainDomain}`; + const dexURL = `http://${dexDomain}`; + + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 3000, + serviceName: "outline", + }, + { + host: dexDomain, + port: 5556, + serviceName: "dex", + }, + ]; + + const mounts: Template["mounts"] = [ + { + filePath: "/etc/dex/config.yaml", + content: `issuer: ${dexURL} + +web: + http: 0.0.0.0:5556 + +storage: + type: memory + +enablePasswordDB: true + +frontend: + issuer: Outline + +logger: + level: debug + +staticPasswords: + - email: "admin@example.com" + # bcrypt hash of the string "password": $(echo password | htpasswd -BinC 10 admin | cut -d: -f2) + hash: "$2y$10$jsRWHw54uxTUIfhjgUrB9u8HSzPk7TUuQri9sXZrKzRXcScvwYor." + username: "admin" + userID: "1" + + +oauth2: + skipApprovalScreen: true + alwaysShowLoginScreen: false + passwordConnector: local + +staticClients: + - id: "outline" + redirectURIs: + - ${mainURL}/auth/oidc.callback + name: "Outline" + secret: "${CLIENT_SECRET}"`, + }, + ]; + + const envs = [ + `URL=${mainURL}`, + `DEX_URL=${dexURL}`, + `DOMAIN_NAME=${mainDomain}`, + `POSTGRES_PASSWORD=${POSTGRES_PASSWORD}`, + `SECRET_KEY=${SECRET_KEY}`, + `UTILS_SECRET=${UTILS_SECRET}`, + `CLIENT_SECRET=${CLIENT_SECRET}`, + ]; + + return { + domains, + envs, + mounts, + }; +} diff --git a/apps/dokploy/templates/penpot/docker-compose.yml b/apps/dokploy/templates/penpot/docker-compose.yml index 55abdb53..3e0efe91 100644 --- a/apps/dokploy/templates/penpot/docker-compose.yml +++ b/apps/dokploy/templates/penpot/docker-compose.yml @@ -46,8 +46,7 @@ services: - penpot-backend - penpot-exporter - networks: - - dokploy-network + environment: PENPOT_FLAGS: disable-email-verification enable-smtp enable-prepl-server disable-secure-session-cookies @@ -63,8 +62,7 @@ services: - penpot-postgres - penpot-redis - networks: - - dokploy-network + ## Configuration envronment variables for the backend ## container. @@ -143,8 +141,7 @@ services: penpot-exporter: image: "penpotapp/exporter:2.3.2" restart: always - networks: - - dokploy-network + environment: # Don't touch it; this uses an internal docker network to @@ -162,8 +159,7 @@ services: volumes: - penpot_postgres_v15:/var/lib/postgresql/data - networks: - - dokploy-network + environment: - POSTGRES_INITDB_ARGS=--data-checksums @@ -174,8 +170,7 @@ services: penpot-redis: image: redis:7.2 restart: always - networks: - - dokploy-network + ## A mailcatch service, used as temporal SMTP server. You can access via HTTP to the ## port 1080 for read all emails the penpot platform has sent. Should be only used as a @@ -188,8 +183,7 @@ services: - '1025' ports: - 1080 - networks: - - dokploy-network + ## Example configuration of MiniIO (S3 compatible object storage service); If you don't ## have preference, then just use filesystem, this is here just for the completeness. diff --git a/apps/dokploy/templates/penpot/index.ts b/apps/dokploy/templates/penpot/index.ts index f657c698..a3e90e8a 100644 --- a/apps/dokploy/templates/penpot/index.ts +++ b/apps/dokploy/templates/penpot/index.ts @@ -2,8 +2,6 @@ import { type DomainSchema, type Schema, type Template, - generateBase64, - generatePassword, generateRandomDomain, } from "../utils"; diff --git a/apps/dokploy/templates/peppermint/docker-compose.yml b/apps/dokploy/templates/peppermint/docker-compose.yml index 305c5eb9..06fb46c6 100644 --- a/apps/dokploy/templates/peppermint/docker-compose.yml +++ b/apps/dokploy/templates/peppermint/docker-compose.yml @@ -4,8 +4,7 @@ services: peppermint-postgres: image: postgres:latest restart: always - networks: - - dokploy-network + volumes: - peppermint-postgres-data:/var/lib/postgresql/data environment: @@ -21,8 +20,7 @@ services: peppermint-app: image: pepperlabs/peppermint:latest restart: always - networks: - - dokploy-network + depends_on: peppermint-postgres: condition: service_healthy diff --git a/apps/dokploy/templates/photoprism/docker-compose.yml b/apps/dokploy/templates/photoprism/docker-compose.yml index 285f2ff8..56793dbd 100644 --- a/apps/dokploy/templates/photoprism/docker-compose.yml +++ b/apps/dokploy/templates/photoprism/docker-compose.yml @@ -7,8 +7,7 @@ services: security_opt: - seccomp:unconfined - apparmor:unconfined - networks: - - dokploy-network + environment: PHOTOPRISM_ADMIN_USER: "admin" PHOTOPRISM_ADMIN_PASSWORD: ${ADMIN_PASSWORD} @@ -57,8 +56,7 @@ services: image: mariadb:11 restart: unless-stopped stop_grace_period: 5s - networks: - - dokploy-network + security_opt: - seccomp:unconfined - apparmor:unconfined diff --git a/apps/dokploy/templates/photoprism/index.ts b/apps/dokploy/templates/photoprism/index.ts index d20ac29c..4a103a62 100644 --- a/apps/dokploy/templates/photoprism/index.ts +++ b/apps/dokploy/templates/photoprism/index.ts @@ -2,7 +2,6 @@ import { type DomainSchema, type Schema, type Template, - generateHash, generatePassword, generateRandomDomain, } from "../utils"; diff --git a/apps/dokploy/templates/phpmyadmin/docker-compose.yml b/apps/dokploy/templates/phpmyadmin/docker-compose.yml index 1f775f09..91674e87 100644 --- a/apps/dokploy/templates/phpmyadmin/docker-compose.yml +++ b/apps/dokploy/templates/phpmyadmin/docker-compose.yml @@ -10,8 +10,7 @@ services: MYSQL_PASSWORD: ${MYSQL_PASSWORD} volumes: - db_data:/var/lib/mysql - networks: - - dokploy-network + phpmyadmin: image: phpmyadmin/phpmyadmin:5.2.1 diff --git a/apps/dokploy/templates/plausible/docker-compose.yml b/apps/dokploy/templates/plausible/docker-compose.yml index bb267f65..ad483ecf 100644 --- a/apps/dokploy/templates/plausible/docker-compose.yml +++ b/apps/dokploy/templates/plausible/docker-compose.yml @@ -1,10 +1,8 @@ -version: "3.8" services: plausible_db: image: postgres:16-alpine restart: always - networks: - - dokploy-network + volumes: - db-data:/var/lib/postgresql/data environment: @@ -13,8 +11,7 @@ services: plausible_events_db: image: clickhouse/clickhouse-server:24.3.3.102-alpine restart: always - networks: - - dokploy-network + volumes: - event-data:/var/lib/clickhouse - event-logs:/var/log/clickhouse-server @@ -26,7 +23,7 @@ services: hard: 262144 plausible: - image: ghcr.io/plausible/community-edition:v2.1.4 + image: ghcr.io/plausible/community-edition:v2.1.5 restart: always command: sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run" depends_on: diff --git a/apps/dokploy/templates/pocket-id/docker-compose.yml b/apps/dokploy/templates/pocket-id/docker-compose.yml new file mode 100644 index 00000000..f9385143 --- /dev/null +++ b/apps/dokploy/templates/pocket-id/docker-compose.yml @@ -0,0 +1,21 @@ +services: + pocket-id: + image: ghcr.io/pocket-id/pocket-id:v0.35.1 + restart: unless-stopped + environment: + - PUBLIC_UI_CONFIG_DISABLED + - PUBLIC_APP_URL + - TRUST_PROXY + ports: + - 80 + volumes: + - pocket-id-data:/app/backend/data + healthcheck: + test: "curl -f http://localhost/health" + interval: 1m30s + timeout: 5s + retries: 2 + start_period: 10s + +volumes: + pocket-id-data: diff --git a/apps/dokploy/templates/pocket-id/index.ts b/apps/dokploy/templates/pocket-id/index.ts new file mode 100644 index 00000000..9a9faa2a --- /dev/null +++ b/apps/dokploy/templates/pocket-id/index.ts @@ -0,0 +1,29 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainDomain = generateRandomDomain(schema); + + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 80, + serviceName: "pocket-id", + }, + ]; + + const envs = [ + "PUBLIC_UI_CONFIG_DISABLED=false", + `PUBLIC_APP_URL=http://${mainDomain}`, + "TRUST_PROXY=true", + ]; + + return { + domains, + envs, + }; +} diff --git a/apps/dokploy/templates/portainer/docker-compose.yml b/apps/dokploy/templates/portainer/docker-compose.yml index fa4fe410..19e67a3e 100644 --- a/apps/dokploy/templates/portainer/docker-compose.yml +++ b/apps/dokploy/templates/portainer/docker-compose.yml @@ -6,8 +6,7 @@ services: volumes: - /var/run/docker.sock:/var/run/docker.sock - /var/lib/docker/volumes:/var/lib/docker/volumes - networks: - - dokploy-network + deploy: mode: global diff --git a/apps/dokploy/templates/postiz/docker-compose.yml b/apps/dokploy/templates/postiz/docker-compose.yml index f842c92d..cd06e795 100644 --- a/apps/dokploy/templates/postiz/docker-compose.yml +++ b/apps/dokploy/templates/postiz/docker-compose.yml @@ -4,8 +4,7 @@ services: postiz-app: image: ghcr.io/gitroomhq/postiz-app:latest restart: always - networks: - - dokploy-network + environment: MAIN_URL: "https://${POSTIZ_HOST}" FRONTEND_URL: "https://${POSTIZ_HOST}" @@ -30,8 +29,7 @@ services: postiz-postgres: image: postgres:17-alpine restart: always - networks: - - dokploy-network + environment: POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_USER: ${DB_USER} @@ -47,8 +45,7 @@ services: postiz-redis: image: redis:7.2 restart: always - networks: - - dokploy-network + healthcheck: test: redis-cli ping interval: 10s diff --git a/apps/dokploy/templates/registry/docker-compose.yml b/apps/dokploy/templates/registry/docker-compose.yml new file mode 100644 index 00000000..08c5c368 --- /dev/null +++ b/apps/dokploy/templates/registry/docker-compose.yml @@ -0,0 +1,19 @@ +services: + registry: + restart: always + image: registry:2 + ports: + - 5000 + volumes: + - ../files/auth/registry.password:/auth/registry.password + - registry-data:/var/lib/registry + environment: + REGISTRY_STORAGE_DELETE_ENABLED: true + REGISTRY_HEALTH_STORAGEDRIVER_ENABLED: false + REGISTRY_HTTP_SECRET: ${REGISTRY_HTTP_SECRET} + REGISTRY_AUTH: htpasswd + REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm + REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.password + +volumes: + registry-data: \ No newline at end of file diff --git a/apps/dokploy/templates/registry/index.ts b/apps/dokploy/templates/registry/index.ts new file mode 100644 index 00000000..81965e6e --- /dev/null +++ b/apps/dokploy/templates/registry/index.ts @@ -0,0 +1,35 @@ +import { + type DomainSchema, + type Schema, + type Template, + generatePassword, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const domains: DomainSchema[] = [ + { + host: generateRandomDomain(schema), + port: 5000, + serviceName: "registry", + }, + ]; + + const registryHttpSecret = generatePassword(30); + + const envs = [`REGISTRY_HTTP_SECRET=${registryHttpSecret}`]; + + const mounts: Template["mounts"] = [ + { + filePath: "/auth/registry.password", + content: + "# from: docker run --rm --entrypoint htpasswd httpd:2 -Bbn docker password\ndocker:$2y$10$qWZoWev/u5PV7WneFoRAMuoGpRcAQOgUuIIdLnU7pJXogrBSY23/2\n", + }, + ]; + + return { + domains, + envs, + mounts, + }; +} diff --git a/apps/dokploy/templates/rocketchat/docker-compose.yml b/apps/dokploy/templates/rocketchat/docker-compose.yml index 751bd845..5119f5a4 100644 --- a/apps/dokploy/templates/rocketchat/docker-compose.yml +++ b/apps/dokploy/templates/rocketchat/docker-compose.yml @@ -28,8 +28,7 @@ services: MONGODB_ADVERTISED_HOSTNAME: mongodb MONGODB_ENABLE_JOURNAL: true ALLOW_EMPTY_PASSWORD: yes - networks: - - dokploy-network + volumes: mongodb_data: { driver: local } diff --git a/apps/dokploy/templates/roundcube/docker-compose.yml b/apps/dokploy/templates/roundcube/docker-compose.yml index 440f907d..e5ba4a8b 100644 --- a/apps/dokploy/templates/roundcube/docker-compose.yml +++ b/apps/dokploy/templates/roundcube/docker-compose.yml @@ -9,8 +9,7 @@ services: - ROUNDCUBEMAIL_SKIN=elastic - ROUNDCUBEMAIL_DEFAULT_HOST=${DEFAULT_HOST} - ROUNDCUBEMAIL_SMTP_SERVER=${SMTP_SERVER} - networks: - - dokploy-network + networks: dokploy-network: diff --git a/apps/dokploy/templates/ryot/docker-compose.yml b/apps/dokploy/templates/ryot/docker-compose.yml index 1fcd80ed..09a72707 100644 --- a/apps/dokploy/templates/ryot/docker-compose.yml +++ b/apps/dokploy/templates/ryot/docker-compose.yml @@ -3,8 +3,7 @@ version: '3.7' services: ryot-app: image: ignisda/ryot:v7.10 - networks: - - dokploy-network + environment: - DATABASE_URL=postgres://postgres:${POSTGRES_PASSWORD}@ryot-db:5432/postgres - SERVER_ADMIN_ACCESS_TOKEN=${ADMIN_ACCESS_TOKEN} @@ -19,8 +18,7 @@ services: ryot-db: image: postgres:16-alpine - networks: - - dokploy-network + volumes: - ryot-postgres-data:/var/lib/postgresql/data environment: diff --git a/apps/dokploy/templates/shlink/docker-compose.yml b/apps/dokploy/templates/shlink/docker-compose.yml new file mode 100644 index 00000000..6d15a26d --- /dev/null +++ b/apps/dokploy/templates/shlink/docker-compose.yml @@ -0,0 +1,29 @@ +services: + shlink: + image: shlinkio/shlink:stable + environment: + - INITIAL_API_KEY=${INITIAL_API_KEY} + - DEFAULT_DOMAIN=${DEFAULT_DOMAIN} + # Note: you should also update SHLINK_SERVER_URL in the shlink-web service. + - IS_HTTPS_ENABLED=false + volumes: + - shlink-data:/etc/shlink/data + healthcheck: + test: ["CMD", "curl", "-f", "http://127.0.0.1:8080/rest/v3/health"] + interval: 30s + timeout: 10s + retries: 3 + shlink-web: + image: shlinkio/shlink-web-client + environment: + - SHLINK_SERVER_API_KEY=${INITIAL_API_KEY} + # Note: if you've set IS_HTTPS_ENABLED=true, change http to https. + - SHLINK_SERVER_URL=http://${DEFAULT_DOMAIN} + healthcheck: + test: ["CMD", "curl", "-f", "http://127.0.0.1:8080"] + interval: 30s + timeout: 10s + retries: 3 + +volumes: + shlink-data: diff --git a/apps/dokploy/templates/shlink/index.ts b/apps/dokploy/templates/shlink/index.ts new file mode 100644 index 00000000..1e456e1c --- /dev/null +++ b/apps/dokploy/templates/shlink/index.ts @@ -0,0 +1,35 @@ +import { + type DomainSchema, + type Schema, + type Template, + generatePassword, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const defaultDomain = generateRandomDomain(schema); + const initialApiKey = generatePassword(30); + + const domains: DomainSchema[] = [ + { + host: `web-${defaultDomain}`, + port: 8080, + serviceName: "shlink-web", + }, + { + host: defaultDomain, + port: 8080, + serviceName: "shlink", + }, + ]; + + const envs = [ + `INITIAL_API_KEY=${initialApiKey}`, + `DEFAULT_DOMAIN=${defaultDomain}`, + ]; + + return { + envs, + domains, + }; +} diff --git a/apps/dokploy/templates/slash/docker-compose.yml b/apps/dokploy/templates/slash/docker-compose.yml index 75afc478..ee6cdf89 100644 --- a/apps/dokploy/templates/slash/docker-compose.yml +++ b/apps/dokploy/templates/slash/docker-compose.yml @@ -3,8 +3,7 @@ version: "3.8" services: slash-app: image: yourselfhosted/slash:latest - networks: - - dokploy-network + volumes: - slash-app-data:/var/opt/slash environment: @@ -17,8 +16,7 @@ services: slash-postgres: image: postgres:16-alpine - networks: - - dokploy-network + volumes: - slash-postgres-data:/var/lib/postgresql/data environment: diff --git a/apps/dokploy/templates/spacedrive/docker-compose.yml b/apps/dokploy/templates/spacedrive/docker-compose.yml new file mode 100644 index 00000000..b98d55ab --- /dev/null +++ b/apps/dokploy/templates/spacedrive/docker-compose.yml @@ -0,0 +1,9 @@ +services: + server: + image: ghcr.io/spacedriveapp/spacedrive/server:latest + ports: + - 8080 + environment: + - SD_AUTH=${SD_USERNAME}:${SD_PASSWORD} + volumes: + - /var/spacedrive:/var/spacedrive diff --git a/apps/dokploy/templates/spacedrive/index.ts b/apps/dokploy/templates/spacedrive/index.ts new file mode 100644 index 00000000..15db4b19 --- /dev/null +++ b/apps/dokploy/templates/spacedrive/index.ts @@ -0,0 +1,28 @@ +import { + type DomainSchema, + type Schema, + type Template, + generatePassword, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const randomDomain = generateRandomDomain(schema); + const secretKey = generatePassword(); + const randomUsername = "admin"; // Default username + + const domains: DomainSchema[] = [ + { + host: randomDomain, + port: 8080, + serviceName: "server", + }, + ]; + + const envs = [`SD_USERNAME=${randomUsername}`, `SD_PASSWORD=${secretKey}`]; + + return { + envs, + domains, + }; +} diff --git a/apps/dokploy/templates/supabase/docker-compose.yml b/apps/dokploy/templates/supabase/docker-compose.yml index e1e187fd..89339736 100644 --- a/apps/dokploy/templates/supabase/docker-compose.yml +++ b/apps/dokploy/templates/supabase/docker-compose.yml @@ -11,8 +11,7 @@ services: studio: container_name: supabase-studio image: supabase/studio:20240729-ce42139 - networks: - - dokploy-network + restart: unless-stopped healthcheck: test: @@ -53,8 +52,7 @@ services: container_name: supabase-kong image: kong:2.8.1 restart: unless-stopped - networks: - - dokploy-network + # https://unix.stackexchange.com/a/294837 entrypoint: bash -c 'eval "echo \"$$(cat ~/temp.yml)\"" > ~/kong.yml && /docker-entrypoint.sh kong docker-start' #ports: @@ -85,8 +83,7 @@ services: auth: container_name: supabase-auth image: supabase/gotrue:v2.158.1 - networks: - - dokploy-network + depends_on: db: # Disable this if you are using an external Postgres database @@ -157,8 +154,7 @@ services: rest: container_name: supabase-rest image: postgrest/postgrest:v12.2.0 - networks: - - dokploy-network + depends_on: db: # Disable this if you are using an external Postgres database @@ -180,8 +176,7 @@ services: # This container name looks inconsistent but is correct because realtime constructs tenant id by parsing the subdomain container_name: realtime-dev.supabase-realtime image: supabase/realtime:v2.30.23 - networks: - - dokploy-network + depends_on: db: # Disable this if you are using an external Postgres database @@ -226,8 +221,7 @@ services: storage: container_name: supabase-storage image: supabase/storage-api:v1.0.6 - networks: - - dokploy-network + depends_on: db: # Disable this if you are using an external Postgres database @@ -271,8 +265,7 @@ services: imgproxy: container_name: supabase-imgproxy image: darthsim/imgproxy:v3.8.0 - networks: - - dokploy-network + healthcheck: test: ["CMD", "imgproxy", "health"] timeout: 5s @@ -289,8 +282,7 @@ services: meta: container_name: supabase-meta image: supabase/postgres-meta:v0.83.2 - networks: - - dokploy-network + depends_on: db: # Disable this if you are using an external Postgres database @@ -310,8 +302,7 @@ services: container_name: supabase-edge-functions image: supabase/edge-runtime:v1.56.0 restart: unless-stopped - networks: - - dokploy-network + depends_on: analytics: condition: service_healthy @@ -333,8 +324,7 @@ services: analytics: container_name: supabase-analytics image: supabase/logflare:1.4.0 - networks: - - dokploy-network + healthcheck: test: ["CMD", "curl", "http://localhost:4000/health"] timeout: 5s @@ -380,8 +370,7 @@ services: db: container_name: supabase-db image: supabase/postgres:15.1.1.78 - networks: - - dokploy-network + healthcheck: test: pg_isready -U postgres -h localhost interval: 5s @@ -430,8 +419,7 @@ services: vector: container_name: supabase-vector image: timberio/vector:0.28.1-alpine - networks: - - dokploy-network + healthcheck: test: [ diff --git a/apps/dokploy/templates/superset/docker-compose.yml b/apps/dokploy/templates/superset/docker-compose.yml new file mode 100644 index 00000000..b73bf55e --- /dev/null +++ b/apps/dokploy/templates/superset/docker-compose.yml @@ -0,0 +1,87 @@ +# This is an UNOFFICIAL production docker image build for Superset: +# - https://github.com/amancevice/docker-superset + + +# ## SETUP INSTRUCTIONS +# +# After deploying this image, you will need to run one of the two +# commands below in a terminal within the superset container: +# $ superset-demo # Initialise database + load demo charts/datasets +# $ superset-init # Initialise database only +# +# You will be prompted to enter the credentials for the admin user. + + +# ## NETWORK INSTRUCTIONS +# +# If you want to connect superset with other internal databases managed by +# Dokploy (on dokploy-network) using internal hostnames, you will need to +# uncomment the `networks` section, both for the superset container and +# at the very bottom of this docker-compose template. +# +# Note that the `superset` service name/hostname will not be unique on the +# global `dokploy-network`. If you plan to: +# +# 1. deploy a second instance of superset on dokploy-network, and +# 2. have other containers on dokploy-network utilise the second instance's +# Superset API (https://superset.apache.org/docs/api) +# +# Please change the service name of the second instance. + +services: + superset: + image: amancevice/superset + restart: always + #networks: + # - dokploy-network + depends_on: + - superset_postgres + - superset_redis + volumes: + # This superset_config.py can be edited in Dokploy's UI Advanced -> Volume Mount + - ../files/superset/superset_config.py:/etc/superset/superset_config.py + environment: + SECRET_KEY: ${SECRET_KEY} + MAPBOX_API_KEY: ${MAPBOX_API_KEY} + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + REDIS_PASSWORD: ${REDIS_PASSWORD} + # Ensure the hosts matches your service names below. + POSTGRES_HOST: superset_postgres + REDIS_HOST: superset_redis + + superset_postgres: + image: postgres + restart: always + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + volumes: + - superset_postgres_data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] + interval: 30s + timeout: 10s + retries: 3 + +superset_redis: + image: redis + restart: always + volumes: + - superset_redis_data:/data + command: redis-server --requirepass ${REDIS_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] + interval: 30s + timeout: 10s + retries: 3 + +#networks: +# dokploy-network: +# external: true + +volumes: + superset_postgres_data: + superset_redis_data: diff --git a/apps/dokploy/templates/superset/index.ts b/apps/dokploy/templates/superset/index.ts new file mode 100644 index 00000000..954fc971 --- /dev/null +++ b/apps/dokploy/templates/superset/index.ts @@ -0,0 +1,77 @@ +import { + type DomainSchema, + type Schema, + type Template, + generatePassword, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mapboxApiKey = ""; + const secretKey = generatePassword(30); + const postgresDb = "superset"; + const postgresUser = "superset"; + const postgresPassword = generatePassword(30); + const redisPassword = generatePassword(30); + + const domains: DomainSchema[] = [ + { + host: generateRandomDomain(schema), + port: 8088, + serviceName: "superset", + }, + ]; + + const envs = [ + `SECRET_KEY=${secretKey}`, + `MAPBOX_API_KEY=${mapboxApiKey}`, + `POSTGRES_DB=${postgresDb}`, + `POSTGRES_USER=${postgresUser}`, + `POSTGRES_PASSWORD=${postgresPassword}`, + `REDIS_PASSWORD=${redisPassword}`, + ]; + + const mounts: Template["mounts"] = [ + { + filePath: "./superset/superset_config.py", + content: ` +""" +For more configuration options, see: +- https://superset.apache.org/docs/configuration/configuring-superset +""" + +import os + +SECRET_KEY = os.getenv("SECRET_KEY") +MAPBOX_API_KEY = os.getenv("MAPBOX_API_KEY", "") + +CACHE_CONFIG = { + "CACHE_TYPE": "RedisCache", + "CACHE_DEFAULT_TIMEOUT": 300, + "CACHE_KEY_PREFIX": "superset_", + "CACHE_REDIS_HOST": "redis", + "CACHE_REDIS_PORT": 6379, + "CACHE_REDIS_DB": 1, + "CACHE_REDIS_URL": f"redis://:{os.getenv('REDIS_PASSWORD')}@{os.getenv('REDIS_HOST')}:6379/1", +} + +FILTER_STATE_CACHE_CONFIG = {**CACHE_CONFIG, "CACHE_KEY_PREFIX": "superset_filter_"} +EXPLORE_FORM_DATA_CACHE_CONFIG = {**CACHE_CONFIG, "CACHE_KEY_PREFIX": "superset_explore_form_"} + +SQLALCHEMY_TRACK_MODIFICATIONS = True +SQLALCHEMY_DATABASE_URI = f"postgresql+psycopg2://{os.getenv('POSTGRES_USER')}:{os.getenv('POSTGRES_PASSWORD')}@{os.getenv('POSTGRES_HOST')}:5432/{os.getenv('POSTGRES_DB')}" + +# Uncomment if you want to load example data (using "superset load_examples") at the +# same location as your metadata postgresql instance. Otherwise, the default sqlite +# will be used, which will not persist in volume when restarting superset by default. +#SQLALCHEMY_EXAMPLES_URI = SQLALCHEMY_DATABASE_URI + `.trim(), + }, + ]; + + return { + envs, + domains, + mounts, + }; +} diff --git a/apps/dokploy/templates/teable/docker-compose.yml b/apps/dokploy/templates/teable/docker-compose.yml index b96b677c..386e3773 100644 --- a/apps/dokploy/templates/teable/docker-compose.yml +++ b/apps/dokploy/templates/teable/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.9" services: teable: - image: ghcr.io/teableio/teable:1.3.1-alpha-build.460 + image: ghcr.io/teableio/teable:latest restart: always volumes: - teable-data:/app/.assets @@ -41,8 +41,7 @@ services: - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - networks: - - dokploy-network + healthcheck: test: [ @@ -58,8 +57,7 @@ services: environment: - TZ=${TIMEZONE} - PRISMA_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} - networks: - - dokploy-network + depends_on: teable-db: condition: service_healthy diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts index 9531eb7a..d39465a8 100644 --- a/apps/dokploy/templates/templates.ts +++ b/apps/dokploy/templates/templates.ts @@ -1,6 +1,37 @@ import type { TemplateData } from "./types/templates-data.type"; export const templates: TemplateData[] = [ + { + id: "appwrite", + name: "Appwrite", + version: "1.6.0", + description: + "Appwrite is an end-to-end backend server for Web, Mobile, Native, or Backend apps. Appwrite abstracts the complexity and repetitiveness required to build a modern backend API from scratch and allows you to build secure apps faster.\n" + + "Using Appwrite, you can easily integrate your app with user authentication and multiple sign-in methods, a database for storing and querying users and team data, storage and file management, image manipulation, Cloud Functions, messaging, and more services.", + links: { + github: "https://github.com/appwrite/appwrite", + website: "https://appwrite.io/", + docs: "https://appwrite.io/docs", + }, + logo: "appwrite.svg", + tags: ["database", "firebase", "postgres"], + load: () => import("./appwrite/index").then((m) => m.generate), + }, + { + id: "outline", + name: "Outline", + version: "0.82.0", + description: + "Outline is a self-hosted knowledge base and documentation platform that allows you to build and manage your own knowledge base applications.", + links: { + github: "https://github.com/outline/outline", + website: "https://getoutline.com/", + docs: "https://docs.getoutline.com/s/guide", + }, + logo: "outline.png", + load: () => import("./outline/index").then((m) => m.generate), + tags: ["documentation", "knowledge-base", "self-hosted"], + }, { id: "supabase", name: "SupaBase", @@ -34,7 +65,7 @@ export const templates: TemplateData[] = [ { id: "plausible", name: "Plausible", - version: "v2.1.4", + version: "v2.1.5", description: "Plausible is a open source, self-hosted web analytics platform that lets you track website traffic and user behavior.", logo: "plausible.svg", @@ -170,7 +201,7 @@ export const templates: TemplateData[] = [ { id: "wordpress", name: "Wordpress", - version: "5.8.3", + version: "6.7.1", description: "Wordpress is a free and open source content management system (CMS) for publishing and managing websites.", logo: "wordpress.png", @@ -362,6 +393,21 @@ export const templates: TemplateData[] = [ tags: ["chat"], load: () => import("./open-webui/index").then((m) => m.generate), }, + { + id: "mailpit", + name: "Mailpit", + version: "v1.22.3", + description: + "Mailpit is a tiny, self-contained, and secure email & SMTP testing tool with API for developers.", + logo: "mailpit.svg", + links: { + github: "https://github.com/axllent/mailpit", + website: "https://mailpit.axllent.org/", + docs: "https://mailpit.axllent.org/docs/", + }, + tags: ["email", "smtp"], + load: () => import("./mailpit/index").then((m) => m.generate), + }, { id: "listmonk", name: "Listmonk", @@ -395,7 +441,7 @@ export const templates: TemplateData[] = [ { id: "umami", name: "Umami", - version: "v2.14.0", + version: "v2.16.1", description: "Umami is a simple, fast, privacy-focused alternative to Google Analytics.", logo: "umami.png", @@ -538,7 +584,7 @@ export const templates: TemplateData[] = [ website: "https://filebrowser.org/", docs: "https://filebrowser.org/", }, - tags: ["file", "manager"], + tags: ["file-manager", "storage"], load: () => import("./filebrowser/index").then((m) => m.generate), }, { @@ -631,6 +677,21 @@ export const templates: TemplateData[] = [ tags: ["open-source"], load: () => import("./vaultwarden/index").then((m) => m.generate), }, + { + id: "linkwarden", + name: "Linkwarden", + version: "2.9.3", + description: + "Self-hosted, open-source collaborative bookmark manager to collect, organize and archive webpages.", + logo: "linkwarden.png", + links: { + github: "https://github.com/linkwarden/linkwarden", + website: "https://linkwarden.app/", + docs: "https://docs.linkwarden.app/", + }, + tags: ["bookmarks", "link-sharing"], + load: () => import("./linkwarden/index").then((m) => m.generate), + }, { id: "hi-events", name: "Hi.events", @@ -834,7 +895,7 @@ export const templates: TemplateData[] = [ website: "https://nextcloud.com/", docs: "https://docs.nextcloud.com/", }, - tags: ["file", "sync"], + tags: ["file-manager", "sync"], load: () => import("./nextcloud-aio/index").then((m) => m.generate), }, { @@ -1062,6 +1123,21 @@ export const templates: TemplateData[] = [ tags: ["identity", "auth"], load: () => import("./logto/index").then((m) => m.generate), }, + { + id: "pocket-id", + name: "Pocket ID", + version: "0.35.1", + description: + "A simple and easy-to-use OIDC provider that allows users to authenticate with their passkeys to your services.", + logo: "pocket-id.svg", + links: { + github: "https://github.com/pocket-id/pocket-id", + website: "https://pocket-id.org/", + docs: "https://pocket-id.org/docs", + }, + tags: ["identity", "auth"], + load: () => import("./pocket-id/index").then((m) => m.generate), + }, { id: "penpot", name: "Penpot", @@ -1074,7 +1150,7 @@ export const templates: TemplateData[] = [ website: "https://penpot.app/", docs: "https://docs.penpot.app/", }, - tags: ["desing", "collaboration"], + tags: ["design", "collaboration"], load: () => import("./penpot/index").then((m) => m.generate), }, { @@ -1095,9 +1171,9 @@ export const templates: TemplateData[] = [ { id: "unsend", name: "Unsend", - version: "v1.2.4", + version: "v1.3.2", description: "Open source alternative to Resend,Sendgrid, Postmark etc. ", - logo: "unsend.png", // we defined the name and the extension of the logo + logo: "unsend.png", links: { github: "https://github.com/unsend-dev/unsend", website: "https://unsend.dev/", @@ -1239,6 +1315,21 @@ export const templates: TemplateData[] = [ tags: ["matrix", "communication"], load: () => import("./conduit/index").then((m) => m.generate), }, + { + id: "evolutionapi", + name: "Evolution API", + version: "v2.1.2", + description: + "Evolution API is a robust platform dedicated to empowering small businesses with limited resources, going beyond a simple messaging solution via WhatsApp.", + logo: "evolutionapi.png", + links: { + github: "https://github.com/EvolutionAPI/evolution-api", + docs: "https://doc.evolution-api.com/v2/en/get-started/introduction", + website: "https://evolution-api.com/opensource-whatsapp-api/", + }, + tags: ["api", "whatsapp", "messaging"], + load: () => import("./evolutionapi/index").then((m) => m.generate), + }, { id: "conduwuit", name: "Conduwuit", @@ -1276,11 +1367,11 @@ export const templates: TemplateData[] = [ version: "latest", description: "CouchDB is a document-oriented NoSQL database that excels at replication and horizontal scaling.", - logo: "couchdb.png", // we defined the name and the extension of the logo + logo: "couchdb.png", links: { - github: "lorem", - website: "lorem", - docs: "lorem", + github: "https://github.com/apache/couchdb", + website: "https://couchdb.apache.org/", + docs: "https://docs.couchdb.org/en/stable/", }, tags: ["database", "storage"], load: () => import("./couchdb/index").then((m) => m.generate), @@ -1298,4 +1389,233 @@ export const templates: TemplateData[] = [ tags: ["developer", "tools"], load: () => import("./it-tools/index").then((m) => m.generate), }, + { + id: "superset", + name: "Superset (Unofficial)", + version: "latest", + description: "Data visualization and data exploration platform.", + logo: "superset.svg", + links: { + github: "https://github.com/amancevice/docker-superset", + website: "https://superset.apache.org", + docs: "https://superset.apache.org/docs/intro", + }, + tags: ["analytics", "bi", "dashboard", "database", "sql"], + load: () => import("./superset/index").then((m) => m.generate), + }, + { + id: "glance", + name: "Glance", + version: "latest", + description: + "A self-hosted dashboard that puts all your feeds in one place. Features RSS feeds, weather, bookmarks, site monitoring, and more in a minimal, fast interface.", + logo: "glance.png", + links: { + github: "https://github.com/glanceapp/glance", + docs: "https://github.com/glanceapp/glance/blob/main/docs/configuration.md", + }, + tags: ["dashboard", "monitoring", "widgets", "rss"], + load: () => import("./glance/index").then((m) => m.generate), + }, + { + id: "homarr", + name: "Homarr", + version: "latest", + description: + "A sleek, modern dashboard that puts all your apps and services in one place with Docker integration.", + logo: "homarr.png", + links: { + github: "https://github.com/homarr-labs/homarr", + docs: "https://homarr.dev/docs/getting-started/installation/docker", + website: "https://homarr.dev/", + }, + tags: ["dashboard", "monitoring"], + load: () => import("./homarr/index").then((m) => m.generate), + }, + { + id: "erpnext", + name: "ERPNext", + version: "version-15", + description: "100% Open Source and highly customizable ERP software.", + logo: "erpnext.svg", + links: { + github: "https://github.com/frappe/erpnext", + docs: "https://docs.frappe.io/erpnext", + website: "https://erpnext.com", + }, + tags: [ + "erp", + "accounts", + "manufacturing", + "retail", + "sales", + "pos", + "hrms", + ], + load: () => import("./erpnext/index").then((m) => m.generate), + }, + { + id: "maybe", + name: "Maybe", + version: "latest", + description: + "Maybe is a self-hosted finance tracking application designed to simplify budgeting and expenses.", + logo: "maybe.svg", + links: { + github: "https://github.com/maybe-finance/maybe", + website: "https://maybe.finance/", + docs: "https://docs.maybe.finance/", + }, + tags: ["finance", "self-hosted"], + load: () => import("./maybe/index").then((m) => m.generate), + }, + { + id: "spacedrive", + name: "Spacedrive", + version: "latest", + description: + "Spacedrive is a cross-platform file manager. It connects your devices together to help you organize files from anywhere. powered by a virtual distributed filesystem (VDFS) written in Rust. Organize files across many devices in one place.", + links: { + github: "https://github.com/spacedriveapp/spacedrive", + website: "https://spacedrive.com/", + docs: "https://www.spacedrive.com/docs/product/getting-started/introduction", + }, + logo: "spacedrive.png", + tags: ["file-manager", "vdfs", "storage"], + load: () => import("./spacedrive/index").then((m) => m.generate), + }, + { + id: "registry", + name: "Docker Registry", + version: "2", + description: + "Distribution implementation for storing and distributing of Docker container images and artifacts.", + links: { + github: "https://github.com/distribution/distribution", + website: "https://hub.docker.com/_/registry", + docs: "https://distribution.github.io/distribution/", + }, + logo: "registry.png", + tags: ["registry", "docker", "self-hosted"], + load: () => import("./registry/index").then((m) => m.generate), + }, + { + id: "alist", + name: "AList", + version: "v3.41.0", + description: + "🗂️A file list/WebDAV program that supports multiple storages, powered by Gin and Solidjs.", + logo: "alist.svg", + links: { + github: "https://github.com/AlistGo/alist", + website: "https://alist.nn.ci", + docs: "https://alist.nn.ci/guide/install/docker.html", + }, + tags: ["file", "webdav", "storage"], + load: () => import("./alist/index").then((m) => m.generate), + }, + { + id: "answer", + name: "Answer", + version: "v1.4.1", + description: + "Answer is an open-source Q&A platform for building a self-hosted question-and-answer service.", + logo: "answer.png", + links: { + github: "https://github.com/apache/answer", + website: "https://answer.apache.org/", + docs: "https://answer.apache.org/docs", + }, + tags: ["q&a", "self-hosted"], + load: () => import("./answer/index").then((m) => m.generate), + }, + { + id: "shlink", + name: "Shlink", + version: "stable", + description: + "URL shortener that can be used to serve shortened URLs under your own domain.", + logo: "shlink.svg", + links: { + github: "https://github.com/shlinkio/shlink", + website: "https://shlink.io", + docs: "https://shlink.io/documentation", + }, + tags: ["sharing", "shortener", "url"], + load: () => import("./shlink/index").then((m) => m.generate), + }, + { + id: "frappe-hr", + name: "Frappe HR", + version: "version-15", + description: + "Feature rich HR & Payroll software. 100% FOSS and customizable.", + logo: "frappe-hr.svg", + links: { + github: "https://github.com/frappe/hrms", + docs: "https://docs.frappe.io/hr", + website: "https://frappe.io/hr", + }, + tags: ["hrms", "payroll", "leaves", "expenses", "attendance", "performace"], + load: () => import("./frappe-hr/index").then((m) => m.generate), + }, + { + id: "formbricks", + name: "Formbricks", + version: "v3.1.3", + description: + "Formbricks is an open-source survey and form platform for collecting user data.", + logo: "formbricks.png", + links: { + github: "https://github.com/formbricks/formbricks", + website: "https://formbricks.com/", + docs: "https://formbricks.com/docs", + }, + tags: ["forms", "analytics"], + load: () => import("./formbricks/index").then((m) => m.generate), + }, + { + id: "trilium", + name: "Trilium", + description: + "Trilium Notes is a hierarchical note taking application with focus on building large personal knowledge bases.", + logo: "trilium.png", + version: "latest", + links: { + github: "https://github.com/zadam/trilium", + website: "https://github.com/zadam/trilium", + docs: "https://github.com/zadam/trilium/wiki/", + }, + tags: ["self-hosted", "productivity", "personal-use"], + load: () => import("./trilium/index").then((m) => m.generate), + }, + { + id: "convex", + name: "Convex", + version: "latest", + description: + "Convex is an open-source reactive database designed to make life easy for web app developers.", + logo: "convex.svg", + links: { + github: "https://github.com/get-convex/convex", + website: "https://www.convex.dev/", + docs: "https://www.convex.dev/docs", + }, + tags: ["backend", "database", "api"], + load: () => import("./convex/index").then((m) => m.generate), + }, + { + id: "wikijs", + name: "Wiki.js", + version: "2.5", + description: "The most powerful and extensible open source Wiki software.", + logo: "wikijs.svg", + links: { + github: "https://github.com/requarks/wiki", + website: "https://js.wiki/", + docs: "https://docs.requarks.io/", + }, + tags: ["knowledge-base", "self-hosted", "documentation"], + load: () => import("./wikijs/index").then((m) => m.generate), + }, ]; diff --git a/apps/dokploy/templates/triggerdotdev/index.ts b/apps/dokploy/templates/triggerdotdev/index.ts index 7b894acb..c11c708b 100644 --- a/apps/dokploy/templates/triggerdotdev/index.ts +++ b/apps/dokploy/templates/triggerdotdev/index.ts @@ -1,4 +1,3 @@ -import { Secrets } from "@/components/ui/secrets"; import { type DomainSchema, type Schema, diff --git a/apps/dokploy/templates/trilium/docker-compose.yml b/apps/dokploy/templates/trilium/docker-compose.yml new file mode 100644 index 00000000..f549d820 --- /dev/null +++ b/apps/dokploy/templates/trilium/docker-compose.yml @@ -0,0 +1,14 @@ +services: + trilium: + image: zadam/trilium:latest + ports: + - 8080 + networks: + - dokploy-network + restart: always + volumes: + - /root/trilium-backups:/home/node/trilium-data/backup + +networks: + dokploy-network: + external: true diff --git a/apps/dokploy/templates/trilium/index.ts b/apps/dokploy/templates/trilium/index.ts new file mode 100644 index 00000000..acac9841 --- /dev/null +++ b/apps/dokploy/templates/trilium/index.ts @@ -0,0 +1,22 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const triliumDomain = generateRandomDomain(schema); + + const domains: DomainSchema[] = [ + { + host: triliumDomain, + port: 8080, + serviceName: "trilium", + }, + ]; + + return { + domains, + }; +} diff --git a/apps/dokploy/templates/twenty/docker-compose.yml b/apps/dokploy/templates/twenty/docker-compose.yml index 34c70aeb..800e9a72 100644 --- a/apps/dokploy/templates/twenty/docker-compose.yml +++ b/apps/dokploy/templates/twenty/docker-compose.yml @@ -4,8 +4,7 @@ services: twenty-change-vol-ownership: image: ubuntu user: root - networks: - - dokploy-network + volumes: - twenty-server-local-data:/tmp/server-local-data - twenty-docker-data:/tmp/docker-data @@ -16,8 +15,7 @@ services: twenty-server: image: twentycrm/twenty:latest - networks: - - dokploy-network + volumes: - twenty-server-local-data:/app/packages/twenty-server/${STORAGE_LOCAL_PATH:-.local-storage} - twenty-docker-data:/app/docker-data @@ -45,8 +43,7 @@ services: twenty-worker: image: twentycrm/twenty:latest - networks: - - dokploy-network + command: ["yarn", "worker:prod"] environment: PG_DATABASE_URL: postgres://${DB_USER}:${DB_PASSWORD}@twenty-postgres:5432/twenty @@ -65,8 +62,7 @@ services: twenty-postgres: image: postgres:16-alpine - networks: - - dokploy-network + volumes: - twenty-postgres-data:/var/lib/postgresql/data environment: @@ -82,8 +78,7 @@ services: twenty-redis: image: redis:latest - networks: - - dokploy-network + volumes: - twenty-redis-data:/data healthcheck: diff --git a/apps/dokploy/templates/typebot/docker-compose.yml b/apps/dokploy/templates/typebot/docker-compose.yml index 739793fe..7881bd8f 100644 --- a/apps/dokploy/templates/typebot/docker-compose.yml +++ b/apps/dokploy/templates/typebot/docker-compose.yml @@ -13,8 +13,7 @@ services: POSTGRES_USER: typebot POSTGRES_DB: typebot POSTGRES_PASSWORD: typebot - networks: - - dokploy-network + typebot-builder: image: baptistearno/typebot-builder:2.27 diff --git a/apps/dokploy/templates/umami/docker-compose.yml b/apps/dokploy/templates/umami/docker-compose.yml index 191c4803..26efd337 100644 --- a/apps/dokploy/templates/umami/docker-compose.yml +++ b/apps/dokploy/templates/umami/docker-compose.yml @@ -1,6 +1,6 @@ services: umami: - image: ghcr.io/umami-software/umami:postgresql-v2.14.0 + image: ghcr.io/umami-software/umami:postgresql-v2.16.1 restart: always healthcheck: test: ["CMD-SHELL", "curl http://localhost:3000/api/heartbeat"] @@ -22,8 +22,7 @@ services: interval: 5s timeout: 5s retries: 5 - networks: - - dokploy-network + volumes: - db-data:/var/lib/postgresql/data environment: diff --git a/apps/dokploy/templates/unifi/docker-compose.yml b/apps/dokploy/templates/unifi/docker-compose.yml index ee531f67..cf0102c0 100644 --- a/apps/dokploy/templates/unifi/docker-compose.yml +++ b/apps/dokploy/templates/unifi/docker-compose.yml @@ -29,8 +29,7 @@ services: restart: unless-stopped depends_on: - unifi-db - networks: - - dokploy-network + unifi-db: image: mongo:4.4 @@ -40,8 +39,7 @@ services: ports: - 27017 restart: unless-stopped - networks: - - dokploy-network + networks: dokploy-network: diff --git a/apps/dokploy/templates/unifi/index.ts b/apps/dokploy/templates/unifi/index.ts index 975ce63d..ea67b0fa 100644 --- a/apps/dokploy/templates/unifi/index.ts +++ b/apps/dokploy/templates/unifi/index.ts @@ -1,6 +1,6 @@ import type { Schema, Template } from "../utils"; -export function generate(schema: Schema): Template { +export function generate(_schema: Schema): Template { const mounts: Template["mounts"] = [ { filePath: "init-mongo.sh", diff --git a/apps/dokploy/templates/unsend/docker-compose.yml b/apps/dokploy/templates/unsend/docker-compose.yml index cdf02de6..93e80295 100644 --- a/apps/dokploy/templates/unsend/docker-compose.yml +++ b/apps/dokploy/templates/unsend/docker-compose.yml @@ -3,8 +3,7 @@ name: unsend-prod services: unsend-db-prod: image: postgres:16 - networks: - - dokploy-network + restart: always environment: - POSTGRES_USER=${POSTGRES_USER:?err} @@ -22,8 +21,7 @@ services: unsend-redis-prod: image: redis:7 - networks: - - dokploy-network + restart: always # ports: # - "6379:6379" @@ -33,8 +31,7 @@ services: unsend-storage-prod: image: minio/minio:RELEASE.2024-11-07T00-52-20Z - networks: - - dokploy-network + ports: - 9002 - 9001 @@ -47,9 +44,7 @@ services: command: -c 'mkdir -p /data/unsend && minio server /data --console-address ":9001" --address ":9002"' unsend: - image: unsend/unsend:v1.2.4 - networks: - - dokploy-network + image: unsend/unsend:v1.3.2 restart: always ports: - ${PORT:-3000} diff --git a/apps/dokploy/templates/unsend/index.ts b/apps/dokploy/templates/unsend/index.ts index 1c4c9c71..dcc80f66 100644 --- a/apps/dokploy/templates/unsend/index.ts +++ b/apps/dokploy/templates/unsend/index.ts @@ -3,7 +3,6 @@ import { type Schema, type Template, generateBase64, - generateHash, generateRandomDomain, } from "../utils"; diff --git a/apps/dokploy/templates/utils/index.ts b/apps/dokploy/templates/utils/index.ts index b5369b91..941afc80 100644 --- a/apps/dokploy/templates/utils/index.ts +++ b/apps/dokploy/templates/utils/index.ts @@ -12,7 +12,9 @@ export interface Schema { projectName: string; } -export type DomainSchema = Pick; +export type DomainSchema = Pick & { + path?: string; +}; export interface Template { envs?: string[]; diff --git a/apps/dokploy/templates/wikijs/docker-compose.yml b/apps/dokploy/templates/wikijs/docker-compose.yml new file mode 100644 index 00000000..6b21423d --- /dev/null +++ b/apps/dokploy/templates/wikijs/docker-compose.yml @@ -0,0 +1,31 @@ +version: '3.5' +services: + wiki: + image: ghcr.io/requarks/wiki:2.5 + restart: unless-stopped + environment: + - DB_TYPE + - DB_HOST + - DB_PORT + - DB_USER + - DB_PASS + - DB_NAME + depends_on: + - db + labels: + - traefik.enable=true + - traefik.constraint-label-stack=wikijs + db: + image: postgres:14 + restart: unless-stopped + environment: + - POSTGRES_USER + - POSTGRES_PASSWORD + - POSTGRES_DB + volumes: + - wiki-db-data:/var/lib/postgresql/data +networks: + dokploy-network: + external: true +volumes: + wiki-db-data: diff --git a/apps/dokploy/templates/wikijs/index.ts b/apps/dokploy/templates/wikijs/index.ts new file mode 100644 index 00000000..ff6c234d --- /dev/null +++ b/apps/dokploy/templates/wikijs/index.ts @@ -0,0 +1,35 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const domains: DomainSchema[] = [ + { + host: generateRandomDomain(schema), + port: 3000, + serviceName: "wiki", + }, + ]; + + const envs = [ + "# Database Setup", + "POSTGRES_USER=wikijs", + "POSTGRES_PASSWORD=wikijsrocks", + "POSTGRES_DB=wiki", + "# WikiJS Database Connection", + "DB_TYPE=postgres", + "DB_HOST=db", + "DB_PORT=5432", + "DB_USER=wikijs", + "DB_PASS=wikijsrocks", + "DB_NAME=wiki", + ]; + + return { + domains, + envs, + }; +} diff --git a/apps/dokploy/templates/windmill/docker-compose.yml b/apps/dokploy/templates/windmill/docker-compose.yml index de91ee55..9e91fa0a 100644 --- a/apps/dokploy/templates/windmill/docker-compose.yml +++ b/apps/dokploy/templates/windmill/docker-compose.yml @@ -7,8 +7,7 @@ services: restart: unless-stopped volumes: - windmill-postgres-data:/var/lib/postgresql/data - networks: - - dokploy-network + environment: POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: windmill @@ -20,8 +19,7 @@ services: windmill-server: image: ghcr.io/windmill-labs/windmill:main - networks: - - dokploy-network + restart: unless-stopped environment: - DATABASE_URL=${DATABASE_URL} @@ -42,8 +40,7 @@ services: cpus: "1" memory: 2048M restart: unless-stopped - networks: - - dokploy-network + environment: - DATABASE_URL=${DATABASE_URL} - MODE=worker @@ -65,8 +62,7 @@ services: cpus: "0.1" memory: 128M restart: unless-stopped - networks: - - dokploy-network + environment: - DATABASE_URL=${DATABASE_URL} - MODE=worker @@ -82,16 +78,14 @@ services: windmill-lsp: image: ghcr.io/windmill-labs/windmill-lsp:latest restart: unless-stopped - networks: - - dokploy-network + volumes: - windmill-lsp-cache:/root/.cache windmill-caddy: image: ghcr.io/windmill-labs/caddy-l4:latest restart: unless-stopped - networks: - - dokploy-network + volumes: - ../files/Caddyfile:/etc/caddy/Caddyfile environment: diff --git a/apps/dokploy/templates/wordpress/docker-compose.yml b/apps/dokploy/templates/wordpress/docker-compose.yml index 7647859d..f2fc4d9a 100644 --- a/apps/dokploy/templates/wordpress/docker-compose.yml +++ b/apps/dokploy/templates/wordpress/docker-compose.yml @@ -12,8 +12,6 @@ services: db: image: mysql:5.7.34 - networks: - - dokploy-network environment: MYSQL_DATABASE: exampledb MYSQL_USER: exampleuser diff --git a/apps/dokploy/templates/yourls/docker-compose.yml b/apps/dokploy/templates/yourls/docker-compose.yml index ff2e14d9..f4aa16e3 100644 --- a/apps/dokploy/templates/yourls/docker-compose.yml +++ b/apps/dokploy/templates/yourls/docker-compose.yml @@ -3,8 +3,7 @@ version: '3.7' services: yourls-app: image: yourls:1.9.2 - networks: - - dokploy-network + environment: YOURLS_SITE: https://${YOURLS_HOST} YOURLS_USER: ${YOURLS_ADMIN_USER} @@ -22,8 +21,7 @@ services: yourls-mysql: image: mysql:5.7 - networks: - - dokploy-network + environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: yourls diff --git a/apps/dokploy/templates/zipline/docker-compose.yml b/apps/dokploy/templates/zipline/docker-compose.yml index 808b0b89..e29132df 100644 --- a/apps/dokploy/templates/zipline/docker-compose.yml +++ b/apps/dokploy/templates/zipline/docker-compose.yml @@ -2,8 +2,7 @@ version: "3" services: postgres: image: postgres:15 - networks: - - dokploy-network + restart: unless-stopped environment: - POSTGRES_USER=postgres diff --git a/apps/monitoring/.gitignore b/apps/monitoring/.gitignore new file mode 100644 index 00000000..b3532fce --- /dev/null +++ b/apps/monitoring/.gitignore @@ -0,0 +1 @@ +monitoring.db \ No newline at end of file diff --git a/apps/monitoring/LICENSE.md b/apps/monitoring/LICENSE.md new file mode 100644 index 00000000..e69de29b diff --git a/apps/monitoring/README.md b/apps/monitoring/README.md new file mode 100644 index 00000000..3d0e1fa6 --- /dev/null +++ b/apps/monitoring/README.md @@ -0,0 +1,154 @@ +# Dokploy Monitoring (Go Version) + +Application that powers Dokploy's monitoring service. + +You can use it for monitoring any external service. + +## Requirements + +- Go 1.21 + +## Configuration + +Create a `.env` file in the root of the project with the following content: + +```shell +METRICS_CONFIG='{ + "server": { + "refreshRate": 25, + "port": 3001, + "type": "Remote | Dokploy", + "token": "metrics", + "urlCallback": "http://localhost:3000/api/trpc/notification.receiveNotification", + "retentionDays": 7, + "cronJob": "0 0 * * *", + "thresholds": { + "cpu": 0, + "memory": 0 + } + }, + "containers": { + "refreshRate": 25, + "services": { + "include": ["testing-elasticsearch-14649e"], + "exclude": [] + } + } +}' +``` + +## Installation + +```bash +go mod download +``` + +## Execution + +```bash +go run main.go +``` + +## Endpoints + +- `GET /health` - Check service health status (no authentication required) +- `GET /metrics?limit=` - Get server metrics (default limit: 50) +- `GET /metrics/containers?limit=&appName=` - Get container metrics for a specific application (default limit: 50) + +## Features + +### Server + +- CPU Usage (%) +- Memory Usage (%) +- Disk +- Network +- CPU Model +- Operating System +- Kernel +- Architecture +- Threads + +Example response: + +| Field | Value | +| ------------------ | --------------------------- | +| timestamp | 2025-01-19T21:44:54.232164Z | +| cpu | 24.57% | +| cpu_model | Apple M1 Pro | +| cpu_cores | 8 | +| cpu_physical_cores | 1 | +| cpu_speed | 3228.0 MHz | +| os | darwin | +| distro | darwin | +| kernel | 23.4.0 | +| arch | arm64 | +| mem_used | 81.91% | +| mem_used_gb | 13.11 GB | +| mem_total | 16.0 GB | +| uptime | 752232s | +| disk_used | 89.34% | +| total_disk | 460.43 GB | +| network_in | 54.78 MB | +| network_out | 31.72 MB | + +### Containers + +Compatible with all Docker container types (standalone containers, Docker Compose, and Docker Swarm stacks). Note: When monitoring Docker Compose or Swarm stacks, use the `--p` flag to properly identify all services within the stack. + +Example response: + +| Field | Value | +| -------------- | ------------------------------------- | +| id | 1 | +| timestamp | 2025-01-19T22:16:30.796129Z | +| container_id | 7428f5a49039 | +| container_name | testing-elasticsearch-14649e-kibana-1 | + +Metrics JSON: + +```json +{ + "timestamp": "2025-01-19T22:16:30.796129Z", + "CPU": 83.76, + "Memory": { + "percentage": 0.03, + "used": 2.262, + "total": 7.654, + "usedUnit": "MB", + "totalUnit": "GB" + }, + "Network": { + "input": 306, + "output": 0, + "inputUnit": "B", + "outputUnit": "B" + }, + "BlockIO": { + "read": 28.7, + "write": 0, + "readUnit": "kB", + "writeUnit": "B" + }, + "Container": "7428f5a49039", + "ID": "7428f5a49039", + "Name": "testing-elasticsearch-14649e-kibana-1" +} +``` + +## Notifications + +Dokploy uses a callback URL to send notifications when metrics exceed configured thresholds. Notifications are sent via POST request in the following format: + +Note: Setting a threshold to 0 disables notifications for that metric. + +```typescript +interface Notification { + Type: "Memory" | "CPU"; + Value: number; + Threshold: number; + Message: string; + Timestamp: string; + Token: string; +} +``` diff --git a/apps/monitoring/config/metrics.go b/apps/monitoring/config/metrics.go new file mode 100644 index 00000000..568b2d06 --- /dev/null +++ b/apps/monitoring/config/metrics.go @@ -0,0 +1,57 @@ +package config + +import ( + "encoding/json" + "log" + "os" + "sync" +) + +type Config struct { + Server struct { + ServerType string `json:"type"` + RefreshRate int `json:"refreshRate"` + Port int `json:"port"` + Token string `json:"token"` + UrlCallback string `json:"urlCallback"` + CronJob string `json:"cronJob"` + RetentionDays int `json:"retentionDays"` + Thresholds struct { + CPU int `json:"cpu"` + Memory int `json:"memory"` + } `json:"thresholds"` + } `json:"server"` + Containers struct { + RefreshRate int `json:"refreshRate"` + Services struct { + Include []string `json:"include"` + Exclude []string `json:"exclude"` + } `json:"services"` + } `json:"containers"` +} + +var ( + config *Config + configOnce sync.Once +) + +func GetMetricsConfig() *Config { + configOnce.Do(func() { + configJSON := os.Getenv("METRICS_CONFIG") + if configJSON == "" { + log.Fatal("METRICS_CONFIG environment variable is required") + } + + config = &Config{} + if err := json.Unmarshal([]byte(configJSON), config); err != nil { + log.Fatalf("Error parsing METRICS_CONFIG: %v", err) + } + + // Validate required fields + if config.Server.Token == "" || config.Server.UrlCallback == "" { + log.Fatal("token and urlCallback are required in the configuration") + } + }) + + return config +} diff --git a/apps/monitoring/containers/config.go b/apps/monitoring/containers/config.go new file mode 100644 index 00000000..a974bbe3 --- /dev/null +++ b/apps/monitoring/containers/config.go @@ -0,0 +1,61 @@ +package containers + +import ( + "strings" + + "github.com/mauriciogm/dokploy/apps/monitoring/config" +) + +var monitorConfig *MonitoringConfig + +func LoadConfig() error { + cfg := config.GetMetricsConfig() + monitorConfig = &MonitoringConfig{ + IncludeServices: make([]string, len(cfg.Containers.Services.Include)), + ExcludeServices: make([]string, len(cfg.Containers.Services.Exclude)), + } + + // Convert Include services + for i, svc := range cfg.Containers.Services.Include { + monitorConfig.IncludeServices[i] = svc + } + + // Convert Exclude services + for i, appName := range cfg.Containers.Services.Exclude { + monitorConfig.ExcludeServices[i] = appName + } + + return nil +} + +func ShouldMonitorContainer(containerName string) bool { + if monitorConfig == nil { + return false + } + + for _, excluded := range monitorConfig.ExcludeServices { + if strings.Contains(containerName, excluded) { + return false + } + } + + if len(monitorConfig.IncludeServices) > 0 { + for _, included := range monitorConfig.IncludeServices { + if strings.Contains(containerName, included) { + return true + } + } + return false + } + + return true +} + +func GetServiceName(containerName string) string { + name := strings.TrimPrefix(containerName, "/") + parts := strings.Split(name, "-") + if len(parts) > 1 { + return strings.Join(parts[:len(parts)-1], "-") + } + return name +} diff --git a/apps/monitoring/containers/monitor.go b/apps/monitoring/containers/monitor.go new file mode 100644 index 00000000..ff658642 --- /dev/null +++ b/apps/monitoring/containers/monitor.go @@ -0,0 +1,270 @@ +package containers + +import ( + "encoding/json" + "fmt" + "log" + "os/exec" + "strconv" + "strings" + "sync" + "time" + + "github.com/mauriciogm/dokploy/apps/monitoring/config" + "github.com/mauriciogm/dokploy/apps/monitoring/database" +) + +type ContainerMonitor struct { + db *database.DB + isRunning bool + mu sync.Mutex + stopChan chan struct{} +} + +func NewContainerMonitor(db *database.DB) (*ContainerMonitor, error) { + if err := db.InitContainerMetricsTable(); err != nil { + return nil, fmt.Errorf("failed to initialize container metrics table: %v", err) + } + + return &ContainerMonitor{ + db: db, + stopChan: make(chan struct{}), + }, nil +} + +func (cm *ContainerMonitor) Start() error { + if err := LoadConfig(); err != nil { + return fmt.Errorf("error loading config: %v", err) + } + + // Check if there are services to monitor + if len(monitorConfig.IncludeServices) == 0 { + log.Printf("No services to monitor. Skipping container metrics collection") + return nil + } + + metricsConfig := config.GetMetricsConfig() + refreshRate := metricsConfig.Containers.RefreshRate + if refreshRate == 0 { + refreshRate = 60 // default refresh rate + } + duration := time.Duration(refreshRate) * time.Second + + // log.Printf("Container metrics collection will run every %d seconds for services: %v", refreshRate, monitorConfig.IncludeServices) + + ticker := time.NewTicker(duration) + go func() { + for { + select { + case <-ticker.C: + // Check again in case the configuration has changed + if len(monitorConfig.IncludeServices) == 0 { + log.Printf("No services to monitor. Stopping metrics collection") + ticker.Stop() + return + } + cm.collectMetrics() + case <-cm.stopChan: + ticker.Stop() + return + } + } + }() + + return nil +} + +func (cm *ContainerMonitor) Stop() { + close(cm.stopChan) +} + +func (cm *ContainerMonitor) collectMetrics() { + cm.mu.Lock() + if cm.isRunning { + cm.mu.Unlock() + log.Println("Previous collection still running, skipping...") + return + } + cm.isRunning = true + cm.mu.Unlock() + + defer func() { + cm.mu.Lock() + cm.isRunning = false + cm.mu.Unlock() + }() + + cmd := exec.Command("docker", "stats", "--no-stream", "--format", + `{"BlockIO":"{{.BlockIO}}","CPUPerc":"{{.CPUPerc}}","ID":"{{.ID}}","MemPerc":"{{.MemPerc}}","MemUsage":"{{.MemUsage}}","Name":"{{.Name}}","NetIO":"{{.NetIO}}"}`) + + output, err := cmd.CombinedOutput() + + // log.Printf("Output: %s", string(output)) + if err != nil { + log.Printf("Error getting docker stats: %v", err) + return + } + + lines := string(output) + if lines == "" { + return + } + + seenServices := make(map[string]bool) + for _, line := range strings.Split(lines, "\n") { + if line == "" { + continue + } + + var container Container + if err := json.Unmarshal([]byte(line), &container); err != nil { + log.Printf("Error parsing container data: %v", err) + continue + } + + if !ShouldMonitorContainer(container.Name) { + continue + } + + serviceName := GetServiceName(container.Name) + + if seenServices[serviceName] { + continue + } + + seenServices[serviceName] = true + + // log.Printf("Container: %+v", container) + + // Process metrics + metric := processContainerMetrics(container) + + // log.Printf("Saving metrics for %s: %+v", serviceName, metric) + + if err := cm.db.SaveContainerMetric(metric); err != nil { + log.Printf("Error saving metrics for %s: %v", serviceName, err) + } + } +} + +func processContainerMetrics(container Container) *database.ContainerMetric { + + // Process CPU + cpu, _ := strconv.ParseFloat(strings.TrimSuffix(container.CPUPerc, "%"), 64) + + // Process Memory + memPerc, _ := strconv.ParseFloat(strings.TrimSuffix(container.MemPerc, "%"), 64) + memParts := strings.Split(container.MemUsage, " / ") + + var usedValue, totalValue float64 + var usedUnit, totalUnit string + + if len(memParts) == 2 { + // Process used memory + usedParts := strings.Fields(memParts[0]) + if len(usedParts) > 0 { + usedValue, _ = strconv.ParseFloat(strings.TrimRight(usedParts[0], "MiBGiB"), 64) + usedUnit = strings.TrimLeft(usedParts[0], "0123456789.") + // Convert MiB to MB and GiB to GB + if usedUnit == "MiB" { + usedUnit = "MB" + } else if usedUnit == "GiB" { + usedUnit = "GB" + } + } + + // Process total memory + totalParts := strings.Fields(memParts[1]) + if len(totalParts) > 0 { + totalValue, _ = strconv.ParseFloat(strings.TrimRight(totalParts[0], "MiBGiB"), 64) + totalUnit = strings.TrimLeft(totalParts[0], "0123456789.") + // Convert MiB to MB and GiB to GB + if totalUnit == "MiB" { + totalUnit = "MB" + } else if totalUnit == "GiB" { + totalUnit = "GB" + } + } + } + + // Process Network I/O + netParts := strings.Split(container.NetIO, " / ") + + var netInValue, netOutValue float64 + var netInUnit, netOutUnit string + + if len(netParts) == 2 { + // Process input + inParts := strings.Fields(netParts[0]) + if len(inParts) > 0 { + netInValue, _ = strconv.ParseFloat(strings.TrimRight(inParts[0], "kMGTB"), 64) + netInUnit = strings.TrimLeft(inParts[0], "0123456789.") + } + + // Process output + outParts := strings.Fields(netParts[1]) + if len(outParts) > 0 { + netOutValue, _ = strconv.ParseFloat(strings.TrimRight(outParts[0], "kMGTB"), 64) + netOutUnit = strings.TrimLeft(outParts[0], "0123456789.") + } + } + + // Process Block I/O + blockParts := strings.Split(container.BlockIO, " / ") + + var blockReadValue, blockWriteValue float64 + var blockReadUnit, blockWriteUnit string + + if len(blockParts) == 2 { + // Process read + readParts := strings.Fields(blockParts[0]) + if len(readParts) > 0 { + blockReadValue, _ = strconv.ParseFloat(strings.TrimRight(readParts[0], "kMGTB"), 64) + blockReadUnit = strings.TrimLeft(readParts[0], "0123456789.") + } + + // Process write + writeParts := strings.Fields(blockParts[1]) + if len(writeParts) > 0 { + blockWriteValue, _ = strconv.ParseFloat(strings.TrimRight(writeParts[0], "kMGTB"), 64) + blockWriteUnit = strings.TrimLeft(writeParts[0], "0123456789.") + } + } + + return &database.ContainerMetric{ + Timestamp: time.Now().UTC().Format(time.RFC3339Nano), + CPU: cpu, + Memory: database.MemoryMetric{ + Percentage: memPerc, + Used: usedValue, + Total: totalValue, + UsedUnit: usedUnit, + TotalUnit: totalUnit, + }, + Network: database.NetworkMetric{ + Input: netInValue, + Output: netOutValue, + InputUnit: netInUnit, + OutputUnit: netOutUnit, + }, + BlockIO: database.BlockIOMetric{ + Read: blockReadValue, + Write: blockWriteValue, + ReadUnit: blockReadUnit, + WriteUnit: blockWriteUnit, + }, + Container: container.ID, + ID: container.ID, + Name: container.Name, + } +} + +func parseValue(value string) (float64, string) { + parts := strings.Fields(value) + if len(parts) < 1 { + return 0, "B" + } + v, _ := strconv.ParseFloat(parts[0], 64) + unit := strings.TrimLeft(value, "0123456789.") + return v, unit +} diff --git a/apps/monitoring/containers/types.go b/apps/monitoring/containers/types.go new file mode 100644 index 00000000..c1d1c110 --- /dev/null +++ b/apps/monitoring/containers/types.go @@ -0,0 +1,48 @@ +package containers + +type Container struct { + BlockIO string `json:"BlockIO"` + CPUPerc string `json:"CPUPerc"` + ID string `json:"ID"` + MemPerc string `json:"MemPerc"` + MemUsage string `json:"MemUsage"` + Name string `json:"Name"` + NetIO string `json:"NetIO"` +} + +type ContainerMetric struct { + Timestamp string `json:"timestamp"` + CPU float64 `json:"CPU"` + Memory MemoryMetric `json:"Memory"` + Network NetworkMetric `json:"Network"` + BlockIO BlockIOMetric `json:"BlockIO"` + Container string `json:"Container"` + ID string `json:"ID"` + Name string `json:"Name"` +} + +type MemoryMetric struct { + Percentage float64 `json:"percentage"` + Used float64 `json:"used"` + Total float64 `json:"total"` + Unit string `json:"unit"` +} + +type NetworkMetric struct { + Input float64 `json:"input"` + Output float64 `json:"output"` + InputUnit string `json:"inputUnit"` + OutputUnit string `json:"outputUnit"` +} + +type BlockIOMetric struct { + Read float64 `json:"read"` + Write float64 `json:"write"` + ReadUnit string `json:"readUnit"` + WriteUnit string `json:"writeUnit"` +} + +type MonitoringConfig struct { + IncludeServices []string `json:"includeServices"` + ExcludeServices []string `json:"excludeServices"` +} diff --git a/apps/monitoring/database/cleanup.go b/apps/monitoring/database/cleanup.go new file mode 100644 index 00000000..9ab0bd26 --- /dev/null +++ b/apps/monitoring/database/cleanup.go @@ -0,0 +1,52 @@ +package database + +import ( + "database/sql" + "log" + "time" + + "github.com/robfig/cron/v3" +) + +// CleanupMetrics deletes metrics older than the retention period +func CleanupMetrics(db *sql.DB, retentionDays int) error { + cutoffDate := time.Now().AddDate(0, 0, -retentionDays) + cutoffDateStr := cutoffDate.UTC().Format(time.RFC3339Nano) + + containerQuery := `DELETE FROM container_metrics WHERE timestamp < ?` + _, err := db.Exec(containerQuery, cutoffDateStr) + if err != nil { + return err + } + + serverQuery := `DELETE FROM server_metrics WHERE timestamp < ?` + _, err = db.Exec(serverQuery, cutoffDateStr) + if err != nil { + return err + } + + log.Printf("Metrics deleted (older than %d days)", retentionDays) + log.Printf("Cutoff date for both tables: %s", cutoffDateStr) + return nil +} + +// StartMetricsCleanup starts a cron job to periodically clean up metrics +func StartMetricsCleanup(db *sql.DB, retentionDays int, cronExpression string) (*cron.Cron, error) { + c := cron.New() + + _, err := c.AddFunc(cronExpression, func() { + if err := CleanupMetrics(db, retentionDays); err != nil { + log.Printf("Error during metrics cleanup: %v", err) + } + }) + + if err != nil { + return nil, err + } + + c.Start() + log.Printf("Started metrics cleanup job (retention: %d days, cron: %s)", + retentionDays, cronExpression) + + return c, nil +} diff --git a/apps/monitoring/database/containers.go b/apps/monitoring/database/containers.go new file mode 100644 index 00000000..568ad12e --- /dev/null +++ b/apps/monitoring/database/containers.go @@ -0,0 +1,160 @@ +package database + +import ( + "encoding/json" + "fmt" + "strings" +) + +func (db *DB) InitContainerMetricsTable() error { + _, err := db.Exec(` + CREATE TABLE IF NOT EXISTS container_metrics ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + timestamp TEXT NOT NULL, + container_id TEXT NOT NULL, + container_name TEXT NOT NULL, + metrics_json TEXT NOT NULL + ) + `) + if err != nil { + return fmt.Errorf("error creating container_metrics table: %v", err) + } + + // Crear índices para mejorar el rendimiento + _, err = db.Exec(`CREATE INDEX IF NOT EXISTS idx_container_metrics_timestamp ON container_metrics(timestamp)`) + if err != nil { + return fmt.Errorf("error creating timestamp index: %v", err) + } + + _, err = db.Exec(`CREATE INDEX IF NOT EXISTS idx_container_metrics_name ON container_metrics(container_name)`) + if err != nil { + return fmt.Errorf("error creating name index: %v", err) + } + + return nil +} + +func (db *DB) SaveContainerMetric(metric *ContainerMetric) error { + metricsJSON, err := json.Marshal(metric) + if err != nil { + return fmt.Errorf("error marshaling metrics: %v", err) + } + + _, err = db.Exec(` + INSERT INTO container_metrics (timestamp, container_id, container_name, metrics_json) + VALUES (?, ?, ?, ?) + `, metric.Timestamp, metric.ID, metric.Name, string(metricsJSON)) + return err +} + +func (db *DB) GetLastNContainerMetrics(containerName string, limit int) ([]ContainerMetric, error) { + name := strings.TrimPrefix(containerName, "/") + parts := strings.Split(name, "-") + if len(parts) > 1 { + containerName = strings.Join(parts[:len(parts)-1], "-") + } + + query := ` + WITH recent_metrics AS ( + SELECT metrics_json + FROM container_metrics + WHERE container_name LIKE ? || '%' + ORDER BY timestamp DESC + LIMIT ? + ) + SELECT metrics_json FROM recent_metrics ORDER BY json_extract(metrics_json, '$.timestamp') ASC + ` + rows, err := db.Query(query, containerName, limit) + if err != nil { + return nil, err + } + defer rows.Close() + + var metrics []ContainerMetric + for rows.Next() { + var metricsJSON string + err := rows.Scan(&metricsJSON) + if err != nil { + return nil, err + } + + var metric ContainerMetric + if err := json.Unmarshal([]byte(metricsJSON), &metric); err != nil { + return nil, err + } + metrics = append(metrics, metric) + } + return metrics, nil +} + +func (db *DB) GetAllMetricsContainer(containerName string) ([]ContainerMetric, error) { + name := strings.TrimPrefix(containerName, "/") + parts := strings.Split(name, "-") + if len(parts) > 1 { + containerName = strings.Join(parts[:len(parts)-1], "-") + } + + query := ` + WITH recent_metrics AS ( + SELECT metrics_json + FROM container_metrics + WHERE container_name LIKE ? || '%' + ORDER BY timestamp DESC + ) + SELECT metrics_json FROM recent_metrics ORDER BY json_extract(metrics_json, '$.timestamp') ASC + ` + rows, err := db.Query(query, containerName) + if err != nil { + return nil, err + } + defer rows.Close() + + var metrics []ContainerMetric + for rows.Next() { + var metricsJSON string + err := rows.Scan(&metricsJSON) + if err != nil { + return nil, err + } + + var metric ContainerMetric + if err := json.Unmarshal([]byte(metricsJSON), &metric); err != nil { + return nil, err + } + metrics = append(metrics, metric) + } + return metrics, nil +} + +type ContainerMetric struct { + Timestamp string `json:"timestamp"` + CPU float64 `json:"CPU"` + Memory MemoryMetric `json:"Memory"` + Network NetworkMetric `json:"Network"` + BlockIO BlockIOMetric `json:"BlockIO"` + Container string `json:"Container"` + ID string `json:"ID"` + Name string `json:"Name"` +} + +type MemoryMetric struct { + Percentage float64 `json:"percentage"` + Used float64 `json:"used"` + Total float64 `json:"total"` + UsedUnit string `json:"usedUnit"` + TotalUnit string `json:"totalUnit"` +} + +type NetworkMetric struct { + Input float64 `json:"input"` + Output float64 `json:"output"` + InputUnit string `json:"inputUnit"` + OutputUnit string `json:"outputUnit"` +} + +type BlockIOMetric struct { + Read float64 `json:"read"` + Write float64 `json:"write"` + ReadUnit string `json:"readUnit"` + WriteUnit string `json:"writeUnit"` +} diff --git a/apps/monitoring/database/db.go b/apps/monitoring/database/db.go new file mode 100644 index 00000000..689564fc --- /dev/null +++ b/apps/monitoring/database/db.go @@ -0,0 +1,47 @@ +package database + +import ( + "database/sql" + + _ "github.com/mattn/go-sqlite3" +) + +type DB struct { + *sql.DB +} + +func InitDB() (*DB, error) { + db, err := sql.Open("sqlite3", "./monitoring.db") + if err != nil { + return nil, err + } + + // Create metrics table if it doesn't exist + _, err = db.Exec(` + CREATE TABLE IF NOT EXISTS server_metrics ( + timestamp TEXT PRIMARY KEY, + cpu REAL, + cpu_model TEXT, + cpu_cores INTEGER, + cpu_physical_cores INTEGER, + cpu_speed REAL, + os TEXT, + distro TEXT, + kernel TEXT, + arch TEXT, + mem_used REAL, + mem_used_gb REAL, + mem_total REAL, + uptime INTEGER, + disk_used REAL, + total_disk REAL, + network_in REAL, + network_out REAL + ) + `) + if err != nil { + return nil, err + } + + return &DB{db}, nil +} diff --git a/apps/monitoring/database/server.go b/apps/monitoring/database/server.go new file mode 100644 index 00000000..64d22e3d --- /dev/null +++ b/apps/monitoring/database/server.go @@ -0,0 +1,115 @@ +package database + +import ( + "time" + + _ "github.com/mattn/go-sqlite3" +) + +type ServerMetric struct { + Timestamp string `json:"timestamp"` + CPU float64 `json:"cpu"` + CPUModel string `json:"cpuModel"` + CPUCores int32 `json:"cpuCores"` + CPUPhysicalCores int32 `json:"cpuPhysicalCores"` + CPUSpeed float64 `json:"cpuSpeed"` + OS string `json:"os"` + Distro string `json:"distro"` + Kernel string `json:"kernel"` + Arch string `json:"arch"` + MemUsed float64 `json:"memUsed"` + MemUsedGB float64 `json:"memUsedGB"` + MemTotal float64 `json:"memTotal"` + Uptime uint64 `json:"uptime"` + DiskUsed float64 `json:"diskUsed"` + TotalDisk float64 `json:"totalDisk"` + NetworkIn float64 `json:"networkIn"` + NetworkOut float64 `json:"networkOut"` +} + +func (db *DB) SaveMetric(metric ServerMetric) error { + if metric.Timestamp == "" { + metric.Timestamp = time.Now().UTC().Format(time.RFC3339Nano) + } + + _, err := db.Exec(` + INSERT INTO server_metrics (timestamp, cpu, cpu_model, cpu_cores, cpu_physical_cores, cpu_speed, os, distro, kernel, arch, mem_used, mem_used_gb, mem_total, uptime, disk_used, total_disk, network_in, network_out) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + `, metric.Timestamp, metric.CPU, metric.CPUModel, metric.CPUCores, metric.CPUPhysicalCores, metric.CPUSpeed, metric.OS, metric.Distro, metric.Kernel, metric.Arch, metric.MemUsed, metric.MemUsedGB, metric.MemTotal, metric.Uptime, metric.DiskUsed, metric.TotalDisk, metric.NetworkIn, metric.NetworkOut) + return err +} + +func (db *DB) GetMetricsInRange(start, end time.Time) ([]ServerMetric, error) { + rows, err := db.Query(` + SELECT timestamp, cpu, cpu_model, cpu_cores, cpu_physical_cores, cpu_speed, os, distro, kernel, arch, mem_used, mem_used_gb, mem_total, uptime, disk_used, total_disk, network_in, network_out + FROM server_metrics + WHERE timestamp BETWEEN ? AND ? + ORDER BY timestamp ASC + `, start.UTC().Format(time.RFC3339Nano), end.UTC().Format(time.RFC3339Nano)) + if err != nil { + return nil, err + } + defer rows.Close() + + var metrics []ServerMetric + for rows.Next() { + var m ServerMetric + err := rows.Scan(&m.Timestamp, &m.CPU, &m.CPUModel, &m.CPUCores, &m.CPUPhysicalCores, &m.CPUSpeed, &m.OS, &m.Distro, &m.Kernel, &m.Arch, &m.MemUsed, &m.MemUsedGB, &m.MemTotal, &m.Uptime, &m.DiskUsed, &m.TotalDisk, &m.NetworkIn, &m.NetworkOut) + if err != nil { + return nil, err + } + metrics = append(metrics, m) + } + return metrics, nil +} + +func (db *DB) GetLastNMetrics(n int) ([]ServerMetric, error) { + rows, err := db.Query(` + WITH recent_metrics AS ( + SELECT timestamp, cpu, cpu_model, cpu_cores, cpu_physical_cores, cpu_speed, os, distro, kernel, arch, mem_used, mem_used_gb, mem_total, uptime, disk_used, total_disk, network_in, network_out + FROM server_metrics + ORDER BY timestamp DESC + LIMIT ? + ) + SELECT * FROM recent_metrics + ORDER BY timestamp ASC + `, n) + if err != nil { + return nil, err + } + defer rows.Close() + + var metrics []ServerMetric + for rows.Next() { + var m ServerMetric + err := rows.Scan(&m.Timestamp, &m.CPU, &m.CPUModel, &m.CPUCores, &m.CPUPhysicalCores, &m.CPUSpeed, &m.OS, &m.Distro, &m.Kernel, &m.Arch, &m.MemUsed, &m.MemUsedGB, &m.MemTotal, &m.Uptime, &m.DiskUsed, &m.TotalDisk, &m.NetworkIn, &m.NetworkOut) + if err != nil { + return nil, err + } + metrics = append(metrics, m) + } + return metrics, nil +} + +func (db *DB) GetAllMetrics() ([]ServerMetric, error) { + rows, err := db.Query(` + SELECT timestamp, cpu, cpu_model, cpu_cores, cpu_physical_cores, cpu_speed, os, distro, kernel, arch, mem_used, mem_used_gb, mem_total, uptime, disk_used, total_disk, network_in, network_out + FROM server_metrics + ORDER BY timestamp ASC + `) + if err != nil { + return nil, err + } + defer rows.Close() + + var metrics []ServerMetric + for rows.Next() { + var m ServerMetric + err := rows.Scan(&m.Timestamp, &m.CPU, &m.CPUModel, &m.CPUCores, &m.CPUPhysicalCores, &m.CPUSpeed, &m.OS, &m.Distro, &m.Kernel, &m.Arch, &m.MemUsed, &m.MemUsedGB, &m.MemTotal, &m.Uptime, &m.DiskUsed, &m.TotalDisk, &m.NetworkIn, &m.NetworkOut) + if err != nil { + return nil, err + } + metrics = append(metrics, m) + } + return metrics, nil +} diff --git a/apps/monitoring/go.mod b/apps/monitoring/go.mod new file mode 100644 index 00000000..2c1590b4 --- /dev/null +++ b/apps/monitoring/go.mod @@ -0,0 +1,34 @@ +module github.com/mauriciogm/dokploy/apps/monitoring + +go 1.20 + +require ( + github.com/gofiber/fiber/v2 v2.52.6 + github.com/joho/godotenv v1.5.1 + github.com/mattn/go-sqlite3 v1.14.24 + github.com/shirou/gopsutil/v3 v3.24.5 +) + +require ( + github.com/andybalholm/brotli v1.1.0 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/klauspost/compress v1.17.9 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/robfig/cron/v3 v3.0.1 // indirect + github.com/shoenig/go-m1cpu v0.1.6 // indirect + github.com/tklauser/go-sysconf v0.3.14 // indirect + github.com/tklauser/numcpus v0.8.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.51.0 // indirect + github.com/valyala/tcplisten v1.0.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + golang.org/x/sys v0.28.0 // indirect +) + +replace github.com/mauriciogm/dokploy/apps/monitoring => ./ diff --git a/apps/monitoring/go.sum b/apps/monitoring/go.sum new file mode 100644 index 00000000..7a4c9db8 --- /dev/null +++ b/apps/monitoring/go.sum @@ -0,0 +1,61 @@ +github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/gofiber/fiber/v2 v2.52.6 h1:Rfp+ILPiYSvvVuIPvxrBns+HJp8qGLDnLJawAu27XVI= +github.com/gofiber/fiber/v2 v2.52.6/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= +github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= +github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= +github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= +github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= +github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA= +github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= +github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/zcalusic/sysinfo v1.1.3 h1:u/AVENkuoikKuIZ4sUEJ6iibpmQP6YpGD8SSMCrqAF0= +github.com/zcalusic/sysinfo v1.1.3/go.mod h1:NX+qYnWGtJVPV0yWldff9uppNKU4h40hJIRPf/pGLv4= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/apps/monitoring/main.go b/apps/monitoring/main.go new file mode 100644 index 00000000..432ccd24 --- /dev/null +++ b/apps/monitoring/main.go @@ -0,0 +1,164 @@ +package main + +import ( + "log" + "os" + "strconv" + "time" + + "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/middleware/cors" + "github.com/joho/godotenv" + "github.com/mauriciogm/dokploy/apps/monitoring/config" + "github.com/mauriciogm/dokploy/apps/monitoring/containers" + "github.com/mauriciogm/dokploy/apps/monitoring/database" + "github.com/mauriciogm/dokploy/apps/monitoring/middleware" + "github.com/mauriciogm/dokploy/apps/monitoring/monitoring" +) + +func main() { + godotenv.Load() + + // Get configuration + cfg := config.GetMetricsConfig() + token := cfg.Server.Token + METRICS_URL_CALLBACK := cfg.Server.UrlCallback + log.Printf("Environment variables:") + log.Printf("METRICS_CONFIG: %s", os.Getenv("METRICS_CONFIG")) + + if token == "" || METRICS_URL_CALLBACK == "" { + log.Fatal("token and urlCallback are required in the configuration") + } + + db, err := database.InitDB() + if err != nil { + log.Fatal(err) + } + + // Iniciar el sistema de limpieza de métricas + cleanupCron, err := database.StartMetricsCleanup(db.DB, cfg.Server.RetentionDays, cfg.Server.CronJob) + if err != nil { + log.Fatalf("Error starting metrics cleanup system: %v", err) + } + defer cleanupCron.Stop() + + app := fiber.New() + + app.Use(cors.New(cors.Config{ + AllowOrigins: "*", + AllowHeaders: "Origin, Content-Type, Accept, Authorization", + })) + + app.Get("/health", func(c *fiber.Ctx) error { + return c.JSON(fiber.Map{ + "status": "ok", + }) + }) + + app.Use(func(c *fiber.Ctx) error { + if c.Path() == "/health" { + return c.Next() + } + return middleware.AuthMiddleware()(c) + }) + + app.Get("/metrics", func(c *fiber.Ctx) error { + limit := c.Query("limit", "50") + + var metrics []monitoring.SystemMetrics + if limit == "all" { + dbMetrics, err := db.GetAllMetrics() + if err != nil { + return c.Status(500).JSON(fiber.Map{ + "error": "Failed to fetch metrics", + }) + } + for _, m := range dbMetrics { + metrics = append(metrics, monitoring.ConvertToSystemMetrics(m)) + } + } else { + n, err := strconv.Atoi(limit) + if err != nil { + n = 50 + } + dbMetrics, err := db.GetLastNMetrics(n) + if err != nil { + return c.Status(500).JSON(fiber.Map{ + "error": "Failed to fetch metrics", + }) + } + for _, m := range dbMetrics { + metrics = append(metrics, monitoring.ConvertToSystemMetrics(m)) + } + } + + return c.JSON(metrics) + }) + + containerMonitor, err := containers.NewContainerMonitor(db) + if err != nil { + log.Fatalf("Failed to create container monitor: %v", err) + } + if err := containerMonitor.Start(); err != nil { + log.Fatalf("Failed to start container monitor: %v", err) + } + defer containerMonitor.Stop() + + app.Get("/metrics/containers", func(c *fiber.Ctx) error { + limit := c.Query("limit", "50") + appName := c.Query("appName", "") + + if appName == "" { + return c.JSON([]database.ContainerMetric{}) + } + + var metrics []database.ContainerMetric + var err error + + if limit == "all" { + metrics, err = db.GetAllMetricsContainer(appName) + } else { + limitNum, parseErr := strconv.Atoi(limit) + if parseErr != nil { + limitNum = 50 + } + metrics, err = db.GetLastNContainerMetrics(appName, limitNum) + } + + if err != nil { + return c.Status(500).JSON(fiber.Map{ + "error": "Error getting container metrics: " + err.Error(), + }) + } + + return c.JSON(metrics) + }) + + go func() { + refreshRate := cfg.Server.RefreshRate + duration := time.Duration(refreshRate) * time.Second + + log.Printf("Refreshing server metrics every %v", duration) + ticker := time.NewTicker(duration) + defer ticker.Stop() + + for range ticker.C { + metrics := monitoring.GetServerMetrics() + if err := db.SaveMetric(metrics); err != nil { + log.Printf("Error saving metrics: %v", err) + } + + if err := monitoring.CheckThresholds(metrics); err != nil { + log.Printf("Error checking thresholds: %v", err) + } + } + }() + + port := cfg.Server.Port + if port == 0 { + port = 3001 + } + + log.Printf("Server starting on port %d", port) + log.Fatal(app.Listen(":" + strconv.Itoa(port))) +} diff --git a/apps/monitoring/middleware/auth.go b/apps/monitoring/middleware/auth.go new file mode 100644 index 00000000..95448213 --- /dev/null +++ b/apps/monitoring/middleware/auth.go @@ -0,0 +1,39 @@ +package middleware + +import ( + "strings" + + "github.com/gofiber/fiber/v2" + "github.com/mauriciogm/dokploy/apps/monitoring/config" +) + +func AuthMiddleware() fiber.Handler { + return func(c *fiber.Ctx) error { + expectedToken := config.GetMetricsConfig().Server.Token + + authHeader := c.Get("Authorization") + if authHeader == "" { + return c.Status(401).JSON(fiber.Map{ + "error": "Authorization header is required", + }) + } + + // Check if the header starts with "Bearer " + if !strings.HasPrefix(authHeader, "Bearer ") { + return c.Status(401).JSON(fiber.Map{ + "error": "Invalid authorization format. Use 'Bearer TOKEN'", + }) + } + + // Extract the token + token := strings.TrimPrefix(authHeader, "Bearer ") + + if token != expectedToken { + return c.Status(401).JSON(fiber.Map{ + "error": "Invalid token", + }) + } + + return c.Next() + } +} diff --git a/apps/monitoring/monitoring/monitor.go b/apps/monitoring/monitoring/monitor.go new file mode 100644 index 00000000..0beb4320 --- /dev/null +++ b/apps/monitoring/monitoring/monitor.go @@ -0,0 +1,261 @@ +package monitoring + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "os" + "os/exec" + "runtime" + "strings" + "time" + + "github.com/shirou/gopsutil/v3/cpu" + "github.com/shirou/gopsutil/v3/disk" + "github.com/shirou/gopsutil/v3/host" + "github.com/shirou/gopsutil/v3/mem" + "github.com/shirou/gopsutil/v3/net" + + "github.com/mauriciogm/dokploy/apps/monitoring/config" + "github.com/mauriciogm/dokploy/apps/monitoring/database" +) + +type SystemMetrics struct { + CPU string `json:"cpu"` + CPUModel string `json:"cpuModel"` + CPUCores int32 `json:"cpuCores"` + CPUPhysicalCores int32 `json:"cpuPhysicalCores"` + CPUSpeed float64 `json:"cpuSpeed"` + OS string `json:"os"` + Distro string `json:"distro"` + Kernel string `json:"kernel"` + Arch string `json:"arch"` + MemUsed string `json:"memUsed"` + MemUsedGB string `json:"memUsedGB"` + MemTotal string `json:"memTotal"` + Uptime uint64 `json:"uptime"` + DiskUsed string `json:"diskUsed"` + TotalDisk string `json:"totalDisk"` + NetworkIn string `json:"networkIn"` + NetworkOut string `json:"networkOut"` + Timestamp string `json:"timestamp"` +} + +type AlertPayload struct { + ServerType string `json:"ServerType"` + Type string `json:"Type"` + Value float64 `json:"Value"` + Threshold float64 `json:"Threshold"` + Message string `json:"Message"` + Timestamp string `json:"Timestamp"` + Token string `json:"Token"` +} + +func getRealOS() string { + if content, err := os.ReadFile("/etc/os-release"); err == nil { + lines := strings.Split(string(content), "\n") + var id, name, version string + for _, line := range lines { + if strings.HasPrefix(line, "PRETTY_NAME=") { + return strings.Trim(strings.TrimPrefix(line, "PRETTY_NAME="), "\"") + } else if strings.HasPrefix(line, "NAME=") { + name = strings.Trim(strings.TrimPrefix(line, "NAME="), "\"") + } else if strings.HasPrefix(line, "VERSION=") { + version = strings.Trim(strings.TrimPrefix(line, "VERSION="), "\"") + } else if strings.HasPrefix(line, "ID=") { + id = strings.Trim(strings.TrimPrefix(line, "ID="), "\"") + } + } + if name != "" && version != "" { + return fmt.Sprintf("%s %s", name, version) + } + if name != "" { + return name + } + if id != "" { + return id + } + } + + if content, err := os.ReadFile("/etc/system-release"); err == nil { + text := strings.ToLower(string(content)) + switch { + case strings.Contains(text, "red hat"): + return "rhel" + case strings.Contains(text, "centos"): + return "centos" + case strings.Contains(text, "fedora"): + return "fedora" + } + } + + cmd := exec.Command("uname", "-a") + if output, err := cmd.Output(); err == nil { + osInfo := strings.ToLower(string(output)) + switch { + case strings.Contains(osInfo, "debian"): + return "debian" + case strings.Contains(osInfo, "ubuntu"): + return "ubuntu" + case strings.Contains(osInfo, "centos"): + return "centos" + case strings.Contains(osInfo, "fedora"): + return "fedora" + case strings.Contains(osInfo, "red hat"): + return "rhel" + case strings.Contains(osInfo, "arch"): + return "arch" + case strings.Contains(osInfo, "darwin"): + return "darwin" + } + } + + return runtime.GOOS +} + +func GetServerMetrics() database.ServerMetric { + v, _ := mem.VirtualMemory() + c, _ := cpu.Percent(0, false) + cpuInfo, _ := cpu.Info() + diskInfo, _ := disk.Usage("/") + netInfo, _ := net.IOCounters(false) + hostInfo, _ := host.Info() + distro := getRealOS() + + cpuModel := "" + if len(cpuInfo) > 0 { + cpuModel = fmt.Sprintf("%s %s", cpuInfo[0].VendorID, cpuInfo[0].ModelName) + } + + memTotalGB := float64(v.Total) / 1024 / 1024 / 1024 + memUsedGB := float64(v.Used) / 1024 / 1024 / 1024 + memUsedPercent := (memUsedGB / memTotalGB) * 100 + + var networkIn, networkOut float64 + if len(netInfo) > 0 { + networkIn = float64(netInfo[0].BytesRecv) / 1024 / 1024 + networkOut = float64(netInfo[0].BytesSent) / 1024 / 1024 + } + return database.ServerMetric{ + Timestamp: time.Now().UTC().Format(time.RFC3339Nano), + CPU: c[0], + CPUModel: cpuModel, + CPUCores: int32(runtime.NumCPU()), + CPUPhysicalCores: int32(len(cpuInfo)), + CPUSpeed: float64(cpuInfo[0].Mhz), + OS: getRealOS(), + Distro: distro, + Kernel: hostInfo.KernelVersion, + Arch: hostInfo.KernelArch, + MemUsed: memUsedPercent, + MemUsedGB: memUsedGB, + MemTotal: memTotalGB, + Uptime: hostInfo.Uptime, + DiskUsed: float64(diskInfo.UsedPercent), + TotalDisk: float64(diskInfo.Total) / 1024 / 1024 / 1024, + NetworkIn: networkIn, + NetworkOut: networkOut, + } +} + +func ConvertToSystemMetrics(metric database.ServerMetric) SystemMetrics { + return SystemMetrics{ + CPU: fmt.Sprintf("%.2f", metric.CPU), + CPUModel: metric.CPUModel, + CPUCores: metric.CPUCores, + CPUPhysicalCores: metric.CPUPhysicalCores, + CPUSpeed: metric.CPUSpeed, + OS: metric.OS, + Distro: metric.Distro, + Kernel: metric.Kernel, + Arch: metric.Arch, + MemUsed: fmt.Sprintf("%.2f", metric.MemUsed), + MemUsedGB: fmt.Sprintf("%.2f", metric.MemUsedGB), + MemTotal: fmt.Sprintf("%.2f", metric.MemTotal), + Uptime: metric.Uptime, + DiskUsed: fmt.Sprintf("%.2f", metric.DiskUsed), + TotalDisk: fmt.Sprintf("%.2f", metric.TotalDisk), + NetworkIn: fmt.Sprintf("%.2f", metric.NetworkIn), + NetworkOut: fmt.Sprintf("%.2f", metric.NetworkOut), + Timestamp: metric.Timestamp, + } +} + +func CheckThresholds(metrics database.ServerMetric) error { + cfg := config.GetMetricsConfig() + cpuThreshold := float64(cfg.Server.Thresholds.CPU) + memThreshold := float64(cfg.Server.Thresholds.Memory) + callbackURL := cfg.Server.UrlCallback + metricsToken := cfg.Server.Token + + // log.Printf("CPU threshold: %.2f%%", cpuThreshold) + // log.Printf("Current CPU usage: %.2f%%", metrics.CPU) + // log.Printf("Memory threshold: %.2f%%", memThreshold) + // log.Printf("Callback URL: %s", callbackURL) + // log.Printf("Metrics token: %s", metricsToken) + + if cpuThreshold == 0 && memThreshold == 0 { + return nil + } + + if cpuThreshold > 0 && metrics.CPU > cpuThreshold { + alert := AlertPayload{ + ServerType: cfg.Server.ServerType, + Type: "CPU", + Value: metrics.CPU, + Threshold: cpuThreshold, + Message: fmt.Sprintf("CPU usage (%.2f%%) exceeded threshold (%.2f%%)", metrics.CPU, cpuThreshold), + Timestamp: metrics.Timestamp, + Token: metricsToken, + } + if err := sendAlert(callbackURL, alert); err != nil { + return fmt.Errorf("failed to send CPU alert: %v", err) + } + } + + if memThreshold > 0 && metrics.MemUsed > memThreshold { + alert := AlertPayload{ + ServerType: cfg.Server.ServerType, + Type: "Memory", + Value: metrics.MemUsed, + Threshold: memThreshold, + Message: fmt.Sprintf("Memory usage (%.2f%%) exceeded threshold (%.2f%%)", metrics.MemUsed, memThreshold), + Timestamp: metrics.Timestamp, + Token: metricsToken, + } + if err := sendAlert(callbackURL, alert); err != nil { + return fmt.Errorf("failed to send memory alert: %v", err) + } + } + + return nil +} + +func sendAlert(callbackURL string, payload AlertPayload) error { + if callbackURL == "" { + return fmt.Errorf("callback URL is not set") + } + wrappedPayload := map[string]interface{}{ + "json": payload, + } + + jsonData, err := json.Marshal(wrappedPayload) + if err != nil { + return fmt.Errorf("failed to marshal alert payload: %v", err) + } + + resp, err := http.Post(callbackURL, "application/json", bytes.NewBuffer(jsonData)) + if err != nil { + return fmt.Errorf("failed to send POST request: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + bodyBytes, _ := io.ReadAll(resp.Body) + return fmt.Errorf("received non-OK response status: %s, body: %s", resp.Status, string(bodyBytes)) + } + + return nil +} diff --git a/apps/schedules/package.json b/apps/schedules/package.json index dd6818d1..0a869fb0 100644 --- a/apps/schedules/package.json +++ b/apps/schedules/package.json @@ -8,7 +8,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "drizzle-orm": "^0.30.8", + "drizzle-orm": "^0.39.1", "ioredis": "5.4.1", "bullmq": "5.4.2", "@hono/zod-validator": "0.3.0", diff --git a/apps/schedules/tsconfig.json b/apps/schedules/tsconfig.json index 3c0b02bc..3d4adb16 100644 --- a/apps/schedules/tsconfig.json +++ b/apps/schedules/tsconfig.json @@ -7,7 +7,8 @@ "skipLibCheck": true, "outDir": "dist", "jsx": "react-jsx", - "jsxImportSource": "hono/jsx" + "jsxImportSource": "hono/jsx", + "declaration": false }, "exclude": ["node_modules", "dist"] } diff --git a/biome.json b/biome.json index f5a6c232..cf677ec4 100644 --- a/biome.json +++ b/biome.json @@ -24,7 +24,10 @@ }, "correctness": { "useExhaustiveDependencies": "off", - "noUnsafeOptionalChaining": "off" + "noUnsafeOptionalChaining": "off", + "noUnusedImports": "error", + "noUnusedFunctionParameters": "error", + "noUnusedVariables": "error" }, "style": { "noNonNullAssertion": "off" diff --git a/lefthook.yml b/lefthook.yml index 1a491cd8..3f5a6d09 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -37,9 +37,9 @@ commit-msg: commands: commitlint: - run: "npx commitlint --edit $1" + # run: "npx commitlint --edit $1" pre-commit: commands: check: - run: "pnpm check" + # run: "pnpm check" diff --git a/packages/server/auth-schema.ts b/packages/server/auth-schema.ts new file mode 100644 index 00000000..a5829046 --- /dev/null +++ b/packages/server/auth-schema.ts @@ -0,0 +1,133 @@ +// import { +// pgTable, +// text, +// integer, +// timestamp, +// boolean, +// } from "drizzle-orm/pg-core"; + +// export const users_temp = pgTable("users_temp", { +// id: text("id").primaryKey(), +// name: text("name").notNull(), +// email: text("email").notNull().unique(), +// emailVerified: boolean("email_verified").notNull(), +// image: text("image"), +// createdAt: timestamp("created_at").notNull(), +// updatedAt: timestamp("updated_at").notNull(), +// twoFactorEnabled: boolean("two_factor_enabled"), +// role: text("role"), +// ownerId: text("owner_id"), +// }); + +// export const session = pgTable("session", { +// id: text("id").primaryKey(), +// expiresAt: timestamp("expires_at").notNull(), +// token: text("token").notNull().unique(), +// createdAt: timestamp("created_at").notNull(), +// updatedAt: timestamp("updated_at").notNull(), +// ipAddress: text("ip_address"), +// userAgent: text("user_agent"), +// userId: text("user_id") +// .notNull() +// .references(() => users_temp.id, { onDelete: "cascade" }), +// activeOrganizationId: text("active_organization_id"), +// }); + +// export const account = pgTable("account", { +// id: text("id").primaryKey(), +// accountId: text("account_id").notNull(), +// providerId: text("provider_id").notNull(), +// userId: text("user_id") +// .notNull() +// .references(() => users_temp.id, { onDelete: "cascade" }), +// accessToken: text("access_token"), +// refreshToken: text("refresh_token"), +// idToken: text("id_token"), +// accessTokenExpiresAt: timestamp("access_token_expires_at"), +// refreshTokenExpiresAt: timestamp("refresh_token_expires_at"), +// scope: text("scope"), +// password: text("password"), +// createdAt: timestamp("created_at").notNull(), +// updatedAt: timestamp("updated_at").notNull(), +// }); + +// export const verification = pgTable("verification", { +// id: text("id").primaryKey(), +// identifier: text("identifier").notNull(), +// value: text("value").notNull(), +// expiresAt: timestamp("expires_at").notNull(), +// createdAt: timestamp("created_at"), +// updatedAt: timestamp("updated_at"), +// }); + +// export const apikey = pgTable("apikey", { +// id: text("id").primaryKey(), +// name: text("name"), +// start: text("start"), +// prefix: text("prefix"), +// key: text("key").notNull(), +// userId: text("user_id") +// .notNull() +// .references(() => user.id, { onDelete: "cascade" }), +// refillInterval: integer("refill_interval"), +// refillAmount: integer("refill_amount"), +// lastRefillAt: timestamp("last_refill_at"), +// enabled: boolean("enabled"), +// rateLimitEnabled: boolean("rate_limit_enabled"), +// rateLimitTimeWindow: integer("rate_limit_time_window"), +// rateLimitMax: integer("rate_limit_max"), +// requestCount: integer("request_count"), +// remaining: integer("remaining"), +// lastRequest: timestamp("last_request"), +// expiresAt: timestamp("expires_at"), +// createdAt: timestamp("created_at").notNull(), +// updatedAt: timestamp("updated_at").notNull(), +// permissions: text("permissions"), +// metadata: text("metadata"), +// }); + +// export const twoFactor = pgTable("two_factor", { +// id: text("id").primaryKey(), +// secret: text("secret").notNull(), +// backupCodes: text("backup_codes").notNull(), +// userId: text("user_id") +// .notNull() +// .references(() => user.id, { onDelete: "cascade" }), +// }); + +// export const organization = pgTable("organization", { +// id: text("id").primaryKey(), +// name: text("name").notNull(), +// slug: text("slug").unique(), +// logo: text("logo"), +// createdAt: timestamp("created_at").notNull(), +// metadata: text("metadata"), +// }); + +// export const member = pgTable("member", { +// id: text("id").primaryKey(), +// organizationId: text("organization_id") +// .notNull() +// .references(() => organization.id, { onDelete: "cascade" }), +// userId: text("user_id") +// .notNull() +// .references(() => user.id, { onDelete: "cascade" }), +// role: text("role").notNull(), +// teamId: text("team_id"), +// createdAt: timestamp("created_at").notNull(), +// }); + +// export const invitation = pgTable("invitation", { +// id: text("id").primaryKey(), +// organizationId: text("organization_id") +// .notNull() +// .references(() => organization.id, { onDelete: "cascade" }), +// email: text("email").notNull(), +// role: text("role"), +// teamId: text("team_id"), +// status: text("status").notNull(), +// expiresAt: timestamp("expires_at").notNull(), +// inviterId: text("inviter_id") +// .notNull() +// .references(() => user.id, { onDelete: "cascade" }), +// }); diff --git a/packages/server/package.json b/packages/server/package.json index a57ff65e..3265c95c 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -35,6 +35,11 @@ "@ai-sdk/mistral": "^1.0.6", "@ai-sdk/openai": "^1.0.12", "@ai-sdk/openai-compatible": "^0.0.13", + "@better-auth/utils":"0.2.3", + "@oslojs/encoding":"1.1.0", + "@oslojs/crypto":"1.0.1", + "drizzle-dbml-generator":"0.10.0", + "better-auth":"1.2.0", "@faker-js/faker": "^8.4.1", "@lucia-auth/adapter-drizzle": "1.0.7", "@octokit/auth-app": "^6.0.4", @@ -48,7 +53,7 @@ "date-fns": "3.6.0", "dockerode": "4.0.2", "dotenv": "16.4.5", - "drizzle-orm": "^0.30.8", + "drizzle-orm": "^0.39.1", "drizzle-zod": "0.5.1", "hi-base32": "^0.5.1", "js-yaml": "4.1.0", @@ -88,7 +93,7 @@ "@types/react-dom": "^18.2.15", "@types/ssh2": "1.15.1", "@types/ws": "8.5.10", - "drizzle-kit": "^0.21.1", + "drizzle-kit": "^0.30.4", "esbuild": "0.20.2", "esbuild-plugin-alias": "0.2.1", "postcss": "^8.4.31", diff --git a/packages/server/src/auth/auth.ts b/packages/server/src/auth/auth.ts deleted file mode 100644 index ab340d0a..00000000 --- a/packages/server/src/auth/auth.ts +++ /dev/null @@ -1,117 +0,0 @@ -import type { IncomingMessage, ServerResponse } from "node:http"; -import { findAdminByAuthId } from "@dokploy/server/services/admin"; -import { findUserByAuthId } from "@dokploy/server/services/user"; -import { DrizzlePostgreSQLAdapter } from "@lucia-auth/adapter-drizzle"; -import { TimeSpan } from "lucia"; -import { Lucia } from "lucia/dist/core.js"; -import type { Session, User } from "lucia/dist/core.js"; -import { db } from "../db"; -import { type DatabaseUser, auth, sessionTable } from "../db/schema"; - -export const adapter = new DrizzlePostgreSQLAdapter(db, sessionTable, auth); - -export const lucia = new Lucia(adapter, { - sessionCookie: { - attributes: { - secure: false, - }, - }, - sessionExpiresIn: new TimeSpan(1, "d"), - getUserAttributes: (attributes) => { - return { - email: attributes.email, - rol: attributes.rol, - secret: attributes.secret !== null, - adminId: attributes.adminId, - }; - }, -}); - -declare module "lucia" { - interface Register { - Lucia: typeof lucia; - DatabaseUserAttributes: Omit & { - authId: string; - adminId: string; - }; - } -} - -export type ReturnValidateToken = Promise<{ - user: (User & { authId: string; adminId: string }) | null; - session: Session | null; -}>; - -export async function validateRequest( - req: IncomingMessage, - res: ServerResponse, -): ReturnValidateToken { - const sessionId = lucia.readSessionCookie(req.headers.cookie ?? ""); - - if (!sessionId) { - return { - user: null, - session: null, - }; - } - const result = await lucia.validateSession(sessionId); - if (result?.session?.fresh) { - res.appendHeader( - "Set-Cookie", - lucia.createSessionCookie(result.session.id).serialize(), - ); - } - if (!result.session) { - res.appendHeader( - "Set-Cookie", - lucia.createBlankSessionCookie().serialize(), - ); - } - if (result.user) { - try { - if (result.user?.rol === "admin") { - const admin = await findAdminByAuthId(result.user.id); - result.user.adminId = admin.adminId; - } else if (result.user?.rol === "user") { - const userResult = await findUserByAuthId(result.user.id); - result.user.adminId = userResult.adminId; - } - } catch (error) { - return { - user: null, - session: null, - }; - } - } - - return { - session: result.session, - ...((result.user && { - user: { - authId: result.user.id, - email: result.user.email, - rol: result.user.rol, - id: result.user.id, - secret: result.user.secret, - adminId: result.user.adminId, - }, - }) || { - user: null, - }), - }; -} - -export async function validateWebSocketRequest( - req: IncomingMessage, -): Promise<{ user: User; session: Session } | { user: null; session: null }> { - const sessionId = lucia.readSessionCookie(req.headers.cookie ?? ""); - - if (!sessionId) { - return { - user: null, - session: null, - }; - } - const result = await lucia.validateSession(sessionId); - return result; -} diff --git a/packages/server/src/auth/token.ts b/packages/server/src/auth/token.ts deleted file mode 100644 index f29d4dbd..00000000 --- a/packages/server/src/auth/token.ts +++ /dev/null @@ -1,99 +0,0 @@ -import type { IncomingMessage } from "node:http"; -import { TimeSpan } from "lucia"; -import { Lucia } from "lucia/dist/core.js"; -import { findAdminByAuthId } from "../services/admin"; -import { findUserByAuthId } from "../services/user"; -import { type ReturnValidateToken, adapter } from "./auth"; - -export const luciaToken = new Lucia(adapter, { - sessionCookie: { - attributes: { - secure: false, - }, - }, - sessionExpiresIn: new TimeSpan(365, "d"), - getUserAttributes: (attributes) => { - return { - email: attributes.email, - rol: attributes.rol, - secret: attributes.secret !== null, - }; - }, -}); - -export const validateBearerToken = async ( - req: IncomingMessage, -): ReturnValidateToken => { - const authorizationHeader = req.headers.authorization; - const sessionId = luciaToken.readBearerToken(authorizationHeader ?? ""); - if (!sessionId) { - return { - user: null, - session: null, - }; - } - const result = await luciaToken.validateSession(sessionId); - - if (result.user) { - if (result.user?.rol === "admin") { - const admin = await findAdminByAuthId(result.user.id); - result.user.adminId = admin.adminId; - } else if (result.user?.rol === "user") { - const userResult = await findUserByAuthId(result.user.id); - result.user.adminId = userResult.adminId; - } - } - return { - session: result.session, - ...((result.user && { - user: { - adminId: result.user.adminId, - authId: result.user.id, - email: result.user.email, - rol: result.user.rol, - id: result.user.id, - secret: result.user.secret, - }, - }) || { - user: null, - }), - }; -}; - -export const validateBearerTokenAPI = async ( - authorizationHeader: string, -): ReturnValidateToken => { - const sessionId = luciaToken.readBearerToken(authorizationHeader ?? ""); - if (!sessionId) { - return { - user: null, - session: null, - }; - } - const result = await luciaToken.validateSession(sessionId); - - if (result.user) { - if (result.user?.rol === "admin") { - const admin = await findAdminByAuthId(result.user.id); - result.user.adminId = admin.adminId; - } else if (result.user?.rol === "user") { - const userResult = await findUserByAuthId(result.user.id); - result.user.adminId = userResult.adminId; - } - } - return { - session: result.session, - ...((result.user && { - user: { - adminId: result.user.adminId, - authId: result.user.id, - email: result.user.email, - rol: result.user.rol, - id: result.user.id, - secret: result.user.secret, - }, - }) || { - user: null, - }), - }; -}; diff --git a/packages/server/src/db/schema/account.ts b/packages/server/src/db/schema/account.ts new file mode 100644 index 00000000..8291ea4d --- /dev/null +++ b/packages/server/src/db/schema/account.ts @@ -0,0 +1,194 @@ +import { relations, sql } from "drizzle-orm"; +import { + boolean, + integer, + pgTable, + text, + timestamp, +} from "drizzle-orm/pg-core"; +import { nanoid } from "nanoid"; +import { projects } from "./project"; +import { server } from "./server"; +import { users_temp } from "./user"; + +export const account = pgTable("account", { + id: text("id") + .primaryKey() + .$defaultFn(() => nanoid()), + accountId: text("account_id") + .notNull() + .$defaultFn(() => nanoid()), + providerId: text("provider_id").notNull(), + userId: text("user_id") + .notNull() + .references(() => users_temp.id, { onDelete: "cascade" }), + accessToken: text("access_token"), + refreshToken: text("refresh_token"), + idToken: text("id_token"), + accessTokenExpiresAt: timestamp("access_token_expires_at"), + refreshTokenExpiresAt: timestamp("refresh_token_expires_at"), + scope: text("scope"), + password: text("password"), + is2FAEnabled: boolean("is2FAEnabled").notNull().default(false), + createdAt: timestamp("created_at").notNull(), + updatedAt: timestamp("updated_at").notNull(), + resetPasswordToken: text("resetPasswordToken"), + resetPasswordExpiresAt: text("resetPasswordExpiresAt"), + confirmationToken: text("confirmationToken"), + confirmationExpiresAt: text("confirmationExpiresAt"), +}); + +export const accountRelations = relations(account, ({ one }) => ({ + user: one(users_temp, { + fields: [account.userId], + references: [users_temp.id], + }), +})); + +export const verification = pgTable("verification", { + id: text("id").primaryKey(), + identifier: text("identifier").notNull(), + value: text("value").notNull(), + expiresAt: timestamp("expires_at").notNull(), + createdAt: timestamp("created_at"), + updatedAt: timestamp("updated_at"), +}); + +export const organization = pgTable("organization", { + id: text("id") + .primaryKey() + .$defaultFn(() => nanoid()), + name: text("name").notNull(), + slug: text("slug").unique(), + logo: text("logo"), + createdAt: timestamp("created_at").notNull(), + metadata: text("metadata"), + ownerId: text("owner_id") + .notNull() + .references(() => users_temp.id, { onDelete: "cascade" }), +}); + +export const organizationRelations = relations( + organization, + ({ one, many }) => ({ + owner: one(users_temp, { + fields: [organization.ownerId], + references: [users_temp.id], + }), + servers: many(server), + projects: many(projects), + members: many(member), + }), +); + +export const member = pgTable("member", { + id: text("id") + .primaryKey() + .$defaultFn(() => nanoid()), + organizationId: text("organization_id") + .notNull() + .references(() => organization.id, { onDelete: "cascade" }), + userId: text("user_id") + .notNull() + .references(() => users_temp.id, { onDelete: "cascade" }), + role: text("role").notNull().$type<"owner" | "member" | "admin">(), + createdAt: timestamp("created_at").notNull(), + teamId: text("team_id"), + // Permissions + canCreateProjects: boolean("canCreateProjects").notNull().default(false), + canAccessToSSHKeys: boolean("canAccessToSSHKeys").notNull().default(false), + canCreateServices: boolean("canCreateServices").notNull().default(false), + canDeleteProjects: boolean("canDeleteProjects").notNull().default(false), + canDeleteServices: boolean("canDeleteServices").notNull().default(false), + canAccessToDocker: boolean("canAccessToDocker").notNull().default(false), + canAccessToAPI: boolean("canAccessToAPI").notNull().default(false), + canAccessToGitProviders: boolean("canAccessToGitProviders") + .notNull() + .default(false), + canAccessToTraefikFiles: boolean("canAccessToTraefikFiles") + .notNull() + .default(false), + accessedProjects: text("accesedProjects") + .array() + .notNull() + .default(sql`ARRAY[]::text[]`), + accessedServices: text("accesedServices") + .array() + .notNull() + .default(sql`ARRAY[]::text[]`), +}); + +export const memberRelations = relations(member, ({ one }) => ({ + organization: one(organization, { + fields: [member.organizationId], + references: [organization.id], + }), + user: one(users_temp, { + fields: [member.userId], + references: [users_temp.id], + }), +})); + +export const invitation = pgTable("invitation", { + id: text("id").primaryKey(), + organizationId: text("organization_id") + .notNull() + .references(() => organization.id, { onDelete: "cascade" }), + email: text("email").notNull(), + role: text("role").$type<"owner" | "member" | "admin">(), + status: text("status").notNull(), + expiresAt: timestamp("expires_at").notNull(), + inviterId: text("inviter_id") + .notNull() + .references(() => users_temp.id, { onDelete: "cascade" }), + teamId: text("team_id"), +}); + +export const invitationRelations = relations(invitation, ({ one }) => ({ + organization: one(organization, { + fields: [invitation.organizationId], + references: [organization.id], + }), +})); + +export const twoFactor = pgTable("two_factor", { + id: text("id").primaryKey(), + secret: text("secret").notNull(), + backupCodes: text("backup_codes").notNull(), + userId: text("user_id") + .notNull() + .references(() => users_temp.id, { onDelete: "cascade" }), +}); + +export const apikey = pgTable("apikey", { + id: text("id").primaryKey(), + name: text("name"), + start: text("start"), + prefix: text("prefix"), + key: text("key").notNull(), + userId: text("user_id") + .notNull() + .references(() => users_temp.id, { onDelete: "cascade" }), + refillInterval: integer("refill_interval"), + refillAmount: integer("refill_amount"), + lastRefillAt: timestamp("last_refill_at"), + enabled: boolean("enabled"), + rateLimitEnabled: boolean("rate_limit_enabled"), + rateLimitTimeWindow: integer("rate_limit_time_window"), + rateLimitMax: integer("rate_limit_max"), + requestCount: integer("request_count"), + remaining: integer("remaining"), + lastRequest: timestamp("last_request"), + expiresAt: timestamp("expires_at"), + createdAt: timestamp("created_at").notNull(), + updatedAt: timestamp("updated_at").notNull(), + permissions: text("permissions"), + metadata: text("metadata"), +}); + +export const apikeyRelations = relations(apikey, ({ one }) => ({ + user: one(users_temp, { + fields: [apikey.userId], + references: [users_temp.id], + }), +})); diff --git a/packages/server/src/db/schema/admin.ts b/packages/server/src/db/schema/admin.ts deleted file mode 100644 index f5b46fdd..00000000 --- a/packages/server/src/db/schema/admin.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { relations } from "drizzle-orm"; -import { boolean, integer, pgTable, text } from "drizzle-orm/pg-core"; -import { createInsertSchema } from "drizzle-zod"; -import { nanoid } from "nanoid"; -import { z } from "zod"; -import { ai } from "./ai"; -import { auth } from "./auth"; -import { certificates } from "./certificate"; -import { registry } from "./registry"; -import { certificateType } from "./shared"; -import { sshKeys } from "./ssh-key"; -import { users } from "./user"; - -export const admins = pgTable("admin", { - adminId: text("adminId") - .notNull() - .primaryKey() - .$defaultFn(() => nanoid()), - serverIp: text("serverIp"), - certificateType: certificateType("certificateType").notNull().default("none"), - host: text("host"), - letsEncryptEmail: text("letsEncryptEmail"), - sshPrivateKey: text("sshPrivateKey"), - enableDockerCleanup: boolean("enableDockerCleanup").notNull().default(false), - enableLogRotation: boolean("enableLogRotation").notNull().default(false), - authId: text("authId") - .notNull() - .references(() => auth.id, { onDelete: "cascade" }), - createdAt: text("createdAt") - .notNull() - .$defaultFn(() => new Date().toISOString()), - stripeCustomerId: text("stripeCustomerId"), - stripeSubscriptionId: text("stripeSubscriptionId"), - serversQuantity: integer("serversQuantity").notNull().default(0), -}); - -export const adminsRelations = relations(admins, ({ one, many }) => ({ - auth: one(auth, { - fields: [admins.authId], - references: [auth.id], - }), - users: many(users), - registry: many(registry), - sshKeys: many(sshKeys), - certificates: many(certificates), - ai: many(ai), -})); - -const createSchema = createInsertSchema(admins, { - adminId: z.string(), - enableDockerCleanup: z.boolean().optional(), - sshPrivateKey: z.string().optional(), - certificateType: z.enum(["letsencrypt", "none"]).default("none"), - serverIp: z.string().optional(), - letsEncryptEmail: z.string().optional(), -}); - -export const apiUpdateAdmin = createSchema.partial(); - -export const apiSaveSSHKey = createSchema - .pick({ - sshPrivateKey: true, - }) - .required(); - -export const apiAssignDomain = createSchema - .pick({ - host: true, - certificateType: true, - letsEncryptEmail: true, - }) - .required() - .partial({ - letsEncryptEmail: true, - }); - -export const apiUpdateDockerCleanup = createSchema - .pick({ - enableDockerCleanup: true, - }) - .required() - .extend({ - serverId: z.string().optional(), - }); - -export const apiTraefikConfig = z.object({ - traefikConfig: z.string().min(1), -}); - -export const apiModifyTraefikConfig = z.object({ - path: z.string().min(1), - traefikConfig: z.string().min(1), - serverId: z.string().optional(), -}); -export const apiReadTraefikConfig = z.object({ - path: z.string().min(1), - serverId: z.string().optional(), -}); - -export const apiEnableDashboard = z.object({ - enableDashboard: z.boolean().optional(), - serverId: z.string().optional(), -}); - -export const apiServerSchema = z - .object({ - serverId: z.string().optional(), - }) - .optional(); - -export const apiReadStatsLogs = z.object({ - page: z - .object({ - pageIndex: z.number(), - pageSize: z.number(), - }) - .optional(), - status: z.string().array().optional(), - search: z.string().optional(), - sort: z.object({ id: z.string(), desc: z.boolean() }).optional(), -}); diff --git a/packages/server/src/db/schema/application.ts b/packages/server/src/db/schema/application.ts index 2437f59d..e670e2e2 100644 --- a/packages/server/src/db/schema/application.ts +++ b/packages/server/src/db/schema/application.ts @@ -44,7 +44,6 @@ export const buildType = pgEnum("buildType", [ "static", ]); -// TODO: refactor this types export interface HealthCheckSwarm { Test?: string[] | undefined; Interval?: number | undefined; diff --git a/packages/server/src/db/schema/auth.ts b/packages/server/src/db/schema/auth.ts deleted file mode 100644 index 3e16c68e..00000000 --- a/packages/server/src/db/schema/auth.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { getRandomValues } from "node:crypto"; -import { relations } from "drizzle-orm"; -import { boolean, pgEnum, pgTable, text } from "drizzle-orm/pg-core"; -import { createInsertSchema } from "drizzle-zod"; -import { nanoid } from "nanoid"; -import { z } from "zod"; -import { admins } from "./admin"; -import { users } from "./user"; - -const randomImages = [ - "/avatars/avatar-1.png", - "/avatars/avatar-2.png", - "/avatars/avatar-3.png", - "/avatars/avatar-4.png", - "/avatars/avatar-5.png", - "/avatars/avatar-6.png", - "/avatars/avatar-7.png", - "/avatars/avatar-8.png", - "/avatars/avatar-9.png", - "/avatars/avatar-10.png", - "/avatars/avatar-11.png", - "/avatars/avatar-12.png", -]; - -const generateRandomImage = () => { - return ( - randomImages[ - // @ts-ignore - getRandomValues(new Uint32Array(1))[0] % randomImages.length - ] || "/avatars/avatar-1.png" - ); -}; -export type DatabaseUser = typeof auth.$inferSelect; -export const roles = pgEnum("Roles", ["admin", "user"]); - -export const auth = pgTable("auth", { - id: text("id") - .notNull() - .primaryKey() - .$defaultFn(() => nanoid()), - email: text("email").notNull().unique(), - password: text("password").notNull(), - rol: roles("rol").notNull(), - image: text("image").$defaultFn(() => generateRandomImage()), - secret: text("secret"), - token: text("token"), - is2FAEnabled: boolean("is2FAEnabled").notNull().default(false), - createdAt: text("createdAt") - .notNull() - .$defaultFn(() => new Date().toISOString()), - resetPasswordToken: text("resetPasswordToken"), - resetPasswordExpiresAt: text("resetPasswordExpiresAt"), - confirmationToken: text("confirmationToken"), - confirmationExpiresAt: text("confirmationExpiresAt"), -}); - -export const authRelations = relations(auth, ({ many }) => ({ - admins: many(admins), - users: many(users), -})); -const createSchema = createInsertSchema(auth, { - email: z.string().email(), - password: z.string().min(8), - rol: z.enum(["admin", "user"]), - image: z.string().optional(), -}); - -export const apiCreateAdmin = createSchema.pick({ - email: true, - password: true, -}); - -export const apiCreateUser = createSchema - .pick({ - password: true, - id: true, - token: true, - }) - .required() - .extend({ - token: z.string().min(1), - }); - -export const apiLogin = createSchema - .pick({ - email: true, - password: true, - }) - .required(); - -export const apiUpdateAuth = createSchema.partial().extend({ - email: z.string().nullable(), - password: z.string().nullable(), - image: z.string().optional(), - currentPassword: z.string().nullable(), -}); - -export const apiUpdateAuthByAdmin = createSchema.partial().extend({ - email: z.string().nullable(), - password: z.string().nullable(), - image: z.string().optional(), - id: z.string().min(1), -}); - -export const apiFindOneAuth = createSchema - .pick({ - id: true, - }) - .required(); - -export const apiVerify2FA = createSchema - .extend({ - pin: z.string().min(6), - secret: z.string().min(1), - }) - .pick({ - pin: true, - secret: true, - }) - .required(); - -export const apiVerifyLogin2FA = createSchema - .extend({ - pin: z.string().min(6), - }) - .pick({ - pin: true, - id: true, - }) - .required(); diff --git a/packages/server/src/db/schema/bitbucket.ts b/packages/server/src/db/schema/bitbucket.ts index 393cb1e7..0311202d 100644 --- a/packages/server/src/db/schema/bitbucket.ts +++ b/packages/server/src/db/schema/bitbucket.ts @@ -61,5 +61,5 @@ export const apiUpdateBitbucket = createSchema.extend({ name: z.string().min(1), bitbucketUsername: z.string().optional(), bitbucketWorkspaceName: z.string().optional(), - adminId: z.string().optional(), + organizationId: z.string().optional(), }); diff --git a/packages/server/src/db/schema/certificate.ts b/packages/server/src/db/schema/certificate.ts index 1df61be8..bf72f7db 100644 --- a/packages/server/src/db/schema/certificate.ts +++ b/packages/server/src/db/schema/certificate.ts @@ -3,7 +3,7 @@ import { boolean, pgTable, text } from "drizzle-orm/pg-core"; import { createInsertSchema } from "drizzle-zod"; import { nanoid } from "nanoid"; import { z } from "zod"; -import { admins } from "./admin"; +import { organization } from "./account"; import { server } from "./server"; import { generateAppName } from "./utils"; @@ -20,27 +20,24 @@ export const certificates = pgTable("certificate", { .$defaultFn(() => generateAppName("certificate")) .unique(), autoRenew: boolean("autoRenew"), - adminId: text("adminId").references(() => admins.adminId, { - onDelete: "cascade", - }), + organizationId: text("organizationId") + .notNull() + .references(() => organization.id, { onDelete: "cascade" }), serverId: text("serverId").references(() => server.serverId, { onDelete: "cascade", }), }); -export const certificatesRelations = relations( - certificates, - ({ one, many }) => ({ - server: one(server, { - fields: [certificates.serverId], - references: [server.serverId], - }), - admin: one(admins, { - fields: [certificates.adminId], - references: [admins.adminId], - }), +export const certificatesRelations = relations(certificates, ({ one }) => ({ + server: one(server, { + fields: [certificates.serverId], + references: [server.serverId], }), -); + organization: one(organization, { + fields: [certificates.organizationId], + references: [organization.id], + }), +})); export const apiCreateCertificate = createInsertSchema(certificates, { name: z.string().min(1), diff --git a/packages/server/src/db/schema/compose.ts b/packages/server/src/db/schema/compose.ts index e0c4863b..ca8344ee 100644 --- a/packages/server/src/db/schema/compose.ts +++ b/packages/server/src/db/schema/compose.ts @@ -69,6 +69,7 @@ export const compose = pgTable("compose", { composePath: text("composePath").notNull().default("./docker-compose.yml"), suffix: text("suffix").notNull().default(""), randomize: boolean("randomize").notNull().default(false), + isolatedDeployment: boolean("isolatedDeployment").notNull().default(false), composeStatus: applicationStatus("composeStatus").notNull().default("idle"), projectId: text("projectId") .notNull() diff --git a/packages/server/src/db/schema/dbml.ts b/packages/server/src/db/schema/dbml.ts new file mode 100644 index 00000000..72a75814 --- /dev/null +++ b/packages/server/src/db/schema/dbml.ts @@ -0,0 +1,7 @@ +import { pgGenerate } from "drizzle-dbml-generator"; // Using Postgres for this example +import * as schema from "./index"; + +const out = "./schema.dbml"; +const relational = true; + +pgGenerate({ schema, out, relational }); diff --git a/packages/server/src/db/schema/deployment.ts b/packages/server/src/db/schema/deployment.ts index ccaf6466..4dfed76b 100644 --- a/packages/server/src/db/schema/deployment.ts +++ b/packages/server/src/db/schema/deployment.ts @@ -1,4 +1,4 @@ -import { is, relations } from "drizzle-orm"; +import { relations } from "drizzle-orm"; import { type AnyPgColumn, boolean, @@ -47,6 +47,7 @@ export const deployments = pgTable("deployment", { createdAt: text("createdAt") .notNull() .$defaultFn(() => new Date().toISOString()), + errorMessage: text("errorMessage"), }); export const deploymentsRelations = relations(deployments, ({ one }) => ({ diff --git a/packages/server/src/db/schema/destination.ts b/packages/server/src/db/schema/destination.ts index 7d7be614..0aeb1490 100644 --- a/packages/server/src/db/schema/destination.ts +++ b/packages/server/src/db/schema/destination.ts @@ -3,7 +3,7 @@ import { pgTable, text } from "drizzle-orm/pg-core"; import { createInsertSchema } from "drizzle-zod"; import { nanoid } from "nanoid"; import { z } from "zod"; -import { admins } from "./admin"; +import { organization } from "./account"; import { backups } from "./backups"; export const destinations = pgTable("destination", { @@ -17,20 +17,19 @@ export const destinations = pgTable("destination", { secretAccessKey: text("secretAccessKey").notNull(), bucket: text("bucket").notNull(), region: text("region").notNull(), - // maybe it can be null endpoint: text("endpoint").notNull(), - adminId: text("adminId") + organizationId: text("organizationId") .notNull() - .references(() => admins.adminId, { onDelete: "cascade" }), + .references(() => organization.id, { onDelete: "cascade" }), }); export const destinationsRelations = relations( destinations, ({ many, one }) => ({ backups: many(backups), - admin: one(admins, { - fields: [destinations.adminId], - references: [admins.adminId], + organization: one(organization, { + fields: [destinations.organizationId], + references: [organization.id], }), }), ); diff --git a/packages/server/src/db/schema/git-provider.ts b/packages/server/src/db/schema/git-provider.ts index dbbfc183..92230737 100644 --- a/packages/server/src/db/schema/git-provider.ts +++ b/packages/server/src/db/schema/git-provider.ts @@ -3,7 +3,7 @@ import { pgEnum, pgTable, text } from "drizzle-orm/pg-core"; import { createInsertSchema } from "drizzle-zod"; import { nanoid } from "nanoid"; import { z } from "zod"; -import { admins } from "./admin"; +import { organization } from "./account"; import { bitbucket } from "./bitbucket"; import { github } from "./github"; import { gitlab } from "./gitlab"; @@ -24,12 +24,12 @@ export const gitProvider = pgTable("git_provider", { createdAt: text("createdAt") .notNull() .$defaultFn(() => new Date().toISOString()), - adminId: text("adminId").references(() => admins.adminId, { - onDelete: "cascade", - }), + organizationId: text("organizationId") + .notNull() + .references(() => organization.id, { onDelete: "cascade" }), }); -export const gitProviderRelations = relations(gitProvider, ({ one, many }) => ({ +export const gitProviderRelations = relations(gitProvider, ({ one }) => ({ github: one(github, { fields: [gitProvider.gitProviderId], references: [github.gitProviderId], @@ -42,9 +42,9 @@ export const gitProviderRelations = relations(gitProvider, ({ one, many }) => ({ fields: [gitProvider.gitProviderId], references: [bitbucket.gitProviderId], }), - admin: one(admins, { - fields: [gitProvider.adminId], - references: [admins.adminId], + organization: one(organization, { + fields: [gitProvider.organizationId], + references: [organization.id], }), })); diff --git a/packages/server/src/db/schema/index.ts b/packages/server/src/db/schema/index.ts index 6d335632..0b453fac 100644 --- a/packages/server/src/db/schema/index.ts +++ b/packages/server/src/db/schema/index.ts @@ -1,8 +1,6 @@ export * from "./application"; export * from "./postgres"; export * from "./user"; -export * from "./admin"; -export * from "./auth"; export * from "./project"; export * from "./domain"; export * from "./mariadb"; @@ -31,3 +29,4 @@ export * from "./server"; export * from "./utils"; export * from "./preview-deployments"; export * from "./ai"; +export * from "./account"; diff --git a/packages/server/src/db/schema/notification.ts b/packages/server/src/db/schema/notification.ts index 12c7698e..1c8a2d8f 100644 --- a/packages/server/src/db/schema/notification.ts +++ b/packages/server/src/db/schema/notification.ts @@ -3,7 +3,7 @@ import { boolean, integer, pgEnum, pgTable, text } from "drizzle-orm/pg-core"; import { createInsertSchema } from "drizzle-zod"; import { nanoid } from "nanoid"; import { z } from "zod"; -import { admins } from "./admin"; +import { organization } from "./account"; export const notificationType = pgEnum("notificationType", [ "slack", @@ -24,6 +24,7 @@ export const notifications = pgTable("notification", { databaseBackup: boolean("databaseBackup").notNull().default(false), dokployRestart: boolean("dokployRestart").notNull().default(false), dockerCleanup: boolean("dockerCleanup").notNull().default(false), + serverThreshold: boolean("serverThreshold").notNull().default(false), notificationType: notificationType("notificationType").notNull(), createdAt: text("createdAt") .notNull() @@ -43,9 +44,9 @@ export const notifications = pgTable("notification", { gotifyId: text("gotifyId").references(() => gotify.gotifyId, { onDelete: "cascade", }), - adminId: text("adminId").references(() => admins.adminId, { - onDelete: "cascade", - }), + organizationId: text("organizationId") + .notNull() + .references(() => organization.id, { onDelete: "cascade" }), }); export const slack = pgTable("slack", { @@ -64,6 +65,7 @@ export const telegram = pgTable("telegram", { .$defaultFn(() => nanoid()), botToken: text("botToken").notNull(), chatId: text("chatId").notNull(), + messageThreadId: text("messageThreadId"), }); export const discord = pgTable("discord", { @@ -120,9 +122,9 @@ export const notificationsRelations = relations(notifications, ({ one }) => ({ fields: [notifications.gotifyId], references: [gotify.gotifyId], }), - admin: one(admins, { - fields: [notifications.adminId], - references: [admins.adminId], + organization: one(organization, { + fields: [notifications.organizationId], + references: [organization.id], }), })); @@ -136,6 +138,7 @@ export const apiCreateSlack = notificationsSchema name: true, appDeploy: true, dockerCleanup: true, + serverThreshold: true, }) .extend({ webhookUrl: z.string().min(1), @@ -146,7 +149,7 @@ export const apiCreateSlack = notificationsSchema export const apiUpdateSlack = apiCreateSlack.partial().extend({ notificationId: z.string().min(1), slackId: z.string(), - adminId: z.string().optional(), + organizationId: z.string().optional(), }); export const apiTestSlackConnection = apiCreateSlack.pick({ @@ -162,22 +165,25 @@ export const apiCreateTelegram = notificationsSchema name: true, appDeploy: true, dockerCleanup: true, + serverThreshold: true, }) .extend({ botToken: z.string().min(1), chatId: z.string().min(1), + messageThreadId: z.string(), }) .required(); export const apiUpdateTelegram = apiCreateTelegram.partial().extend({ notificationId: z.string().min(1), telegramId: z.string().min(1), - adminId: z.string().optional(), + organizationId: z.string().optional(), }); export const apiTestTelegramConnection = apiCreateTelegram.pick({ botToken: true, chatId: true, + messageThreadId: true, }); export const apiCreateDiscord = notificationsSchema @@ -188,6 +194,7 @@ export const apiCreateDiscord = notificationsSchema name: true, appDeploy: true, dockerCleanup: true, + serverThreshold: true, }) .extend({ webhookUrl: z.string().min(1), @@ -198,7 +205,7 @@ export const apiCreateDiscord = notificationsSchema export const apiUpdateDiscord = apiCreateDiscord.partial().extend({ notificationId: z.string().min(1), discordId: z.string().min(1), - adminId: z.string().optional(), + organizationId: z.string().optional(), }); export const apiTestDiscordConnection = apiCreateDiscord @@ -217,6 +224,7 @@ export const apiCreateEmail = notificationsSchema name: true, appDeploy: true, dockerCleanup: true, + serverThreshold: true, }) .extend({ smtpServer: z.string().min(1), @@ -231,7 +239,7 @@ export const apiCreateEmail = notificationsSchema export const apiUpdateEmail = apiCreateEmail.partial().extend({ notificationId: z.string().min(1), emailId: z.string().min(1), - adminId: z.string().optional(), + organizationId: z.string().optional(), }); export const apiTestEmailConnection = apiCreateEmail.pick({ @@ -263,7 +271,7 @@ export const apiCreateGotify = notificationsSchema export const apiUpdateGotify = apiCreateGotify.partial().extend({ notificationId: z.string().min(1), gotifyId: z.string().min(1), - adminId: z.string().optional(), + organizationId: z.string().optional(), }); export const apiTestGotifyConnection = apiCreateGotify diff --git a/packages/server/src/db/schema/project.ts b/packages/server/src/db/schema/project.ts index 7ed140d6..deeba4ac 100644 --- a/packages/server/src/db/schema/project.ts +++ b/packages/server/src/db/schema/project.ts @@ -1,10 +1,9 @@ import { relations } from "drizzle-orm"; - import { pgTable, text } from "drizzle-orm/pg-core"; import { createInsertSchema } from "drizzle-zod"; import { nanoid } from "nanoid"; import { z } from "zod"; -import { admins } from "./admin"; +import { organization } from "./account"; import { applications } from "./application"; import { compose } from "./compose"; import { mariadb } from "./mariadb"; @@ -23,9 +22,10 @@ export const projects = pgTable("project", { createdAt: text("createdAt") .notNull() .$defaultFn(() => new Date().toISOString()), - adminId: text("adminId") + + organizationId: text("organizationId") .notNull() - .references(() => admins.adminId, { onDelete: "cascade" }), + .references(() => organization.id, { onDelete: "cascade" }), env: text("env").notNull().default(""), }); @@ -37,9 +37,9 @@ export const projectRelations = relations(projects, ({ many, one }) => ({ mongo: many(mongo), redis: many(redis), compose: many(compose), - admin: one(admins, { - fields: [projects.adminId], - references: [admins.adminId], + organization: one(organization, { + fields: [projects.organizationId], + references: [organization.id], }), })); diff --git a/packages/server/src/db/schema/registry.ts b/packages/server/src/db/schema/registry.ts index 20544a58..b1874709 100644 --- a/packages/server/src/db/schema/registry.ts +++ b/packages/server/src/db/schema/registry.ts @@ -3,7 +3,7 @@ import { pgEnum, pgTable, text } from "drizzle-orm/pg-core"; import { createInsertSchema } from "drizzle-zod"; import { nanoid } from "nanoid"; import { z } from "zod"; -import { admins } from "./admin"; +import { organization } from "./account"; import { applications } from "./application"; /** * This is an example of how to use the multi-project schema feature of Drizzle ORM. Use the same @@ -27,16 +27,12 @@ export const registry = pgTable("registry", { .notNull() .$defaultFn(() => new Date().toISOString()), registryType: registryType("selfHosted").notNull().default("cloud"), - adminId: text("adminId") + organizationId: text("organizationId") .notNull() - .references(() => admins.adminId, { onDelete: "cascade" }), + .references(() => organization.id, { onDelete: "cascade" }), }); -export const registryRelations = relations(registry, ({ one, many }) => ({ - admin: one(admins, { - fields: [registry.adminId], - references: [admins.adminId], - }), +export const registryRelations = relations(registry, ({ many }) => ({ applications: many(applications), })); @@ -45,7 +41,7 @@ const createSchema = createInsertSchema(registry, { username: z.string().min(1), password: z.string().min(1), registryUrl: z.string(), - adminId: z.string().min(1), + organizationId: z.string().min(1), registryId: z.string().min(1), registryType: z.enum(["cloud"]), imagePrefix: z.string().nullable().optional(), diff --git a/packages/server/src/db/schema/schema.dbml b/packages/server/src/db/schema/schema.dbml new file mode 100644 index 00000000..ce2b5abc --- /dev/null +++ b/packages/server/src/db/schema/schema.dbml @@ -0,0 +1,872 @@ +enum applicationStatus { + idle + running + done + error +} + +enum buildType { + dockerfile + heroku_buildpacks + paketo_buildpacks + nixpacks + static +} + +enum certificateType { + letsencrypt + none +} + +enum composeType { + "docker-compose" + stack +} + +enum databaseType { + postgres + mariadb + mysql + mongo +} + +enum deploymentStatus { + running + done + error +} + +enum domainType { + compose + application + preview +} + +enum gitProviderType { + github + gitlab + bitbucket +} + +enum mountType { + bind + volume + file +} + +enum notificationType { + slack + telegram + discord + email + gotify +} + +enum protocolType { + tcp + udp +} + +enum RegistryType { + selfHosted + cloud +} + +enum Roles { + admin + user +} + +enum serverStatus { + active + inactive +} + +enum serviceType { + application + postgres + mysql + mariadb + mongo + redis + compose +} + +enum sourceType { + docker + git + github + gitlab + bitbucket + drop +} + +enum sourceTypeCompose { + git + github + gitlab + bitbucket + raw +} + +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 admin { +} + +table application { + applicationId text [pk, not null] + name text [not null] + appName text [not null, unique] + description text + env text + previewEnv text + previewBuildArgs text + previewWildcard text + previewPort integer [default: 3000] + previewHttps boolean [not null, default: false] + previewPath text [default: '/'] + certificateType certificateType [not null, default: 'none'] + previewLimit integer [default: 3] + isPreviewDeploymentsActive boolean [default: false] + buildArgs 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'] + repository text + owner text + branch text + buildPath text [default: '/'] + autoDeploy boolean + gitlabProjectId integer + gitlabRepository text + gitlabOwner text + gitlabBranch text + gitlabBuildPath text [default: '/'] + gitlabPathNamespace text + 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 + dockerfile text + dockerContextPath text + dockerBuildStage text + dropBuildPath text + healthCheckSwarm json + restartPolicySwarm json + placementSwarm json + updateConfigSwarm json + rollbackConfigSwarm json + modeSwarm json + labelsSwarm json + networkSwarm json + replicas integer [not null, default: 1] + applicationStatus applicationStatus [not null, default: 'idle'] + buildType buildType [not null, default: 'nixpacks'] + herokuVersion text [default: '24'] + publishDirectory text + createdAt text [not null] + registryId text + projectId text [not null] + githubId text + gitlabId text + bitbucketId text + serverId text +} + +table auth { + id text [pk, not null] + email text [not null, unique] + password text [not null] + rol Roles [not null] + image text + secret text + token text + is2FAEnabled boolean [not null, default: false] + createdAt text [not null] + resetPasswordToken text + resetPasswordExpiresAt text + confirmationToken text + confirmationExpiresAt text +} + +table backup { + backupId text [pk, not null] + schedule text [not null] + enabled boolean + database text [not null] + prefix text [not null] + destinationId text [not null] + databaseType databaseType [not null] + postgresId text + mariadbId text + mysqlId text + mongoId text +} + +table bitbucket { + bitbucketId text [pk, not null] + bitbucketUsername text + appPassword 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 + userId text + 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 + customGitUrl text + customGitBranch text + customGitSSHKeyId text + command text [not null, default: ''] + 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] + composeStatus applicationStatus [not null, default: 'idle'] + projectId text [not null] + createdAt text [not null] + githubId text + gitlabId text + bitbucketId text + serverId text +} + +table deployment { + deploymentId text [pk, not null] + title text [not null] + description text + status deploymentStatus [default: 'running'] + logPath text [not null] + applicationId text + composeId text + serverId text + isPreviewDeployment boolean [default: false] + previewDeploymentId text + createdAt text [not null] + errorMessage 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] + userId text [not null] +} + +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 + applicationId text + previewDeploymentId text + certificateType certificateType [not null, default: 'none'] +} + +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 git_provider { + gitProviderId text [pk, not null] + name text [not null] + providerType gitProviderType [not null, default: 'github'] + createdAt text [not null] + userId text +} + +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] +} + +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'] + createdAt text [not null] + projectId 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] +} + +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'] + createdAt text [not null] + projectId 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'] + createdAt text [not null] + projectId 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 + gotifyId text + userId text +} + +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] + 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'] + createdAt text [not null] + projectId 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] + userId 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'] + projectId 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'] + userId 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] + userId 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 { + 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 + userId text +} + +table telegram { + telegramId text [pk, not null] + botToken text [not null] + chatId text [not null] +} + +table user { + id text [pk, not null] + name text [not null, default: ''] + token text [not null] + isRegistered boolean [not null, default: false] + expirationDate text [not null] + createdAt text [not null] + 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] + accesedProjects text[] [not null, default: `ARRAY[]::text[]`] + accesedServices text[] [not null, default: `ARRAY[]::text[]`] + email text [not null, unique] + email_verified boolean [not null] + image text + role text + banned boolean + ban_reason text + ban_expires timestamp + updated_at timestamp [not null] + serverIp text + certificateType certificateType [not null, default: 'none'] + host text + letsEncryptEmail text + sshPrivateKey text + enableDockerCleanup boolean [not null, default: false] + enableLogRotation boolean [not null, default: false] + enablePaidFeatures 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 +} + +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: application.projectId > project.projectId + +ref: application.customGitSSHKeyId > "ssh-key".sshKeyId + +ref: application.registryId > registry.registryId + +ref: application.githubId - github.githubId + +ref: application.gitlabId - gitlab.gitlabId + +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: git_provider.gitProviderId - bitbucket.gitProviderId + +ref: certificate.serverId > server.serverId + +ref: certificate.userId - user.id + +ref: compose.projectId > project.projectId + +ref: compose.customGitSSHKeyId > "ssh-key".sshKeyId + +ref: compose.githubId - github.githubId + +ref: compose.gitlabId - gitlab.gitlabId + +ref: compose.bitbucketId - bitbucket.bitbucketId + +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: destination.userId - user.id + +ref: domain.applicationId > application.applicationId + +ref: domain.composeId > compose.composeId + +ref: preview_deployments.domainId - domain.domainId + +ref: github.gitProviderId - git_provider.gitProviderId + +ref: gitlab.gitProviderId - git_provider.gitProviderId + +ref: git_provider.userId - user.id + +ref: mariadb.projectId > project.projectId + +ref: mariadb.serverId > server.serverId + +ref: mongo.projectId > project.projectId + +ref: mongo.serverId > server.serverId + +ref: mysql.projectId > project.projectId + +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.gotifyId - gotify.gotifyId + +ref: notification.userId - user.id + +ref: port.applicationId > application.applicationId + +ref: postgres.projectId > project.projectId + +ref: postgres.serverId > server.serverId + +ref: preview_deployments.applicationId > application.applicationId + +ref: project.userId - user.id + +ref: redirect.applicationId > application.applicationId + +ref: redis.projectId > project.projectId + +ref: redis.serverId > server.serverId + +ref: registry.userId - user.id + +ref: security.applicationId > application.applicationId + +ref: server.userId - user.id + +ref: server.sshKeyId > "ssh-key".sshKeyId + +ref: "ssh-key".userId - user.id \ No newline at end of file diff --git a/packages/server/src/db/schema/server.ts b/packages/server/src/db/schema/server.ts index a9c8da6e..26bb4632 100644 --- a/packages/server/src/db/schema/server.ts +++ b/packages/server/src/db/schema/server.ts @@ -1,10 +1,16 @@ import { relations } from "drizzle-orm"; -import { boolean, integer, pgEnum, pgTable, text } from "drizzle-orm/pg-core"; +import { + boolean, + integer, + jsonb, + pgEnum, + pgTable, + text, +} from "drizzle-orm/pg-core"; import { createInsertSchema } from "drizzle-zod"; import { nanoid } from "nanoid"; import { z } from "zod"; - -import { admins } from "./admin"; +import { organization } from "./account"; import { applications } from "./application"; import { certificates } from "./certificate"; import { compose } from "./compose"; @@ -33,24 +39,64 @@ export const server = pgTable("server", { .notNull() .$defaultFn(() => generateAppName("server")), enableDockerCleanup: boolean("enableDockerCleanup").notNull().default(false), - createdAt: text("createdAt") + createdAt: text("createdAt").notNull(), + organizationId: text("organizationId") .notNull() - .$defaultFn(() => new Date().toISOString()), - adminId: text("adminId") - .notNull() - .references(() => admins.adminId, { onDelete: "cascade" }), + .references(() => organization.id, { onDelete: "cascade" }), serverStatus: serverStatus("serverStatus").notNull().default("active"), command: text("command").notNull().default(""), sshKeyId: text("sshKeyId").references(() => sshKeys.sshKeyId, { onDelete: "set null", }), + metricsConfig: jsonb("metricsConfig") + .$type<{ + server: { + type: "Dokploy" | "Remote"; + refreshRate: number; + port: number; + token: string; + urlCallback: string; + retentionDays: number; + cronJob: string; + thresholds: { + cpu: number; + memory: number; + }; + }; + containers: { + refreshRate: number; + services: { + include: string[]; + exclude: string[]; + }; + }; + }>() + .notNull() + .default({ + server: { + type: "Remote", + refreshRate: 60, + port: 4500, + token: "", + urlCallback: "", + cronJob: "", + retentionDays: 2, + thresholds: { + cpu: 0, + memory: 0, + }, + }, + containers: { + refreshRate: 60, + services: { + include: [], + exclude: [], + }, + }, + }), }); export const serverRelations = relations(server, ({ one, many }) => ({ - admin: one(admins, { - fields: [server.adminId], - references: [admins.adminId], - }), deployments: many(deployments), sshKey: one(sshKeys, { fields: [server.sshKeyId], @@ -64,6 +110,10 @@ export const serverRelations = relations(server, ({ one, many }) => ({ mysql: many(mysql), postgres: many(postgres), certificates: many(certificates), + organization: one(organization, { + fields: [server.organizationId], + references: [organization.id], + }), })); const createSchema = createInsertSchema(server, { @@ -109,3 +159,34 @@ export const apiUpdateServer = createSchema .extend({ command: z.string().optional(), }); + +export const apiUpdateServerMonitoring = createSchema + .pick({ + serverId: true, + }) + .required() + .extend({ + metricsConfig: z + .object({ + server: z.object({ + refreshRate: z.number().min(2), + port: z.number().min(1), + token: z.string(), + urlCallback: z.string().url(), + retentionDays: z.number().min(1), + cronJob: z.string().min(1), + thresholds: z.object({ + cpu: z.number().min(0), + memory: z.number().min(0), + }), + }), + containers: z.object({ + refreshRate: z.number().min(2), + services: z.object({ + include: z.array(z.string()).optional(), + exclude: z.array(z.string()).optional(), + }), + }), + }) + .required(), + }); diff --git a/packages/server/src/db/schema/session.ts b/packages/server/src/db/schema/session.ts index 1b6d8cc1..f7c12dae 100644 --- a/packages/server/src/db/schema/session.ts +++ b/packages/server/src/db/schema/session.ts @@ -1,13 +1,18 @@ import { pgTable, text, timestamp } from "drizzle-orm/pg-core"; -import { auth } from "./auth"; +import { users_temp } from "./user"; -export const sessionTable = pgTable("session", { +// OLD TABLE +export const session = pgTable("session_temp", { id: text("id").primaryKey(), + expiresAt: timestamp("expires_at").notNull(), + token: text("token").notNull().unique(), + createdAt: timestamp("created_at").notNull(), + updatedAt: timestamp("updated_at").notNull(), + ipAddress: text("ip_address"), + userAgent: text("user_agent"), userId: text("user_id") .notNull() - .references(() => auth.id, { onDelete: "cascade" }), - expiresAt: timestamp("expires_at", { - withTimezone: true, - mode: "date", - }).notNull(), + .references(() => users_temp.id, { onDelete: "cascade" }), + impersonatedBy: text("impersonated_by"), + activeOrganizationId: text("active_organization_id"), }); diff --git a/packages/server/src/db/schema/source.ts b/packages/server/src/db/schema/source.ts deleted file mode 100644 index 6618ced7..00000000 --- a/packages/server/src/db/schema/source.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { pgTable, text } from "drizzle-orm/pg-core"; -import { createInsertSchema } from "drizzle-zod"; -import { nanoid } from "nanoid"; -import { z } from "zod"; - -export const source = pgTable("project", { - projectId: text("projectId") - .notNull() - .primaryKey() - .$defaultFn(() => nanoid()), - name: text("name").notNull(), - description: text("description"), - createdAt: text("createdAt") - .notNull() - .$defaultFn(() => new Date().toISOString()), -}); - -const createSchema = createInsertSchema(source, { - name: z.string().min(1), - description: z.string(), - projectId: z.string(), -}); - -export const apiCreate = createSchema.pick({ - name: true, - description: true, -}); diff --git a/packages/server/src/db/schema/ssh-key.ts b/packages/server/src/db/schema/ssh-key.ts index e4842851..8a66d6d9 100644 --- a/packages/server/src/db/schema/ssh-key.ts +++ b/packages/server/src/db/schema/ssh-key.ts @@ -3,7 +3,7 @@ import { pgTable, text } from "drizzle-orm/pg-core"; import { createInsertSchema } from "drizzle-zod"; import { nanoid } from "nanoid"; import { sshKeyCreate, sshKeyType } from "../validations"; -import { admins } from "./admin"; +import { organization } from "./account"; import { applications } from "./application"; import { compose } from "./compose"; import { server } from "./server"; @@ -21,18 +21,18 @@ export const sshKeys = pgTable("ssh-key", { .notNull() .$defaultFn(() => new Date().toISOString()), lastUsedAt: text("lastUsedAt"), - adminId: text("adminId").references(() => admins.adminId, { - onDelete: "cascade", - }), + organizationId: text("organizationId") + .notNull() + .references(() => organization.id, { onDelete: "cascade" }), }); export const sshKeysRelations = relations(sshKeys, ({ many, one }) => ({ applications: many(applications), compose: many(compose), servers: many(server), - admin: one(admins, { - fields: [sshKeys.adminId], - references: [admins.adminId], + organization: one(organization, { + fields: [sshKeys.organizationId], + references: [organization.id], }), })); @@ -48,7 +48,7 @@ export const apiCreateSshKey = createSchema description: true, privateKey: true, publicKey: true, - adminId: true, + organizationId: true, }) .merge(sshKeyCreate.pick({ privateKey: true })); diff --git a/packages/server/src/db/schema/user.ts b/packages/server/src/db/schema/user.ts index 735898f9..9307127a 100644 --- a/packages/server/src/db/schema/user.ts +++ b/packages/server/src/db/schema/user.ts @@ -1,10 +1,18 @@ -import { relations, sql } from "drizzle-orm"; -import { boolean, pgTable, text, timestamp } from "drizzle-orm/pg-core"; +import { relations } from "drizzle-orm"; +import { + boolean, + integer, + jsonb, + pgTable, + text, + timestamp, +} from "drizzle-orm/pg-core"; import { createInsertSchema } from "drizzle-zod"; import { nanoid } from "nanoid"; import { z } from "zod"; -import { admins } from "./admin"; -import { auth } from "./auth"; +import { account, organization, apikey } from "./account"; +import { projects } from "./project"; +import { certificateType } from "./shared"; /** * This is an example of how to use the multi-project schema feature of Drizzle ORM. Use the same * database instance for multiple projects. @@ -12,75 +20,115 @@ import { auth } from "./auth"; * @see https://orm.drizzle.team/docs/goodies#multi-project-schema */ -export const users = pgTable("user", { - userId: text("userId") +// OLD TABLE + +// TEMP +export const users_temp = pgTable("user_temp", { + id: text("id") .notNull() .primaryKey() .$defaultFn(() => nanoid()), - - token: text("token").notNull(), + name: text("name").notNull().default(""), isRegistered: boolean("isRegistered").notNull().default(false), - expirationDate: timestamp("expirationDate", { - precision: 3, - mode: "string", - }).notNull(), - createdAt: text("createdAt") + expirationDate: text("expirationDate") .notNull() .$defaultFn(() => new Date().toISOString()), - canCreateProjects: boolean("canCreateProjects").notNull().default(false), - canAccessToSSHKeys: boolean("canAccessToSSHKeys").notNull().default(false), - canCreateServices: boolean("canCreateServices").notNull().default(false), - canDeleteProjects: boolean("canDeleteProjects").notNull().default(false), - canDeleteServices: boolean("canDeleteServices").notNull().default(false), - canAccessToDocker: boolean("canAccessToDocker").notNull().default(false), - canAccessToAPI: boolean("canAccessToAPI").notNull().default(false), - canAccessToGitProviders: boolean("canAccessToGitProviders") + createdAt2: text("createdAt") + .notNull() + .$defaultFn(() => new Date().toISOString()), + createdAt: timestamp("created_at").defaultNow(), + // Auth + twoFactorEnabled: boolean("two_factor_enabled"), + email: text("email").notNull().unique(), + emailVerified: boolean("email_verified").notNull(), + image: text("image"), + banned: boolean("banned"), + banReason: text("ban_reason"), + banExpires: timestamp("ban_expires"), + updatedAt: timestamp("updated_at").notNull(), + // Admin + serverIp: text("serverIp"), + certificateType: certificateType("certificateType").notNull().default("none"), + host: text("host"), + letsEncryptEmail: text("letsEncryptEmail"), + sshPrivateKey: text("sshPrivateKey"), + enableDockerCleanup: boolean("enableDockerCleanup").notNull().default(false), + enableLogRotation: boolean("enableLogRotation").notNull().default(false), + // Metrics + enablePaidFeatures: boolean("enablePaidFeatures").notNull().default(false), + metricsConfig: jsonb("metricsConfig") + .$type<{ + server: { + type: "Dokploy" | "Remote"; + refreshRate: number; + port: number; + token: string; + urlCallback: string; + retentionDays: number; + cronJob: string; + thresholds: { + cpu: number; + memory: number; + }; + }; + containers: { + refreshRate: number; + services: { + include: string[]; + exclude: string[]; + }; + }; + }>() + .notNull() + .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("cleanupCacheApplications") .notNull() .default(false), - canAccessToTraefikFiles: boolean("canAccessToTraefikFiles") + cleanupCacheOnPreviews: boolean("cleanupCacheOnPreviews") .notNull() .default(false), - accessedProjects: text("accesedProjects") - .array() + cleanupCacheOnCompose: boolean("cleanupCacheOnCompose") .notNull() - .default(sql`ARRAY[]::text[]`), - accessedServices: text("accesedServices") - .array() - .notNull() - .default(sql`ARRAY[]::text[]`), - adminId: text("adminId") - .notNull() - .references(() => admins.adminId, { onDelete: "cascade" }), - authId: text("authId") - .notNull() - .references(() => auth.id, { onDelete: "cascade" }), + .default(false), + stripeCustomerId: text("stripeCustomerId"), + stripeSubscriptionId: text("stripeSubscriptionId"), + serversQuantity: integer("serversQuantity").notNull().default(0), }); -export const usersRelations = relations(users, ({ one }) => ({ - auth: one(auth, { - fields: [users.authId], - references: [auth.id], - }), - admin: one(admins, { - fields: [users.adminId], - references: [admins.adminId], +export const usersRelations = relations(users_temp, ({ one, many }) => ({ + account: one(account, { + fields: [users_temp.id], + references: [account.userId], }), + organizations: many(organization), + projects: many(projects), + apiKeys: many(apikey), })); -const createSchema = createInsertSchema(users, { - userId: z.string().min(1), - authId: z.string().min(1), - token: z.string().min(1), +const createSchema = createInsertSchema(users_temp, { + id: z.string().min(1), isRegistered: z.boolean().optional(), - adminId: z.string(), - accessedProjects: z.array(z.string()).optional(), - accessedServices: z.array(z.string()).optional(), - canCreateProjects: z.boolean().optional(), - canCreateServices: z.boolean().optional(), - canDeleteProjects: z.boolean().optional(), - canDeleteServices: z.boolean().optional(), - canAccessToDocker: z.boolean().optional(), - canAccessToTraefikFiles: z.boolean().optional(), }); export const apiCreateUserInvitation = createSchema.pick({}).extend({ @@ -89,41 +137,172 @@ export const apiCreateUserInvitation = createSchema.pick({}).extend({ export const apiRemoveUser = createSchema .pick({ - authId: true, + id: true, }) .required(); export const apiFindOneToken = createSchema - .pick({ - token: true, - }) - .required(); + .pick({}) + .required() + .extend({ + token: z.string().min(1), + }); export const apiAssignPermissions = createSchema .pick({ - userId: true, - canCreateProjects: true, - canCreateServices: true, - canDeleteProjects: true, - canDeleteServices: true, - accessedProjects: true, - accessedServices: true, - canAccessToTraefikFiles: true, - canAccessToDocker: true, - canAccessToAPI: true, - canAccessToSSHKeys: true, - canAccessToGitProviders: true, + id: true, + // canCreateProjects: true, + // canCreateServices: true, + // canDeleteProjects: true, + // canDeleteServices: true, + // accessedProjects: true, + // accessedServices: true, + // canAccessToTraefikFiles: true, + // canAccessToDocker: true, + // canAccessToAPI: true, + // canAccessToSSHKeys: true, + // canAccessToGitProviders: true, + }) + .extend({ + accessedProjects: z.array(z.string()).optional(), + accessedServices: z.array(z.string()).optional(), + canCreateProjects: z.boolean().optional(), + canCreateServices: z.boolean().optional(), + canDeleteProjects: z.boolean().optional(), + canDeleteServices: z.boolean().optional(), + canAccessToDocker: z.boolean().optional(), + canAccessToTraefikFiles: z.boolean().optional(), + canAccessToAPI: z.boolean().optional(), + canAccessToSSHKeys: z.boolean().optional(), + canAccessToGitProviders: z.boolean().optional(), }) .required(); export const apiFindOneUser = createSchema .pick({ - userId: true, + id: true, }) .required(); export const apiFindOneUserByAuth = createSchema .pick({ - authId: true, + // authId: true, }) .required(); +export const apiSaveSSHKey = createSchema + .pick({ + sshPrivateKey: true, + }) + .required(); + +export const apiAssignDomain = createSchema + .pick({ + host: true, + certificateType: true, + letsEncryptEmail: true, + }) + .required() + .partial({ + letsEncryptEmail: true, + }); + +export const apiUpdateDockerCleanup = createSchema + .pick({ + enableDockerCleanup: true, + }) + .required() + .extend({ + serverId: z.string().optional(), + }); + +export const apiTraefikConfig = z.object({ + traefikConfig: z.string().min(1), +}); + +export const apiModifyTraefikConfig = z.object({ + path: z.string().min(1), + traefikConfig: z.string().min(1), + serverId: z.string().optional(), +}); +export const apiReadTraefikConfig = z.object({ + path: z.string().min(1), + serverId: z.string().optional(), +}); + +export const apiEnableDashboard = z.object({ + enableDashboard: z.boolean().optional(), + serverId: z.string().optional(), +}); + +export const apiServerSchema = z + .object({ + serverId: z.string().optional(), + }) + .optional(); + +export const apiReadStatsLogs = z.object({ + page: z + .object({ + pageIndex: z.number(), + pageSize: z.number(), + }) + .optional(), + status: z.string().array().optional(), + search: z.string().optional(), + sort: z.object({ id: z.string(), desc: z.boolean() }).optional(), +}); + +export const apiUpdateWebServerMonitoring = z.object({ + metricsConfig: z + .object({ + server: z.object({ + refreshRate: z.number().min(2), + port: z.number().min(1), + token: z.string(), + urlCallback: z.string().url(), + retentionDays: z.number().min(1), + cronJob: z.string().min(1), + thresholds: z.object({ + cpu: z.number().min(0), + memory: z.number().min(0), + }), + }), + containers: z.object({ + refreshRate: z.number().min(2), + services: z.object({ + include: z.array(z.string()).optional(), + exclude: z.array(z.string()).optional(), + }), + }), + }) + .required(), +}); + +export const apiUpdateUser = createSchema.partial().extend({ + password: z.string().optional(), + currentPassword: z.string().optional(), + metricsConfig: z + .object({ + server: z.object({ + type: z.enum(["Dokploy", "Remote"]), + refreshRate: z.number(), + port: z.number(), + token: z.string(), + urlCallback: z.string(), + retentionDays: z.number(), + cronJob: z.string(), + thresholds: z.object({ + cpu: z.number(), + memory: z.number(), + }), + }), + containers: z.object({ + refreshRate: z.number(), + services: z.object({ + include: z.array(z.string()), + exclude: z.array(z.string()), + }), + }), + }) + .optional(), +}); diff --git a/packages/server/src/emails/emails/build-failed.tsx b/packages/server/src/emails/emails/build-failed.tsx index b3d99919..79e7b718 100644 --- a/packages/server/src/emails/emails/build-failed.tsx +++ b/packages/server/src/emails/emails/build-failed.tsx @@ -12,7 +12,6 @@ import { Tailwind, Text, } from "@react-email/components"; -import * as React from "react"; export type TemplateProps = { projectName: string; diff --git a/packages/server/src/emails/emails/build-success.tsx b/packages/server/src/emails/emails/build-success.tsx index eadf7c44..d9e500ab 100644 --- a/packages/server/src/emails/emails/build-success.tsx +++ b/packages/server/src/emails/emails/build-success.tsx @@ -12,7 +12,6 @@ import { Tailwind, Text, } from "@react-email/components"; -import * as React from "react"; export type TemplateProps = { projectName: string; diff --git a/packages/server/src/emails/emails/database-backup.tsx b/packages/server/src/emails/emails/database-backup.tsx index 2bdf944c..754d4d98 100644 --- a/packages/server/src/emails/emails/database-backup.tsx +++ b/packages/server/src/emails/emails/database-backup.tsx @@ -10,7 +10,6 @@ import { Tailwind, Text, } from "@react-email/components"; -import * as React from "react"; export type TemplateProps = { projectName: string; diff --git a/packages/server/src/emails/emails/docker-cleanup.tsx b/packages/server/src/emails/emails/docker-cleanup.tsx index 05d93ed7..985406ae 100644 --- a/packages/server/src/emails/emails/docker-cleanup.tsx +++ b/packages/server/src/emails/emails/docker-cleanup.tsx @@ -1,6 +1,5 @@ import { Body, - Button, Container, Head, Heading, @@ -11,7 +10,6 @@ import { Tailwind, Text, } from "@react-email/components"; -import * as React from "react"; export type TemplateProps = { message: string; diff --git a/packages/server/src/emails/emails/dokploy-restart.tsx b/packages/server/src/emails/emails/dokploy-restart.tsx index 1ad3d600..db4edd69 100644 --- a/packages/server/src/emails/emails/dokploy-restart.tsx +++ b/packages/server/src/emails/emails/dokploy-restart.tsx @@ -10,7 +10,6 @@ import { Tailwind, Text, } from "@react-email/components"; -import * as React from "react"; export type TemplateProps = { date: string; diff --git a/packages/server/src/emails/emails/notion-magic-link.tsx b/packages/server/src/emails/emails/notion-magic-link.tsx index b2286c34..f4071ce0 100644 --- a/packages/server/src/emails/emails/notion-magic-link.tsx +++ b/packages/server/src/emails/emails/notion-magic-link.tsx @@ -9,7 +9,6 @@ import { Preview, Text, } from "@react-email/components"; -import * as React from "react"; interface NotionMagicLinkEmailProps { loginCode?: string; diff --git a/packages/server/src/emails/emails/plaid-verify-identity.tsx b/packages/server/src/emails/emails/plaid-verify-identity.tsx index 650ab486..88cf893d 100644 --- a/packages/server/src/emails/emails/plaid-verify-identity.tsx +++ b/packages/server/src/emails/emails/plaid-verify-identity.tsx @@ -9,7 +9,6 @@ import { Section, Text, } from "@react-email/components"; -import * as React from "react"; interface PlaidVerifyIdentityEmailProps { validationCode?: string; diff --git a/packages/server/src/emails/emails/stripe-welcome.tsx b/packages/server/src/emails/emails/stripe-welcome.tsx index 9377853b..dbf02ea0 100644 --- a/packages/server/src/emails/emails/stripe-welcome.tsx +++ b/packages/server/src/emails/emails/stripe-welcome.tsx @@ -11,7 +11,6 @@ import { Section, Text, } from "@react-email/components"; -import * as React from "react"; const baseUrl = process.env.VERCEL_URL!; diff --git a/packages/server/src/emails/emails/vercel-invite-user.tsx b/packages/server/src/emails/emails/vercel-invite-user.tsx index 53b31987..79f50cd7 100644 --- a/packages/server/src/emails/emails/vercel-invite-user.tsx +++ b/packages/server/src/emails/emails/vercel-invite-user.tsx @@ -15,7 +15,6 @@ import { Tailwind, Text, } from "@react-email/components"; -import * as React from "react"; interface VercelInviteUserEmailProps { username?: string; diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index d48e6ea8..f74b8d9d 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -1,7 +1,4 @@ -export * from "./auth/auth"; -export * from "./auth/token"; export * from "./auth/random-password"; -// export * from "./db"; export * from "./services/admin"; export * from "./services/user"; export * from "./services/project"; @@ -30,7 +27,6 @@ export * from "./services/ssh-key"; export * from "./services/git-provider"; export * from "./services/bitbucket"; export * from "./services/github"; -export * from "./services/auth"; export * from "./services/gitlab"; export * from "./services/server"; export * from "./services/application"; @@ -39,6 +35,7 @@ export * from "./setup/config-paths"; export * from "./setup/postgres-setup"; export * from "./setup/redis-setup"; export * from "./setup/server-setup"; +export * from "./setup/monitoring-setup"; export * from "./setup/setup"; export * from "./setup/traefik-setup"; export * from "./setup/server-validate"; @@ -57,6 +54,7 @@ export * from "./utils/notifications/database-backup"; export * from "./utils/notifications/dokploy-restart"; export * from "./utils/notifications/utils"; export * from "./utils/notifications/docker-cleanup"; +export * from "./utils/notifications/server-threshold"; export * from "./utils/builders/index"; export * from "./utils/builders/compose"; @@ -71,6 +69,7 @@ export * from "./utils/builders/utils"; export * from "./utils/cluster/upload"; export * from "./utils/docker/compose"; +export * from "./utils/docker/collision"; export * from "./utils/docker/domain"; export * from "./utils/docker/utils"; export * from "./utils/docker/types"; @@ -110,8 +109,10 @@ export * from "./utils/access-log/types"; export * from "./utils/access-log/utils"; export * from "./constants/index"; -export * from "./monitoring/utilts"; +export * from "./monitoring/utils"; export * from "./db/validations/domain"; export * from "./db/validations/index"; export * from "./utils/gpu-setup"; + +export * from "./lib/auth"; diff --git a/packages/server/src/lib/auth.ts b/packages/server/src/lib/auth.ts new file mode 100644 index 00000000..1efa1730 --- /dev/null +++ b/packages/server/src/lib/auth.ts @@ -0,0 +1,304 @@ +import type { IncomingMessage } from "node:http"; +import * as bcrypt from "bcrypt"; +import { betterAuth } from "better-auth"; +import { drizzleAdapter } from "better-auth/adapters/drizzle"; +import { organization, twoFactor, apiKey } from "better-auth/plugins"; +import { and, desc, eq } from "drizzle-orm"; +import { db } from "../db"; +import * as schema from "../db/schema"; +import { sendEmail } from "../verification/send-verification-email"; +import { IS_CLOUD } from "../constants"; + +const { handler, api } = betterAuth({ + database: drizzleAdapter(db, { + provider: "pg", + schema: schema, + }), + logger: { + disabled: process.env.NODE_ENV === "production", + }, + appName: "Dokploy", + socialProviders: { + github: { + clientId: process.env.GITHUB_CLIENT_ID as string, + clientSecret: process.env.GITHUB_CLIENT_SECRET as string, + }, + google: { + clientId: process.env.GOOGLE_CLIENT_ID as string, + clientSecret: process.env.GOOGLE_CLIENT_SECRET as string, + }, + }, + emailVerification: { + sendOnSignUp: true, + autoSignInAfterVerification: true, + sendVerificationEmail: async ({ user, url }) => { + if (IS_CLOUD) { + await sendEmail({ + email: user.email, + subject: "Verify your email", + text: ` +

Click the link to verify your email: Verify Email

+ `, + }); + } + }, + }, + emailAndPassword: { + enabled: true, + autoSignIn: !IS_CLOUD, + requireEmailVerification: IS_CLOUD, + password: { + async hash(password) { + return bcrypt.hashSync(password, 10); + }, + async verify({ hash, password }) { + return bcrypt.compareSync(password, hash); + }, + }, + sendResetPassword: async ({ user, url }) => { + await sendEmail({ + email: user.email, + subject: "Reset your password", + text: ` +

Click the link to reset your password: Reset Password

+ `, + }); + }, + }, + databaseHooks: { + user: { + create: { + after: async (user) => { + const isAdminPresent = await db.query.member.findFirst({ + where: eq(schema.member.role, "owner"), + }); + + if (IS_CLOUD || !isAdminPresent) { + await db.transaction(async (tx) => { + const organization = await tx + .insert(schema.organization) + .values({ + name: "My Organization", + ownerId: user.id, + createdAt: new Date(), + }) + .returning() + .then((res) => res[0]); + + await tx.insert(schema.member).values({ + userId: user.id, + organizationId: organization?.id || "", + role: "owner", + createdAt: new Date(), + }); + }); + } + }, + }, + }, + session: { + create: { + before: async (session) => { + const member = await db.query.member.findFirst({ + where: eq(schema.member.userId, session.userId), + orderBy: desc(schema.member.createdAt), + with: { + organization: true, + }, + }); + + return { + data: { + ...session, + activeOrganizationId: member?.organization.id, + }, + }; + }, + }, + }, + }, + user: { + modelName: "users_temp", + additionalFields: { + role: { + type: "string", + // required: true, + input: false, + }, + ownerId: { + type: "string", + // required: true, + input: false, + }, + }, + }, + + plugins: [ + apiKey({ + enableMetadata: true, + }), + twoFactor(), + organization({ + async sendInvitationEmail(data, _request) { + if (IS_CLOUD) { + const host = + process.env.NODE_ENV === "development" + ? "http://localhost:3000" + : "https://dokploy.com"; + const inviteLink = `${host}/invitation?token=${data.id}`; + + await sendEmail({ + email: data.email, + subject: "Invitation to join organization", + text: ` +

You are invited to join ${data.organization.name} on Dokploy. Click the link to accept the invitation: Accept Invitation

+ `, + }); + } + }, + }), + ], +}); + +export const auth = { + handler, + createApiKey: api.createApiKey, +}; + +export const validateRequest = async (request: IncomingMessage) => { + const apiKey = request.headers["x-api-key"] as string; + if (apiKey) { + try { + const { valid, key, error } = await api.verifyApiKey({ + body: { + key: apiKey, + }, + }); + + if (error) { + throw new Error(error.message || "Error verifying API key"); + } + if (!valid || !key) { + return { + session: null, + user: null, + }; + } + + const apiKeyRecord = await db.query.apikey.findFirst({ + where: eq(schema.apikey.id, key.id), + with: { + user: true, + }, + }); + + if (!apiKeyRecord) { + return { + session: null, + user: null, + }; + } + + const organizationId = JSON.parse( + apiKeyRecord.metadata || "{}", + ).organizationId; + + if (!organizationId) { + return { + session: null, + user: null, + }; + } + + const member = await db.query.member.findFirst({ + where: and( + eq(schema.member.userId, apiKeyRecord.user.id), + eq(schema.member.organizationId, organizationId), + ), + with: { + organization: true, + }, + }); + + const { + id, + name, + email, + emailVerified, + image, + createdAt, + updatedAt, + twoFactorEnabled, + } = apiKeyRecord.user; + + const mockSession = { + session: { + user: { + id: apiKeyRecord.user.id, + email: apiKeyRecord.user.email, + name: apiKeyRecord.user.name, + }, + activeOrganizationId: organizationId || "", + }, + user: { + id, + name, + email, + emailVerified, + image, + createdAt, + updatedAt, + twoFactorEnabled, + role: member?.role || "member", + ownerId: member?.organization.ownerId || apiKeyRecord.user.id, + }, + }; + + return mockSession; + } catch (error) { + console.error("Error verifying API key", error); + return { + session: null, + user: null, + }; + } + } + + // If no API key, proceed with normal session validation + const session = await api.getSession({ + headers: new Headers({ + cookie: request.headers.cookie || "", + }), + }); + + if (!session?.session || !session.user) { + return { + session: null, + user: null, + }; + } + + if (session?.user) { + const member = await db.query.member.findFirst({ + where: and( + eq(schema.member.userId, session.user.id), + eq( + schema.member.organizationId, + session.session.activeOrganizationId || "", + ), + ), + with: { + organization: true, + }, + }); + + session.user.role = member?.role || "member"; + if (member) { + session.user.ownerId = member.organization.ownerId; + } else { + session.user.ownerId = session.user.id; + } + } + + return session; +}; diff --git a/packages/server/src/monitoring/utilts.ts b/packages/server/src/monitoring/utils.ts similarity index 52% rename from packages/server/src/monitoring/utilts.ts rename to packages/server/src/monitoring/utils.ts index f67d5705..147ade0a 100644 --- a/packages/server/src/monitoring/utilts.ts +++ b/packages/server/src/monitoring/utils.ts @@ -1,10 +1,19 @@ import { promises } from "node:fs"; -import type Dockerode from "dockerode"; import osUtils from "node-os-utils"; import { paths } from "../constants"; +export interface Container { + BlockIO: string; + CPUPerc: string; + Container: string; + ID: string; + MemPerc: string; + MemUsage: string; + Name: string; + NetIO: string; +} export const recordAdvancedStats = async ( - stats: Dockerode.ContainerStats, + stats: Container, appName: string, ) => { const { MONITORING_PATH } = paths(); @@ -12,29 +21,20 @@ export const recordAdvancedStats = async ( await promises.mkdir(path, { recursive: true }); - const cpuPercent = calculateCpuUsagePercent( - stats.cpu_stats, - stats.precpu_stats, - ); - const memoryStats = calculateMemoryStats(stats.memory_stats); - const blockIO = calculateBlockIO(stats.blkio_stats); - const networkUsage = calculateNetworkUsage(stats.networks); - - await updateStatsFile(appName, "cpu", cpuPercent); + await updateStatsFile(appName, "cpu", stats.CPUPerc); await updateStatsFile(appName, "memory", { - used: memoryStats.used, - free: memoryStats.free, - usedPercentage: memoryStats.usedPercentage, - total: memoryStats.total, + used: stats.MemUsage.split(" ")[0], + total: stats.MemUsage.split(" ")[2], }); + await updateStatsFile(appName, "block", { - readMb: blockIO.readMb, - writeMb: blockIO.writeMb, + readMb: stats.BlockIO.split(" ")[0], + writeMb: stats.BlockIO.split(" ")[2], }); await updateStatsFile(appName, "network", { - inputMb: networkUsage.inputMb, - outputMb: networkUsage.outputMb, + inputMb: stats.NetIO.split(" ")[0], + outputMb: stats.NetIO.split(" ")[2], }); if (appName === "dokploy") { @@ -73,7 +73,7 @@ export const readStatsFile = async ( const filePath = `${MONITORING_PATH}/${appName}/${statType}.json`; const data = await promises.readFile(filePath, "utf-8"); return JSON.parse(data); - } catch (error) { + } catch (_error) { return []; } }; @@ -108,7 +108,7 @@ export const readLastValueStatsFile = async ( const data = await promises.readFile(filePath, "utf-8"); const stats = JSON.parse(data); return stats[stats.length - 1] || null; - } catch (error) { + } catch (_error) { return null; } }; @@ -122,77 +122,3 @@ export const getLastAdvancedStatsFile = async (appName: string) => { block: await readLastValueStatsFile(appName, "block"), }; }; - -const calculateCpuUsagePercent = ( - cpu_stats: Dockerode.ContainerStats["cpu_stats"], - precpu_stats: Dockerode.ContainerStats["precpu_stats"], -) => { - const cpuDelta = - cpu_stats.cpu_usage.total_usage - precpu_stats.cpu_usage.total_usage; - const systemDelta = - cpu_stats.system_cpu_usage - precpu_stats.system_cpu_usage; - - const numberCpus = - cpu_stats.online_cpus || - (cpu_stats.cpu_usage.percpu_usage - ? cpu_stats.cpu_usage.percpu_usage.length - : 1); - - if (systemDelta > 0 && cpuDelta > 0) { - return (cpuDelta / systemDelta) * numberCpus * 100.0; - } - return 0; -}; - -const calculateMemoryStats = ( - memory_stats: Dockerode.ContainerStats["memory_stats"], -) => { - const usedMemory = memory_stats.usage - (memory_stats.stats.cache || 0); - const availableMemory = memory_stats.limit; - const memoryUsedPercentage = (usedMemory / availableMemory) * 100.0; - - return { - used: usedMemory, - free: availableMemory - usedMemory, - usedPercentage: memoryUsedPercentage, - total: availableMemory, - }; -}; -const calculateBlockIO = ( - blkio_stats: Dockerode.ContainerStats["blkio_stats"], -) => { - let readIO = 0; - let writeIO = 0; - if (blkio_stats?.io_service_bytes_recursive) { - for (const io of blkio_stats.io_service_bytes_recursive) { - if (io.op === "read") { - readIO += io.value; - } else if (io.op === "write") { - writeIO += io.value; - } - } - } - return { - readMb: readIO / (1024 * 1024), - writeMb: writeIO / (1024 * 1024), - }; -}; - -const calculateNetworkUsage = ( - networks: Dockerode.ContainerStats["networks"], -) => { - let totalRx = 0; - let totalTx = 0; - - const stats = Object.keys(networks); - - for (const interfaceName of stats) { - const net = networks[interfaceName]; - totalRx += net?.rx_bytes || 0; - totalTx += net?.tx_bytes || 0; - } - return { - inputMb: totalRx / (1024 * 1024), - outputMb: totalTx / (1024 * 1024), - }; -}; diff --git a/packages/server/src/services/admin.ts b/packages/server/src/services/admin.ts index 3502395e..3509868b 100644 --- a/packages/server/src/services/admin.ts +++ b/packages/server/src/services/admin.ts @@ -1,108 +1,56 @@ -import { randomBytes } from "node:crypto"; import { db } from "@dokploy/server/db"; import { - admins, - type apiCreateUserInvitation, - auth, - users, + invitation, + member, + organization, + users_temp, } from "@dokploy/server/db/schema"; import { TRPCError } from "@trpc/server"; -import * as bcrypt from "bcrypt"; import { eq } from "drizzle-orm"; import { IS_CLOUD } from "../constants"; -export type Admin = typeof admins.$inferSelect; -export const createInvitation = async ( - input: typeof apiCreateUserInvitation._type, - adminId: string, -) => { - await db.transaction(async (tx) => { - const result = await tx - .insert(auth) - .values({ - email: input.email.toLowerCase(), - rol: "user", - password: bcrypt.hashSync("01231203012312", 10), - }) - .returning() - .then((res) => res[0]); - - if (!result) { - throw new TRPCError({ - code: "BAD_REQUEST", - message: "Error creating the user", - }); - } - const expiresIn24Hours = new Date(); - expiresIn24Hours.setDate(expiresIn24Hours.getDate() + 1); - const token = randomBytes(32).toString("hex"); - await tx - .insert(users) - .values({ - adminId: adminId, - authId: result.id, - token, - expirationDate: expiresIn24Hours.toISOString(), - }) - .returning(); +export const findUserById = async (userId: string) => { + const user = await db.query.users_temp.findFirst({ + where: eq(users_temp.id, userId), + // with: { + // account: true, + // }, }); -}; - -export const findAdminById = async (adminId: string) => { - const admin = await db.query.admins.findFirst({ - where: eq(admins.adminId, adminId), - }); - if (!admin) { + if (!user) { throw new TRPCError({ code: "NOT_FOUND", - message: "Admin not found", + message: "User not found", }); } - return admin; + return user; }; -export const updateAdmin = async ( - authId: string, - adminData: Partial, -) => { - const admin = await db - .update(admins) - .set({ - ...adminData, - }) - .where(eq(admins.authId, authId)) - .returning() - .then((res) => res[0]); - - return admin; +export const findOrganizationById = async (organizationId: string) => { + const organizationResult = await db.query.organization.findFirst({ + where: eq(organization.id, organizationId), + }); + return organizationResult; }; export const isAdminPresent = async () => { - const admin = await db.query.admins.findFirst(); + const admin = await db.query.member.findFirst({ + where: eq(member.role, "owner"), + }); + if (!admin) { return false; } return true; }; -export const findAdminByAuthId = async (authId: string) => { - const admin = await db.query.admins.findFirst({ - where: eq(admins.authId, authId), +export const findAdmin = async () => { + const admin = await db.query.member.findFirst({ + where: eq(member.role, "owner"), with: { - users: true, + user: true, }, }); - if (!admin) { - throw new TRPCError({ - code: "NOT_FOUND", - message: "Admin not found", - }); - } - return admin; -}; -export const findAdmin = async () => { - const admin = await db.query.admins.findFirst({}); if (!admin) { throw new TRPCError({ code: "NOT_FOUND", @@ -113,14 +61,15 @@ export const findAdmin = async () => { }; export const getUserByToken = async (token: string) => { - const user = await db.query.users.findFirst({ - where: eq(users.token, token), - with: { - auth: { - columns: { - password: false, - }, - }, + const user = await db.query.invitation.findFirst({ + where: eq(invitation.id, token), + columns: { + id: true, + email: true, + status: true, + expiresAt: true, + role: true, + inviterId: true, }, }); @@ -130,34 +79,23 @@ export const getUserByToken = async (token: string) => { message: "Invitation not found", }); } + + const userAlreadyExists = await db.query.users_temp.findFirst({ + where: eq(users_temp.email, user?.email || ""), + }); + + const { expiresAt, ...rest } = user; return { - ...user, - isExpired: user.isRegistered, + ...rest, + isExpired: user.expiresAt < new Date(), + userAlreadyExists: !!userAlreadyExists, }; }; -export const removeUserByAuthId = async (authId: string) => { +export const removeUserById = async (userId: string) => { await db - .delete(auth) - .where(eq(auth.id, authId)) - .returning() - .then((res) => res[0]); -}; - -export const removeAdminByAuthId = async (authId: string) => { - const admin = await findAdminByAuthId(authId); - if (!admin) return null; - - // First delete all associated users - const users = admin.users; - - for (const user of users) { - await removeUserByAuthId(user.authId); - } - // Then delete the auth record which will cascade delete the admin - return await db - .delete(auth) - .where(eq(auth.id, authId)) + .delete(users_temp) + .where(eq(users_temp.id, userId)) .returning() .then((res) => res[0]); }; @@ -168,8 +106,8 @@ export const getDokployUrl = async () => { } const admin = await findAdmin(); - if (admin.host) { - return `https://${admin.host}`; + if (admin.user.host) { + return `https://${admin.user.host}`; } - return `http://${admin.serverIp}:${process.env.PORT}`; + return `http://${admin.user.serverIp}:${process.env.PORT}`; }; diff --git a/packages/server/src/services/application.ts b/packages/server/src/services/application.ts index 8de9b5ba..425a6adb 100644 --- a/packages/server/src/services/application.ts +++ b/packages/server/src/services/application.ts @@ -4,9 +4,8 @@ import { type apiCreateApplication, applications, buildAppName, - cleanAppName, } from "@dokploy/server/db/schema"; -import { getAdvancedStats } from "@dokploy/server/monitoring/utilts"; +import { getAdvancedStats } from "@dokploy/server/monitoring/utils"; import { buildApplication, getBuildCommand, @@ -28,7 +27,6 @@ import { getCustomGitCloneCommand, } from "@dokploy/server/utils/providers/git"; import { - authGithub, cloneGithubRepository, getGithubCloneCommand, } from "@dokploy/server/utils/providers/github"; @@ -175,6 +173,7 @@ export const deployApplication = async ({ descriptionLog: string; }) => { const application = await findApplicationById(applicationId); + const buildLink = `${await getDokployUrl()}/dashboard/project/${application.projectId}/services/application/${application.applicationId}?tab=deployments`; const deployment = await createDeployment({ applicationId: applicationId, @@ -183,6 +182,12 @@ export const deployApplication = async ({ }); try { + // const admin = await findUserById(application.project.userId); + + // if (admin.cleanupCacheApplications) { + // await cleanupFullDocker(application?.serverId); + // } + if (application.sourceType === "github") { await cloneGithubRepository({ ...application, @@ -212,7 +217,7 @@ export const deployApplication = async ({ applicationName: application.name, applicationType: "application", buildLink, - adminId: application.project.adminId, + organizationId: application.project.organizationId, domains: application.domains, }); } catch (error) { @@ -225,7 +230,7 @@ export const deployApplication = async ({ // @ts-ignore errorMessage: error?.message || "Error building", buildLink, - adminId: application.project.adminId, + organizationId: application.project.organizationId, }); throw error; @@ -244,6 +249,7 @@ export const rebuildApplication = async ({ descriptionLog: string; }) => { const application = await findApplicationById(applicationId); + const deployment = await createDeployment({ applicationId: applicationId, title: titleLog, @@ -251,6 +257,11 @@ export const rebuildApplication = async ({ }); try { + // const admin = await findUserById(application.project.userId); + + // if (admin.cleanupCacheApplications) { + // await cleanupFullDocker(application?.serverId); + // } if (application.sourceType === "github") { await buildApplication(application, deployment.logPath); } else if (application.sourceType === "gitlab") { @@ -285,6 +296,7 @@ export const deployRemoteApplication = async ({ descriptionLog: string; }) => { const application = await findApplicationById(applicationId); + const buildLink = `${await getDokployUrl()}/dashboard/project/${application.projectId}/services/application/${application.applicationId}?tab=deployments`; const deployment = await createDeployment({ applicationId: applicationId, @@ -294,6 +306,11 @@ export const deployRemoteApplication = async ({ try { if (application.serverId) { + // const admin = await findUserById(application.project.userId); + + // if (admin.cleanupCacheApplications) { + // await cleanupFullDocker(application?.serverId); + // } let command = "set -e;"; if (application.sourceType === "github") { command += await getGithubCloneCommand({ @@ -332,7 +349,7 @@ export const deployRemoteApplication = async ({ applicationName: application.name, applicationType: "application", buildLink, - adminId: application.project.adminId, + organizationId: application.project.organizationId, domains: application.domains, }); } catch (error) { @@ -356,17 +373,9 @@ export const deployRemoteApplication = async ({ // @ts-ignore errorMessage: error?.message || "Error building", buildLink, - adminId: application.project.adminId, + organizationId: application.project.organizationId, }); - console.log( - "Error on ", - application.buildType, - "/", - application.sourceType, - error, - ); - throw error; } @@ -385,6 +394,7 @@ export const deployPreviewApplication = async ({ previewDeploymentId: string; }) => { const application = await findApplicationById(applicationId); + const deployment = await createDeploymentPreview({ title: titleLog, description: descriptionLog, @@ -438,9 +448,15 @@ export const deployPreviewApplication = async ({ body: `### Dokploy Preview Deployment\n\n${buildingComment}`, }); application.appName = previewDeployment.appName; - application.env = application.previewEnv; + application.env = `${application.previewEnv}\nDOKPLOY_DEPLOY_URL=${previewDeployment?.domain}`; application.buildArgs = application.previewBuildArgs; + // const admin = await findUserById(application.project.userId); + + // if (admin.cleanupCacheOnPreviews) { + // await cleanupFullDocker(application?.serverId); + // } + if (application.sourceType === "github") { await cloneGithubRepository({ ...application, @@ -450,7 +466,6 @@ export const deployPreviewApplication = async ({ }); await buildApplication(application, deployment.logPath); } - // 4eef09efc46009187d668cf1c25f768d0bde4f91 const successComment = getIssueComment( application.name, "success", @@ -492,6 +507,7 @@ export const deployRemotePreviewApplication = async ({ previewDeploymentId: string; }) => { const application = await findApplicationById(applicationId); + const deployment = await createDeploymentPreview({ title: titleLog, description: descriptionLog, @@ -545,14 +561,21 @@ export const deployRemotePreviewApplication = async ({ body: `### Dokploy Preview Deployment\n\n${buildingComment}`, }); application.appName = previewDeployment.appName; - application.env = application.previewEnv; + application.env = `${application.previewEnv}\nDOKPLOY_DEPLOY_URL=${previewDeployment?.domain}`; application.buildArgs = application.previewBuildArgs; if (application.serverId) { + // const admin = await findUserById(application.project.userId); + + // if (admin.cleanupCacheOnPreviews) { + // await cleanupFullDocker(application?.serverId); + // } let command = "set -e;"; if (application.sourceType === "github") { command += await getGithubCloneCommand({ ...application, + appName: previewDeployment.appName, + branch: previewDeployment.branch, serverId: application.serverId, logPath: deployment.logPath, }); @@ -602,6 +625,7 @@ export const rebuildRemoteApplication = async ({ descriptionLog: string; }) => { const application = await findApplicationById(applicationId); + const deployment = await createDeployment({ applicationId: applicationId, title: titleLog, @@ -610,6 +634,11 @@ export const rebuildRemoteApplication = async ({ try { if (application.serverId) { + // const admin = await findUserById(application.project.userId); + + // if (admin.cleanupCacheApplications) { + // await cleanupFullDocker(application?.serverId); + // } if (application.sourceType !== "docker") { let command = "set -e;"; command += getBuildCommand(application, deployment.logPath); diff --git a/packages/server/src/services/auth.ts b/packages/server/src/services/auth.ts deleted file mode 100644 index 65a01c41..00000000 --- a/packages/server/src/services/auth.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { randomBytes } from "node:crypto"; -import { db } from "@dokploy/server/db"; -import { - admins, - type apiCreateAdmin, - type apiCreateUser, - auth, - users, -} from "@dokploy/server/db/schema"; -import { getPublicIpWithFallback } from "@dokploy/server/wss/utils"; -import { TRPCError } from "@trpc/server"; -import * as bcrypt from "bcrypt"; -import { eq } from "drizzle-orm"; -import encode from "hi-base32"; -import { TOTP } from "otpauth"; -import QRCode from "qrcode"; -import { IS_CLOUD } from "../constants"; - -export type Auth = typeof auth.$inferSelect; - -export const createAdmin = async (input: typeof apiCreateAdmin._type) => { - return await db.transaction(async (tx) => { - const hashedPassword = bcrypt.hashSync(input.password, 10); - const newAuth = await tx - .insert(auth) - .values({ - email: input.email.toLowerCase(), - password: hashedPassword, - rol: "admin", - }) - .returning() - .then((res) => res[0]); - - if (!newAuth) { - throw new TRPCError({ - code: "BAD_REQUEST", - message: "Error creating the user", - }); - } - - await tx - .insert(admins) - .values({ - authId: newAuth.id, - ...(!IS_CLOUD && { - serverIp: - process.env.ADVERTISE_ADDR || (await getPublicIpWithFallback()), - }), - }) - .returning(); - - return newAuth; - }); -}; - -export const createUser = async (input: typeof apiCreateUser._type) => { - return await db.transaction(async (tx) => { - const hashedPassword = bcrypt.hashSync(input.password, 10); - const res = await tx - .update(auth) - .set({ - password: hashedPassword, - }) - .where(eq(auth.id, input.id)) - .returning() - .then((res) => res[0]); - - if (!res) { - throw new TRPCError({ - code: "BAD_REQUEST", - message: "Error creating the user", - }); - } - - const user = await tx - .update(users) - .set({ - isRegistered: true, - expirationDate: undefined, - }) - .where(eq(users.token, input.token)) - .returning() - .then((res) => res[0]); - - return user; - }); -}; - -export const findAuthByEmail = async (email: string) => { - const result = await db.query.auth.findFirst({ - where: eq(auth.email, email), - }); - if (!result) { - throw new TRPCError({ - code: "NOT_FOUND", - message: "User not found", - }); - } - return result; -}; - -export const findAuthById = async (authId: string) => { - const result = await db.query.auth.findFirst({ - where: eq(auth.id, authId), - columns: { - password: false, - }, - }); - if (!result) { - throw new TRPCError({ - code: "NOT_FOUND", - message: "Auth not found", - }); - } - return result; -}; - -export const updateAuthById = async ( - authId: string, - authData: Partial, -) => { - const result = await db - .update(auth) - .set({ - ...authData, - }) - .where(eq(auth.id, authId)) - .returning(); - - return result[0]; -}; - -export const generate2FASecret = async (authId: string) => { - const auth = await findAuthById(authId); - - const base32_secret = generateBase32Secret(); - - const totp = new TOTP({ - issuer: "Dokploy", - label: `${auth?.email}`, - algorithm: "SHA1", - digits: 6, - secret: base32_secret, - }); - - const otpauth_url = totp.toString(); - - const qrUrl = await QRCode.toDataURL(otpauth_url); - - return { - qrCodeUrl: qrUrl, - secret: base32_secret, - }; -}; - -export const verify2FA = async ( - auth: Omit, - secret: string, - pin: string, -) => { - const totp = new TOTP({ - issuer: "Dokploy", - label: `${auth?.email}`, - algorithm: "SHA1", - digits: 6, - secret: secret, - }); - - const delta = totp.validate({ token: pin }); - - if (delta === null) { - throw new TRPCError({ - code: "BAD_REQUEST", - message: "Invalid 2FA code", - }); - } - return auth; -}; - -const generateBase32Secret = () => { - const buffer = randomBytes(15); - const base32 = encode.encode(buffer).replace(/=/g, "").substring(0, 24); - return base32; -}; diff --git a/packages/server/src/services/backup.ts b/packages/server/src/services/backup.ts index 70e37af4..32705786 100644 --- a/packages/server/src/services/backup.ts +++ b/packages/server/src/services/backup.ts @@ -6,7 +6,7 @@ import { eq } from "drizzle-orm"; export type Backup = typeof backups.$inferSelect; export type BackupSchedule = Awaited>; - +export type BackupScheduleList = Awaited>; export const createBackup = async (input: typeof apiCreateBackup._type) => { const newBackup = await db .insert(backups) @@ -69,3 +69,20 @@ export const removeBackupById = async (backupId: string) => { return result[0]; }; + +export const findBackupsByDbId = async ( + id: string, + type: "postgres" | "mysql" | "mariadb" | "mongo", +) => { + const result = await db.query.backups.findMany({ + where: eq(backups[`${type}Id`], id), + with: { + postgres: true, + mysql: true, + mariadb: true, + mongo: true, + destination: true, + }, + }); + return result || []; +}; diff --git a/packages/server/src/services/bitbucket.ts b/packages/server/src/services/bitbucket.ts index 21807156..7b5be7d6 100644 --- a/packages/server/src/services/bitbucket.ts +++ b/packages/server/src/services/bitbucket.ts @@ -12,14 +12,14 @@ export type Bitbucket = typeof bitbucket.$inferSelect; export const createBitbucket = async ( input: typeof apiCreateBitbucket._type, - adminId: string, + organizationId: string, ) => { return await db.transaction(async (tx) => { const newGitProvider = await tx .insert(gitProvider) .values({ providerType: "bitbucket", - adminId: adminId, + organizationId: organizationId, name: input.name, }) .returning() @@ -74,12 +74,12 @@ export const updateBitbucket = async ( .where(eq(bitbucket.bitbucketId, bitbucketId)) .returning(); - if (input.name || input.adminId) { + if (input.name || input.organizationId) { await tx .update(gitProvider) .set({ name: input.name, - adminId: input.adminId, + organizationId: input.organizationId, }) .where(eq(gitProvider.gitProviderId, input.gitProviderId)) .returning(); diff --git a/packages/server/src/services/certificate.ts b/packages/server/src/services/certificate.ts index 23177862..f59f1c2a 100644 --- a/packages/server/src/services/certificate.ts +++ b/packages/server/src/services/certificate.ts @@ -33,13 +33,13 @@ export const findCertificateById = async (certificateId: string) => { export const createCertificate = async ( certificateData: z.infer, - adminId: string, + organizationId: string, ) => { const certificate = await db .insert(certificates) .values({ ...certificateData, - adminId: adminId, + organizationId: organizationId, }) .returning(); diff --git a/packages/server/src/services/compose.ts b/packages/server/src/services/compose.ts index 8561dd37..a3ebc26c 100644 --- a/packages/server/src/services/compose.ts +++ b/packages/server/src/services/compose.ts @@ -3,7 +3,6 @@ import { paths } from "@dokploy/server/constants"; import { db } from "@dokploy/server/db"; import { type apiCreateCompose, compose } from "@dokploy/server/db/schema"; import { buildAppName, cleanAppName } from "@dokploy/server/db/schema"; -import { generatePassword } from "@dokploy/server/templates/utils"; import { buildCompose, getBuildComposeCommand, @@ -206,6 +205,7 @@ export const deployCompose = async ({ descriptionLog: string; }) => { const compose = await findComposeById(composeId); + const buildLink = `${await getDokployUrl()}/dashboard/project/${ compose.projectId }/services/compose/${compose.composeId}?tab=deployments`; @@ -216,6 +216,10 @@ export const deployCompose = async ({ }); try { + // const admin = await findUserById(compose.project.userId); + // if (admin.cleanupCacheOnCompose) { + // await cleanupFullDocker(compose?.serverId); + // } if (compose.sourceType === "github") { await cloneGithubRepository({ ...compose, @@ -242,7 +246,7 @@ export const deployCompose = async ({ applicationName: compose.name, applicationType: "compose", buildLink, - adminId: compose.project.adminId, + organizationId: compose.project.organizationId, domains: compose.domains, }); } catch (error) { @@ -257,7 +261,7 @@ export const deployCompose = async ({ // @ts-ignore errorMessage: error?.message || "Error building", buildLink, - adminId: compose.project.adminId, + organizationId: compose.project.organizationId, }); throw error; } @@ -273,6 +277,7 @@ export const rebuildCompose = async ({ descriptionLog: string; }) => { const compose = await findComposeById(composeId); + const deployment = await createDeploymentCompose({ composeId: composeId, title: titleLog, @@ -280,6 +285,10 @@ export const rebuildCompose = async ({ }); try { + // const admin = await findUserById(compose.project.userId); + // if (admin.cleanupCacheOnCompose) { + // await cleanupFullDocker(compose?.serverId); + // } if (compose.serverId) { await getBuildComposeCommand(compose, deployment.logPath); } else { @@ -311,6 +320,7 @@ export const deployRemoteCompose = async ({ descriptionLog: string; }) => { const compose = await findComposeById(composeId); + const buildLink = `${await getDokployUrl()}/dashboard/project/${ compose.projectId }/services/compose/${compose.composeId}?tab=deployments`; @@ -321,6 +331,10 @@ export const deployRemoteCompose = async ({ }); try { if (compose.serverId) { + // const admin = await findUserById(compose.project.userId); + // if (admin.cleanupCacheOnCompose) { + // await cleanupFullDocker(compose?.serverId); + // } let command = "set -e;"; if (compose.sourceType === "github") { @@ -366,7 +380,7 @@ export const deployRemoteCompose = async ({ applicationName: compose.name, applicationType: "compose", buildLink, - adminId: compose.project.adminId, + organizationId: compose.project.organizationId, domains: compose.domains, }); } catch (error) { @@ -391,7 +405,7 @@ export const deployRemoteCompose = async ({ // @ts-ignore errorMessage: error?.message || "Error building", buildLink, - adminId: compose.project.adminId, + organizationId: compose.project.organizationId, }); throw error; } @@ -407,6 +421,7 @@ export const rebuildRemoteCompose = async ({ descriptionLog: string; }) => { const compose = await findComposeById(composeId); + const deployment = await createDeploymentCompose({ composeId: composeId, title: titleLog, @@ -414,6 +429,10 @@ export const rebuildRemoteCompose = async ({ }); try { + // const admin = await findUserById(compose.project.userId); + // if (admin.cleanupCacheOnCompose) { + // await cleanupFullDocker(compose?.serverId); + // } if (compose.serverId) { await getBuildComposeCommand(compose, deployment.logPath); } @@ -538,6 +557,17 @@ export const stopCompose = async (composeId: string) => { } } + if (compose.composeType === "stack") { + if (compose.serverId) { + await execAsyncRemote( + compose.serverId, + `docker stack rm ${compose.appName}`, + ); + } else { + await execAsync(`docker stack rm ${compose.appName}`); + } + } + await updateCompose(composeId, { composeStatus: "idle", }); diff --git a/packages/server/src/services/deployment.ts b/packages/server/src/services/deployment.ts index 0e55ea32..86d6c88e 100644 --- a/packages/server/src/services/deployment.ts +++ b/packages/server/src/services/deployment.ts @@ -12,7 +12,7 @@ import { import { removeDirectoryIfExistsContent } from "@dokploy/server/utils/filesystem/directory"; import { TRPCError } from "@trpc/server"; import { format } from "date-fns"; -import { and, desc, eq, isNull } from "drizzle-orm"; +import { desc, eq } from "drizzle-orm"; import { type Application, findApplicationById, @@ -98,6 +98,17 @@ export const createDeployment = async ( } return deploymentCreate[0]; } catch (error) { + await db + .insert(deployments) + .values({ + applicationId: deployment.applicationId, + title: deployment.title || "Deployment", + status: "error", + logPath: "", + description: deployment.description || "", + errorMessage: `An error have occured: ${error instanceof Error ? error.message : error}`, + }) + .returning(); await updateApplicationStatus(application.applicationId, "error"); console.log(error); throw new TRPCError({ @@ -164,6 +175,17 @@ export const createDeploymentPreview = async ( } return deploymentCreate[0]; } catch (error) { + await db + .insert(deployments) + .values({ + previewDeploymentId: deployment.previewDeploymentId, + title: deployment.title || "Deployment", + status: "error", + logPath: "", + description: deployment.description || "", + errorMessage: `An error have occured: ${error instanceof Error ? error.message : error}`, + }) + .returning(); await updatePreviewDeployment(deployment.previewDeploymentId, { previewStatus: "error", }); @@ -226,6 +248,17 @@ echo "Initializing deployment" >> ${logFilePath}; } return deploymentCreate[0]; } catch (error) { + await db + .insert(deployments) + .values({ + composeId: deployment.composeId, + title: deployment.title || "Deployment", + status: "error", + logPath: "", + description: deployment.description || "", + errorMessage: `An error have occured: ${error instanceof Error ? error.message : error}`, + }) + .returning(); await updateCompose(compose.composeId, { composeStatus: "error", }); @@ -245,9 +278,11 @@ export const removeDeployment = async (deploymentId: string) => { .returning(); return deployment[0]; } catch (error) { + const message = + error instanceof Error ? error.message : "Error creating the deployment"; throw new TRPCError({ code: "BAD_REQUEST", - message: "Error deleting this deployment", + message, }); } }; @@ -502,9 +537,11 @@ export const createServerDeployment = async ( } return deploymentCreate[0]; } catch (error) { + const message = + error instanceof Error ? error.message : "Error creating the deployment"; throw new TRPCError({ code: "BAD_REQUEST", - message: "Error creating the deployment", + message, }); } }; diff --git a/packages/server/src/services/destination.ts b/packages/server/src/services/destination.ts index 892c9354..e66f8695 100644 --- a/packages/server/src/services/destination.ts +++ b/packages/server/src/services/destination.ts @@ -10,13 +10,13 @@ export type Destination = typeof destinations.$inferSelect; export const createDestintation = async ( input: typeof apiCreateDestination._type, - adminId: string, + organizationId: string, ) => { const newDestination = await db .insert(destinations) .values({ ...input, - adminId: adminId, + organizationId: organizationId, }) .returning() .then((value) => value[0]); @@ -46,14 +46,14 @@ export const findDestinationById = async (destinationId: string) => { export const removeDestinationById = async ( destinationId: string, - adminId: string, + organizationId: string, ) => { const result = await db .delete(destinations) .where( and( eq(destinations.destinationId, destinationId), - eq(destinations.adminId, adminId), + eq(destinations.organizationId, organizationId), ), ) .returning(); @@ -73,7 +73,7 @@ export const updateDestinationById = async ( .where( and( eq(destinations.destinationId, destinationId), - eq(destinations.adminId, destinationData.adminId || ""), + eq(destinations.organizationId, destinationData.organizationId || ""), ), ) .returning(); diff --git a/packages/server/src/services/docker.ts b/packages/server/src/services/docker.ts index b7a5c440..a4a3b0b5 100644 --- a/packages/server/src/services/docker.ts +++ b/packages/server/src/services/docker.ts @@ -58,7 +58,11 @@ export const getContainers = async (serverId?: string | null) => { serverId, }; }) - .filter((container) => !container.name.includes("dokploy")); + .filter( + (container) => + !container.name.includes("dokploy") || + container.name.includes("dokploy-monitoring"), + ); return containers; } catch (error) { @@ -94,7 +98,7 @@ export const getConfig = async ( const config = JSON.parse(stdout); return config; - } catch (error) {} + } catch (_error) {} }; export const getContainersByAppNameMatch = async ( @@ -152,7 +156,7 @@ export const getContainersByAppNameMatch = async ( }); return containers || []; - } catch (error) {} + } catch (_error) {} return []; }; @@ -210,7 +214,7 @@ export const getStackContainersByAppName = async ( }); return containers || []; - } catch (error) {} + } catch (_error) {} return []; }; @@ -270,7 +274,7 @@ export const getServiceContainersByAppName = async ( }); return containers || []; - } catch (error) {} + } catch (_error) {} return []; }; @@ -321,7 +325,7 @@ export const getContainersByAppLabel = async ( }); return containers || []; - } catch (error) {} + } catch (_error) {} return []; }; @@ -340,7 +344,7 @@ export const containerRestart = async (containerId: string) => { const config = JSON.parse(stdout); return config; - } catch (error) {} + } catch (_error) {} }; export const getSwarmNodes = async (serverId?: string) => { @@ -369,7 +373,7 @@ export const getSwarmNodes = async (serverId?: string) => { .split("\n") .map((line) => JSON.parse(line)); return nodesArray; - } catch (error) {} + } catch (_error) {} }; export const getNodeInfo = async (nodeId: string, serverId?: string) => { @@ -395,7 +399,7 @@ export const getNodeInfo = async (nodeId: string, serverId?: string) => { const nodeInfo = JSON.parse(stdout); return nodeInfo; - } catch (error) {} + } catch (_error) {} }; export const getNodeApplications = async (serverId?: string) => { @@ -427,7 +431,7 @@ export const getNodeApplications = async (serverId?: string) => { .filter((service) => !service.Name.startsWith("dokploy-")); return appArray; - } catch (error) {} + } catch (_error) {} }; export const getApplicationInfo = async ( @@ -460,5 +464,5 @@ export const getApplicationInfo = async ( .map((line) => JSON.parse(line)); return appArray; - } catch (error) {} + } catch (_error) {} }; diff --git a/packages/server/src/services/domain.ts b/packages/server/src/services/domain.ts index b99c4869..d2e23c06 100644 --- a/packages/server/src/services/domain.ts +++ b/packages/server/src/services/domain.ts @@ -4,7 +4,7 @@ import { manageDomain } from "@dokploy/server/utils/traefik/domain"; import { TRPCError } from "@trpc/server"; import { eq } from "drizzle-orm"; import { type apiCreateDomain, domains } from "../db/schema"; -import { findAdmin, findAdminById } from "./admin"; +import { findUserById } from "./admin"; import { findApplicationById } from "./application"; import { findServerById } from "./server"; @@ -40,7 +40,7 @@ export const createDomain = async (input: typeof apiCreateDomain._type) => { export const generateTraefikMeDomain = async ( appName: string, - adminId: string, + userId: string, serverId?: string, ) => { if (serverId) { @@ -57,7 +57,7 @@ export const generateTraefikMeDomain = async ( projectName: appName, }); } - const admin = await findAdminById(adminId); + const admin = await findUserById(userId); return generateRandomDomain({ serverIp: admin?.serverIp || "", projectName: appName, @@ -126,7 +126,6 @@ export const updateDomainById = async ( export const removeDomainById = async (domainId: string) => { await findDomainById(domainId); - // TODO: fix order const result = await db .delete(domains) .where(eq(domains.domainId, domainId)) diff --git a/packages/server/src/services/github.ts b/packages/server/src/services/github.ts index a5d9d863..19deb2b2 100644 --- a/packages/server/src/services/github.ts +++ b/packages/server/src/services/github.ts @@ -12,14 +12,14 @@ import { updatePreviewDeployment } from "./preview-deployment"; export type Github = typeof github.$inferSelect; export const createGithub = async ( input: typeof apiCreateGithub._type, - adminId: string, + organizationId: string, ) => { return await db.transaction(async (tx) => { const newGitProvider = await tx .insert(gitProvider) .values({ providerType: "github", - adminId: adminId, + organizationId: organizationId, name: input.name, }) .returning() @@ -119,7 +119,7 @@ export const issueCommentExists = async ({ comment_id: comment_id, }); return true; - } catch (error) { + } catch (_error) { return false; } }; diff --git a/packages/server/src/services/gitlab.ts b/packages/server/src/services/gitlab.ts index 8e1362c9..fdca2775 100644 --- a/packages/server/src/services/gitlab.ts +++ b/packages/server/src/services/gitlab.ts @@ -1,9 +1,7 @@ import { db } from "@dokploy/server/db"; import { type apiCreateGitlab, - type bitbucket, gitProvider, - type github, gitlab, } from "@dokploy/server/db/schema"; import { TRPCError } from "@trpc/server"; @@ -13,14 +11,14 @@ export type Gitlab = typeof gitlab.$inferSelect; export const createGitlab = async ( input: typeof apiCreateGitlab._type, - adminId: string, + organizationId: string, ) => { return await db.transaction(async (tx) => { const newGitProvider = await tx .insert(gitProvider) .values({ providerType: "gitlab", - adminId: adminId, + organizationId: organizationId, name: input.name, }) .returning() diff --git a/packages/server/src/services/mariadb.ts b/packages/server/src/services/mariadb.ts index 8257b587..00be29d6 100644 --- a/packages/server/src/services/mariadb.ts +++ b/packages/server/src/services/mariadb.ts @@ -4,7 +4,7 @@ import { backups, mariadb, } from "@dokploy/server/db/schema"; -import { buildAppName, cleanAppName } from "@dokploy/server/db/schema"; +import { buildAppName } from "@dokploy/server/db/schema"; import { generatePassword } from "@dokploy/server/templates/utils"; import { buildMariadb } from "@dokploy/server/utils/databases/mariadb"; import { pullImage } from "@dokploy/server/utils/docker/utils"; diff --git a/packages/server/src/services/mongo.ts b/packages/server/src/services/mongo.ts index 031a6013..0ac4cc63 100644 --- a/packages/server/src/services/mongo.ts +++ b/packages/server/src/services/mongo.ts @@ -1,6 +1,6 @@ import { db } from "@dokploy/server/db"; import { type apiCreateMongo, backups, mongo } from "@dokploy/server/db/schema"; -import { buildAppName, cleanAppName } from "@dokploy/server/db/schema"; +import { buildAppName } from "@dokploy/server/db/schema"; import { generatePassword } from "@dokploy/server/templates/utils"; import { buildMongo } from "@dokploy/server/utils/databases/mongo"; import { pullImage } from "@dokploy/server/utils/docker/utils"; diff --git a/packages/server/src/services/mount.ts b/packages/server/src/services/mount.ts index dd7bd3e9..836feace 100644 --- a/packages/server/src/services/mount.ts +++ b/packages/server/src/services/mount.ts @@ -64,7 +64,7 @@ export const createMount = async (input: typeof apiCreateMount._type) => { console.log(error); throw new TRPCError({ code: "BAD_REQUEST", - message: "Error creating the mount", + message: `Error ${error instanceof Error ? error.message : error}`, cause: error, }); } @@ -91,7 +91,7 @@ export const createFileMount = async (mountId: string) => { console.log(`Error creating the file mount: ${error}`); throw new TRPCError({ code: "BAD_REQUEST", - message: "Error creating the mount", + message: `Error creating the mount ${error instanceof Error ? error.message : error}`, cause: error, }); } @@ -123,8 +123,8 @@ export const updateMount = async ( mountId: string, mountData: Partial, ) => { - return await db.transaction(async (transaction) => { - const mount = await db + return await db.transaction(async (tx) => { + const mount = await tx .update(mounts) .set({ ...mountData, @@ -211,7 +211,7 @@ export const deleteFileMount = async (mountId: string) => { } else { await removeFileOrDirectory(fullPath); } - } catch (error) {} + } catch (_error) {} }; export const getBaseFilesPath = async (mountId: string) => { diff --git a/packages/server/src/services/notification.ts b/packages/server/src/services/notification.ts index 2b62b457..16ba2085 100644 --- a/packages/server/src/services/notification.ts +++ b/packages/server/src/services/notification.ts @@ -24,7 +24,7 @@ export type Notification = typeof notifications.$inferSelect; export const createSlackNotification = async ( input: typeof apiCreateSlack._type, - adminId: string, + organizationId: string, ) => { await db.transaction(async (tx) => { const newSlack = await tx @@ -54,7 +54,8 @@ export const createSlackNotification = async ( dokployRestart: input.dokployRestart, dockerCleanup: input.dockerCleanup, notificationType: "slack", - adminId: adminId, + organizationId: organizationId, + serverThreshold: input.serverThreshold, }) .returning() .then((value) => value[0]); @@ -83,7 +84,8 @@ export const updateSlackNotification = async ( databaseBackup: input.databaseBackup, dokployRestart: input.dokployRestart, dockerCleanup: input.dockerCleanup, - adminId: input.adminId, + organizationId: input.organizationId, + serverThreshold: input.serverThreshold, }) .where(eq(notifications.notificationId, input.notificationId)) .returning() @@ -112,7 +114,7 @@ export const updateSlackNotification = async ( export const createTelegramNotification = async ( input: typeof apiCreateTelegram._type, - adminId: string, + organizationId: string, ) => { await db.transaction(async (tx) => { const newTelegram = await tx @@ -120,6 +122,7 @@ export const createTelegramNotification = async ( .values({ botToken: input.botToken, chatId: input.chatId, + messageThreadId: input.messageThreadId, }) .returning() .then((value) => value[0]); @@ -142,7 +145,8 @@ export const createTelegramNotification = async ( dokployRestart: input.dokployRestart, dockerCleanup: input.dockerCleanup, notificationType: "telegram", - adminId: adminId, + organizationId: organizationId, + serverThreshold: input.serverThreshold, }) .returning() .then((value) => value[0]); @@ -171,7 +175,8 @@ export const updateTelegramNotification = async ( databaseBackup: input.databaseBackup, dokployRestart: input.dokployRestart, dockerCleanup: input.dockerCleanup, - adminId: input.adminId, + organizationId: input.organizationId, + serverThreshold: input.serverThreshold, }) .where(eq(notifications.notificationId, input.notificationId)) .returning() @@ -189,6 +194,7 @@ export const updateTelegramNotification = async ( .set({ botToken: input.botToken, chatId: input.chatId, + messageThreadId: input.messageThreadId, }) .where(eq(telegram.telegramId, input.telegramId)) .returning() @@ -200,7 +206,7 @@ export const updateTelegramNotification = async ( export const createDiscordNotification = async ( input: typeof apiCreateDiscord._type, - adminId: string, + organizationId: string, ) => { await db.transaction(async (tx) => { const newDiscord = await tx @@ -230,7 +236,8 @@ export const createDiscordNotification = async ( dokployRestart: input.dokployRestart, dockerCleanup: input.dockerCleanup, notificationType: "discord", - adminId: adminId, + organizationId: organizationId, + serverThreshold: input.serverThreshold, }) .returning() .then((value) => value[0]); @@ -259,7 +266,8 @@ export const updateDiscordNotification = async ( databaseBackup: input.databaseBackup, dokployRestart: input.dokployRestart, dockerCleanup: input.dockerCleanup, - adminId: input.adminId, + organizationId: input.organizationId, + serverThreshold: input.serverThreshold, }) .where(eq(notifications.notificationId, input.notificationId)) .returning() @@ -288,7 +296,7 @@ export const updateDiscordNotification = async ( export const createEmailNotification = async ( input: typeof apiCreateEmail._type, - adminId: string, + organizationId: string, ) => { await db.transaction(async (tx) => { const newEmail = await tx @@ -322,7 +330,8 @@ export const createEmailNotification = async ( dokployRestart: input.dokployRestart, dockerCleanup: input.dockerCleanup, notificationType: "email", - adminId: adminId, + organizationId: organizationId, + serverThreshold: input.serverThreshold, }) .returning() .then((value) => value[0]); @@ -351,7 +360,8 @@ export const updateEmailNotification = async ( databaseBackup: input.databaseBackup, dokployRestart: input.dokployRestart, dockerCleanup: input.dockerCleanup, - adminId: input.adminId, + organizationId: input.organizationId, + serverThreshold: input.serverThreshold, }) .where(eq(notifications.notificationId, input.notificationId)) .returning() @@ -384,7 +394,7 @@ export const updateEmailNotification = async ( export const createGotifyNotification = async ( input: typeof apiCreateGotify._type, - adminId: string, + organizationId: string, ) => { await db.transaction(async (tx) => { const newGotify = await tx @@ -416,7 +426,7 @@ export const createGotifyNotification = async ( dokployRestart: input.dokployRestart, dockerCleanup: input.dockerCleanup, notificationType: "gotify", - adminId: adminId, + organizationId: organizationId, }) .returning() .then((value) => value[0]); @@ -445,7 +455,7 @@ export const updateGotifyNotification = async ( databaseBackup: input.databaseBackup, dokployRestart: input.dokployRestart, dockerCleanup: input.dockerCleanup, - adminId: input.adminId, + organizationId: input.organizationId, }) .where(eq(notifications.notificationId, input.notificationId)) .returning() diff --git a/packages/server/src/services/postgres.ts b/packages/server/src/services/postgres.ts index 682d3f78..75b81c50 100644 --- a/packages/server/src/services/postgres.ts +++ b/packages/server/src/services/postgres.ts @@ -4,7 +4,7 @@ import { backups, postgres, } from "@dokploy/server/db/schema"; -import { buildAppName, cleanAppName } from "@dokploy/server/db/schema"; +import { buildAppName } from "@dokploy/server/db/schema"; import { generatePassword } from "@dokploy/server/templates/utils"; import { buildPostgres } from "@dokploy/server/utils/databases/postgres"; import { pullImage } from "@dokploy/server/utils/docker/utils"; diff --git a/packages/server/src/services/preview-deployment.ts b/packages/server/src/services/preview-deployment.ts index ab38c17c..a1ffca4b 100644 --- a/packages/server/src/services/preview-deployment.ts +++ b/packages/server/src/services/preview-deployment.ts @@ -2,23 +2,20 @@ import { db } from "@dokploy/server/db"; import { type apiCreatePreviewDeployment, deployments, + organization, previewDeployments, } from "@dokploy/server/db/schema"; import { TRPCError } from "@trpc/server"; import { and, desc, eq } from "drizzle-orm"; -import { slugify } from "../setup/server-setup"; -import { generatePassword, generateRandomDomain } from "../templates/utils"; +import { generatePassword } from "../templates/utils"; import { removeService } from "../utils/docker/utils"; import { removeDirectoryCode } from "../utils/filesystem/directory"; import { authGithub } from "../utils/providers/github"; import { removeTraefikConfig } from "../utils/traefik/application"; import { manageDomain } from "../utils/traefik/domain"; -import { findAdminById } from "./admin"; +import { findUserById } from "./admin"; import { findApplicationById } from "./application"; -import { - removeDeployments, - removeDeploymentsByPreviewDeploymentId, -} from "./deployment"; +import { removeDeploymentsByPreviewDeploymentId } from "./deployment"; import { createDomain } from "./domain"; import { type Github, getIssueComment } from "./github"; @@ -106,13 +103,17 @@ export const removePreviewDeployment = async (previewDeploymentId: string) => { for (const operation of cleanupOperations) { try { await operation(); - } catch (error) {} + } catch (_error) {} } return deployment[0]; } catch (error) { + const message = + error instanceof Error + ? error.message + : "Error deleting this preview deployment"; throw new TRPCError({ code: "BAD_REQUEST", - message: "Error deleting this preview deployment", + message, }); } }; @@ -154,11 +155,14 @@ export const createPreviewDeployment = async ( const application = await findApplicationById(schema.applicationId); const appName = `preview-${application.appName}-${generatePassword(6)}`; + const org = await db.query.organization.findFirst({ + where: eq(organization.id, application.project.organizationId), + }); const generateDomain = await generateWildcardDomain( application.previewWildcard || "*.traefik.me", appName, application.server?.ipAddress || "", - application.project.adminId, + org?.ownerId || "", ); const octokit = authGithub(application?.github as Github); @@ -250,7 +254,7 @@ const generateWildcardDomain = async ( baseDomain: string, appName: string, serverIp: string, - adminId: string, + userId: string, ): Promise => { if (!baseDomain.startsWith("*.")) { throw new Error('The base domain must start with "*."'); @@ -268,7 +272,7 @@ const generateWildcardDomain = async ( } if (!ip) { - const admin = await findAdminById(adminId); + const admin = await findUserById(userId); ip = admin?.serverIp || ""; } diff --git a/packages/server/src/services/project.ts b/packages/server/src/services/project.ts index adaa07ea..b740834b 100644 --- a/packages/server/src/services/project.ts +++ b/packages/server/src/services/project.ts @@ -16,13 +16,13 @@ export type Project = typeof projects.$inferSelect; export const createProject = async ( input: typeof apiCreateProject._type, - adminId: string, + organizationId: string, ) => { const newProject = await db .insert(projects) .values({ ...input, - adminId: adminId, + organizationId: organizationId, }) .returning() .then((value) => value[0]); diff --git a/packages/server/src/services/redirect.ts b/packages/server/src/services/redirect.ts index f16dbe42..1896105f 100644 --- a/packages/server/src/services/redirect.ts +++ b/packages/server/src/services/redirect.ts @@ -6,7 +6,7 @@ import { updateRedirectMiddleware, } from "@dokploy/server/utils/traefik/redirect"; import { TRPCError } from "@trpc/server"; -import { desc, eq } from "drizzle-orm"; +import { eq } from "drizzle-orm"; import type { z } from "zod"; import { findApplicationById } from "./application"; export type Redirect = typeof redirects.$inferSelect; @@ -114,9 +114,11 @@ export const updateRedirectById = async ( return redirect; } catch (error) { + const message = + error instanceof Error ? error.message : "Error updating this redirect"; throw new TRPCError({ code: "BAD_REQUEST", - message: "Error updating this redirect", + message, }); } }; diff --git a/packages/server/src/services/redis.ts b/packages/server/src/services/redis.ts index e0dbbe02..9f4a1f9e 100644 --- a/packages/server/src/services/redis.ts +++ b/packages/server/src/services/redis.ts @@ -1,6 +1,6 @@ import { db } from "@dokploy/server/db"; import { type apiCreateRedis, redis } from "@dokploy/server/db/schema"; -import { buildAppName, cleanAppName } from "@dokploy/server/db/schema"; +import { buildAppName } from "@dokploy/server/db/schema"; import { generatePassword } from "@dokploy/server/templates/utils"; import { buildRedis } from "@dokploy/server/utils/databases/redis"; import { pullImage } from "@dokploy/server/utils/docker/utils"; diff --git a/packages/server/src/services/registry.ts b/packages/server/src/services/registry.ts index 2bcf3a4a..6468cd97 100644 --- a/packages/server/src/services/registry.ts +++ b/packages/server/src/services/registry.ts @@ -12,14 +12,14 @@ export type Registry = typeof registry.$inferSelect; export const createRegistry = async ( input: typeof apiCreateRegistry._type, - adminId: string, + organizationId: string, ) => { return await db.transaction(async (tx) => { const newRegistry = await tx .insert(registry) .values({ ...input, - adminId: adminId, + organizationId: organizationId, }) .returning() .then((value) => value[0]); @@ -112,9 +112,11 @@ export const updateRegistry = async ( return response; } catch (error) { + const message = + error instanceof Error ? error.message : "Error updating this registry"; throw new TRPCError({ code: "BAD_REQUEST", - message: "Error updating this registry", + message, }); } }; @@ -135,9 +137,11 @@ export const findRegistryById = async (registryId: string) => { return registryResponse; }; -export const findAllRegistryByAdminId = async (adminId: string) => { +export const findAllRegistryByOrganizationId = async ( + organizationId: string, +) => { const registryResponse = await db.query.registry.findMany({ - where: eq(registry.adminId, adminId), + where: eq(registry.organizationId, organizationId), }); return registryResponse; }; diff --git a/packages/server/src/services/security.ts b/packages/server/src/services/security.ts index 5efca19f..d6947b88 100644 --- a/packages/server/src/services/security.ts +++ b/packages/server/src/services/security.ts @@ -76,9 +76,11 @@ export const deleteSecurityById = async (securityId: string) => { await removeSecurityMiddleware(application, result); return result; } catch (error) { + const message = + error instanceof Error ? error.message : "Error removing this security"; throw new TRPCError({ code: "BAD_REQUEST", - message: "Error removing this security", + message, }); } }; @@ -98,9 +100,11 @@ export const updateSecurityById = async ( return response[0]; } catch (error) { + const message = + error instanceof Error ? error.message : "Error updating this security"; throw new TRPCError({ code: "BAD_REQUEST", - message: "Error updating this security", + message, }); } }; diff --git a/packages/server/src/services/server.ts b/packages/server/src/services/server.ts index 081b19fa..a4d5c5d8 100644 --- a/packages/server/src/services/server.ts +++ b/packages/server/src/services/server.ts @@ -1,19 +1,24 @@ import { db } from "@dokploy/server/db"; -import { type apiCreateServer, server } from "@dokploy/server/db/schema"; +import { + type apiCreateServer, + organization, + server, +} from "@dokploy/server/db/schema"; import { TRPCError } from "@trpc/server"; -import { desc, eq } from "drizzle-orm"; +import { eq } from "drizzle-orm"; export type Server = typeof server.$inferSelect; export const createServer = async ( input: typeof apiCreateServer._type, - adminId: string, + organizationId: string, ) => { const newServer = await db .insert(server) .values({ ...input, - adminId: adminId, + organizationId: organizationId, + createdAt: new Date().toISOString(), }) .returning() .then((value) => value[0]); @@ -45,12 +50,16 @@ export const findServerById = async (serverId: string) => { return currentServer; }; -export const findServersByAdminId = async (adminId: string) => { - const servers = await db.query.server.findMany({ - where: eq(server.adminId, adminId), - orderBy: desc(server.createdAt), +export const findServersByUserId = async (userId: string) => { + const orgs = await db.query.organization.findMany({ + where: eq(organization.ownerId, userId), + with: { + servers: true, + }, }); + const servers = orgs.flatMap((org) => org.servers); + return servers; }; diff --git a/packages/server/src/services/settings.ts b/packages/server/src/services/settings.ts index 37f7b2ee..75613be0 100644 --- a/packages/server/src/services/settings.ts +++ b/packages/server/src/services/settings.ts @@ -5,7 +5,6 @@ import { execAsync, execAsyncRemote, } from "@dokploy/server/utils/process/execAsync"; -// import packageInfo from "../../../package.json"; export interface IUpdateData { latestVersion: string | null; @@ -170,7 +169,6 @@ echo "$json_output" const result = JSON.parse(stdout); return result; } - const items = readdirSync(dirPath, { withFileTypes: true }); const stack = [dirPath]; const result: TreeDataItem[] = []; @@ -213,3 +211,35 @@ echo "$json_output" } return result; }; + +export const cleanupFullDocker = async (serverId?: string | null) => { + const cleanupImages = "docker image prune --force"; + const cleanupVolumes = "docker volume prune --force"; + const cleanupContainers = "docker container prune --force"; + const cleanupSystem = "docker system prune --force --volumes"; + const cleanupBuilder = "docker builder prune --force"; + + try { + if (serverId) { + await execAsyncRemote( + serverId, + ` + ${cleanupImages} + ${cleanupVolumes} + ${cleanupContainers} + ${cleanupSystem} + ${cleanupBuilder} + `, + ); + } + await execAsync(` + ${cleanupImages} + ${cleanupVolumes} + ${cleanupContainers} + ${cleanupSystem} + ${cleanupBuilder} + `); + } catch (error) { + console.log(error); + } +}; diff --git a/packages/server/src/services/user.ts b/packages/server/src/services/user.ts index d8d9862c..39ac95ce 100644 --- a/packages/server/src/services/user.ts +++ b/packages/server/src/services/user.ts @@ -1,80 +1,53 @@ import { db } from "@dokploy/server/db"; -import { users } from "@dokploy/server/db/schema"; +import { apikey, member, users_temp } from "@dokploy/server/db/schema"; import { TRPCError } from "@trpc/server"; -import { eq } from "drizzle-orm"; +import { and, eq } from "drizzle-orm"; +import { auth } from "../lib/auth"; -export type User = typeof users.$inferSelect; +export type User = typeof users_temp.$inferSelect; -export const findUserById = async (userId: string) => { - const user = await db.query.users.findFirst({ - where: eq(users.userId, userId), - }); - if (!user) { - throw new TRPCError({ - code: "NOT_FOUND", - message: "User not found", - }); - } - return user; -}; - -export const findUserByAuthId = async (authId: string) => { - const user = await db.query.users.findFirst({ - where: eq(users.authId, authId), - with: { - auth: true, - }, - }); - if (!user) { - throw new TRPCError({ - code: "NOT_FOUND", - message: "User not found", - }); - } - return user; -}; - -export const findUsers = async (adminId: string) => { - const currentUsers = await db.query.users.findMany({ - where: eq(users.adminId, adminId), - with: { - auth: { - columns: { - secret: false, - }, - }, - }, - }); - return currentUsers; -}; - -export const addNewProject = async (authId: string, projectId: string) => { - const user = await findUserByAuthId(authId); +export const addNewProject = async ( + userId: string, + projectId: string, + organizationId: string, +) => { + const userR = await findMemberById(userId, organizationId); await db - .update(users) + .update(member) .set({ - accessedProjects: [...user.accessedProjects, projectId], + accessedProjects: [...userR.accessedProjects, projectId], }) - .where(eq(users.authId, authId)); + .where( + and(eq(member.id, userR.id), eq(member.organizationId, organizationId)), + ); }; -export const addNewService = async (authId: string, serviceId: string) => { - const user = await findUserByAuthId(authId); +export const addNewService = async ( + userId: string, + serviceId: string, + organizationId: string, +) => { + const userR = await findMemberById(userId, organizationId); await db - .update(users) + .update(member) .set({ - accessedServices: [...user.accessedServices, serviceId], + accessedServices: [...userR.accessedServices, serviceId], }) - .where(eq(users.authId, authId)); + .where( + and(eq(member.id, userR.id), eq(member.organizationId, organizationId)), + ); }; export const canPerformCreationService = async ( userId: string, projectId: string, + organizationId: string, ) => { - const { accessedProjects, canCreateServices } = - await findUserByAuthId(userId); + const { accessedProjects, canCreateServices } = await findMemberById( + userId, + organizationId, + ); const haveAccessToProject = accessedProjects.includes(projectId); if (canCreateServices && haveAccessToProject) { @@ -87,8 +60,9 @@ export const canPerformCreationService = async ( export const canPerformAccessService = async ( userId: string, serviceId: string, + organizationId: string, ) => { - const { accessedServices } = await findUserByAuthId(userId); + const { accessedServices } = await findMemberById(userId, organizationId); const haveAccessToService = accessedServices.includes(serviceId); if (haveAccessToService) { @@ -99,11 +73,14 @@ export const canPerformAccessService = async ( }; export const canPeformDeleteService = async ( - authId: string, + userId: string, serviceId: string, + organizationId: string, ) => { - const { accessedServices, canDeleteServices } = - await findUserByAuthId(authId); + const { accessedServices, canDeleteServices } = await findMemberById( + userId, + organizationId, + ); const haveAccessToService = accessedServices.includes(serviceId); if (canDeleteServices && haveAccessToService) { @@ -113,8 +90,11 @@ export const canPeformDeleteService = async ( return false; }; -export const canPerformCreationProject = async (authId: string) => { - const { canCreateProjects } = await findUserByAuthId(authId); +export const canPerformCreationProject = async ( + userId: string, + organizationId: string, +) => { + const { canCreateProjects } = await findMemberById(userId, organizationId); if (canCreateProjects) { return true; @@ -123,8 +103,11 @@ export const canPerformCreationProject = async (authId: string) => { return false; }; -export const canPerformDeleteProject = async (authId: string) => { - const { canDeleteProjects } = await findUserByAuthId(authId); +export const canPerformDeleteProject = async ( + userId: string, + organizationId: string, +) => { + const { canDeleteProjects } = await findMemberById(userId, organizationId); if (canDeleteProjects) { return true; @@ -134,10 +117,11 @@ export const canPerformDeleteProject = async (authId: string) => { }; export const canPerformAccessProject = async ( - authId: string, + userId: string, projectId: string, + organizationId: string, ) => { - const { accessedProjects } = await findUserByAuthId(authId); + const { accessedProjects } = await findMemberById(userId, organizationId); const haveAccessToProject = accessedProjects.includes(projectId); @@ -147,26 +131,45 @@ export const canPerformAccessProject = async ( return false; }; -export const canAccessToTraefikFiles = async (authId: string) => { - const { canAccessToTraefikFiles } = await findUserByAuthId(authId); +export const canAccessToTraefikFiles = async ( + userId: string, + organizationId: string, +) => { + const { canAccessToTraefikFiles } = await findMemberById( + userId, + organizationId, + ); return canAccessToTraefikFiles; }; export const checkServiceAccess = async ( - authId: string, + userId: string, serviceId: string, + organizationId: string, action = "access" as "access" | "create" | "delete", ) => { let hasPermission = false; switch (action) { case "create": - hasPermission = await canPerformCreationService(authId, serviceId); + hasPermission = await canPerformCreationService( + userId, + serviceId, + organizationId, + ); break; case "access": - hasPermission = await canPerformAccessService(authId, serviceId); + hasPermission = await canPerformAccessService( + userId, + serviceId, + organizationId, + ); break; case "delete": - hasPermission = await canPeformDeleteService(authId, serviceId); + hasPermission = await canPeformDeleteService( + userId, + serviceId, + organizationId, + ); break; default: hasPermission = false; @@ -182,6 +185,7 @@ export const checkServiceAccess = async ( export const checkProjectAccess = async ( authId: string, action: "create" | "delete" | "access", + organizationId: string, projectId?: string, ) => { let hasPermission = false; @@ -190,13 +194,14 @@ export const checkProjectAccess = async ( hasPermission = await canPerformAccessProject( authId, projectId as string, + organizationId, ); break; case "create": - hasPermission = await canPerformCreationProject(authId); + hasPermission = await canPerformCreationProject(authId, organizationId); break; case "delete": - hasPermission = await canPerformDeleteProject(authId); + hasPermission = await canPerformDeleteProject(authId, organizationId); break; default: hasPermission = false; @@ -208,3 +213,82 @@ export const checkProjectAccess = async ( }); } }; + +export const findMemberById = async ( + userId: string, + organizationId: string, +) => { + const result = await db.query.member.findFirst({ + where: and( + eq(member.userId, userId), + eq(member.organizationId, organizationId), + ), + with: { + user: true, + }, + }); + + if (!result) { + throw new TRPCError({ + code: "UNAUTHORIZED", + message: "Permission denied", + }); + } + return result; +}; + +export const updateUser = async (userId: string, userData: Partial) => { + const user = await db + .update(users_temp) + .set({ + ...userData, + }) + .where(eq(users_temp.id, userId)) + .returning() + .then((res) => res[0]); + + return user; +}; + +export const createApiKey = async ( + userId: string, + input: { + name: string; + prefix?: string; + expiresIn?: number; + metadata: { + organizationId: string; + }; + rateLimitEnabled?: boolean; + rateLimitTimeWindow?: number; + rateLimitMax?: number; + remaining?: number; + refillAmount?: number; + refillInterval?: number; + }, +) => { + const apiKey = await auth.createApiKey({ + body: { + name: input.name, + expiresIn: input.expiresIn, + prefix: input.prefix, + rateLimitEnabled: input.rateLimitEnabled, + rateLimitTimeWindow: input.rateLimitTimeWindow, + rateLimitMax: input.rateLimitMax, + remaining: input.remaining, + refillAmount: input.refillAmount, + refillInterval: input.refillInterval, + userId, + }, + }); + + if (input.metadata) { + await db + .update(apikey) + .set({ + metadata: JSON.stringify(input.metadata), + }) + .where(eq(apikey.id, apiKey.id)); + } + return apiKey; +}; diff --git a/packages/server/src/setup/monitoring-setup.ts b/packages/server/src/setup/monitoring-setup.ts new file mode 100644 index 00000000..75b9a928 --- /dev/null +++ b/packages/server/src/setup/monitoring-setup.ts @@ -0,0 +1,148 @@ +import { findServerById } from "@dokploy/server/services/server"; +import type { ContainerCreateOptions } from "dockerode"; +import { IS_CLOUD } from "../constants"; +import { findUserById } from "../services/admin"; +import { getDokployImageTag } from "../services/settings"; +import { pullImage, pullRemoteImage } from "../utils/docker/utils"; +import { execAsync, execAsyncRemote } from "../utils/process/execAsync"; +import { getRemoteDocker } from "../utils/servers/remote-docker"; + +export const setupMonitoring = async (serverId: string) => { + const server = await findServerById(serverId); + + const containerName = "dokploy-monitoring"; + let imageName = "dokploy/monitoring:latest"; + + if ( + (getDokployImageTag() !== "latest" || + process.env.NODE_ENV === "development") && + !IS_CLOUD + ) { + imageName = "dokploy/monitoring:canary"; + } + + const settings: ContainerCreateOptions = { + name: containerName, + Env: [`METRICS_CONFIG=${JSON.stringify(server?.metricsConfig)}`], + Image: imageName, + HostConfig: { + // Memory: 100 * 1024 * 1024, // 100MB en bytes + // PidMode: "host", + // CapAdd: ["NET_ADMIN", "SYS_ADMIN"], + // Privileged: true, + PortBindings: { + [`${server.metricsConfig.server.port}/tcp`]: [ + { + HostPort: server.metricsConfig.server.port.toString(), + }, + ], + }, + Binds: [ + "/var/run/docker.sock:/var/run/docker.sock:ro", + "/sys:/host/sys:ro", + "/etc/os-release:/etc/os-release:ro", + "/proc:/host/proc:ro", + "/etc/dokploy/monitoring/monitoring.db:/app/monitoring.db", + ], + NetworkMode: "host", + }, + ExposedPorts: { + [`${server.metricsConfig.server.port}/tcp`]: {}, + }, + }; + const docker = await getRemoteDocker(serverId); + try { + await execAsyncRemote( + serverId, + "mkdir -p /etc/dokploy/monitoring && touch /etc/dokploy/monitoring/monitoring.db", + ); + if (serverId) { + await pullRemoteImage(imageName, serverId); + } + + // Check if container exists + const container = docker.getContainer(containerName); + try { + await container.inspect(); + await container.remove({ force: true }); + console.log("Removed existing container"); + } catch (_error) { + // Container doesn't exist, continue + } + + await docker.createContainer(settings); + const newContainer = docker.getContainer(containerName); + await newContainer.start(); + + console.log("Monitoring Started "); + } catch (error) { + console.log("Monitoring Not Found: Starting ", error); + } +}; + +export const setupWebMonitoring = async (userId: string) => { + const user = await findUserById(userId); + + const containerName = "dokploy-monitoring"; + let imageName = "dokploy/monitoring:latest"; + + if ( + (getDokployImageTag() !== "latest" || + process.env.NODE_ENV === "development") && + !IS_CLOUD + ) { + imageName = "dokploy/monitoring:canary"; + } + + const settings: ContainerCreateOptions = { + name: containerName, + Env: [`METRICS_CONFIG=${JSON.stringify(user?.metricsConfig)}`], + Image: imageName, + HostConfig: { + // Memory: 100 * 1024 * 1024, // 100MB en bytes + // PidMode: "host", + // CapAdd: ["NET_ADMIN", "SYS_ADMIN"], + // Privileged: true, + PortBindings: { + [`${user?.metricsConfig?.server?.port}/tcp`]: [ + { + HostPort: user?.metricsConfig?.server?.port.toString(), + }, + ], + }, + Binds: [ + "/var/run/docker.sock:/var/run/docker.sock:ro", + "/sys:/host/sys:ro", + "/etc/os-release:/etc/os-release:ro", + "/proc:/host/proc:ro", + "/etc/dokploy/monitoring/monitoring.db:/app/monitoring.db", + ], + // NetworkMode: "host", + }, + ExposedPorts: { + [`${user?.metricsConfig?.server?.port}/tcp`]: {}, + }, + }; + const docker = await getRemoteDocker(); + try { + await execAsync( + "mkdir -p /etc/dokploy/monitoring && touch /etc/dokploy/monitoring/monitoring.db", + ); + await pullImage(imageName); + + const container = docker.getContainer(containerName); + try { + await container.inspect(); + await container.remove({ force: true }); + console.log("Removed existing container"); + } catch (_error) {} + + await docker.createContainer(settings); + const newContainer = docker.getContainer(containerName); + await newContainer.start(); + + console.log("Monitoring Started "); + } catch (error) { + console.log("Monitoring Not Found: Starting ", error); + } +}; diff --git a/packages/server/src/setup/postgres-setup.ts b/packages/server/src/setup/postgres-setup.ts index b5794c2b..cf162f1e 100644 --- a/packages/server/src/setup/postgres-setup.ts +++ b/packages/server/src/setup/postgres-setup.ts @@ -54,10 +54,16 @@ export const initializePostgres = async () => { version: Number.parseInt(inspect.Version.Index), ...settings, }); - console.log("Postgres Started ✅"); - } catch (error) { - await docker.createService(settings); + } catch (_) { + try { + await docker.createService(settings); + } catch (error: any) { + if (error?.statusCode !== 409) { + throw error; + } + console.log("Postgres service already exists, continuing..."); + } console.log("Postgres Not Found: Starting ✅"); } }; diff --git a/packages/server/src/setup/redis-setup.ts b/packages/server/src/setup/redis-setup.ts index 1c3b545a..7366546d 100644 --- a/packages/server/src/setup/redis-setup.ts +++ b/packages/server/src/setup/redis-setup.ts @@ -52,8 +52,15 @@ export const initializeRedis = async () => { ...settings, }); console.log("Redis Started ✅"); - } catch (error) { - await docker.createService(settings); + } catch (_) { + try { + await docker.createService(settings); + } catch (error: any) { + if (error?.statusCode !== 409) { + throw error; + } + console.log("Redis service already exists, continuing..."); + } console.log("Redis Not Found: Starting ✅"); } }; diff --git a/packages/server/src/setup/server-audit.ts b/packages/server/src/setup/server-audit.ts index df00e9a7..b9283c31 100644 --- a/packages/server/src/setup/server-audit.ts +++ b/packages/server/src/setup/server-audit.ts @@ -89,7 +89,7 @@ export const serverAudit = async (serverId: string) => { .on("data", (data: string) => { output += data; }) - .stderr.on("data", (data) => {}); + .stderr.on("data", (_data) => {}); }); }) .on("error", (err) => { diff --git a/packages/server/src/setup/server-validate.ts b/packages/server/src/setup/server-validate.ts index 4ca21df8..c86206b6 100644 --- a/packages/server/src/setup/server-validate.ts +++ b/packages/server/src/setup/server-validate.ts @@ -128,7 +128,7 @@ export const serverValidate = async (serverId: string) => { .on("data", (data: string) => { output += data; }) - .stderr.on("data", (data) => {}); + .stderr.on("data", (_data) => {}); }); }) .on("error", (err) => { diff --git a/packages/server/src/setup/setup.ts b/packages/server/src/setup/setup.ts index c5987702..eeef32dd 100644 --- a/packages/server/src/setup/setup.ts +++ b/packages/server/src/setup/setup.ts @@ -18,7 +18,7 @@ export const dockerSwarmInitialized = async () => { await docker.swarmInspect(); return true; - } catch (e) { + } catch (_e) { return false; } }; @@ -41,7 +41,7 @@ export const dockerNetworkInitialized = async () => { try { await docker.getNetwork("dokploy-network").inspect(); return true; - } catch (e) { + } catch (_e) { return false; } }; diff --git a/packages/server/src/setup/traefik-setup.ts b/packages/server/src/setup/traefik-setup.ts index 270a4447..e8d01942 100644 --- a/packages/server/src/setup/traefik-setup.ts +++ b/packages/server/src/setup/traefik-setup.ts @@ -68,9 +68,6 @@ export const initializeTraefik = async ({ Replicas: 1, }, }, - Labels: { - "traefik.enable": "true", - }, EndpointSpec: { Ports: [ { @@ -130,8 +127,15 @@ export const initializeTraefik = async ({ }); console.log("Traefik Started ✅"); - } catch (error) { - await docker.createService(settings); + } catch (_) { + try { + await docker.createService(settings); + } catch (error: any) { + if (error?.statusCode !== 409) { + throw error; + } + console.log("Traefik service already exists, continuing..."); + } console.log("Traefik Not Found: Starting ✅"); } }; @@ -189,10 +193,12 @@ export const getDefaultTraefikConfig = () => { : { swarm: { exposedByDefault: false, - watch: false, + watch: true, }, docker: { exposedByDefault: false, + watch: true, + network: "dokploy-network", }, }), file: { @@ -243,10 +249,12 @@ export const getDefaultServerTraefikConfig = () => { providers: { swarm: { exposedByDefault: false, - watch: false, + watch: true, }, docker: { exposedByDefault: false, + watch: true, + network: "dokploy-network", }, file: { directory: "/etc/dokploy/traefik/dynamic", diff --git a/packages/server/src/types/with.ts b/packages/server/src/types/with.ts index c4826f73..467020a2 100644 --- a/packages/server/src/types/with.ts +++ b/packages/server/src/types/with.ts @@ -36,7 +36,7 @@ type AnyObj = Record; type ZodObj = { [key in keyof T]: z.ZodType; }; -const zObject = (arg: ZodObj) => z.object(arg); +const _zObject = (arg: ZodObj) => z.object(arg); // const goodDogScheme = zObject({ // // prueba: schema.selectDatabaseSchema, diff --git a/packages/server/src/utils/access-log/handler.ts b/packages/server/src/utils/access-log/handler.ts index b1fd925c..69d0cc68 100644 --- a/packages/server/src/utils/access-log/handler.ts +++ b/packages/server/src/utils/access-log/handler.ts @@ -1,8 +1,8 @@ import { IS_CLOUD, paths } from "@dokploy/server/constants"; -import { updateAdmin } from "@dokploy/server/services/admin"; import { type RotatingFileStream, createStream } from "rotating-file-stream"; -import { db } from "../../db"; import { execAsync } from "../process/execAsync"; +import { findAdmin } from "@dokploy/server/services/admin"; +import { updateUser } from "@dokploy/server/services/user"; class LogRotationManager { private static instance: LogRotationManager; @@ -30,17 +30,16 @@ class LogRotationManager { } private async getStateFromDB(): Promise { - const setting = await db.query.admins.findFirst({}); - return setting?.enableLogRotation ?? false; + const admin = await findAdmin(); + return admin?.user.enableLogRotation ?? false; } private async setStateInDB(active: boolean): Promise { - const admin = await db.query.admins.findFirst({}); - + const admin = await findAdmin(); if (!admin) { return; } - await updateAdmin(admin?.authId, { + await updateUser(admin.user.id, { enableLogRotation: active, }); } diff --git a/packages/server/src/utils/backups/index.ts b/packages/server/src/utils/backups/index.ts index 922232a0..7699a42e 100644 --- a/packages/server/src/utils/backups/index.ts +++ b/packages/server/src/utils/backups/index.ts @@ -1,4 +1,3 @@ -import { findAdmin } from "@dokploy/server/services/admin"; import { getAllServers } from "@dokploy/server/services/server"; import { scheduleJob } from "node-schedule"; import { db } from "../../db/index"; @@ -12,13 +11,14 @@ import { runMariadbBackup } from "./mariadb"; import { runMongoBackup } from "./mongo"; import { runMySqlBackup } from "./mysql"; import { runPostgresBackup } from "./postgres"; +import { findAdmin } from "../../services/admin"; export const initCronJobs = async () => { console.log("Setting up cron jobs...."); const admin = await findAdmin(); - if (admin?.enableDockerCleanup) { + if (admin?.user.enableDockerCleanup) { scheduleJob("docker-cleanup", "0 0 * * *", async () => { console.log( `Docker Cleanup ${new Date().toLocaleString()}] Running docker cleanup`, @@ -26,7 +26,7 @@ export const initCronJobs = async () => { await cleanUpUnusedImages(); await cleanUpDockerBuilder(); await cleanUpSystemPrune(); - await sendDockerCleanupNotifications(admin.adminId); + await sendDockerCleanupNotifications(admin.user.id); }); } @@ -43,7 +43,7 @@ export const initCronJobs = async () => { await cleanUpDockerBuilder(serverId); await cleanUpSystemPrune(serverId); await sendDockerCleanupNotifications( - admin.adminId, + admin.user.id, `Docker cleanup for Server ${name} (${serverId})`, ); }); diff --git a/packages/server/src/utils/backups/mariadb.ts b/packages/server/src/utils/backups/mariadb.ts index 79cba9c5..56c2919c 100644 --- a/packages/server/src/utils/backups/mariadb.ts +++ b/packages/server/src/utils/backups/mariadb.ts @@ -49,7 +49,7 @@ export const runMariadbBackup = async ( projectName: project.name, databaseType: "mariadb", type: "success", - adminId: project.adminId, + organizationId: project.organizationId, }); } catch (error) { console.log(error); @@ -60,7 +60,7 @@ export const runMariadbBackup = async ( type: "error", // @ts-ignore errorMessage: error?.message || "Error message not provided", - adminId: project.adminId, + organizationId: project.organizationId, }); throw error; } diff --git a/packages/server/src/utils/backups/mongo.ts b/packages/server/src/utils/backups/mongo.ts index ddd1b889..a40ec4f4 100644 --- a/packages/server/src/utils/backups/mongo.ts +++ b/packages/server/src/utils/backups/mongo.ts @@ -46,7 +46,7 @@ export const runMongoBackup = async (mongo: Mongo, backup: BackupSchedule) => { projectName: project.name, databaseType: "mongodb", type: "success", - adminId: project.adminId, + organizationId: project.organizationId, }); } catch (error) { console.log(error); @@ -57,7 +57,7 @@ export const runMongoBackup = async (mongo: Mongo, backup: BackupSchedule) => { type: "error", // @ts-ignore errorMessage: error?.message || "Error message not provided", - adminId: project.adminId, + organizationId: project.organizationId, }); throw error; } diff --git a/packages/server/src/utils/backups/mysql.ts b/packages/server/src/utils/backups/mysql.ts index b505204c..1272fc3e 100644 --- a/packages/server/src/utils/backups/mysql.ts +++ b/packages/server/src/utils/backups/mysql.ts @@ -1,4 +1,3 @@ -import { unlink } from "node:fs/promises"; import path from "node:path"; import type { BackupSchedule } from "@dokploy/server/services/backup"; import type { MySql } from "@dokploy/server/services/mysql"; @@ -46,7 +45,7 @@ export const runMySqlBackup = async (mysql: MySql, backup: BackupSchedule) => { projectName: project.name, databaseType: "mysql", type: "success", - adminId: project.adminId, + organizationId: project.organizationId, }); } catch (error) { console.log(error); @@ -57,7 +56,7 @@ export const runMySqlBackup = async (mysql: MySql, backup: BackupSchedule) => { type: "error", // @ts-ignore errorMessage: error?.message || "Error message not provided", - adminId: project.adminId, + organizationId: project.organizationId, }); throw error; } diff --git a/packages/server/src/utils/backups/postgres.ts b/packages/server/src/utils/backups/postgres.ts index e9609fc8..5ada2aa9 100644 --- a/packages/server/src/utils/backups/postgres.ts +++ b/packages/server/src/utils/backups/postgres.ts @@ -49,7 +49,7 @@ export const runPostgresBackup = async ( projectName: project.name, databaseType: "postgres", type: "success", - adminId: project.adminId, + organizationId: project.organizationId, }); } catch (error) { await sendDatabaseBackupNotifications({ @@ -59,7 +59,7 @@ export const runPostgresBackup = async ( type: "error", // @ts-ignore errorMessage: error?.message || "Error message not provided", - adminId: project.adminId, + organizationId: project.organizationId, }); throw error; diff --git a/packages/server/src/utils/backups/utils.ts b/packages/server/src/utils/backups/utils.ts index 0d78ff96..c76f7962 100644 --- a/packages/server/src/utils/backups/utils.ts +++ b/packages/server/src/utils/backups/utils.ts @@ -28,7 +28,7 @@ export const removeScheduleBackup = (backupId: string) => { }; export const getS3Credentials = (destination: Destination) => { - const { accessKey, secretAccessKey, bucket, region, endpoint, provider } = + const { accessKey, secretAccessKey, region, endpoint, provider } = destination; const rcloneFlags = [ `--s3-access-key-id=${accessKey}`, diff --git a/packages/server/src/utils/builders/compose.ts b/packages/server/src/utils/builders/compose.ts index ae181fc3..19e7d152 100644 --- a/packages/server/src/utils/builders/compose.ts +++ b/packages/server/src/utils/builders/compose.ts @@ -12,8 +12,12 @@ import { writeDomainsToCompose, writeDomainsToComposeRemote, } from "../docker/domain"; -import { encodeBase64, prepareEnvironmentVariables } from "../docker/utils"; -import { execAsyncRemote } from "../process/execAsync"; +import { + encodeBase64, + getEnviromentVariablesObject, + prepareEnvironmentVariables, +} from "../docker/utils"; +import { execAsync, execAsyncRemote } from "../process/execAsync"; import { spawnAsync } from "../process/spawnAsync"; export type ComposeNested = InferResultType< @@ -29,13 +33,19 @@ export const buildCompose = async (compose: ComposeNested, logPath: string) => { await writeDomainsToCompose(compose, domains); createEnvFile(compose); + if (compose.isolatedDeployment) { + await execAsync( + `docker network inspect ${compose.appName} >/dev/null 2>&1 || docker network create --attachable ${compose.appName}`, + ); + } + const logContent = ` -App Name: ${appName} -Build Compose 🐳 -Detected: ${mounts.length} mounts 📂 -Command: docker ${command} -Source Type: docker ${sourceType} ✅ -Compose Type: ${composeType} ✅`; + App Name: ${appName} + Build Compose 🐳 + Detected: ${mounts.length} mounts 📂 + Command: docker ${command} + Source Type: docker ${sourceType} ✅ + Compose Type: ${composeType} ✅`; const logBox = boxen(logContent, { padding: { left: 1, @@ -46,7 +56,6 @@ Compose Type: ${composeType} ✅`; borderStyle: "double", }); writeStream.write(`\n${logBox}\n`); - const projectPath = join(COMPOSE_PATH, compose.appName, "code"); await spawnAsync( @@ -62,10 +71,19 @@ Compose Type: ${composeType} ✅`; env: { NODE_ENV: process.env.NODE_ENV, PATH: process.env.PATH, + ...(composeType === "stack" && { + ...getEnviromentVariablesObject(compose.env, compose.project.env), + }), }, }, ); + if (compose.isolatedDeployment) { + await execAsync( + `docker network connect ${compose.appName} $(docker ps --filter "name=dokploy-traefik" -q) >/dev/null 2>&1`, + ).catch(() => {}); + } + writeStream.write("Docker Compose Deployed: ✅"); } catch (error) { writeStream.write(`Error ❌ ${(error as Error).message}`); @@ -80,11 +98,11 @@ export const getBuildComposeCommand = async ( logPath: string, ) => { const { COMPOSE_PATH } = paths(true); - const { sourceType, appName, mounts, composeType, domains, composePath } = - compose; + const { sourceType, appName, mounts, composeType, domains } = compose; const command = createCommand(compose); const envCommand = getCreateEnvFileCommand(compose); const projectPath = join(COMPOSE_PATH, compose.appName, "code"); + const exportEnvCommand = getExportEnvCommand(compose); const newCompose = await writeDomainsToComposeRemote( compose, @@ -120,7 +138,10 @@ Compose Type: ${composeType} ✅`; cd "${projectPath}"; + ${exportEnvCommand} + ${compose.isolatedDeployment ? `docker network inspect ${compose.appName} >/dev/null 2>&1 || docker network create --attachable ${compose.appName}` : ""} docker ${command.split(" ").join(" ")} >> "${logPath}" 2>&1 || { echo "Error: ❌ Docker command failed" >> "${logPath}"; exit 1; } + ${compose.isolatedDeployment ? `docker network connect ${compose.appName} $(docker ps --filter "name=dokploy-traefik" -q) >/dev/null 2>&1` : ""} echo "Docker Compose Deployed: ✅" >> "${logPath}" } || { @@ -144,7 +165,6 @@ const sanitizeCommand = (command: string) => { export const createCommand = (compose: ComposeNested) => { const { composeType, appName, sourceType } = compose; - if (compose.command) { return `${sanitizeCommand(compose.command)}`; } @@ -219,3 +239,17 @@ touch ${envFilePath}; echo "${encodedContent}" | base64 -d > "${envFilePath}"; `; }; + +const getExportEnvCommand = (compose: ComposeNested) => { + if (compose.composeType !== "stack") return ""; + + const envVars = getEnviromentVariablesObject( + compose.env, + compose.project.env, + ); + const exports = Object.entries(envVars) + .map(([key, value]) => `export ${key}=${JSON.stringify(value)}`) + .join("\n"); + + return exports ? `\n# Export environment variables\n${exports}\n` : ""; +}; diff --git a/packages/server/src/utils/builders/index.ts b/packages/server/src/utils/builders/index.ts index d6748275..d777b1a3 100644 --- a/packages/server/src/utils/builders/index.ts +++ b/packages/server/src/utils/builders/index.ts @@ -197,7 +197,7 @@ export const mechanizeDockerContainer = async ( ForceUpdate: inspect.Spec.TaskTemplate.ForceUpdate + 1, }, }); - } catch (error) { + } catch (_error) { await docker.createService(settings); } }; diff --git a/packages/server/src/utils/builders/nixpacks.ts b/packages/server/src/utils/builders/nixpacks.ts index 56560e4e..c13f82a5 100644 --- a/packages/server/src/utils/builders/nixpacks.ts +++ b/packages/server/src/utils/builders/nixpacks.ts @@ -91,7 +91,7 @@ export const getNixpacksCommand = ( application: ApplicationNested, logPath: string, ) => { - const { env, appName, publishDirectory, serverId } = application; + const { env, appName, publishDirectory } = application; const buildAppDirectory = getBuildAppDirectory(application); const buildContainerId = `${appName}-${nanoid(10)}`; diff --git a/packages/server/src/utils/databases/mariadb.ts b/packages/server/src/utils/databases/mariadb.ts index d1b41fc3..ead5a618 100644 --- a/packages/server/src/utils/databases/mariadb.ts +++ b/packages/server/src/utils/databases/mariadb.ts @@ -98,7 +98,7 @@ export const buildMariadb = async (mariadb: MariadbNested) => { version: Number.parseInt(inspect.Version.Index), ...settings, }); - } catch (error) { + } catch (_error) { await docker.createService(settings); } }; diff --git a/packages/server/src/utils/databases/mongo.ts b/packages/server/src/utils/databases/mongo.ts index 5af58eef..ace9c972 100644 --- a/packages/server/src/utils/databases/mongo.ts +++ b/packages/server/src/utils/databases/mongo.ts @@ -152,7 +152,7 @@ ${command ?? "wait $MONGOD_PID"}`; version: Number.parseInt(inspect.Version.Index), ...settings, }); - } catch (error) { + } catch (_error) { await docker.createService(settings); } }; diff --git a/packages/server/src/utils/databases/mysql.ts b/packages/server/src/utils/databases/mysql.ts index 5a691177..de28cfe6 100644 --- a/packages/server/src/utils/databases/mysql.ts +++ b/packages/server/src/utils/databases/mysql.ts @@ -104,7 +104,7 @@ export const buildMysql = async (mysql: MysqlNested) => { version: Number.parseInt(inspect.Version.Index), ...settings, }); - } catch (error) { + } catch (_error) { await docker.createService(settings); } }; diff --git a/packages/server/src/utils/databases/redis.ts b/packages/server/src/utils/databases/redis.ts index 724069a1..aef86280 100644 --- a/packages/server/src/utils/databases/redis.ts +++ b/packages/server/src/utils/databases/redis.ts @@ -95,7 +95,7 @@ export const buildRedis = async (redis: RedisNested) => { version: Number.parseInt(inspect.Version.Index), ...settings, }); - } catch (error) { + } catch (_error) { await docker.createService(settings); } }; diff --git a/packages/server/src/utils/docker/collision.ts b/packages/server/src/utils/docker/collision.ts new file mode 100644 index 00000000..d3f131c6 --- /dev/null +++ b/packages/server/src/utils/docker/collision.ts @@ -0,0 +1,46 @@ +import { findComposeById } from "@dokploy/server/services/compose"; +import { dump, load } from "js-yaml"; +import { addAppNameToAllServiceNames } from "./collision/root-network"; +import { generateRandomHash } from "./compose"; +import { addSuffixToAllVolumes } from "./compose/volume"; +import type { ComposeSpecification } from "./types"; + +export const addAppNameToPreventCollision = ( + composeData: ComposeSpecification, + appName: string, +): ComposeSpecification => { + let updatedComposeData = { ...composeData }; + + updatedComposeData = addAppNameToAllServiceNames(updatedComposeData, appName); + updatedComposeData = addSuffixToAllVolumes(updatedComposeData, appName); + return updatedComposeData; +}; + +export const randomizeIsolatedDeploymentComposeFile = async ( + composeId: string, + suffix?: string, +) => { + const compose = await findComposeById(composeId); + const composeFile = compose.composeFile; + const composeData = load(composeFile) as ComposeSpecification; + + const randomSuffix = suffix || compose.appName || generateRandomHash(); + + const newComposeFile = addAppNameToPreventCollision( + composeData, + randomSuffix, + ); + + return dump(newComposeFile); +}; + +export const randomizeDeployableSpecificationFile = ( + composeSpec: ComposeSpecification, + suffix?: string, +) => { + if (!suffix) { + return composeSpec; + } + const newComposeFile = addAppNameToPreventCollision(composeSpec, suffix); + return newComposeFile; +}; diff --git a/packages/server/src/utils/docker/collision/root-network.ts b/packages/server/src/utils/docker/collision/root-network.ts new file mode 100644 index 00000000..ed36d4bd --- /dev/null +++ b/packages/server/src/utils/docker/collision/root-network.ts @@ -0,0 +1,62 @@ +import _ from "lodash"; +import type { ComposeSpecification, DefinitionsService } from "../types"; + +export const addAppNameToRootNetwork = ( + composeData: ComposeSpecification, + appName: string, +): ComposeSpecification => { + const updatedComposeData = { ...composeData }; + + // Initialize networks if it doesn't exist + if (!updatedComposeData.networks) { + updatedComposeData.networks = {}; + } + + // Add the new network with the app name + updatedComposeData.networks[appName] = { + name: appName, + external: true, + }; + + return updatedComposeData; +}; + +export const addAppNameToServiceNetworks = ( + services: { [key: string]: DefinitionsService }, + appName: string, +): { [key: string]: DefinitionsService } => { + return _.mapValues(services, (service) => { + if (!service.networks) { + service.networks = [appName]; + return service; + } + + if (Array.isArray(service.networks)) { + if (!service.networks.includes(appName)) { + service.networks.push(appName); + } + } else { + service.networks[appName] = {}; + } + + return service; + }); +}; + +export const addAppNameToAllServiceNames = ( + composeData: ComposeSpecification, + appName: string, +): ComposeSpecification => { + let updatedComposeData = { ...composeData }; + + updatedComposeData = addAppNameToRootNetwork(updatedComposeData, appName); + + if (updatedComposeData.services) { + updatedComposeData.services = addAppNameToServiceNetworks( + updatedComposeData.services, + appName, + ); + } + + return updatedComposeData; +}; diff --git a/packages/server/src/utils/docker/domain.ts b/packages/server/src/utils/docker/domain.ts index 69bfa222..c4ced3f4 100644 --- a/packages/server/src/utils/docker/domain.ts +++ b/packages/server/src/utils/docker/domain.ts @@ -26,6 +26,7 @@ import { createComposeFileRaw, createComposeFileRawRemote, } from "../providers/raw"; +import { randomizeDeployableSpecificationFile } from "./collision"; import { randomizeSpecificationFile } from "./compose"; import type { ComposeSpecification, @@ -108,7 +109,7 @@ export const loadDockerComposeRemote = async ( if (!stdout) return null; const parsedConfig = load(stdout) as ComposeSpecification; return parsedConfig; - } catch (err) { + } catch (_err) { return null; } }; @@ -190,7 +191,13 @@ export const addDomainToCompose = async ( return null; } - if (compose.randomize) { + if (compose.isolatedDeployment) { + const randomized = randomizeDeployableSpecificationFile( + result, + compose.suffix || compose.appName, + ); + result = randomized; + } else if (compose.randomize) { const randomized = randomizeSpecificationFile(result, compose.suffix); result = randomized; } @@ -203,9 +210,6 @@ export const addDomainToCompose = async ( if (!result?.services?.[serviceName]) { throw new Error(`The service ${serviceName} not found in the compose`); } - if (!result.services[serviceName].labels) { - result.services[serviceName].labels = []; - } const httpLabels = await createDomainLabels(appName, domain, "web"); if (https) { @@ -217,7 +221,24 @@ export const addDomainToCompose = async ( httpLabels.push(...httpsLabels); } - const labels = result.services[serviceName].labels; + let labels: DefinitionsService["labels"] = []; + if (compose.composeType === "docker-compose") { + if (!result.services[serviceName].labels) { + result.services[serviceName].labels = []; + } + + labels = result.services[serviceName].labels; + } else { + // Stack Case + if (!result.services[serviceName].deploy) { + result.services[serviceName].deploy = {}; + } + if (!result.services[serviceName].deploy.labels) { + result.services[serviceName].deploy.labels = []; + } + + labels = result.services[serviceName].deploy.labels; + } if (Array.isArray(labels)) { if (!labels.includes("traefik.enable=true")) { @@ -226,14 +247,18 @@ export const addDomainToCompose = async ( labels.push(...httpLabels); } - // Add the dokploy-network to the service - result.services[serviceName].networks = addDokployNetworkToService( - result.services[serviceName].networks, - ); + if (!compose.isolatedDeployment) { + // Add the dokploy-network to the service + result.services[serviceName].networks = addDokployNetworkToService( + result.services[serviceName].networks, + ); + } } // Add dokploy-network to the root of the compose file - result.networks = addDokployNetworkToRoot(result.networks); + if (!compose.isolatedDeployment) { + result.networks = addDokployNetworkToRoot(result.networks); + } return result; }; diff --git a/packages/server/src/utils/docker/utils.ts b/packages/server/src/utils/docker/utils.ts index 654d8330..71b7e4aa 100644 --- a/packages/server/src/utils/docker/utils.ts +++ b/packages/server/src/utils/docker/utils.ts @@ -100,7 +100,7 @@ export const containerExists = async (containerName: string) => { try { await container.inspect(); return true; - } catch (error) { + } catch (_error) { return false; } }; @@ -144,10 +144,11 @@ export const getContainerByName = (name: string): Promise => { }; export const cleanUpUnusedImages = async (serverId?: string) => { try { + const command = "docker image prune --force"; if (serverId) { - await execAsyncRemote(serverId, "docker image prune --all --force"); + await execAsyncRemote(serverId, command); } else { - await execAsync("docker image prune --all --force"); + await execAsync(command); } } catch (error) { console.error(error); @@ -157,10 +158,11 @@ export const cleanUpUnusedImages = async (serverId?: string) => { export const cleanStoppedContainers = async (serverId?: string) => { try { + const command = "docker container prune --force"; if (serverId) { - await execAsyncRemote(serverId, "docker container prune --force"); + await execAsyncRemote(serverId, command); } else { - await execAsync("docker container prune --force"); + await execAsync(command); } } catch (error) { console.error(error); @@ -170,10 +172,11 @@ export const cleanStoppedContainers = async (serverId?: string) => { export const cleanUpUnusedVolumes = async (serverId?: string) => { try { + const command = "docker volume prune --force"; if (serverId) { - await execAsyncRemote(serverId, "docker volume prune --all --force"); + await execAsyncRemote(serverId, command); } else { - await execAsync("docker volume prune --all --force"); + await execAsync(command); } } catch (error) { console.error(error); @@ -199,21 +202,20 @@ export const cleanUpInactiveContainers = async () => { }; export const cleanUpDockerBuilder = async (serverId?: string) => { + const command = "docker builder prune --all --force"; if (serverId) { - await execAsyncRemote(serverId, "docker builder prune --all --force"); + await execAsyncRemote(serverId, command); } else { - await execAsync("docker builder prune --all --force"); + await execAsync(command); } }; export const cleanUpSystemPrune = async (serverId?: string) => { + const command = "docker system prune --all --force --volumes"; if (serverId) { - await execAsyncRemote( - serverId, - "docker system prune --all --force --volumes", - ); + await execAsyncRemote(serverId, command); } else { - await execAsync("docker system prune --all --force --volumes"); + await execAsync(command); } }; @@ -238,7 +240,7 @@ export const startServiceRemote = async (serverId: string, appName: string) => { export const removeService = async ( appName: string, serverId?: string | null, - deleteVolumes = false, + _deleteVolumes = false, ) => { try { const command = `docker service rm ${appName}`; @@ -276,12 +278,15 @@ export const prepareEnvironmentVariables = ( return resolvedVars; }; -export const prepareBuildArgs = (input: string | null) => { - const pairs = (input ?? "").split("\n"); +export const getEnviromentVariablesObject = ( + input: string | null, + projectEnv?: string | null, +) => { + const envs = prepareEnvironmentVariables(input, projectEnv); const jsonObject: Record = {}; - for (const pair of pairs) { + for (const pair of envs) { const [key, value] = pair.split("="); if (key && value) { jsonObject[key] = value; diff --git a/packages/server/src/utils/gpu-setup.ts b/packages/server/src/utils/gpu-setup.ts index 6a6611b4..a815a00c 100644 --- a/packages/server/src/utils/gpu-setup.ts +++ b/packages/server/src/utils/gpu-setup.ts @@ -34,7 +34,7 @@ export async function checkGPUStatus(serverId?: string): Promise { ...gpuInfo, ...cudaInfo, }; - } catch (error) { + } catch (_error) { return { driverInstalled: false, driverVersion: undefined, @@ -315,7 +315,7 @@ const setupLocalServer = async (daemonConfig: any) => { try { await execAsync(setupCommands); - } catch (error) { + } catch (_error) { throw new Error( "Failed to configure GPU support. Please ensure you have sudo privileges and try again.", ); diff --git a/packages/server/src/utils/notifications/build-error.ts b/packages/server/src/utils/notifications/build-error.ts index 95936652..c873c9ab 100644 --- a/packages/server/src/utils/notifications/build-error.ts +++ b/packages/server/src/utils/notifications/build-error.ts @@ -18,7 +18,7 @@ interface Props { applicationType: string; errorMessage: string; buildLink: string; - adminId: string; + organizationId: string; } export const sendBuildErrorNotifications = async ({ @@ -27,14 +27,14 @@ export const sendBuildErrorNotifications = async ({ applicationType, errorMessage, buildLink, - adminId, + organizationId, }: Props) => { const date = new Date(); const unixDate = ~~(Number(date) / 1000); const notificationList = await db.query.notifications.findMany({ where: and( eq(notifications.appBuildError, true), - eq(notifications.adminId, adminId), + eq(notifications.organizationId, organizationId), ), with: { email: true, diff --git a/packages/server/src/utils/notifications/build-success.ts b/packages/server/src/utils/notifications/build-success.ts index 960f7a6a..ac470c49 100644 --- a/packages/server/src/utils/notifications/build-success.ts +++ b/packages/server/src/utils/notifications/build-success.ts @@ -18,7 +18,7 @@ interface Props { applicationName: string; applicationType: string; buildLink: string; - adminId: string; + organizationId: string; domains: Domain[]; } @@ -27,7 +27,7 @@ export const sendBuildSuccessNotifications = async ({ applicationName, applicationType, buildLink, - adminId, + organizationId, domains, }: Props) => { const date = new Date(); @@ -35,7 +35,7 @@ export const sendBuildSuccessNotifications = async ({ const notificationList = await db.query.notifications.findMany({ where: and( eq(notifications.appDeploy, true), - eq(notifications.adminId, adminId), + eq(notifications.organizationId, organizationId), ), with: { email: true, diff --git a/packages/server/src/utils/notifications/database-backup.ts b/packages/server/src/utils/notifications/database-backup.ts index 0b1d61f7..37a4a1ff 100644 --- a/packages/server/src/utils/notifications/database-backup.ts +++ b/packages/server/src/utils/notifications/database-backup.ts @@ -1,4 +1,3 @@ -import { error } from "node:console"; import { db } from "@dokploy/server/db"; import { notifications } from "@dokploy/server/db/schema"; import DatabaseBackupEmail from "@dokploy/server/emails/emails/database-backup"; @@ -19,13 +18,13 @@ export const sendDatabaseBackupNotifications = async ({ databaseType, type, errorMessage, - adminId, + organizationId, }: { projectName: string; applicationName: string; databaseType: "postgres" | "mysql" | "mongodb" | "mariadb"; type: "error" | "success"; - adminId: string; + organizationId: string; errorMessage?: string; }) => { const date = new Date(); @@ -33,7 +32,7 @@ export const sendDatabaseBackupNotifications = async ({ const notificationList = await db.query.notifications.findMany({ where: and( eq(notifications.databaseBackup, true), - eq(notifications.adminId, adminId), + eq(notifications.organizationId, organizationId), ), with: { email: true, diff --git a/packages/server/src/utils/notifications/docker-cleanup.ts b/packages/server/src/utils/notifications/docker-cleanup.ts index b60e3b0a..b3959ccc 100644 --- a/packages/server/src/utils/notifications/docker-cleanup.ts +++ b/packages/server/src/utils/notifications/docker-cleanup.ts @@ -13,7 +13,7 @@ import { } from "./utils"; export const sendDockerCleanupNotifications = async ( - adminId: string, + organizationId: string, message = "Docker cleanup for dokploy", ) => { const date = new Date(); @@ -21,7 +21,7 @@ export const sendDockerCleanupNotifications = async ( const notificationList = await db.query.notifications.findMany({ where: and( eq(notifications.dockerCleanup, true), - eq(notifications.adminId, adminId), + eq(notifications.organizationId, organizationId), ), with: { email: true, diff --git a/packages/server/src/utils/notifications/server-threshold.ts b/packages/server/src/utils/notifications/server-threshold.ts new file mode 100644 index 00000000..2e63ba25 --- /dev/null +++ b/packages/server/src/utils/notifications/server-threshold.ts @@ -0,0 +1,155 @@ +import { and, eq } from "drizzle-orm"; +import { db } from "../../db"; +import { notifications } from "../../db/schema"; +import { + sendDiscordNotification, + sendSlackNotification, + sendTelegramNotification, +} from "./utils"; + +interface ServerThresholdPayload { + Type: "CPU" | "Memory"; + Value: number; + Threshold: number; + Message: string; + Timestamp: string; + Token: string; + ServerName: string; +} + +export const sendServerThresholdNotifications = async ( + organizationId: string, + payload: ServerThresholdPayload, +) => { + const date = new Date(payload.Timestamp); + const unixDate = ~~(Number(date) / 1000); + + const notificationList = await db.query.notifications.findMany({ + where: and( + eq(notifications.serverThreshold, true), + eq(notifications.organizationId, organizationId), + ), + with: { + email: true, + discord: true, + telegram: true, + slack: true, + }, + }); + + const typeEmoji = payload.Type === "CPU" ? "🔲" : "💾"; + const typeColor = 0xff0000; // Rojo para indicar alerta + + for (const notification of notificationList) { + const { discord, telegram, slack } = notification; + + if (discord) { + const decorate = (decoration: string, text: string) => + `${discord.decoration ? decoration : ""} ${text}`.trim(); + + await sendDiscordNotification(discord, { + title: decorate(">", `\`⚠️\` Server ${payload.Type} Alert`), + color: typeColor, + fields: [ + { + name: decorate("`🏷️`", "Server Name"), + value: payload.ServerName, + inline: true, + }, + { + name: decorate("`📅`", "Date"), + value: ``, + inline: true, + }, + { + name: decorate("`⌚`", "Time"), + value: ``, + inline: true, + }, + { + name: decorate(typeEmoji, "Type"), + value: payload.Type, + inline: true, + }, + { + name: decorate("📊", "Current Value"), + value: `${payload.Value.toFixed(2)}%`, + inline: true, + }, + { + name: decorate("⚠️", "Threshold"), + value: `${payload.Threshold.toFixed(2)}%`, + inline: true, + }, + { + name: decorate("`📜`", "Message"), + value: `\`\`\`${payload.Message}\`\`\``, + }, + ], + timestamp: date.toISOString(), + footer: { + text: "Dokploy Server Monitoring Alert", + }, + }); + } + + if (telegram) { + await sendTelegramNotification( + telegram, + ` + ⚠️ Server ${payload.Type} Alert + Server Name: ${payload.ServerName} + Type: ${payload.Type} + Current Value: ${payload.Value.toFixed(2)}% + Threshold: ${payload.Threshold.toFixed(2)}% + Message: ${payload.Message} + Time: ${date.toLocaleString()} + `, + ); + } + + if (slack) { + const { channel } = slack; + await sendSlackNotification(slack, { + channel: channel, + attachments: [ + { + color: "#FF0000", + pretext: `:warning: *Server ${payload.Type} Alert*`, + fields: [ + { + title: "Server Name", + value: payload.ServerName, + short: true, + }, + { + title: "Type", + value: payload.Type, + short: true, + }, + { + title: "Current Value", + value: `${payload.Value.toFixed(2)}%`, + short: true, + }, + { + title: "Threshold", + value: `${payload.Threshold.toFixed(2)}%`, + short: true, + }, + { + title: "Message", + value: payload.Message, + }, + { + title: "Time", + value: date.toLocaleString(), + short: true, + }, + ], + }, + ], + }); + } + } +}; diff --git a/packages/server/src/utils/notifications/utils.ts b/packages/server/src/utils/notifications/utils.ts index 4f8bb1a5..dd552cf3 100644 --- a/packages/server/src/utils/notifications/utils.ts +++ b/packages/server/src/utils/notifications/utils.ts @@ -68,6 +68,7 @@ export const sendTelegramNotification = async ( headers: { "Content-Type": "application/json" }, body: JSON.stringify({ chat_id: connection.chatId, + message_thread_id: connection.messageThreadId, text: messageText, parse_mode: "HTML", disable_web_page_preview: true, diff --git a/packages/server/src/utils/process/execAsync.ts b/packages/server/src/utils/process/execAsync.ts index 19a16ac1..aee1e821 100644 --- a/packages/server/src/utils/process/execAsync.ts +++ b/packages/server/src/utils/process/execAsync.ts @@ -27,7 +27,7 @@ export const execAsyncRemote = async ( throw err; } stream - .on("close", (code: number, signal: string) => { + .on("close", (code: number, _signal: string) => { conn.end(); if (code === 0) { resolve({ stdout, stderr }); diff --git a/packages/server/src/utils/providers/bitbucket.ts b/packages/server/src/utils/providers/bitbucket.ts index 7059e65f..dd98a93b 100644 --- a/packages/server/src/utils/providers/bitbucket.ts +++ b/packages/server/src/utils/providers/bitbucket.ts @@ -176,7 +176,6 @@ export const getBitbucketCloneCommand = async ( bitbucketBranch, bitbucketId, serverId, - bitbucket, } = entity; if (!serverId) { diff --git a/packages/server/src/utils/providers/git.ts b/packages/server/src/utils/providers/git.ts index 6377b557..c26af3af 100644 --- a/packages/server/src/utils/providers/git.ts +++ b/packages/server/src/utils/providers/git.ts @@ -69,6 +69,7 @@ export const cloneGitRepository = async ( }); } + const { port } = sanitizeRepoPathSSH(customGitUrl); await spawnAsync( "git", [ @@ -91,7 +92,7 @@ export const cloneGitRepository = async ( env: { ...process.env, ...(customGitSSHKeyId && { - GIT_SSH_COMMAND: `ssh -i ${temporalKeyPath} -o UserKnownHostsFile=${knownHostsPath}`, + GIT_SSH_COMMAND: `ssh -i ${temporalKeyPath}${port ? ` -p ${port}` : ""} -o UserKnownHostsFile=${knownHostsPath}`, }), }, }, @@ -168,7 +169,8 @@ export const getCustomGitCloneCommand = async ( ); if (customGitSSHKeyId) { const sshKey = await findSSHKeyById(customGitSSHKeyId); - const gitSshCommand = `ssh -i /tmp/id_rsa -o UserKnownHostsFile=${knownHostsPath}`; + const { port } = sanitizeRepoPathSSH(customGitUrl); + const gitSshCommand = `ssh -i /tmp/id_rsa${port ? ` -p ${port}` : ""} -o UserKnownHostsFile=${knownHostsPath}`; command.push( ` echo "${sshKey.privateKey}" > /tmp/id_rsa @@ -304,6 +306,7 @@ export const cloneGitRawRepository = async (entity: { }); } + const { port } = sanitizeRepoPathSSH(customGitUrl); await spawnAsync( "git", [ @@ -317,12 +320,12 @@ export const cloneGitRawRepository = async (entity: { outputPath, "--progress", ], - (data) => {}, + (_data) => {}, { env: { ...process.env, ...(customGitSSHKeyId && { - GIT_SSH_COMMAND: `ssh -i ${temporalKeyPath} -o UserKnownHostsFile=${knownHostsPath}`, + GIT_SSH_COMMAND: `ssh -i ${temporalKeyPath}${port ? ` -p ${port}` : ""} -o UserKnownHostsFile=${knownHostsPath}`, }), }, }, @@ -381,7 +384,8 @@ export const cloneRawGitRepositoryRemote = async (compose: Compose) => { command.push(`mkdir -p ${outputPath};`); if (customGitSSHKeyId) { const sshKey = await findSSHKeyById(customGitSSHKeyId); - const gitSshCommand = `ssh -i /tmp/id_rsa -o UserKnownHostsFile=${knownHostsPath}`; + const { port } = sanitizeRepoPathSSH(customGitUrl); + const gitSshCommand = `ssh -i /tmp/id_rsa${port ? ` -p ${port}` : ""} -o UserKnownHostsFile=${knownHostsPath}`; command.push( ` echo "${sshKey.privateKey}" > /tmp/id_rsa diff --git a/packages/server/src/utils/providers/gitlab.ts b/packages/server/src/utils/providers/gitlab.ts index 096f9e28..c380a920 100644 --- a/packages/server/src/utils/providers/gitlab.ts +++ b/packages/server/src/utils/providers/gitlab.ts @@ -162,8 +162,6 @@ export const getGitlabCloneCommand = async ( ) => { const { appName, - gitlabRepository, - gitlabOwner, gitlabPathNamespace, gitlabBranch, gitlabId, @@ -268,7 +266,7 @@ export const getGitlabRepositories = async (gitlabId?: string) => { if (groupName) { return full_path.toLowerCase().includes(groupName) && kind === "group"; } - return kind === "user"; + return kind === "member"; }); const mappedRepositories = filteredRepos.map((repo: any) => { return { @@ -328,14 +326,7 @@ export const getGitlabBranches = async (input: { }; export const cloneRawGitlabRepository = async (entity: Compose) => { - const { - appName, - gitlabRepository, - gitlabOwner, - gitlabBranch, - gitlabId, - gitlabPathNamespace, - } = entity; + const { appName, gitlabBranch, gitlabId, gitlabPathNamespace } = entity; if (!gitlabId) { throw new TRPCError({ @@ -442,7 +433,7 @@ export const testGitlabConnection = async ( if (groupName) { return full_path.toLowerCase().includes(groupName) && kind === "group"; } - return kind === "user"; + return kind === "member"; }); return filteredRepos.length; diff --git a/packages/server/src/utils/traefik/application.ts b/packages/server/src/utils/traefik/application.ts index 4434d858..61150abf 100644 --- a/packages/server/src/utils/traefik/application.ts +++ b/packages/server/src/utils/traefik/application.ts @@ -67,7 +67,7 @@ export const removeTraefikConfig = async ( if (fs.existsSync(configPath)) { await fs.promises.unlink(configPath); } - } catch (error) {} + } catch (_error) {} }; export const removeTraefikConfigRemote = async ( @@ -78,7 +78,7 @@ export const removeTraefikConfigRemote = async ( const { DYNAMIC_TRAEFIK_PATH } = paths(true); const configPath = path.join(DYNAMIC_TRAEFIK_PATH, `${appName}.yml`); await execAsyncRemote(serverId, `rm ${configPath}`); - } catch (error) {} + } catch (_error) {} }; export const loadOrCreateConfig = (appName: string): FileConfig => { @@ -110,7 +110,7 @@ export const loadOrCreateConfigRemote = async ( http: { routers: {}, services: {} }, }; return parsedConfig; - } catch (err) { + } catch (_err) { return fileConfig; } }; @@ -132,7 +132,7 @@ export const readRemoteConfig = async (serverId: string, appName: string) => { const { stdout } = await execAsyncRemote(serverId, `cat ${configPath}`); if (!stdout) return null; return stdout; - } catch (err) { + } catch (_err) { return null; } }; diff --git a/packages/server/src/utils/traefik/domain.ts b/packages/server/src/utils/traefik/domain.ts index a6c878e7..1ae3c05a 100644 --- a/packages/server/src/utils/traefik/domain.ts +++ b/packages/server/src/utils/traefik/domain.ts @@ -122,13 +122,25 @@ export const createRouterConfig = async ( if ((entryPoint === "websecure" && https) || !https) { // redirects for (const redirect of redirects) { - const middlewareName = `redirect-${appName}-${redirect.uniqueConfigKey}`; + let middlewareName = `redirect-${appName}-${redirect.uniqueConfigKey}`; + if (domain.domainType === "preview") { + middlewareName = `redirect-${appName.replace( + /^preview-(.+)-[^-]+$/, + "$1", + )}-${redirect.uniqueConfigKey}`; + } routerConfig.middlewares?.push(middlewareName); } // security if (security.length > 0) { - const middlewareName = `auth-${appName}`; + let middlewareName = `auth-${appName}`; + if (domain.domainType === "preview") { + middlewareName = `auth-${appName.replace( + /^preview-(.+)-[^-]+$/, + "$1", + )}`; + } routerConfig.middlewares?.push(middlewareName); } } diff --git a/packages/server/src/utils/traefik/middleware.ts b/packages/server/src/utils/traefik/middleware.ts index 60345f66..934d637e 100644 --- a/packages/server/src/utils/traefik/middleware.ts +++ b/packages/server/src/utils/traefik/middleware.ts @@ -95,7 +95,7 @@ export const loadRemoteMiddlewares = async (serverId: string) => { } const config = load(stdout) as FileConfig; return config; - } catch (error) { + } catch (_) { throw new Error(`File not found: ${configPath}`); } }; diff --git a/packages/server/src/utils/traefik/web-server.ts b/packages/server/src/utils/traefik/web-server.ts index 0aa4d35d..78046c67 100644 --- a/packages/server/src/utils/traefik/web-server.ts +++ b/packages/server/src/utils/traefik/web-server.ts @@ -1,14 +1,14 @@ import { existsSync, readFileSync, writeFileSync } from "node:fs"; import { join } from "node:path"; import { paths } from "@dokploy/server/constants"; -import type { Admin } from "@dokploy/server/services/admin"; +import type { User } from "@dokploy/server/services/user"; import { dump, load } from "js-yaml"; import { loadOrCreateConfig, writeTraefikConfig } from "./application"; import type { FileConfig } from "./file-types"; import type { MainTraefikConfig } from "./types"; export const updateServerTraefik = ( - admin: Admin | null, + user: User | null, newHost: string | null, ) => { const appName = "dokploy"; @@ -22,7 +22,7 @@ export const updateServerTraefik = ( if (currentRouterConfig && newHost) { currentRouterConfig.rule = `Host(\`${newHost}\`)`; - if (admin?.certificateType === "letsencrypt") { + if (user?.certificateType === "letsencrypt") { config.http.routers[`${appName}-router-app-secure`] = { ...currentRouterConfig, entryPoints: ["websecure"], diff --git a/packages/server/src/verification/send-verification-email.tsx b/packages/server/src/verification/send-verification-email.tsx new file mode 100644 index 00000000..c673c0f7 --- /dev/null +++ b/packages/server/src/verification/send-verification-email.tsx @@ -0,0 +1,51 @@ +import { + sendDiscordNotification, + sendEmailNotification, +} from "../utils/notifications/utils"; +export const sendEmail = async ({ + email, + subject, + text, +}: { + email: string; + subject: string; + text: string; +}) => { + await sendEmailNotification( + { + fromAddress: process.env.SMTP_FROM_ADDRESS || "", + toAddresses: [email], + smtpServer: process.env.SMTP_SERVER || "", + smtpPort: Number(process.env.SMTP_PORT), + username: process.env.SMTP_USERNAME || "", + password: process.env.SMTP_PASSWORD || "", + }, + subject, + text, + ); + + return true; +}; + +export const sendDiscordNotificationWelcome = async (email: string) => { + await sendDiscordNotification( + { + webhookUrl: process.env.DISCORD_WEBHOOK_URL || "", + }, + { + title: "New User Registered", + color: 0x00ff00, + fields: [ + { + name: "Email", + value: email, + inline: true, + }, + ], + timestamp: new Date(), + footer: { + text: "Dokploy User Registration Notification", + }, + }, + ); +}; diff --git a/packages/server/tsconfig.server.json b/packages/server/tsconfig.server.json index 7f349eb8..33777c02 100644 --- a/packages/server/tsconfig.server.json +++ b/packages/server/tsconfig.server.json @@ -1,6 +1,7 @@ { "extends": "./tsconfig.json", "compilerOptions": { + "disableSizeLimit": true, "module": "ESNext", "outDir": "dist/", "target": "ESNext", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7542278f..703101ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,7 +17,7 @@ importers: version: 1.9.4 '@commitlint/cli': specifier: ^19.3.0 - version: 19.3.0(@types/node@18.19.42)(typescript@5.5.3) + version: 19.3.0(@types/node@18.19.42)(typescript@5.7.2) '@commitlint/config-conventional': specifier: ^19.2.2 version: 19.2.2 @@ -127,6 +127,12 @@ importers: '@hookform/resolvers': specifier: ^3.9.0 version: 3.9.0(react-hook-form@7.52.1(react@18.2.0)) + '@lucia-auth/adapter-drizzle': + specifier: 1.0.7 + version: 1.0.7(lucia@3.2.0) + '@octokit/auth-app': + specifier: ^6.0.4 + version: 6.1.1 '@octokit/webhooks': specifier: ^13.2.7 version: 13.3.0 @@ -187,6 +193,9 @@ importers: '@radix-ui/react-tooltip': specifier: ^1.0.7 version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-email/components': + specifier: ^0.0.21 + version: 0.0.21(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@stepperize/react': specifier: 4.0.1 version: 4.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -220,6 +229,9 @@ importers: '@xterm/addon-attach': specifier: 0.10.0 version: 0.10.0(@xterm/xterm@5.5.0) + '@xterm/addon-clipboard': + specifier: 0.1.0 + version: 0.1.0(@xterm/xterm@5.5.0) '@xterm/xterm': specifier: ^5.4.0 version: 5.5.0 @@ -231,7 +243,16 @@ importers: version: 4.0.31(react@18.2.0)(zod@3.23.8) bcrypt: specifier: 5.1.1 - version: 5.1.1 + version: 5.1.1(encoding@0.1.13) + better-auth: + specifier: 1.2.0 + version: 1.2.0(typescript@5.5.3) + bl: + specifier: 6.0.11 + version: 6.0.11 + boxen: + specifier: ^7.1.1 + version: 7.1.1 bullmq: specifier: 5.4.2 version: 5.4.2 @@ -253,18 +274,24 @@ importers: date-fns: specifier: 3.6.0 version: 3.6.0 + dockerode: + specifier: 4.0.2 + version: 4.0.2 dotenv: specifier: 16.4.5 version: 16.4.5 drizzle-orm: - specifier: ^0.30.8 - version: 0.30.10(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(postgres@3.4.4)(react@18.2.0) + specifier: ^0.39.1 + version: 0.39.1(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7) drizzle-zod: specifier: 0.5.1 - version: 0.5.1(drizzle-orm@0.30.10(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(postgres@3.4.4)(react@18.2.0))(zod@3.23.8) + version: 0.5.1(drizzle-orm@0.39.1(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7))(zod@3.23.8) fancy-ansi: specifier: ^0.1.3 version: 0.1.3 + hi-base32: + specifier: ^0.5.1 + version: 0.5.1 i18next: specifier: ^23.16.4 version: 23.16.5 @@ -297,28 +324,43 @@ importers: version: 15.3.1(i18next@23.16.5)(next@15.0.1(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-i18next@15.1.1(i18next@23.16.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) next-themes: specifier: ^0.2.1 - version: 0.2.1(next@15.0.1(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 0.2.1(next@15.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + node-os-utils: + specifier: 1.3.7 + version: 1.3.7 node-pty: specifier: 1.0.0 version: 1.0.0 node-schedule: specifier: 2.1.1 version: 2.1.1 + nodemailer: + specifier: 6.9.14 + version: 6.9.14 octokit: specifier: 3.1.2 version: 3.1.2 + otpauth: + specifier: ^9.2.3 + version: 9.3.4 postgres: specifier: 3.4.4 version: 3.4.4 public-ip: specifier: 6.0.2 version: 6.0.2 + qrcode: + specifier: ^1.5.3 + version: 1.5.4 react: specifier: 18.2.0 version: 18.2.0 react-confetti-explosion: specifier: 2.1.2 version: 2.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-day-picker: + specifier: 8.10.1 + version: 8.10.1(date-fns@3.6.0)(react@18.2.0) react-dom: specifier: 18.2.0 version: 18.2.0(react@18.2.0) @@ -334,6 +376,9 @@ importers: recharts: specifier: ^2.12.7 version: 2.12.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + rotating-file-stream: + specifier: 3.2.3 + version: 3.2.3 slugify: specifier: ^1.6.6 version: 1.6.6 @@ -357,7 +402,7 @@ importers: version: 2.4.0 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.7) + version: 1.0.7(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.3))) undici: specifier: ^6.19.2 version: 6.19.4 @@ -398,9 +443,18 @@ importers: '@types/node': specifier: ^18.17.0 version: 18.19.42 + '@types/node-os-utils': + specifier: 1.3.4 + version: 1.3.4 '@types/node-schedule': specifier: 2.1.6 version: 2.1.6 + '@types/nodemailer': + specifier: ^6.4.15 + version: 6.4.16 + '@types/qrcode': + specifier: ^1.5.5 + version: 1.5.5 '@types/react': specifier: 18.3.5 version: 18.3.5 @@ -420,8 +474,8 @@ importers: specifier: 10.4.12 version: 10.4.12(postcss@8.4.40) drizzle-kit: - specifier: ^0.21.1 - version: 0.21.4 + specifier: ^0.30.4 + version: 0.30.4 esbuild: specifier: 0.20.2 version: 0.20.2 @@ -433,7 +487,7 @@ importers: version: 4.11.0 tailwindcss: specifier: ^3.4.1 - version: 3.4.7 + version: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.3)) tsx: specifier: ^4.7.0 version: 4.16.2 @@ -465,8 +519,8 @@ importers: specifier: ^16.3.1 version: 16.4.5 drizzle-orm: - specifier: ^0.30.8 - version: 0.30.10(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(postgres@3.4.4)(react@18.2.0) + specifier: ^0.39.1 + version: 0.39.1(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7) hono: specifier: ^4.5.8 version: 4.5.8 @@ -507,27 +561,9 @@ importers: packages/server: dependencies: - '@ai-sdk/anthropic': - specifier: ^1.0.6 - version: 1.0.8(zod@3.23.8) - '@ai-sdk/azure': - specifier: ^1.0.15 - version: 1.0.18(zod@3.23.8) - '@ai-sdk/cohere': - specifier: ^1.0.6 - version: 1.0.8(zod@3.23.8) - '@ai-sdk/deepinfra': - specifier: ^0.0.4 - version: 0.0.4(zod@3.23.8) - '@ai-sdk/mistral': - specifier: ^1.0.6 - version: 1.0.8(zod@3.23.8) - '@ai-sdk/openai': - specifier: ^1.0.12 - version: 1.0.16(zod@3.23.8) - '@ai-sdk/openai-compatible': - specifier: ^0.0.13 - version: 0.0.13(zod@3.23.8) + '@better-auth/utils': + specifier: 0.2.3 + version: 0.2.3 '@faker-js/faker': specifier: ^8.4.1 version: 8.4.1 @@ -537,6 +573,12 @@ importers: '@octokit/auth-app': specifier: ^6.0.4 version: 6.1.1 + '@oslojs/crypto': + specifier: 1.0.1 + version: 1.0.1 + '@oslojs/encoding': + specifier: 1.1.0 + version: 1.1.0 '@react-email/components': specifier: ^0.0.21 version: 0.0.21(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -551,7 +593,10 @@ importers: version: 4.0.31(react@18.2.0)(zod@3.23.8) bcrypt: specifier: 5.1.1 - version: 5.1.1 + version: 5.1.1(encoding@0.1.13) + better-auth: + specifier: 1.2.0 + version: 1.2.0(typescript@5.5.3) bl: specifier: 6.0.11 version: 6.0.11 @@ -567,12 +612,15 @@ importers: dotenv: specifier: 16.4.5 version: 16.4.5 + drizzle-dbml-generator: + specifier: 0.10.0 + version: 0.10.0(drizzle-orm@0.39.1(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7)) drizzle-orm: - specifier: ^0.30.8 - version: 0.30.10(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(postgres@3.4.4)(react@18.2.0) + specifier: ^0.39.1 + version: 0.39.1(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7) drizzle-zod: specifier: 0.5.1 - version: 0.5.1(drizzle-orm@0.30.10(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(postgres@3.4.4)(react@18.2.0))(zod@3.23.8) + version: 0.5.1(drizzle-orm@0.39.1(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7))(zod@3.23.8) hi-base32: specifier: ^0.5.1 version: 0.5.1 @@ -683,8 +731,8 @@ importers: specifier: 8.5.10 version: 8.5.10 drizzle-kit: - specifier: ^0.21.1 - version: 0.21.4 + specifier: ^0.30.4 + version: 0.30.4 esbuild: specifier: 0.20.2 version: 0.20.2 @@ -696,7 +744,7 @@ importers: version: 8.4.40 tailwindcss: specifier: ^3.4.1 - version: 3.4.7 + version: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.3)) tsc-alias: specifier: 1.8.10 version: 1.8.10 @@ -825,6 +873,12 @@ packages: '@balena/dockerignore@1.0.2': resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} + '@better-auth/utils@0.2.3': + resolution: {integrity: sha512-Ap1GaSmo6JYhJhxJOpUB0HobkKPTNzfta+bLV89HfpyCAHN7p8ntCrmNFHNAVD0F6v0mywFVEUg1FUhNCc81Rw==} + + '@better-fetch/fetch@1.1.15': + resolution: {integrity: sha512-0Bl8YYj1f8qCTNHeSn5+1DWv2hy7rLBrQ8rS8Y9XYloiwZEfc3k4yspIG0llRxafxqhGCwlGRg+F8q1HZRCMXA==} + '@biomejs/biome@1.9.4': resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} engines: {node: '>=14.21.3'} @@ -988,12 +1042,19 @@ packages: resolution: {integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==} engines: {node: '>=v18'} + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + '@dokploy/trpc-openapi@0.0.4': resolution: {integrity: sha512-a7VKunKu9arq57bP9MPH7ikJuKfT5SILnNy70vMqf1stm5IrqMG3Y7CIFprFe0DZiw3bwjue0KpETIATBftN6w==} peerDependencies: '@trpc/server': ^10.0.0 zod: ^3.14.4 + '@drizzle-team/brocli@0.10.2': + resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + '@emnapi/core@0.45.0': resolution: {integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==} @@ -1582,9 +1643,15 @@ packages: '@floating-ui/utils@0.2.5': resolution: {integrity: sha512-sTcG+QZ6fdEUObICavU+aB3Mp8HY4n14wYHdxK4fXjPmv3PXZZeY5RaguJmGyeH/CJQhX3fqKUtS4qc1LoHwhQ==} + '@gar/promisify@1.1.3': + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + '@hapi/bourne@3.0.0': resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==} + '@hexagon/base64@1.1.28': + resolution: {integrity: sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==} + '@hono/node-server@1.12.1': resolution: {integrity: sha512-C9l+08O8xtXB7Ppmy8DjBFH1hYji7JKzsU32Yt1poIIbdPp6S7aOI8IldDHD9YFJ55lv2c21ovNrmxatlHfhAg==} engines: {node: '>=18.14.1'} @@ -1737,6 +1804,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@jsonjoy.com/base64@1.1.2': resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} engines: {node: '>=10.0'} @@ -1761,6 +1831,9 @@ packages: '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + '@levischuck/tiny-cbor@0.2.11': + resolution: {integrity: sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==} + '@lezer/common@1.2.1': resolution: {integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==} @@ -1871,10 +1944,17 @@ packages: cpu: [x64] os: [win32] + '@noble/ciphers@0.6.0': + resolution: {integrity: sha512-mIbq/R9QXk5/cTfESb1OKtyFnk7oc1Om/8onA1158K9/OZUQFDEVy55jVTato+xmp3XX6F6Qh0zz0Nc1AxAlRQ==} + '@noble/hashes@1.5.0': resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.7.1': + resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + engines: {node: ^14.21.3 || >=16} + '@node-rs/argon2-android-arm-eabi@1.7.0': resolution: {integrity: sha512-udDqkr5P9E+wYX1SZwAVPdyfYvaF4ry9Tm+R9LkfSHbzWH0uhU6zjIwNRp7m+n4gx691rk+lqqDAIP8RLKwbhg==} engines: {node: '>= 10'} @@ -2061,6 +2141,14 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@npmcli/fs@1.1.1': + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + + '@npmcli/move-file@1.1.2': + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + deprecated: This functionality has been moved to @npmcli/fs + '@octokit/app@14.1.0': resolution: {integrity: sha512-g3uEsGOQCBl1+W1rgfwoRFUIR6PtvB2T1E4RpygeUU5LrLvlOqcxrt5lfykIeRpUPpupreGJUYl70fqMDXdTpw==} engines: {node: '>= 18'} @@ -2192,9 +2280,32 @@ packages: '@one-ini/wasm@0.1.1': resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} - '@opentelemetry/api@1.9.0': - resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} - engines: {node: '>=8.0.0'} + '@oslojs/asn1@1.0.0': + resolution: {integrity: sha512-zw/wn0sj0j0QKbIXfIlnEcTviaCzYOY3V5rAyjR6YtOByFtJiT574+8p9Wlach0lZH9fddD4yb9laEAIl4vXQA==} + + '@oslojs/binary@1.0.0': + resolution: {integrity: sha512-9RCU6OwXU6p67H4NODbuxv2S3eenuQ4/WFLrsq+K/k682xrznH5EVWA7N4VFk9VYVcbFtKqur5YQQZc0ySGhsQ==} + + '@oslojs/crypto@1.0.1': + resolution: {integrity: sha512-7n08G8nWjAr/Yu3vu9zzrd0L9XnrJfpMioQcvCMxBIiF5orECHe5/3J0jmXRVvgfqMm/+4oxlQ+Sq39COYLcNQ==} + + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + + '@peculiar/asn1-android@2.3.15': + resolution: {integrity: sha512-8U2TIj59cRlSXTX2d0mzUKP7whfWGFMzTeC3qPgAbccXFrPNZLaDhpNEdG5U2QZ/tBv/IHlCJ8s+KYXpJeop6w==} + + '@peculiar/asn1-ecc@2.3.15': + resolution: {integrity: sha512-/HtR91dvgog7z/WhCVdxZJ/jitJuIu8iTqiyWVgRE9Ac5imt2sT/E4obqIVGKQw7PIy+X6i8lVBoT6wC73XUgA==} + + '@peculiar/asn1-rsa@2.3.15': + resolution: {integrity: sha512-p6hsanvPhexRtYSOHihLvUUgrJ8y0FtOM97N5UEpC+VifFYyZa0iZ5cXjTkZoDwxJ/TTJ1IJo3HVTB2JJTpXvg==} + + '@peculiar/asn1-schema@2.3.15': + resolution: {integrity: sha512-QPeD8UA8axQREpgR5UTAfu2mqQmm97oUqahDtNdBcfj3qAnoXzFdQW+aNf/tD2WVXF8Fhmftxoj0eMIT++gX2w==} + + '@peculiar/asn1-x509@2.3.15': + resolution: {integrity: sha512-0dK5xqTqSLaxv1FHXIcd4Q/BZNuopg+u1l23hT9rOmQ1g4dNtw0g/RnEi+TboB0gOwGtrWn269v27cMgchFIIg==} '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -3207,6 +3318,13 @@ packages: '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + '@simplewebauthn/browser@13.1.0': + resolution: {integrity: sha512-WuHZ/PYvyPJ9nxSzgHtOEjogBhwJfC8xzYkPC+rR/+8chl/ft4ngjiK8kSU5HtRJfczupyOh33b25TjYbvwAcg==} + + '@simplewebauthn/server@13.1.1': + resolution: {integrity: sha512-1hsLpRHfSuMB9ee2aAdh0Htza/X3f4djhYISrggqGe3xopNjOcePiSDkDDoPzDYaaMCrbqGP1H2TYU7bgL9PmA==} + engines: {node: '>=20.0.0'} + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -3353,6 +3471,10 @@ packages: resolution: {integrity: sha512-IqREj9ADoml9zCAouIG/5kCGoyIxPFdqdyoxis9FisXFi5vT+iYfEfLosq4xkU/iDbMcEuAj+X8dWRLvKYDNoQ==} engines: {node: '>=12'} + '@tootallnate/once@1.1.2': + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + '@trpc/client@10.45.2': resolution: {integrity: sha512-ykALM5kYWTLn1zYuUOZ2cPWlVfrXhc18HzBDyRhoPYN0jey4iQHEFSEowfnhg1RvYnrAVjNBgHNeSAXjrDbGwg==} peerDependencies: @@ -3381,6 +3503,18 @@ packages: '@trpc/server@10.45.2': resolution: {integrity: sha512-wOrSThNNE4HUnuhJG6PfDRp4L2009KDVxsd+2VYH8ro6o/7/jwYZ8Uu5j+VaW+mOmc8EHerHzGcdbGNQSAUPgg==} + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tybys/wasm-util@0.8.3': resolution: {integrity: sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q==} @@ -3664,6 +3798,11 @@ packages: peerDependencies: '@xterm/xterm': ^5.0.0 + '@xterm/addon-clipboard@0.1.0': + resolution: {integrity: sha512-zdoM7p53T5sv/HbRTyp4hY0kKmEQ3MZvAvEtiXqNIHc/JdpqwByCtsTaQF5DX2n4hYdXRPO4P/eOS0QEhX1nPw==} + peerDependencies: + '@xterm/xterm': ^5.4.0 + '@xterm/xterm@5.5.0': resolution: {integrity: sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==} @@ -3714,6 +3853,10 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -3807,6 +3950,14 @@ packages: engines: {node: '>=10'} deprecated: This package is no longer supported. + are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -3830,6 +3981,10 @@ packages: asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + asn1js@3.0.5: + resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} + engines: {node: '>=12.0.0'} + assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} @@ -3875,10 +4030,19 @@ packages: before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + better-auth@1.2.0: + resolution: {integrity: sha512-eIRGOXfix25bh4fgs8jslZAZssufpIkxfEeEokQu5G4wICoDee1wPctkFb8v80PvhtI4dPm28SuAoZaAdRc6Wg==} + + better-call@1.0.3: + resolution: {integrity: sha512-DUKImKoDIy5UtCvQbHTg0wuBRse6gu1Yvznn7+1B3I5TeY8sclRPFce0HI+4WF2bcb+9PqmkET8nXZubrHQh9A==} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -3941,6 +4105,10 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cacache@15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} + cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} engines: {node: '>=14.16'} @@ -4044,10 +4212,6 @@ packages: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} - cli-color@2.0.4: - resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} - engines: {node: '>=0.10'} - cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -4230,6 +4394,9 @@ packages: resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} engines: {node: '>=10.0.0'} + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} @@ -4310,10 +4477,6 @@ packages: resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} engines: {node: '>=12'} - d@1.0.2: - resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} - engines: {node: '>=0.12'} - dargs@8.1.0: resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} engines: {node: '>=12'} @@ -4428,8 +4591,9 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - difflib@0.2.4: - resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} @@ -4488,25 +4652,29 @@ packages: resolution: {integrity: sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==} engines: {node: '>=4'} - dreamopt@0.8.0: - resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} - engines: {node: '>=0.4.0'} + drizzle-dbml-generator@0.10.0: + resolution: {integrity: sha512-cMZq9E3U3RlmE0uBeXyc6oWJ0royOkC6HiTlc9LDeMe+W87poZTzKoNYUyAxZrs4Q1RQtob+cGKiefV4ZoI8HA==} + peerDependencies: + drizzle-orm: '>=0.36.0' - drizzle-kit@0.21.4: - resolution: {integrity: sha512-Nxcc1ONJLRgbhmR+azxjNF9Ly9privNLEIgW53c92whb4xp8jZLH1kMCh/54ci1mTMuYxPdOukqLwJ8wRudNwA==} + drizzle-kit@0.30.4: + resolution: {integrity: sha512-B2oJN5UkvwwNHscPWXDG5KqAixu7AUzZ3qbe++KU9SsQ+cZWR4DXEPYcvWplyFAno0dhRJECNEhNxiDmFaPGyQ==} hasBin: true - drizzle-orm@0.30.10: - resolution: {integrity: sha512-IRy/QmMWw9lAQHpwbUh1b8fcn27S/a9zMIzqea1WNOxK9/4EB8gIo+FZWLiPXzl2n9ixGSv8BhsLZiOppWEwBw==} + drizzle-orm@0.39.1: + resolution: {integrity: sha512-2bDHlzTY31IDmrYn8i+ZZrxK8IyBD4mPZ7JmZdVDQj2tpBZXs/gxB/1kK5pSvkjxPUMNOVsTnoGkSltgjuJwcA==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' - '@cloudflare/workers-types': '>=3' - '@electric-sql/pglite': '>=0.1.1' - '@libsql/client': '*' - '@neondatabase/serverless': '>=0.1' + '@cloudflare/workers-types': '>=4' + '@electric-sql/pglite': '>=0.2.0' + '@libsql/client': '>=0.10.0' + '@libsql/client-wasm': '>=0.10.0' + '@neondatabase/serverless': '>=0.10.0' '@op-engineering/op-sqlite': '>=2' '@opentelemetry/api': ^1.4.1 '@planetscale/database': '>=1' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' '@types/better-sqlite3': '*' '@types/pg': '*' '@types/react': 18.3.5 @@ -4515,12 +4683,13 @@ packages: '@xata.io/client': '*' better-sqlite3: '>=7' bun-types: '*' - expo-sqlite: '>=13.2.0' + expo-sqlite: '>=14.0.0' knex: '*' kysely: '*' mysql2: '>=2' pg: '>=8' postgres: '>=3' + prisma: '*' react: '>=18' sql.js: '>=1' sqlite3: '>=5' @@ -4533,6 +4702,8 @@ packages: optional: true '@libsql/client': optional: true + '@libsql/client-wasm': + optional: true '@neondatabase/serverless': optional: true '@op-engineering/op-sqlite': @@ -4541,6 +4712,10 @@ packages: optional: true '@planetscale/database': optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true '@types/better-sqlite3': optional: true '@types/pg': @@ -4569,6 +4744,8 @@ packages: optional: true postgres: optional: true + prisma: + optional: true react: optional: true sql.js: @@ -4605,6 +4782,9 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -4620,14 +4800,13 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - env-paths@3.0.0: - resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -4642,20 +4821,6 @@ packages: es-module-lexer@1.5.4: resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} - es5-ext@0.10.64: - resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} - engines: {node: '>=0.10'} - - es6-iterator@2.0.3: - resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} - - es6-symbol@3.1.4: - resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} - engines: {node: '>=0.12'} - - es6-weak-map@2.0.3: - resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} - esbuild-plugin-alias@0.2.1: resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==} @@ -4703,10 +4868,6 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - esniff@2.0.1: - resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} - engines: {node: '>=0.10'} - esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -4725,9 +4886,6 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - event-emitter@0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -4754,12 +4912,6 @@ packages: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - ext@1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - fancy-ansi@0.1.3: resolution: {integrity: sha512-tRQVTo5jjdSIiydqgzIIEZpKddzSsfGLsSVt6vWdjVm7fbvDTiQkyoPu6Z3dIPlAM4OZk0jP5jmTCX4G8WGgBw==} @@ -4802,6 +4954,9 @@ packages: fault@1.0.4: resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -4872,6 +5027,11 @@ packages: engines: {node: '>=10'} deprecated: This package is no longer supported. + gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + generic-pool@3.9.0: resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} engines: {node: '>= 4'} @@ -4933,11 +5093,6 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - global-directory@4.0.1: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} @@ -4966,9 +5121,6 @@ packages: h3@1.12.0: resolution: {integrity: sha512-Zi/CcNeWBXDrFNlV0hUBJQR9F7a96RjMeAZweW/ZWkR9fuXrMcvKnSA63f/zZ9l0GgQOZDVHGvXivNN9PWOwhA==} - hanji@0.0.5: - resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} - has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -5007,9 +5159,6 @@ packages: hastscript@6.0.0: resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} - heap@0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} - help-me@5.0.0: resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} @@ -5046,6 +5195,10 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + http2-wrapper@2.2.1: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} @@ -5058,6 +5211,9 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + hyperdyperid@1.2.0: resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} engines: {node: '>=10.18'} @@ -5075,6 +5231,10 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -5093,6 +5253,10 @@ packages: import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} @@ -5101,6 +5265,9 @@ packages: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} + infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + inflation@2.1.0: resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} engines: {node: '>= 0.8.0'} @@ -5139,6 +5306,10 @@ packages: resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==} engines: {node: '>=12.22.0'} + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + ip-regex@5.0.0: resolution: {integrity: sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5211,6 +5382,9 @@ packages: resolution: {integrity: sha512-4B4XA2HEIm/PY+OSpeMBXr8pGWBYbXuHgjMAqrwbLO3CPTCAd9ArEJzBUKGZtk9viY6+aSfadGnWyjY3ydYZkw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -5219,13 +5393,6 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - - is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5252,10 +5419,16 @@ packages: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true + jose@5.9.6: + resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + js-beautify@1.15.1: resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} engines: {node: '>=14'} @@ -5278,13 +5451,12 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-diff@0.9.0: - resolution: {integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==} - hasBin: true - json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -5361,6 +5533,10 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kysely@0.27.5: + resolution: {integrity: sha512-s7hZHcQeSNKpzCkHRm8yA+0JPLjncSWnjb+2TIElwS2JAqYr+Kv3Ess+9KFfJS0C1xcQ1i9NkNHpWwCYpHMWsA==} + engines: {node: '>=14.0.0'} + leac@0.6.0: resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} @@ -5508,9 +5684,6 @@ packages: lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} @@ -5547,8 +5720,9 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-queue@0.1.0: - resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} lucia@3.2.0: resolution: {integrity: sha512-eXMxXwk6hqtjRTj4W/x3EnTUtAztLPm0p2N2TEBMDEbakDLXiYnDQ9z/qahjPdPdhPguQc+vwO0/88zIWxlpuw==} @@ -5569,6 +5743,13 @@ packages: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + make-fetch-happen@9.1.0: + resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} + engines: {node: '>= 10'} + marked@7.0.4: resolution: {integrity: sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==} engines: {node: '>= 16'} @@ -5618,10 +5799,6 @@ packages: resolution: {integrity: sha512-+6kz90/YQoZuHvg3rn1CGPMZfEMaU5xe7xIavZMNiom2RNesiI8S37p9O9n+PlIUnUgretjLdM6HnqpZYl3X2g==} engines: {node: '>= 4.0.0'} - memoizee@0.4.17: - resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==} - engines: {node: '>=0.12'} - meow@12.1.1: resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} engines: {node: '>=16.10'} @@ -5748,10 +5925,6 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - minimatch@7.4.6: resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} engines: {node: '>=10'} @@ -5767,6 +5940,26 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + + minipass-fetch@1.4.1: + resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} + engines: {node: '>=8'} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} @@ -5822,10 +6015,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + nanostores@0.11.3: + resolution: {integrity: sha512-TUes3xKIX33re4QzdxwZ6tdbodjmn3tWXCEc1uokiEmo14sI1EaGYNs2k3bU2pyyGNmBqFGAVl6jAGWd06AVIg==} + engines: {node: ^18.0.0 || >=20.0.0} napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} @@ -5857,9 +6049,6 @@ packages: react: '*' react-dom: '*' - next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - next@15.0.1: resolution: {integrity: sha512-PSkFkr/w7UnFWm+EP8y/QpHrJXMqpZzAXpergB/EqLPOh4SGPJXv1wj4mslr2hUZBAS9pX7/9YLIdxTv6fwytw==} engines: {node: '>=18.18.0'} @@ -5891,6 +6080,9 @@ packages: node-addon-api@5.1.0: resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -5915,6 +6107,11 @@ packages: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true + node-gyp@8.4.1: + resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} + engines: {node: '>= 10.12.0'} + hasBin: true + node-mocks-http@1.15.0: resolution: {integrity: sha512-3orGBAxXrnwz3ixU8AZpa0x8srAvVSHvbWanAqd5F0zVCVA2QstxaVcTSarFcjz4+pFSnR1zm28MsV83s/BtmA==} engines: {node: '>=14'} @@ -5966,6 +6163,11 @@ packages: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} deprecated: This package is no longer supported. + npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -6050,6 +6252,10 @@ packages: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -6247,6 +6453,18 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -6273,6 +6491,13 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + pvtsutils@1.3.6: + resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + + pvutils@1.1.3: + resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} + engines: {node: '>=6.0.0'} + qrcode@1.5.4: resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} engines: {node: '>=10.13.0'} @@ -6341,6 +6566,12 @@ packages: peerDependencies: react: ^15.3.0 || 16 || 17 || 18 + react-day-picker@8.10.1: + resolution: {integrity: sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==} + peerDependencies: + date-fns: ^2.28.0 || ^3.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-debounce-input@3.3.0: resolution: {integrity: sha512-VEqkvs8JvY/IIZvh71Z0TC+mdbxERvYF33RcebnodlsUZ8RSgyKe2VWaHXv4+/8aoOgXLxWrdsYs2hDhcwbUgA==} peerDependencies: @@ -6599,6 +6830,10 @@ packages: resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} engines: {node: '>=4'} + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -6620,6 +6855,9 @@ packages: resolution: {integrity: sha512-cfmm3tqdnbuYw2FBmRTPBDaohYEbMJ3211T35o6eZdr4d7v69+ZeK1Av84Br7FLj2dlzyeZSbN6qTuXXE6dawQ==} engines: {node: '>=14.0'} + rou3@0.5.1: + resolution: {integrity: sha512-OXMmJ3zRk2xeXFGfA3K+EOPHC5u7RDFG7lIOx0X1pdnhUkI8MdVrbV+sNsD80ElpUZ+MRHdyxPnFthq9VHs8uQ==} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -6677,6 +6915,9 @@ packages: set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -6730,9 +6971,6 @@ packages: simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -6753,6 +6991,18 @@ packages: resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} engines: {node: '>=8.0.0'} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@6.2.1: + resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} + engines: {node: '>= 10'} + + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + sonic-boom@4.1.0: resolution: {integrity: sha512-NGipjjRicyJJ03rPiZCJYjwlsuP2d1/5QUviozRXC7S3WdVWNK5e3Ojieb9CCyfhq2UC+3+SRd9nG3I2lPRvUw==} @@ -6792,10 +7042,20 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + sqlite3@5.1.7: + resolution: {integrity: sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==} + ssh2@1.15.0: resolution: {integrity: sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw==} engines: {node: '>=10.16.0'} + ssri@8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -7002,10 +7262,6 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - timers-ext@0.1.8: - resolution: {integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==} - engines: {node: '>=0.12'} - tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -7064,6 +7320,20 @@ packages: ts-mixer@6.0.4: resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + ts-toolbelt@9.6.0: resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} @@ -7084,6 +7354,9 @@ packages: tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.16.2: resolution: {integrity: sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==} engines: {node: '>=18.0.0'} @@ -7111,9 +7384,6 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - type@2.7.3: - resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} - types-ramda@0.30.1: resolution: {integrity: sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==} @@ -7122,6 +7392,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.7.2: + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + engines: {node: '>=14.17'} + hasBin: true + ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} @@ -7142,23 +7417,11 @@ packages: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} - unified@11.0.5: - resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unique-filename@1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unique-slug@2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} universal-github-app-jwt@1.1.2: resolution: {integrity: sha512-t1iB2FmLFE+yyJY9+3wMx0ejB+MQpEVkH0gQv7dR6FZyltyq+ZZO0uDpbopxhrZ3SLEO4dCEkIujOMldEQ2iOA==} @@ -7228,11 +7491,16 @@ packages: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + valibot@1.0.0-beta.15: + resolution: {integrity: sha512-BKy8XosZkDHWmYC+cJG74LBzP++Gfntwi33pP3D3RKztz2XV9jmFWnkOi21GoqARP8wAWARwhV6eTr1JcWzjGw==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true victory-vendor@36.9.2: resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} @@ -7361,9 +7629,6 @@ packages: resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} engines: {node: '>=12'} - wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -7446,6 +7711,10 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + yocto-queue@1.1.1: resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} @@ -7471,8 +7740,8 @@ packages: zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + zod@3.24.1: + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} snapshots: @@ -7591,6 +7860,12 @@ snapshots: '@balena/dockerignore@1.0.2': {} + '@better-auth/utils@0.2.3': + dependencies: + uncrypto: 0.1.3 + + '@better-fetch/fetch@1.1.15': {} + '@biomejs/biome@1.9.4': optionalDependencies: '@biomejs/cli-darwin-arm64': 1.9.4 @@ -7698,11 +7973,11 @@ snapshots: style-mod: 4.1.2 w3c-keyname: 2.2.8 - '@commitlint/cli@19.3.0(@types/node@18.19.42)(typescript@5.5.3)': + '@commitlint/cli@19.3.0(@types/node@18.19.42)(typescript@5.7.2)': dependencies: '@commitlint/format': 19.3.0 '@commitlint/lint': 19.2.2 - '@commitlint/load': 19.2.0(@types/node@18.19.42)(typescript@5.5.3) + '@commitlint/load': 19.2.0(@types/node@18.19.42)(typescript@5.7.2) '@commitlint/read': 19.2.1 '@commitlint/types': 19.0.3 execa: 8.0.1 @@ -7749,15 +8024,15 @@ snapshots: '@commitlint/rules': 19.0.3 '@commitlint/types': 19.0.3 - '@commitlint/load@19.2.0(@types/node@18.19.42)(typescript@5.5.3)': + '@commitlint/load@19.2.0(@types/node@18.19.42)(typescript@5.7.2)': dependencies: '@commitlint/config-validator': 19.0.3 '@commitlint/execute-rule': 19.0.0 '@commitlint/resolve-extends': 19.1.0 '@commitlint/types': 19.0.3 chalk: 5.3.0 - cosmiconfig: 9.0.0(typescript@5.5.3) - cosmiconfig-typescript-loader: 5.0.0(@types/node@18.19.42)(cosmiconfig@9.0.0(typescript@5.5.3))(typescript@5.5.3) + cosmiconfig: 9.0.0(typescript@5.7.2) + cosmiconfig-typescript-loader: 5.0.0(@types/node@18.19.42)(cosmiconfig@9.0.0(typescript@5.7.2))(typescript@5.7.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -7809,6 +8084,11 @@ snapshots: '@types/conventional-commits-parser': 5.0.0 chalk: 5.3.0 + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + optional: true + '@dokploy/trpc-openapi@0.0.4(@trpc/server@10.45.2)(zod@3.23.8)': dependencies: '@trpc/server': 10.45.2 @@ -7822,6 +8102,8 @@ snapshots: transitivePeerDependencies: - uWebSockets.js + '@drizzle-team/brocli@0.10.2': {} + '@emnapi/core@0.45.0': dependencies: tslib: 2.6.3 @@ -8145,8 +8427,13 @@ snapshots: '@floating-ui/utils@0.2.5': {} + '@gar/promisify@1.1.3': + optional: true + '@hapi/bourne@3.0.0': {} + '@hexagon/base64@1.1.28': {} + '@hono/node-server@1.12.1': {} '@hono/zod-validator@0.3.0(hono@4.5.8)(zod@3.23.8)': @@ -8270,6 +8557,12 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + optional: true + '@jsonjoy.com/base64@1.1.2(tslib@2.6.3)': dependencies: tslib: 2.6.3 @@ -8290,6 +8583,8 @@ snapshots: '@leichtgewicht/ip-codec@2.0.5': {} + '@levischuck/tiny-cbor@0.2.11': {} + '@lezer/common@1.2.1': {} '@lezer/highlight@1.2.0': @@ -8316,12 +8611,12 @@ snapshots: dependencies: lucia: 3.2.0 - '@mapbox/node-pre-gyp@1.0.11': + '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)': dependencies: detect-libc: 2.0.3 https-proxy-agent: 5.0.1 make-dir: 3.1.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 @@ -8380,8 +8675,12 @@ snapshots: '@next/swc-win32-x64-msvc@15.0.1': optional: true + '@noble/ciphers@0.6.0': {} + '@noble/hashes@1.5.0': {} + '@noble/hashes@1.7.1': {} + '@node-rs/argon2-android-arm-eabi@1.7.0': optional: true @@ -8522,6 +8821,18 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@npmcli/fs@1.1.1': + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.6.3 + optional: true + + '@npmcli/move-file@1.1.2': + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + optional: true + '@octokit/app@14.1.0': dependencies: '@octokit/auth-app': 6.1.1 @@ -8698,7 +9009,51 @@ snapshots: '@one-ini/wasm@0.1.1': {} - '@opentelemetry/api@1.9.0': {} + '@oslojs/asn1@1.0.0': + dependencies: + '@oslojs/binary': 1.0.0 + + '@oslojs/binary@1.0.0': {} + + '@oslojs/crypto@1.0.1': + dependencies: + '@oslojs/asn1': 1.0.0 + '@oslojs/binary': 1.0.0 + + '@oslojs/encoding@1.1.0': {} + + '@peculiar/asn1-android@2.3.15': + dependencies: + '@peculiar/asn1-schema': 2.3.15 + asn1js: 3.0.5 + tslib: 2.8.1 + + '@peculiar/asn1-ecc@2.3.15': + dependencies: + '@peculiar/asn1-schema': 2.3.15 + '@peculiar/asn1-x509': 2.3.15 + asn1js: 3.0.5 + tslib: 2.8.1 + + '@peculiar/asn1-rsa@2.3.15': + dependencies: + '@peculiar/asn1-schema': 2.3.15 + '@peculiar/asn1-x509': 2.3.15 + asn1js: 3.0.5 + tslib: 2.8.1 + + '@peculiar/asn1-schema@2.3.15': + dependencies: + asn1js: 3.0.5 + pvtsutils: 1.3.6 + tslib: 2.8.1 + + '@peculiar/asn1-x509@2.3.15': + dependencies: + '@peculiar/asn1-schema': 2.3.15 + asn1js: 3.0.5 + pvtsutils: 1.3.6 + tslib: 2.8.1 '@pkgjs/parseargs@0.11.0': optional: true @@ -9693,6 +10048,18 @@ snapshots: domhandler: 5.0.3 selderee: 0.11.0 + '@simplewebauthn/browser@13.1.0': {} + + '@simplewebauthn/server@13.1.1': + dependencies: + '@hexagon/base64': 1.1.28 + '@levischuck/tiny-cbor': 0.2.11 + '@peculiar/asn1-android': 2.3.15 + '@peculiar/asn1-ecc': 2.3.15 + '@peculiar/asn1-rsa': 2.3.15 + '@peculiar/asn1-schema': 2.3.15 + '@peculiar/asn1-x509': 2.3.15 + '@sinclair/typebox@0.27.8': {} '@sindresorhus/is@5.6.0': {} @@ -10074,6 +10441,9 @@ snapshots: '@tanstack/table-core@8.19.3': {} + '@tootallnate/once@1.1.2': + optional: true + '@trpc/client@10.45.2(@trpc/server@10.45.2)': dependencies: '@trpc/server': 10.45.2 @@ -10098,6 +10468,18 @@ snapshots: '@trpc/server@10.45.2': {} + '@tsconfig/node10@1.0.11': + optional: true + + '@tsconfig/node12@1.0.11': + optional: true + + '@tsconfig/node14@1.0.3': + optional: true + + '@tsconfig/node16@1.0.4': + optional: true + '@tybys/wasm-util@0.8.3': dependencies: tslib: 2.6.3 @@ -10462,6 +10844,11 @@ snapshots: dependencies: '@xterm/xterm': 5.5.0 + '@xterm/addon-clipboard@0.1.0(@xterm/xterm@5.5.0)': + dependencies: + '@xterm/xterm': 5.5.0 + js-base64: 3.7.7 + '@xterm/xterm@5.5.0': {} '@xtuc/ieee754@1.2.0': {} @@ -10504,6 +10891,11 @@ snapshots: transitivePeerDependencies: - supports-color + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + optional: true + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 @@ -10594,6 +10986,15 @@ snapshots: delegates: 1.0.0 readable-stream: 3.6.2 + are-we-there-yet@3.0.1: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + optional: true + + arg@4.1.3: + optional: true + arg@5.0.2: {} argparse@1.0.10: @@ -10614,6 +11015,12 @@ snapshots: dependencies: safer-buffer: 2.1.2 + asn1js@3.0.5: + dependencies: + pvtsutils: 1.3.6 + pvutils: 1.1.3 + tslib: 2.8.1 + assertion-error@1.1.0: {} async-await-queue@2.1.4: {} @@ -10654,9 +11061,9 @@ snapshots: dependencies: tweetnacl: 0.14.5 - bcrypt@5.1.1: + bcrypt@5.1.1(encoding@0.1.13): dependencies: - '@mapbox/node-pre-gyp': 1.0.11 + '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) node-addon-api: 5.1.0 transitivePeerDependencies: - encoding @@ -10664,8 +11071,38 @@ snapshots: before-after-hook@2.2.3: {} + better-auth@1.2.0(typescript@5.5.3): + dependencies: + '@better-auth/utils': 0.2.3 + '@better-fetch/fetch': 1.1.15 + '@noble/ciphers': 0.6.0 + '@noble/hashes': 1.7.1 + '@simplewebauthn/browser': 13.1.0 + '@simplewebauthn/server': 13.1.1 + better-call: 1.0.3 + defu: 6.1.4 + jose: 5.9.6 + kysely: 0.27.5 + nanostores: 0.11.3 + valibot: 1.0.0-beta.15(typescript@5.5.3) + zod: 3.24.1 + transitivePeerDependencies: + - typescript + + better-call@1.0.3: + dependencies: + '@better-fetch/fetch': 1.1.15 + rou3: 0.5.1 + set-cookie-parser: 2.7.1 + uncrypto: 0.1.3 + binary-extensions@2.3.0: {} + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + optional: true + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -10752,6 +11189,30 @@ snapshots: cac@6.7.14: {} + cacache@15.3.0: + dependencies: + '@npmcli/fs': 1.1.1 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.3 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.2.1 + unique-filename: 1.1.1 + transitivePeerDependencies: + - bluebird + optional: true + cacheable-lookup@7.0.0: {} cacheable-request@10.2.14: @@ -10852,14 +11313,6 @@ snapshots: cli-boxes@3.0.0: {} - cli-color@2.0.4: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - memoizee: 0.4.17 - timers-ext: 0.1.8 - cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -11026,21 +11479,21 @@ snapshots: core-js@3.39.0: {} - cosmiconfig-typescript-loader@5.0.0(@types/node@18.19.42)(cosmiconfig@9.0.0(typescript@5.5.3))(typescript@5.5.3): + cosmiconfig-typescript-loader@5.0.0(@types/node@18.19.42)(cosmiconfig@9.0.0(typescript@5.7.2))(typescript@5.7.2): dependencies: '@types/node': 18.19.42 - cosmiconfig: 9.0.0(typescript@5.5.3) + cosmiconfig: 9.0.0(typescript@5.7.2) jiti: 1.21.6 - typescript: 5.5.3 + typescript: 5.7.2 - cosmiconfig@9.0.0(typescript@5.5.3): + cosmiconfig@9.0.0(typescript@5.7.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.5.3 + typescript: 5.7.2 cpu-features@0.0.10: dependencies: @@ -11048,6 +11501,9 @@ snapshots: nan: 2.20.0 optional: true + create-require@1.1.1: + optional: true + crelt@1.0.6: {} cron-parser@4.9.0: @@ -11117,11 +11573,6 @@ snapshots: d3-timer@3.0.1: {} - d@1.0.2: - dependencies: - es5-ext: 0.10.64 - type: 2.7.3 - dargs@8.1.0: {} date-fns@3.6.0: {} @@ -11196,9 +11647,8 @@ snapshots: diff-sequences@29.6.3: {} - difflib@0.2.4: - dependencies: - heap: 0.2.7 + diff@4.0.2: + optional: true dijkstrajs@1.0.3: {} @@ -11266,34 +11716,31 @@ snapshots: drange@1.1.1: {} - dreamopt@0.8.0: + drizzle-dbml-generator@0.10.0(drizzle-orm@0.39.1(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7)): dependencies: - wordwrap: 1.0.0 + drizzle-orm: 0.39.1(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7) - drizzle-kit@0.21.4: + drizzle-kit@0.30.4: dependencies: + '@drizzle-team/brocli': 0.10.2 '@esbuild-kit/esm-loader': 2.6.5 - commander: 9.5.0 - env-paths: 3.0.0 esbuild: 0.19.12 esbuild-register: 3.6.0(esbuild@0.19.12) - glob: 8.1.0 - hanji: 0.0.5 - json-diff: 0.9.0 - zod: 3.23.8 transitivePeerDependencies: - supports-color - drizzle-orm@0.30.10(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(postgres@3.4.4)(react@18.2.0): + drizzle-orm@0.39.1(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7): optionalDependencies: '@opentelemetry/api': 1.9.0 '@types/react': 18.3.5 + kysely: 0.27.5 postgres: 3.4.4 react: 18.2.0 + sqlite3: 5.1.7 - drizzle-zod@0.5.1(drizzle-orm@0.30.10(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(postgres@3.4.4)(react@18.2.0))(zod@3.23.8): + drizzle-zod@0.5.1(drizzle-orm@0.39.1(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7))(zod@3.23.8): dependencies: - drizzle-orm: 0.30.10(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(postgres@3.4.4)(react@18.2.0) + drizzle-orm: 0.39.1(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7) zod: 3.23.8 eastasianwidth@0.2.0: {} @@ -11317,6 +11764,11 @@ snapshots: emoji-regex@9.2.2: {} + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + optional: true + end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -11330,10 +11782,11 @@ snapshots: env-paths@2.2.1: {} - env-paths@3.0.0: {} - environment@1.1.0: {} + err-code@2.0.3: + optional: true + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -11346,31 +11799,6 @@ snapshots: es-module-lexer@1.5.4: {} - es5-ext@0.10.64: - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esniff: 2.0.1 - next-tick: 1.1.0 - - es6-iterator@2.0.3: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-symbol: 3.1.4 - - es6-symbol@3.1.4: - dependencies: - d: 1.0.2 - ext: 1.7.0 - - es6-weak-map@2.0.3: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esbuild-plugin-alias@0.2.1: {} esbuild-register@3.6.0(esbuild@0.19.12): @@ -11496,13 +11924,6 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 - esniff@2.0.1: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - event-emitter: 0.3.5 - type: 2.7.3 - esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -11517,11 +11938,6 @@ snapshots: dependencies: '@types/estree': 1.0.5 - event-emitter@0.3.5: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - event-target-shim@5.0.1: {} eventemitter3@4.0.7: {} @@ -11547,12 +11963,6 @@ snapshots: expand-template@2.0.3: optional: true - ext@1.7.0: - dependencies: - type: 2.7.3 - - extend@3.0.2: {} - fancy-ansi@0.1.3: dependencies: escape-html: 1.0.3 @@ -11591,6 +12001,9 @@ snapshots: dependencies: format: 0.2.2 + file-uri-to-path@1.0.0: + optional: true + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -11655,6 +12068,18 @@ snapshots: strip-ansi: 6.0.1 wide-align: 1.1.5 + gauge@4.0.4: + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + optional: true + generic-pool@3.9.0: {} get-caller-file@2.0.5: {} @@ -11718,14 +12143,6 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - global-directory@4.0.1: dependencies: ini: 4.1.1 @@ -11785,11 +12202,6 @@ snapshots: transitivePeerDependencies: - uWebSockets.js - hanji@0.0.5: - dependencies: - lodash.throttle: 4.1.1 - sisteransi: 1.0.5 - has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -11842,8 +12254,6 @@ snapshots: property-information: 5.6.0 space-separated-tokens: 1.1.5 - heap@0.2.7: {} - help-me@5.0.0: {} hi-base32@0.5.1: {} @@ -11887,6 +12297,15 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-proxy-agent@4.0.1: + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + optional: true + http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 @@ -11901,6 +12320,11 @@ snapshots: human-signals@5.0.0: {} + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + optional: true + hyperdyperid@1.2.0: {} hyphenate-style-name@1.1.0: {} @@ -11915,6 +12339,11 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + optional: true + ieee754@1.2.1: {} ignore@5.3.1: {} @@ -11928,10 +12357,16 @@ snapshots: import-meta-resolve@4.1.0: {} + imurmurhash@0.1.4: + optional: true + indent-string@4.0.0: {} indent-string@5.0.0: {} + infer-owner@1.0.4: + optional: true + inflation@2.1.0: {} inflight@1.0.6: @@ -11972,6 +12407,12 @@ snapshots: transitivePeerDependencies: - supports-color + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + optional: true + ip-regex@5.0.0: {} iron-webcrypto@1.2.1: {} @@ -12031,14 +12472,13 @@ snapshots: dependencies: ip-regex: 5.0.0 + is-lambda@1.0.1: + optional: true + is-number@7.0.0: {} is-obj@2.0.0: {} - is-plain-obj@4.1.0: {} - - is-promise@2.2.2: {} - is-stream@3.0.0: {} is-text-path@2.0.0: @@ -12063,8 +12503,12 @@ snapshots: jiti@1.21.6: {} + jose@5.9.6: {} + joycon@3.1.1: {} + js-base64@3.7.7: {} + js-beautify@1.15.1: dependencies: config-chain: 1.1.13 @@ -12085,13 +12529,10 @@ snapshots: dependencies: argparse: 2.0.1 - json-buffer@3.0.1: {} + jsbn@1.1.0: + optional: true - json-diff@0.9.0: - dependencies: - cli-color: 2.0.4 - difflib: 0.2.4 - dreamopt: 0.8.0 + json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -12229,6 +12670,8 @@ snapshots: dependencies: json-buffer: 3.0.1 + kysely@0.27.5: {} + leac@0.6.0: {} lefthook-darwin-arm64@1.8.4: @@ -12355,8 +12798,6 @@ snapshots: lodash.startcase@4.4.0: {} - lodash.throttle@4.1.1: {} - lodash.uniq@4.5.0: {} lodash.upperfirst@4.3.1: {} @@ -12392,9 +12833,10 @@ snapshots: lru-cache@10.4.3: {} - lru-queue@0.1.0: + lru-cache@6.0.0: dependencies: - es5-ext: 0.10.64 + yallist: 4.0.0 + optional: true lucia@3.2.0: dependencies: @@ -12414,6 +12856,32 @@ snapshots: dependencies: semver: 6.3.1 + make-error@1.3.6: + optional: true + + make-fetch-happen@9.1.0: + dependencies: + agentkeepalive: 4.6.0 + cacache: 15.3.0 + http-cache-semantics: 4.1.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 1.4.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 6.2.1 + ssri: 8.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + optional: true + marked@7.0.4: {} md-to-react-email@5.0.2(react@18.2.0): @@ -12529,17 +12997,6 @@ snapshots: tree-dump: 1.0.2(tslib@2.6.3) tslib: 2.6.3 - memoizee@0.4.17: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-weak-map: 2.0.3 - event-emitter: 0.3.5 - is-promise: 2.2.2 - lru-queue: 0.1.0 - next-tick: 1.1.0 - timers-ext: 0.1.8 - meow@12.1.1: {} merge-descriptors@1.0.3: {} @@ -12714,10 +13171,6 @@ snapshots: dependencies: brace-expansion: 1.1.11 - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 - minimatch@7.4.6: dependencies: brace-expansion: 2.0.1 @@ -12732,6 +13185,35 @@ snapshots: minimist@1.2.8: {} + minipass-collect@1.0.2: + dependencies: + minipass: 3.3.6 + optional: true + + minipass-fetch@1.4.1: + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + optional: true + + minipass-flush@1.0.5: + dependencies: + minipass: 3.3.6 + optional: true + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + optional: true + + minipass-sized@1.0.3: + dependencies: + minipass: 3.3.6 + optional: true + minipass@3.3.6: dependencies: yallist: 4.0.0 @@ -12788,7 +13270,7 @@ snapshots: nanoid@3.3.7: {} - nanoid@3.3.8: {} + nanostores@0.11.3: {} napi-build-utils@1.0.2: optional: true @@ -12817,9 +13299,7 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - next-tick@1.1.0: {} - - next@15.0.1(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + next@15.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@next/env': 15.0.1 '@swc/counter': 0.1.3 @@ -12847,13 +13327,16 @@ snapshots: node-abi@3.68.0: dependencies: - semver: 7.6.2 + semver: 7.6.3 optional: true node-abort-controller@3.1.1: {} node-addon-api@5.1.0: {} + node-addon-api@7.1.1: + optional: true + node-domexception@1.0.0: {} node-fetch-commonjs@3.3.2: @@ -12863,15 +13346,34 @@ snapshots: node-fetch-native@1.6.4: {} - node-fetch@2.7.0: + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 node-gyp-build-optional-packages@5.2.2: dependencies: detect-libc: 2.0.3 optional: true + node-gyp@8.4.1: + dependencies: + env-paths: 2.2.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 9.1.0 + nopt: 5.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.6.3 + tar: 6.2.1 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + optional: true + node-mocks-http@1.15.0: dependencies: '@types/express': 4.17.21 @@ -12928,6 +13430,14 @@ snapshots: gauge: 3.0.2 set-blocking: 2.0.0 + npmlog@6.0.2: + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + optional: true + object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -13012,6 +13522,11 @@ snapshots: dependencies: p-limit: 4.0.0 + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + optional: true + p-try@2.2.0: {} package-json-from-dist@1.0.0: {} @@ -13154,12 +13669,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.4.40 - postcss-load-config@4.0.2(postcss@8.4.40): + postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.3)): dependencies: lilconfig: 3.1.2 yaml: 2.4.5 optionalDependencies: postcss: 8.4.40 + ts-node: 10.9.2(@types/node@18.19.42)(typescript@5.5.3) postcss-nested@6.2.0(postcss@8.4.40): dependencies: @@ -13222,6 +13738,15 @@ snapshots: process@0.11.10: {} + promise-inflight@1.0.1: + optional: true + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + optional: true + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -13252,6 +13777,12 @@ snapshots: punycode@2.3.1: {} + pvtsutils@1.3.6: + dependencies: + tslib: 2.8.1 + + pvutils@1.1.3: {} + qrcode@1.5.4: dependencies: dijkstrajs: 1.0.3 @@ -13319,6 +13850,11 @@ snapshots: prop-types: 15.8.1 react: 18.2.0 + react-day-picker@8.10.1(date-fns@3.6.0)(react@18.2.0): + dependencies: + date-fns: 3.6.0 + react: 18.2.0 + react-debounce-input@3.3.0(react@18.2.0): dependencies: lodash.debounce: 4.0.8 @@ -13608,6 +14144,9 @@ snapshots: ret@0.2.2: {} + retry@0.12.0: + optional: true + reusify@1.0.4: {} rfdc@1.4.1: {} @@ -13640,6 +14179,8 @@ snapshots: rotating-file-stream@3.2.3: {} + rou3@0.5.1: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -13692,6 +14233,8 @@ snapshots: set-blocking@2.0.0: {} + set-cookie-parser@2.7.1: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -13773,8 +14316,6 @@ snapshots: is-arrayish: 0.3.2 optional: true - sisteransi@1.0.5: {} - slash@3.0.0: {} slash@5.1.0: {} @@ -13791,6 +14332,24 @@ snapshots: slugify@1.6.6: {} + smart-buffer@4.2.0: + optional: true + + socks-proxy-agent@6.2.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.7 + socks: 2.8.3 + transitivePeerDependencies: + - supports-color + optional: true + + socks@2.8.3: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + optional: true + sonic-boom@4.1.0: dependencies: atomic-sleep: 1.0.0 @@ -13821,6 +14380,22 @@ snapshots: sprintf-js@1.0.3: {} + sprintf-js@1.1.3: + optional: true + + sqlite3@5.1.7: + dependencies: + bindings: 1.5.0 + node-addon-api: 7.1.1 + prebuild-install: 7.1.2 + tar: 6.2.1 + optionalDependencies: + node-gyp: 8.4.1 + transitivePeerDependencies: + - bluebird + - supports-color + optional: true + ssh2@1.15.0: dependencies: asn1: 0.2.6 @@ -13829,6 +14404,11 @@ snapshots: cpu-features: 0.0.10 nan: 2.20.0 + ssri@8.0.1: + dependencies: + minipass: 3.3.6 + optional: true + stackback@0.0.2: {} standard-as-callback@2.1.0: {} @@ -14000,11 +14580,11 @@ snapshots: tailwind-merge@2.4.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.7): + tailwindcss-animate@1.0.7(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.3))): dependencies: - tailwindcss: 3.4.7 + tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.3)) - tailwindcss@3.4.7: + tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -14023,7 +14603,7 @@ snapshots: postcss: 8.4.40 postcss-import: 15.1.0(postcss@8.4.40) postcss-js: 4.0.1(postcss@8.4.40) - postcss-load-config: 4.0.2(postcss@8.4.40) + postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.3)) postcss-nested: 6.2.0(postcss@8.4.40) postcss-selector-parser: 6.1.1 resolve: 1.22.8 @@ -14105,11 +14685,6 @@ snapshots: through@2.3.8: {} - timers-ext@0.1.8: - dependencies: - es5-ext: 0.10.64 - next-tick: 1.1.0 - tiny-invariant@1.3.3: {} tiny-warning@1.0.3: {} @@ -14158,6 +14733,25 @@ snapshots: ts-mixer@6.0.4: {} + ts-node@10.9.2(@types/node@18.19.42)(typescript@5.5.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 18.19.42 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + ts-toolbelt@9.6.0: {} tsc-alias@1.8.10: @@ -14175,6 +14769,8 @@ snapshots: tslib@2.6.3: {} + tslib@2.8.1: {} + tsx@4.16.2: dependencies: esbuild: 0.21.5 @@ -14200,14 +14796,14 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - type@2.7.3: {} - types-ramda@0.30.1: dependencies: ts-toolbelt: 9.6.0 typescript@5.5.3: {} + typescript@5.7.2: {} + ufo@1.5.4: {} uncrypto@0.1.3: {} @@ -14226,38 +14822,15 @@ snapshots: unicorn-magic@0.1.0: {} - unified@11.0.5: + unique-filename@1.1.1: dependencies: - '@types/unist': 3.0.3 - bail: 2.0.2 - devlop: 1.1.0 - extend: 3.0.2 - is-plain-obj: 4.1.0 - trough: 2.2.0 - vfile: 6.0.3 + unique-slug: 2.0.2 + optional: true - unist-util-is@6.0.0: + unique-slug@2.0.2: dependencies: - '@types/unist': 3.0.3 - - unist-util-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-stringify-position@4.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-visit-parents@6.0.1: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - - unist-util-visit@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + imurmurhash: 0.1.4 + optional: true universal-github-app-jwt@1.1.2: dependencies: @@ -14318,15 +14891,12 @@ snapshots: uuid@9.0.1: {} - vfile-message@4.0.2: - dependencies: - '@types/unist': 3.0.3 - unist-util-stringify-position: 4.0.0 + v8-compile-cache-lib@3.0.1: + optional: true - vfile@6.0.3: - dependencies: - '@types/unist': 3.0.3 - vfile-message: 4.0.2 + valibot@1.0.0-beta.15(typescript@5.5.3): + optionalDependencies: + typescript: 5.5.3 victory-vendor@36.9.2: dependencies: @@ -14489,8 +15059,6 @@ snapshots: dependencies: string-width: 5.1.2 - wordwrap@1.0.0: {} - wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -14572,6 +15140,9 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yn@3.1.1: + optional: true + yocto-queue@1.1.1: {} zenscroll@4.0.2: {} @@ -14590,4 +15161,4 @@ snapshots: zod@3.23.8: {} - zwitch@2.0.4: {} + zod@3.24.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3ca0730a..2cb911db 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,7 @@ packages: - "apps/dokploy" - "apps/api" + - "apps/monitoring" - "apps/schedules" - "apps/models" - "packages/server"