From ade7c8566dcd2bfc55da64ccb0055570818a15f9 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 23 Jan 2023 10:37:14 +0100 Subject: [PATCH] fix: cleanupStuckedContainers --- apps/api/src/index.ts | 19 +- apps/{ => others}/backup/.dockerignore | 0 apps/{ => others}/backup/Dockerfile | 0 apps/{ => others}/backup/backups/.gitkeep | 0 apps/{ => others}/backup/package.json | 0 apps/{ => others}/backup/src/index.mjs | 0 apps/{ => others}/i18n/.env.example | 0 apps/{ => others}/i18n/.gitignore | 0 apps/{ => others}/i18n/index.mjs | 0 apps/{ => others}/i18n/package.json | 0 .../client/.eslintignore | 0 .../client/.eslintrc.cjs | 0 .../{ => trpc-experimental}/client/.gitignore | 0 apps/{ => trpc-experimental}/client/.npmrc | 0 .../client/.prettierignore | 0 .../client/.prettierrc | 0 apps/{ => trpc-experimental}/client/README.md | 0 .../client/package.json | 0 .../client/playwright.config.ts | 0 .../client/pnpm-lock.yaml | 0 .../client/postcss.config.cjs | 0 .../client/src/app.d.ts | 0 .../client/src/app.html | 0 .../client/src/app.postcss | 0 .../client/src/lib/common.ts | 0 .../client/src/lib/components/Beta.svelte | 0 .../lib/components/CopyPasswordField.svelte | 0 .../client/src/lib/components/DocLink.svelte | 0 .../src/lib/components/Explainer.svelte | 0 .../src/lib/components/ExternalLink.svelte | 0 .../client/src/lib/components/Setting.svelte | 0 .../src/lib/components/SimpleExplainer.svelte | 0 .../client/src/lib/components/Toast.svelte | 0 .../client/src/lib/components/Toasts.svelte | 0 .../client/src/lib/components/Tooltip.svelte | 0 .../src/lib/components/UpdateAvailable.svelte | 0 .../src/lib/components/icons/Delete.svelte | 0 .../lib/components/icons/RemoteLink.svelte | 0 .../applications/ApplicationIcons.svelte | 0 .../icons/applications/Astro.svelte | 0 .../icons/applications/Compose.svelte | 0 .../components/icons/applications/Deno.svelte | 0 .../icons/applications/Docker.svelte | 0 .../icons/applications/Eleventy.svelte | 0 .../icons/applications/Gatsby.svelte | 0 .../icons/applications/Heroku.svelte | 0 .../icons/applications/Laravel.svelte | 0 .../icons/applications/Nestjs.svelte | 0 .../icons/applications/Nextjs.svelte | 0 .../icons/applications/Nodejs.svelte | 0 .../icons/applications/Nuxtjs.svelte | 0 .../components/icons/applications/PHP.svelte | 0 .../icons/applications/Python.svelte | 0 .../icons/applications/React.svelte | 0 .../components/icons/applications/Rust.svelte | 0 .../icons/applications/Static.svelte | 0 .../icons/applications/Svelte.svelte | 0 .../icons/applications/Vuejs.svelte | 0 .../components/icons/applications/index.ts | 0 .../icons/databases/Clickhouse.svelte | 0 .../components/icons/databases/CouchDB.svelte | 0 .../icons/databases/DatabaseIcons.svelte | 0 .../components/icons/databases/EdgeDB.svelte | 0 .../components/icons/databases/MariaDB.svelte | 0 .../components/icons/databases/MongoDB.svelte | 0 .../components/icons/databases/MySQL.svelte | 0 .../icons/databases/PostgreSQL.svelte | 0 .../components/icons/databases/Redis.svelte | 0 .../lib/components/icons/databases/index.ts | 0 .../icons/destinations/LocalDocker.svelte | 0 .../icons/destinations/RemoteDocker.svelte | 0 .../components/icons/destinations/index.ts | 0 .../client/src/lib/components/icons/index.ts | 0 .../icons/services/ServiceIcons.svelte | 0 .../components/icons/sources/Github.svelte | 0 .../components/icons/sources/Gitlab.svelte | 0 .../src/lib/components/icons/sources/index.ts | 0 .../client/src/lib/dayjs.ts | 0 .../client/src/lib/store.ts | 0 .../client/src/routes/+error.svelte | 0 .../client/src/routes/+layout.svelte | 0 .../client/src/routes/+layout.ts | 0 .../client/src/routes/+page.svelte | 0 .../client/src/routes/+page.ts | 0 .../routes/applications/[id]/+layout.svelte | 0 .../src/routes/applications/[id]/+layout.ts | 0 .../src/routes/applications/[id]/+page.svelte | 0 .../applications/[id]/builds/+page.svelte | 0 .../routes/applications/[id]/builds/+page.ts | 0 .../applications/[id]/builds/BuildLog.svelte | 0 .../[id]/components/Buttons/Delete.svelte | 0 .../[id]/components/Buttons/Deploy.svelte | 0 .../components/Buttons/ForceDeploy.svelte | 0 .../[id]/components/Buttons/Loading.svelte | 0 .../[id]/components/Buttons/Restart.svelte | 0 .../[id]/components/Buttons/Stop.svelte | 0 .../[id]/components/Buttons/index.ts | 0 .../applications/[id]/components/Menu.svelte | 0 .../[id]/components/States/Degraded.svelte | 0 .../[id]/components/States/Healthy.svelte | 0 .../[id]/components/States/Loading.svelte | 0 .../[id]/components/States/Stopped.svelte | 0 .../[id]/components/States/index.ts | 0 .../applications/[id]/danger/+page.svelte | 0 .../applications/[id]/features/+page.svelte | 0 .../applications/[id]/logs/+page.svelte | 0 .../applications/[id]/previews/+page.svelte | 0 .../applications/[id]/revert/+page.svelte | 0 .../routes/applications/[id]/revert/+page.ts | 0 .../applications/[id]/secrets/+page.svelte | 0 .../routes/applications/[id]/secrets/+page.ts | 0 .../secrets/components/PreviewSecret.svelte | 0 .../[id]/secrets/components/Secret.svelte | 0 .../applications/[id]/storages/+page.svelte | 0 .../applications/[id]/storages/+page.ts | 0 .../[id]/storages/components/Storage.svelte | 0 .../applications/[id]/usage/+page.svelte | 0 .../src/routes/applications/[id]/utils.ts | 0 .../src/routes/components/NewResource.svelte | 0 .../src/routes/databases/[id]/+layout.svelte | 0 .../src/routes/databases/[id]/+layout.ts | 0 .../src/routes/databases/[id]/+page.svelte | 0 .../[id]/components/DatabaseLinks.svelte | 0 .../[id]/components/Databases/CouchDb.svelte | 0 .../components/Databases/Databases.svelte | 0 .../[id]/components/Databases/EdgeDB.svelte | 0 .../[id]/components/Databases/MariaDB.svelte | 0 .../[id]/components/Databases/MongoDB.svelte | 0 .../[id]/components/Databases/MySQL.svelte | 0 .../components/Databases/PostgreSQL.svelte | 0 .../[id]/components/Databases/Redis.svelte | 0 .../client/src/routes/databases/[id]/utils.ts | 0 .../routes/destinations/[id]/+layout.svelte | 0 .../src/routes/destinations/[id]/+layout.ts | 0 .../src/routes/destinations/[id]/+page.svelte | 0 .../[id]/components/Destination.svelte | 0 .../[id]/components/LocalDocker.svelte | 0 .../destinations/[id]/components/New.svelte | 0 .../[id]/components/NewLocalDocker.svelte | 0 .../[id]/components/NewRemoteDocker.svelte | 0 .../[id]/components/RemoteDocker.svelte | 0 .../client/src/routes/login/+page.svelte | 0 .../client/src/routes/register/+page.svelte | 0 .../src/routes/services/[id]/+layout.svelte | 0 .../src/routes/services/[id]/+layout.ts | 0 .../src/routes/services/[id]/+page.svelte | 0 .../services/[id]/components/Menu.svelte | 0 .../[id]/components/ServiceLinks.svelte | 0 .../[id]/components/ServiceStatus.svelte | 0 .../services/[id]/components/Wordpress.svelte | 0 .../routes/services/[id]/danger/+page.svelte | 0 .../routes/services/[id]/logs/+page.svelte | 0 .../routes/services/[id]/secrets/+page.svelte | 0 .../src/routes/services/[id]/secrets/+page.ts | 0 .../[id]/secrets/components/Secret.svelte | 0 .../src/routes/services/[id]/secrets/utils.ts | 0 .../services/[id]/storages/+page.svelte | 0 .../routes/services/[id]/storages/+page.ts | 0 .../[id]/storages/components/Storage.svelte | 0 .../client/src/routes/services/[id]/utils.ts | 0 .../src/routes/sources/[id]/+layout.svelte | 0 .../client/src/routes/sources/[id]/+layout.ts | 0 .../src/routes/sources/[id]/+page.svelte | 0 .../sources/[id]/components/Github.svelte | 0 .../sources/[id]/components/Gitlab.svelte | 0 .../routes/sources/[id]/components/New.svelte | 0 .../sources/[id]/components/Source.svelte | 0 .../client/static/favicon.png | Bin .../client/static/icons/appsmith.png | Bin .../client/static/icons/appwrite.png | Bin .../client/static/icons/compose.png | Bin .../client/static/icons/default.png | Bin .../client/static/icons/directus.svg | 0 .../client/static/icons/fider.png | Bin .../client/static/icons/ghost.png | Bin .../client/static/icons/gitea.svg | 0 .../client/static/icons/glitchtip.svg | 0 .../client/static/icons/grafana.png | Bin .../client/static/icons/hasura.png | Bin .../client/static/icons/keycloak.png | Bin .../client/static/icons/languagetool.svg | 0 .../client/static/icons/lavalink.png | Bin .../client/static/icons/libretranslate.png | Bin .../client/static/icons/meilisearch.svg | 0 .../client/static/icons/minio.png | Bin .../client/static/icons/moodle.png | Bin .../client/static/icons/n8n.svg | 0 .../client/static/icons/nocodb.png | Bin .../client/static/icons/openblocks.png | Bin .../static/icons/plausibleanalytics.png | Bin .../client/static/icons/pocketbase.svg | 0 .../client/static/icons/searxng.svg | 0 .../client/static/icons/trilium.png | Bin .../client/static/icons/umami.svg | 0 .../client/static/icons/uptimekuma.svg | 0 .../client/static/icons/vaultwarden.svg | 0 .../client/static/icons/vscodeserver.png | Bin .../client/static/icons/weblate.svg | 0 .../client/static/icons/whoogle.png | Bin .../client/static/icons/wordpress.svg | 0 ...ns-v19-latin-ext_latin_devanagari-500.woff | Bin ...s-v19-latin-ext_latin_devanagari-500.woff2 | Bin ...19-latin-ext_latin_devanagari-regular.woff | Bin ...9-latin-ext_latin_devanagari-regular.woff2 | Bin .../client/svelte.config.js | 0 .../client/tailwind.config.cjs | 0 .../client/tests/test.ts | 0 .../client/tsconfig.json | 0 .../client/vite.config.ts | 0 .../server/.env-template | 0 .../server/.prettierrc | 0 .../server/build/api/index.js | 31 + apps/trpc-experimental/server/build/config.js | 32 + apps/trpc-experimental/server/build/env.js | 18 + apps/trpc-experimental/server/build/index.js | 5 + .../build/jobs/applicationBuildQueue.js | 813 +++++++++++ .../server/build/lib/buildPacks/common.js | 842 +++++++++++ .../server/build/lib/buildPacks/compose.js | 137 ++ .../server/build/lib/buildPacks/deno.js | 74 + .../server/build/lib/buildPacks/docker.js | 51 + .../server/build/lib/buildPacks/gatsby.js | 50 + .../server/build/lib/buildPacks/heroku.js | 41 + .../server/build/lib/buildPacks/index.js | 88 ++ .../server/build/lib/buildPacks/laravel.js | 68 + .../server/build/lib/buildPacks/nestjs.js | 52 + .../server/build/lib/buildPacks/nextjs.js | 89 ++ .../server/build/lib/buildPacks/node.js | 71 + .../server/build/lib/buildPacks/nuxtjs.js | 89 ++ .../server/build/lib/buildPacks/php.js | 71 + .../server/build/lib/buildPacks/python.js | 86 ++ .../server/build/lib/buildPacks/react.js | 50 + .../server/build/lib/buildPacks/rust.js | 69 + .../server/build/lib/buildPacks/static.js | 77 + .../server/build/lib/buildPacks/svelte.js | 50 + .../server/build/lib/buildPacks/vuejs.js | 50 + .../server/build/lib/common.js | 952 ++++++++++++ .../server/build/lib/dayjs.js | 38 + .../server/build/lib/docker.js | 168 +++ .../server/build/lib/executeCommand.js | 207 +++ .../server/build/lib/importers/github.js | 108 ++ .../server/build/lib/importers/gitlab.js | 76 + .../server/build/lib/importers/index.js | 37 + .../server/build/lib/logging.js | 75 + .../trpc-experimental/server/build/lib/ssh.js | 76 + apps/trpc-experimental/server/build/prisma.js | 36 + .../server/build/scheduler.js | 48 + apps/trpc-experimental/server/build/server.js | 99 ++ .../server/build/trpc/context.js | 43 + .../server/build/trpc/index.js | 39 + .../build/trpc/routers/applications/index.js | 1277 +++++++++++++++++ .../build/trpc/routers/applications/lib.js | 526 +++++++ .../server/build/trpc/routers/auth.js | 201 +++ .../server/build/trpc/routers/dashboard.js | 87 ++ .../build/trpc/routers/databases/index.js | 384 +++++ .../build/trpc/routers/databases/lib.js | 316 ++++ .../build/trpc/routers/destinations/index.js | 220 +++ .../server/build/trpc/routers/index.js | 25 + .../build/trpc/routers/services/index.js | 846 +++++++++++ .../server/build/trpc/routers/services/lib.js | 371 +++++ .../server/build/trpc/routers/settings.js | 108 ++ .../build/trpc/routers/sources/index.js | 241 ++++ .../server/build/trpc/trpc.js | 65 + .../server/db/.gitkeep | 0 apps/trpc-experimental/server/db/dev.db | Bin 0 -> 1970176 bytes apps/trpc-experimental/server/db/migration.db | Bin 0 -> 671744 bytes .../server/db/migration.db-journal | Bin 0 -> 29240 bytes .../server/devTags.json | 0 .../server/devTemplates.yaml | 0 .../server/nodemon.json | 0 .../server/package.json | 0 .../20220131142425_init/migration.sql | 0 .../20220210104005_redis_aol/migration.sql | 0 .../migration.sql | 0 .../20220217211304_dualcerts/migration.sql | 0 .../20220219231255_prmr_secrets/migration.sql | 0 .../migration.sql | 0 .../20220301101928_proxyhash/migration.sql | 0 .../migration.sql | 0 .../20220311213422_autodeploy/migration.sql | 0 .../20220320141424_phpmodules/migration.sql | 0 .../migration.sql | 0 .../20220327180323_ghost/migration.sql | 0 .../20220402135305_python/migration.sql | 0 .../20220402210645_meilisearch/migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../20220425071132_umami/migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../20220427133656_hasura/migration.sql | 0 .../20220429202516_fider/migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../20220517081328_traefik/migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../20220718083646_moodle/migration.sql | 0 .../migration.sql | 0 .../20220721084020_ssh_key/migration.sql | 0 .../20220722203927_ipaddress/migration.sql | 0 .../20220725191205_architecture/migration.sql | 0 .../20220726121333_fix_ssh_key/migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../20220815092230_glitchtip/migration.sql | 0 .../20220815133844_appwrite/migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../20221128104158_do_not_track/migration.sql | 0 .../20221128104718_fix_defaults/migration.sql | 0 .../migration.sql | 0 .../20221129081832_fix_defaults/migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../prisma/migrations/migration_lock.toml | 0 .../server/prisma/schema.prisma | 0 .../server/prisma/seed.js | 0 .../server/src/api/index.ts | 0 .../server/src/config.ts | 0 .../{ => trpc-experimental}/server/src/env.js | 0 .../server/src/index.ts | 0 .../server/src/jobs/applicationBuildQueue.ts | 0 .../server/src/lib/buildPacks/common.ts | 0 .../server/src/lib/buildPacks/compose.ts | 0 .../server/src/lib/buildPacks/deno.ts | 0 .../server/src/lib/buildPacks/docker.ts | 0 .../server/src/lib/buildPacks/gatsby.ts | 0 .../server/src/lib/buildPacks/heroku.ts | 0 .../server/src/lib/buildPacks/index.ts | 0 .../server/src/lib/buildPacks/laravel.ts | 0 .../server/src/lib/buildPacks/nestjs.ts | 0 .../server/src/lib/buildPacks/nextjs.ts | 0 .../server/src/lib/buildPacks/node.ts | 0 .../server/src/lib/buildPacks/nuxtjs.ts | 0 .../server/src/lib/buildPacks/php.ts | 0 .../server/src/lib/buildPacks/python.ts | 0 .../server/src/lib/buildPacks/react.ts | 0 .../server/src/lib/buildPacks/rust.ts | 0 .../server/src/lib/buildPacks/static.ts | 0 .../server/src/lib/buildPacks/svelte.ts | 0 .../server/src/lib/buildPacks/vuejs.ts | 0 .../server/src/lib/common.ts | 0 .../server/src/lib/dayjs.ts | 0 .../server/src/lib/docker.ts | 0 .../server/src/lib/executeCommand.ts | 0 .../server/src/lib/importers/github.ts | 0 .../server/src/lib/importers/gitlab.ts | 0 .../server/src/lib/importers/index.ts | 0 .../server/src/lib/logging.ts | 0 .../server/src/lib/ssh.ts | 0 .../server/src/prisma.ts | 0 .../server/src/scheduler.ts | 0 .../server/src/server.ts | 0 .../server/src/tags.json | 0 .../server/src/templates.json | 0 .../server/src/trpc/context.ts | 0 .../server/src/trpc/index.ts | 0 .../src/trpc/routers/applications/index.ts | 0 .../src/trpc/routers/applications/lib.ts | 0 .../server/src/trpc/routers/auth.ts | 0 .../server/src/trpc/routers/dashboard.ts | 0 .../src/trpc/routers/databases/index.ts | 0 .../server/src/trpc/routers/databases/lib.ts | 0 .../src/trpc/routers/destinations/index.ts | 0 .../server/src/trpc/routers/index.ts | 0 .../server/src/trpc/routers/services/index.ts | 0 .../server/src/trpc/routers/services/lib.ts | 0 .../server/src/trpc/routers/settings.ts | 0 .../server/src/trpc/routers/sources/index.ts | 0 .../server/src/trpc/trpc.ts | 0 apps/{ => trpc-experimental}/server/tags.json | 0 .../server/templates.json | 0 .../server/tsconfig.json | 0 415 files changed, 9686 insertions(+), 6 deletions(-) rename apps/{ => others}/backup/.dockerignore (100%) rename apps/{ => others}/backup/Dockerfile (100%) rename apps/{ => others}/backup/backups/.gitkeep (100%) rename apps/{ => others}/backup/package.json (100%) rename apps/{ => others}/backup/src/index.mjs (100%) rename apps/{ => others}/i18n/.env.example (100%) rename apps/{ => others}/i18n/.gitignore (100%) rename apps/{ => others}/i18n/index.mjs (100%) rename apps/{ => others}/i18n/package.json (100%) rename apps/{ => trpc-experimental}/client/.eslintignore (100%) rename apps/{ => trpc-experimental}/client/.eslintrc.cjs (100%) rename apps/{ => trpc-experimental}/client/.gitignore (100%) rename apps/{ => trpc-experimental}/client/.npmrc (100%) rename apps/{ => trpc-experimental}/client/.prettierignore (100%) rename apps/{ => trpc-experimental}/client/.prettierrc (100%) rename apps/{ => trpc-experimental}/client/README.md (100%) rename apps/{ => trpc-experimental}/client/package.json (100%) rename apps/{ => trpc-experimental}/client/playwright.config.ts (100%) rename apps/{ => trpc-experimental}/client/pnpm-lock.yaml (100%) rename apps/{ => trpc-experimental}/client/postcss.config.cjs (100%) rename apps/{ => trpc-experimental}/client/src/app.d.ts (100%) rename apps/{ => trpc-experimental}/client/src/app.html (100%) rename apps/{ => trpc-experimental}/client/src/app.postcss (100%) rename apps/{ => trpc-experimental}/client/src/lib/common.ts (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/Beta.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/CopyPasswordField.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/DocLink.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/Explainer.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/ExternalLink.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/Setting.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/SimpleExplainer.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/Toast.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/Toasts.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/Tooltip.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/UpdateAvailable.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/Delete.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/RemoteLink.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/ApplicationIcons.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/Astro.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/Compose.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/Deno.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/Docker.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/Eleventy.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/Gatsby.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/Heroku.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/Laravel.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/Nestjs.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/Nextjs.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/Nodejs.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/Nuxtjs.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/PHP.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/Python.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/React.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/Rust.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/Static.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/Svelte.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/Vuejs.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/applications/index.ts (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/databases/Clickhouse.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/databases/CouchDB.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/databases/DatabaseIcons.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/databases/EdgeDB.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/databases/MariaDB.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/databases/MongoDB.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/databases/MySQL.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/databases/PostgreSQL.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/databases/Redis.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/databases/index.ts (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/destinations/LocalDocker.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/destinations/RemoteDocker.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/destinations/index.ts (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/index.ts (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/services/ServiceIcons.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/sources/Github.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/sources/Gitlab.svelte (100%) rename apps/{ => trpc-experimental}/client/src/lib/components/icons/sources/index.ts (100%) rename apps/{ => trpc-experimental}/client/src/lib/dayjs.ts (100%) rename apps/{ => trpc-experimental}/client/src/lib/store.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/+error.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/+layout.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/+layout.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/+page.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/+layout.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/+layout.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/builds/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/builds/+page.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/builds/BuildLog.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/components/Buttons/Delete.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/components/Buttons/Deploy.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/components/Buttons/ForceDeploy.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/components/Buttons/Loading.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/components/Buttons/Restart.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/components/Buttons/Stop.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/components/Buttons/index.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/components/Menu.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/components/States/Degraded.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/components/States/Healthy.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/components/States/Loading.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/components/States/Stopped.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/components/States/index.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/danger/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/features/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/logs/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/previews/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/revert/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/revert/+page.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/secrets/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/secrets/+page.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/secrets/components/PreviewSecret.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/secrets/components/Secret.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/storages/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/storages/+page.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/storages/components/Storage.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/usage/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/applications/[id]/utils.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/components/NewResource.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/databases/[id]/+layout.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/databases/[id]/+layout.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/databases/[id]/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/databases/[id]/components/DatabaseLinks.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/databases/[id]/components/Databases/CouchDb.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/databases/[id]/components/Databases/Databases.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/databases/[id]/components/Databases/EdgeDB.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/databases/[id]/components/Databases/MariaDB.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/databases/[id]/components/Databases/MongoDB.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/databases/[id]/components/Databases/MySQL.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/databases/[id]/components/Databases/PostgreSQL.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/databases/[id]/components/Databases/Redis.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/databases/[id]/utils.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/destinations/[id]/+layout.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/destinations/[id]/+layout.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/destinations/[id]/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/destinations/[id]/components/Destination.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/destinations/[id]/components/LocalDocker.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/destinations/[id]/components/New.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/destinations/[id]/components/NewLocalDocker.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/destinations/[id]/components/NewRemoteDocker.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/destinations/[id]/components/RemoteDocker.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/login/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/register/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/services/[id]/+layout.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/services/[id]/+layout.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/services/[id]/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/services/[id]/components/Menu.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/services/[id]/components/ServiceLinks.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/services/[id]/components/ServiceStatus.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/services/[id]/components/Wordpress.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/services/[id]/danger/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/services/[id]/logs/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/services/[id]/secrets/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/services/[id]/secrets/+page.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/services/[id]/secrets/components/Secret.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/services/[id]/secrets/utils.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/services/[id]/storages/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/services/[id]/storages/+page.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/services/[id]/storages/components/Storage.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/services/[id]/utils.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/sources/[id]/+layout.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/sources/[id]/+layout.ts (100%) rename apps/{ => trpc-experimental}/client/src/routes/sources/[id]/+page.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/sources/[id]/components/Github.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/sources/[id]/components/Gitlab.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/sources/[id]/components/New.svelte (100%) rename apps/{ => trpc-experimental}/client/src/routes/sources/[id]/components/Source.svelte (100%) rename apps/{ => trpc-experimental}/client/static/favicon.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/appsmith.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/appwrite.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/compose.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/default.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/directus.svg (100%) rename apps/{ => trpc-experimental}/client/static/icons/fider.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/ghost.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/gitea.svg (100%) rename apps/{ => trpc-experimental}/client/static/icons/glitchtip.svg (100%) rename apps/{ => trpc-experimental}/client/static/icons/grafana.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/hasura.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/keycloak.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/languagetool.svg (100%) rename apps/{ => trpc-experimental}/client/static/icons/lavalink.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/libretranslate.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/meilisearch.svg (100%) rename apps/{ => trpc-experimental}/client/static/icons/minio.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/moodle.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/n8n.svg (100%) rename apps/{ => trpc-experimental}/client/static/icons/nocodb.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/openblocks.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/plausibleanalytics.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/pocketbase.svg (100%) rename apps/{ => trpc-experimental}/client/static/icons/searxng.svg (100%) rename apps/{ => trpc-experimental}/client/static/icons/trilium.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/umami.svg (100%) rename apps/{ => trpc-experimental}/client/static/icons/uptimekuma.svg (100%) rename apps/{ => trpc-experimental}/client/static/icons/vaultwarden.svg (100%) rename apps/{ => trpc-experimental}/client/static/icons/vscodeserver.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/weblate.svg (100%) rename apps/{ => trpc-experimental}/client/static/icons/whoogle.png (100%) rename apps/{ => trpc-experimental}/client/static/icons/wordpress.svg (100%) rename apps/{ => trpc-experimental}/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff (100%) rename apps/{ => trpc-experimental}/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff2 (100%) rename apps/{ => trpc-experimental}/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff (100%) rename apps/{ => trpc-experimental}/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff2 (100%) rename apps/{ => trpc-experimental}/client/svelte.config.js (100%) rename apps/{ => trpc-experimental}/client/tailwind.config.cjs (100%) rename apps/{ => trpc-experimental}/client/tests/test.ts (100%) rename apps/{ => trpc-experimental}/client/tsconfig.json (100%) rename apps/{ => trpc-experimental}/client/vite.config.ts (100%) rename apps/{ => trpc-experimental}/server/.env-template (100%) rename apps/{ => trpc-experimental}/server/.prettierrc (100%) create mode 100644 apps/trpc-experimental/server/build/api/index.js create mode 100644 apps/trpc-experimental/server/build/config.js create mode 100644 apps/trpc-experimental/server/build/env.js create mode 100644 apps/trpc-experimental/server/build/index.js create mode 100644 apps/trpc-experimental/server/build/jobs/applicationBuildQueue.js create mode 100644 apps/trpc-experimental/server/build/lib/buildPacks/common.js create mode 100644 apps/trpc-experimental/server/build/lib/buildPacks/compose.js create mode 100644 apps/trpc-experimental/server/build/lib/buildPacks/deno.js create mode 100644 apps/trpc-experimental/server/build/lib/buildPacks/docker.js create mode 100644 apps/trpc-experimental/server/build/lib/buildPacks/gatsby.js create mode 100644 apps/trpc-experimental/server/build/lib/buildPacks/heroku.js create mode 100644 apps/trpc-experimental/server/build/lib/buildPacks/index.js create mode 100644 apps/trpc-experimental/server/build/lib/buildPacks/laravel.js create mode 100644 apps/trpc-experimental/server/build/lib/buildPacks/nestjs.js create mode 100644 apps/trpc-experimental/server/build/lib/buildPacks/nextjs.js create mode 100644 apps/trpc-experimental/server/build/lib/buildPacks/node.js create mode 100644 apps/trpc-experimental/server/build/lib/buildPacks/nuxtjs.js create mode 100644 apps/trpc-experimental/server/build/lib/buildPacks/php.js create mode 100644 apps/trpc-experimental/server/build/lib/buildPacks/python.js create mode 100644 apps/trpc-experimental/server/build/lib/buildPacks/react.js create mode 100644 apps/trpc-experimental/server/build/lib/buildPacks/rust.js create mode 100644 apps/trpc-experimental/server/build/lib/buildPacks/static.js create mode 100644 apps/trpc-experimental/server/build/lib/buildPacks/svelte.js create mode 100644 apps/trpc-experimental/server/build/lib/buildPacks/vuejs.js create mode 100644 apps/trpc-experimental/server/build/lib/common.js create mode 100644 apps/trpc-experimental/server/build/lib/dayjs.js create mode 100644 apps/trpc-experimental/server/build/lib/docker.js create mode 100644 apps/trpc-experimental/server/build/lib/executeCommand.js create mode 100644 apps/trpc-experimental/server/build/lib/importers/github.js create mode 100644 apps/trpc-experimental/server/build/lib/importers/gitlab.js create mode 100644 apps/trpc-experimental/server/build/lib/importers/index.js create mode 100644 apps/trpc-experimental/server/build/lib/logging.js create mode 100644 apps/trpc-experimental/server/build/lib/ssh.js create mode 100644 apps/trpc-experimental/server/build/prisma.js create mode 100644 apps/trpc-experimental/server/build/scheduler.js create mode 100644 apps/trpc-experimental/server/build/server.js create mode 100644 apps/trpc-experimental/server/build/trpc/context.js create mode 100644 apps/trpc-experimental/server/build/trpc/index.js create mode 100644 apps/trpc-experimental/server/build/trpc/routers/applications/index.js create mode 100644 apps/trpc-experimental/server/build/trpc/routers/applications/lib.js create mode 100644 apps/trpc-experimental/server/build/trpc/routers/auth.js create mode 100644 apps/trpc-experimental/server/build/trpc/routers/dashboard.js create mode 100644 apps/trpc-experimental/server/build/trpc/routers/databases/index.js create mode 100644 apps/trpc-experimental/server/build/trpc/routers/databases/lib.js create mode 100644 apps/trpc-experimental/server/build/trpc/routers/destinations/index.js create mode 100644 apps/trpc-experimental/server/build/trpc/routers/index.js create mode 100644 apps/trpc-experimental/server/build/trpc/routers/services/index.js create mode 100644 apps/trpc-experimental/server/build/trpc/routers/services/lib.js create mode 100644 apps/trpc-experimental/server/build/trpc/routers/settings.js create mode 100644 apps/trpc-experimental/server/build/trpc/routers/sources/index.js create mode 100644 apps/trpc-experimental/server/build/trpc/trpc.js rename apps/{ => trpc-experimental}/server/db/.gitkeep (100%) create mode 100644 apps/trpc-experimental/server/db/dev.db create mode 100644 apps/trpc-experimental/server/db/migration.db create mode 100644 apps/trpc-experimental/server/db/migration.db-journal rename apps/{ => trpc-experimental}/server/devTags.json (100%) rename apps/{ => trpc-experimental}/server/devTemplates.yaml (100%) rename apps/{ => trpc-experimental}/server/nodemon.json (100%) rename apps/{ => trpc-experimental}/server/package.json (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220131142425_init/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220210104005_redis_aol/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220212142309_unique_secret_by_application/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220217211304_dualcerts/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220219231255_prmr_secrets/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220220141136_public_portrange/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220301101928_proxyhash/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220304141408_service_secrets/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220311213422_autodeploy/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220320141424_phpmodules/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220322135800_persistent_storage/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220327180323_ghost/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220402135305_python/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220402210645_meilisearch/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220405151428_wordpress_sftp/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220407220809_unique_storage_fix/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220408070805_added_expose_port/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220418214843_persistent_storage_services/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220419203408_multiply_dockerfile_locations/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220420202031_deno_configurations/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220420210057_branch_for_builds/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220425071132_umami/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220425075326_auto_update_coolify/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220426125053_select_base_image/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220427133656_hasura/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220429202516_fider/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220429214112_fider_correction/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220430111953_ssl_dns_check_settings/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220430124553_expose_port_for_services/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220509130501_custom_plausible_script/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220510081125_custom_wordpress_db/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220517081328_traefik/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220519095648_minio_apifqdn/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220708132655_deployment_type_for_applications/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220712083523_custom_port_git_sources/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220718083646_moodle/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220718114551_remote_docker_engine/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220721084020_ssh_key/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220722203927_ipaddress/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220725191205_architecture/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220726121333_fix_ssh_key/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220806090621_fqdn_not_unique_anymore/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220806102340_rde_ssh_local_port/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220815092230_glitchtip/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220815133844_appwrite/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220816133447_bot_deployments/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220817082342_custom_dns_servers/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220818093615_public_repositories/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220823070532_service_searxng/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220825064811_concurrent_build_settings/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220825072007_build_queue_improvements/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220831095714_service_weblate/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220902115640_service_taiga/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220905062318_database_branching/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220905113241_prisma_migration/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220905115321_application_connected_database/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220906120112_enable_api_debug_logging/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220907092244_database_secrets/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220913092100_preview_applications/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220922064605_custom_certificates/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220923122227_custom_ssl_for_applications/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20220928083348_system_wide_git_sources/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221002084246_no_unique_appid_on_previews/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221002091630_forked_previews/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221005120323_initial_docker_compose/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221005132352_docker_compose_configuration/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221017134342_standardized_service_configs/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221018090939_service_peristent_volumes_predefined/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221021112429_serivce_settings_extended/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221021185630_service_template_version/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221026115123_service_persistent_unique/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221028074301_wordpress_optional_fields/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221104092223_default_redirect_proxy/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221114093217_application_storage_path_migration/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221123122143_remote_haproxy_from_db/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221123133429_docker_registries/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221128104158_do_not_track/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221128104718_fix_defaults/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221128105615_custom_sentry/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221129081832_fix_defaults/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221129121702_preview_separator/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221129130036_keep_local_docker_images/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221130142058_reconfigure_docker_registries/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221201115801_simple_dockerfile_deployment/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20221201133847_push_image_to_docker_registry/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/20230117092356_http2_protocol/migration.sql (100%) rename apps/{ => trpc-experimental}/server/prisma/migrations/migration_lock.toml (100%) rename apps/{ => trpc-experimental}/server/prisma/schema.prisma (100%) rename apps/{ => trpc-experimental}/server/prisma/seed.js (100%) rename apps/{ => trpc-experimental}/server/src/api/index.ts (100%) rename apps/{ => trpc-experimental}/server/src/config.ts (100%) rename apps/{ => trpc-experimental}/server/src/env.js (100%) rename apps/{ => trpc-experimental}/server/src/index.ts (100%) rename apps/{ => trpc-experimental}/server/src/jobs/applicationBuildQueue.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/buildPacks/common.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/buildPacks/compose.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/buildPacks/deno.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/buildPacks/docker.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/buildPacks/gatsby.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/buildPacks/heroku.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/buildPacks/index.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/buildPacks/laravel.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/buildPacks/nestjs.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/buildPacks/nextjs.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/buildPacks/node.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/buildPacks/nuxtjs.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/buildPacks/php.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/buildPacks/python.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/buildPacks/react.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/buildPacks/rust.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/buildPacks/static.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/buildPacks/svelte.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/buildPacks/vuejs.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/common.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/dayjs.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/docker.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/executeCommand.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/importers/github.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/importers/gitlab.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/importers/index.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/logging.ts (100%) rename apps/{ => trpc-experimental}/server/src/lib/ssh.ts (100%) rename apps/{ => trpc-experimental}/server/src/prisma.ts (100%) rename apps/{ => trpc-experimental}/server/src/scheduler.ts (100%) rename apps/{ => trpc-experimental}/server/src/server.ts (100%) rename apps/{ => trpc-experimental}/server/src/tags.json (100%) rename apps/{ => trpc-experimental}/server/src/templates.json (100%) rename apps/{ => trpc-experimental}/server/src/trpc/context.ts (100%) rename apps/{ => trpc-experimental}/server/src/trpc/index.ts (100%) rename apps/{ => trpc-experimental}/server/src/trpc/routers/applications/index.ts (100%) rename apps/{ => trpc-experimental}/server/src/trpc/routers/applications/lib.ts (100%) rename apps/{ => trpc-experimental}/server/src/trpc/routers/auth.ts (100%) rename apps/{ => trpc-experimental}/server/src/trpc/routers/dashboard.ts (100%) rename apps/{ => trpc-experimental}/server/src/trpc/routers/databases/index.ts (100%) rename apps/{ => trpc-experimental}/server/src/trpc/routers/databases/lib.ts (100%) rename apps/{ => trpc-experimental}/server/src/trpc/routers/destinations/index.ts (100%) rename apps/{ => trpc-experimental}/server/src/trpc/routers/index.ts (100%) rename apps/{ => trpc-experimental}/server/src/trpc/routers/services/index.ts (100%) rename apps/{ => trpc-experimental}/server/src/trpc/routers/services/lib.ts (100%) rename apps/{ => trpc-experimental}/server/src/trpc/routers/settings.ts (100%) rename apps/{ => trpc-experimental}/server/src/trpc/routers/sources/index.ts (100%) rename apps/{ => trpc-experimental}/server/src/trpc/trpc.ts (100%) rename apps/{ => trpc-experimental}/server/tags.json (100%) rename apps/{ => trpc-experimental}/server/templates.json (100%) rename apps/{ => trpc-experimental}/server/tsconfig.json (100%) diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index 456faa513..91a008238 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -172,9 +172,9 @@ const host = '0.0.0.0'; }, 60000 * 15); // Cleanup stucked containers (not defined in Coolify, but still running and managed by Coolify) - // setInterval(async () => { - // await cleanupStuckedContainers(); - // }, 60000 * 5); + setInterval(async () => { + await cleanupStuckedContainers(); + }, 2000); // checkProxies, checkFluentBit & refresh templates setInterval(async () => { @@ -344,9 +344,16 @@ async function cleanupStuckedContainers() { const containersArray = containers.trim().split('\n'); if (containersArray.length > 0) { for (const container of containersArray) { - const application = await prisma.application.findFirst({ where: { id: container } }); - const service = await prisma.service.findFirst({ where: { id: container } }); - const database = await prisma.database.findFirst({ where: { id: container } }); + const containerId = container.split('-')[0]; + const application = await prisma.application.findFirst({ + where: { id: { startsWith: containerId } } + }); + const service = await prisma.service.findFirst({ + where: { id: { startsWith: containerId } } + }); + const database = await prisma.database.findFirst({ + where: { id: { startsWith: containerId } } + }); if (!application && !service && !database) { await executeCommand({ command: `docker container rm -f ${container}` }); } diff --git a/apps/backup/.dockerignore b/apps/others/backup/.dockerignore similarity index 100% rename from apps/backup/.dockerignore rename to apps/others/backup/.dockerignore diff --git a/apps/backup/Dockerfile b/apps/others/backup/Dockerfile similarity index 100% rename from apps/backup/Dockerfile rename to apps/others/backup/Dockerfile diff --git a/apps/backup/backups/.gitkeep b/apps/others/backup/backups/.gitkeep similarity index 100% rename from apps/backup/backups/.gitkeep rename to apps/others/backup/backups/.gitkeep diff --git a/apps/backup/package.json b/apps/others/backup/package.json similarity index 100% rename from apps/backup/package.json rename to apps/others/backup/package.json diff --git a/apps/backup/src/index.mjs b/apps/others/backup/src/index.mjs similarity index 100% rename from apps/backup/src/index.mjs rename to apps/others/backup/src/index.mjs diff --git a/apps/i18n/.env.example b/apps/others/i18n/.env.example similarity index 100% rename from apps/i18n/.env.example rename to apps/others/i18n/.env.example diff --git a/apps/i18n/.gitignore b/apps/others/i18n/.gitignore similarity index 100% rename from apps/i18n/.gitignore rename to apps/others/i18n/.gitignore diff --git a/apps/i18n/index.mjs b/apps/others/i18n/index.mjs similarity index 100% rename from apps/i18n/index.mjs rename to apps/others/i18n/index.mjs diff --git a/apps/i18n/package.json b/apps/others/i18n/package.json similarity index 100% rename from apps/i18n/package.json rename to apps/others/i18n/package.json diff --git a/apps/client/.eslintignore b/apps/trpc-experimental/client/.eslintignore similarity index 100% rename from apps/client/.eslintignore rename to apps/trpc-experimental/client/.eslintignore diff --git a/apps/client/.eslintrc.cjs b/apps/trpc-experimental/client/.eslintrc.cjs similarity index 100% rename from apps/client/.eslintrc.cjs rename to apps/trpc-experimental/client/.eslintrc.cjs diff --git a/apps/client/.gitignore b/apps/trpc-experimental/client/.gitignore similarity index 100% rename from apps/client/.gitignore rename to apps/trpc-experimental/client/.gitignore diff --git a/apps/client/.npmrc b/apps/trpc-experimental/client/.npmrc similarity index 100% rename from apps/client/.npmrc rename to apps/trpc-experimental/client/.npmrc diff --git a/apps/client/.prettierignore b/apps/trpc-experimental/client/.prettierignore similarity index 100% rename from apps/client/.prettierignore rename to apps/trpc-experimental/client/.prettierignore diff --git a/apps/client/.prettierrc b/apps/trpc-experimental/client/.prettierrc similarity index 100% rename from apps/client/.prettierrc rename to apps/trpc-experimental/client/.prettierrc diff --git a/apps/client/README.md b/apps/trpc-experimental/client/README.md similarity index 100% rename from apps/client/README.md rename to apps/trpc-experimental/client/README.md diff --git a/apps/client/package.json b/apps/trpc-experimental/client/package.json similarity index 100% rename from apps/client/package.json rename to apps/trpc-experimental/client/package.json diff --git a/apps/client/playwright.config.ts b/apps/trpc-experimental/client/playwright.config.ts similarity index 100% rename from apps/client/playwright.config.ts rename to apps/trpc-experimental/client/playwright.config.ts diff --git a/apps/client/pnpm-lock.yaml b/apps/trpc-experimental/client/pnpm-lock.yaml similarity index 100% rename from apps/client/pnpm-lock.yaml rename to apps/trpc-experimental/client/pnpm-lock.yaml diff --git a/apps/client/postcss.config.cjs b/apps/trpc-experimental/client/postcss.config.cjs similarity index 100% rename from apps/client/postcss.config.cjs rename to apps/trpc-experimental/client/postcss.config.cjs diff --git a/apps/client/src/app.d.ts b/apps/trpc-experimental/client/src/app.d.ts similarity index 100% rename from apps/client/src/app.d.ts rename to apps/trpc-experimental/client/src/app.d.ts diff --git a/apps/client/src/app.html b/apps/trpc-experimental/client/src/app.html similarity index 100% rename from apps/client/src/app.html rename to apps/trpc-experimental/client/src/app.html diff --git a/apps/client/src/app.postcss b/apps/trpc-experimental/client/src/app.postcss similarity index 100% rename from apps/client/src/app.postcss rename to apps/trpc-experimental/client/src/app.postcss diff --git a/apps/client/src/lib/common.ts b/apps/trpc-experimental/client/src/lib/common.ts similarity index 100% rename from apps/client/src/lib/common.ts rename to apps/trpc-experimental/client/src/lib/common.ts diff --git a/apps/client/src/lib/components/Beta.svelte b/apps/trpc-experimental/client/src/lib/components/Beta.svelte similarity index 100% rename from apps/client/src/lib/components/Beta.svelte rename to apps/trpc-experimental/client/src/lib/components/Beta.svelte diff --git a/apps/client/src/lib/components/CopyPasswordField.svelte b/apps/trpc-experimental/client/src/lib/components/CopyPasswordField.svelte similarity index 100% rename from apps/client/src/lib/components/CopyPasswordField.svelte rename to apps/trpc-experimental/client/src/lib/components/CopyPasswordField.svelte diff --git a/apps/client/src/lib/components/DocLink.svelte b/apps/trpc-experimental/client/src/lib/components/DocLink.svelte similarity index 100% rename from apps/client/src/lib/components/DocLink.svelte rename to apps/trpc-experimental/client/src/lib/components/DocLink.svelte diff --git a/apps/client/src/lib/components/Explainer.svelte b/apps/trpc-experimental/client/src/lib/components/Explainer.svelte similarity index 100% rename from apps/client/src/lib/components/Explainer.svelte rename to apps/trpc-experimental/client/src/lib/components/Explainer.svelte diff --git a/apps/client/src/lib/components/ExternalLink.svelte b/apps/trpc-experimental/client/src/lib/components/ExternalLink.svelte similarity index 100% rename from apps/client/src/lib/components/ExternalLink.svelte rename to apps/trpc-experimental/client/src/lib/components/ExternalLink.svelte diff --git a/apps/client/src/lib/components/Setting.svelte b/apps/trpc-experimental/client/src/lib/components/Setting.svelte similarity index 100% rename from apps/client/src/lib/components/Setting.svelte rename to apps/trpc-experimental/client/src/lib/components/Setting.svelte diff --git a/apps/client/src/lib/components/SimpleExplainer.svelte b/apps/trpc-experimental/client/src/lib/components/SimpleExplainer.svelte similarity index 100% rename from apps/client/src/lib/components/SimpleExplainer.svelte rename to apps/trpc-experimental/client/src/lib/components/SimpleExplainer.svelte diff --git a/apps/client/src/lib/components/Toast.svelte b/apps/trpc-experimental/client/src/lib/components/Toast.svelte similarity index 100% rename from apps/client/src/lib/components/Toast.svelte rename to apps/trpc-experimental/client/src/lib/components/Toast.svelte diff --git a/apps/client/src/lib/components/Toasts.svelte b/apps/trpc-experimental/client/src/lib/components/Toasts.svelte similarity index 100% rename from apps/client/src/lib/components/Toasts.svelte rename to apps/trpc-experimental/client/src/lib/components/Toasts.svelte diff --git a/apps/client/src/lib/components/Tooltip.svelte b/apps/trpc-experimental/client/src/lib/components/Tooltip.svelte similarity index 100% rename from apps/client/src/lib/components/Tooltip.svelte rename to apps/trpc-experimental/client/src/lib/components/Tooltip.svelte diff --git a/apps/client/src/lib/components/UpdateAvailable.svelte b/apps/trpc-experimental/client/src/lib/components/UpdateAvailable.svelte similarity index 100% rename from apps/client/src/lib/components/UpdateAvailable.svelte rename to apps/trpc-experimental/client/src/lib/components/UpdateAvailable.svelte diff --git a/apps/client/src/lib/components/icons/Delete.svelte b/apps/trpc-experimental/client/src/lib/components/icons/Delete.svelte similarity index 100% rename from apps/client/src/lib/components/icons/Delete.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/Delete.svelte diff --git a/apps/client/src/lib/components/icons/RemoteLink.svelte b/apps/trpc-experimental/client/src/lib/components/icons/RemoteLink.svelte similarity index 100% rename from apps/client/src/lib/components/icons/RemoteLink.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/RemoteLink.svelte diff --git a/apps/client/src/lib/components/icons/applications/ApplicationIcons.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/ApplicationIcons.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/ApplicationIcons.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/ApplicationIcons.svelte diff --git a/apps/client/src/lib/components/icons/applications/Astro.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/Astro.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/Astro.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/Astro.svelte diff --git a/apps/client/src/lib/components/icons/applications/Compose.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/Compose.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/Compose.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/Compose.svelte diff --git a/apps/client/src/lib/components/icons/applications/Deno.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/Deno.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/Deno.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/Deno.svelte diff --git a/apps/client/src/lib/components/icons/applications/Docker.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/Docker.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/Docker.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/Docker.svelte diff --git a/apps/client/src/lib/components/icons/applications/Eleventy.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/Eleventy.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/Eleventy.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/Eleventy.svelte diff --git a/apps/client/src/lib/components/icons/applications/Gatsby.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/Gatsby.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/Gatsby.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/Gatsby.svelte diff --git a/apps/client/src/lib/components/icons/applications/Heroku.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/Heroku.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/Heroku.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/Heroku.svelte diff --git a/apps/client/src/lib/components/icons/applications/Laravel.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/Laravel.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/Laravel.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/Laravel.svelte diff --git a/apps/client/src/lib/components/icons/applications/Nestjs.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/Nestjs.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/Nestjs.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/Nestjs.svelte diff --git a/apps/client/src/lib/components/icons/applications/Nextjs.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/Nextjs.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/Nextjs.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/Nextjs.svelte diff --git a/apps/client/src/lib/components/icons/applications/Nodejs.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/Nodejs.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/Nodejs.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/Nodejs.svelte diff --git a/apps/client/src/lib/components/icons/applications/Nuxtjs.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/Nuxtjs.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/Nuxtjs.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/Nuxtjs.svelte diff --git a/apps/client/src/lib/components/icons/applications/PHP.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/PHP.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/PHP.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/PHP.svelte diff --git a/apps/client/src/lib/components/icons/applications/Python.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/Python.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/Python.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/Python.svelte diff --git a/apps/client/src/lib/components/icons/applications/React.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/React.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/React.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/React.svelte diff --git a/apps/client/src/lib/components/icons/applications/Rust.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/Rust.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/Rust.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/Rust.svelte diff --git a/apps/client/src/lib/components/icons/applications/Static.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/Static.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/Static.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/Static.svelte diff --git a/apps/client/src/lib/components/icons/applications/Svelte.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/Svelte.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/Svelte.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/Svelte.svelte diff --git a/apps/client/src/lib/components/icons/applications/Vuejs.svelte b/apps/trpc-experimental/client/src/lib/components/icons/applications/Vuejs.svelte similarity index 100% rename from apps/client/src/lib/components/icons/applications/Vuejs.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/applications/Vuejs.svelte diff --git a/apps/client/src/lib/components/icons/applications/index.ts b/apps/trpc-experimental/client/src/lib/components/icons/applications/index.ts similarity index 100% rename from apps/client/src/lib/components/icons/applications/index.ts rename to apps/trpc-experimental/client/src/lib/components/icons/applications/index.ts diff --git a/apps/client/src/lib/components/icons/databases/Clickhouse.svelte b/apps/trpc-experimental/client/src/lib/components/icons/databases/Clickhouse.svelte similarity index 100% rename from apps/client/src/lib/components/icons/databases/Clickhouse.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/databases/Clickhouse.svelte diff --git a/apps/client/src/lib/components/icons/databases/CouchDB.svelte b/apps/trpc-experimental/client/src/lib/components/icons/databases/CouchDB.svelte similarity index 100% rename from apps/client/src/lib/components/icons/databases/CouchDB.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/databases/CouchDB.svelte diff --git a/apps/client/src/lib/components/icons/databases/DatabaseIcons.svelte b/apps/trpc-experimental/client/src/lib/components/icons/databases/DatabaseIcons.svelte similarity index 100% rename from apps/client/src/lib/components/icons/databases/DatabaseIcons.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/databases/DatabaseIcons.svelte diff --git a/apps/client/src/lib/components/icons/databases/EdgeDB.svelte b/apps/trpc-experimental/client/src/lib/components/icons/databases/EdgeDB.svelte similarity index 100% rename from apps/client/src/lib/components/icons/databases/EdgeDB.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/databases/EdgeDB.svelte diff --git a/apps/client/src/lib/components/icons/databases/MariaDB.svelte b/apps/trpc-experimental/client/src/lib/components/icons/databases/MariaDB.svelte similarity index 100% rename from apps/client/src/lib/components/icons/databases/MariaDB.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/databases/MariaDB.svelte diff --git a/apps/client/src/lib/components/icons/databases/MongoDB.svelte b/apps/trpc-experimental/client/src/lib/components/icons/databases/MongoDB.svelte similarity index 100% rename from apps/client/src/lib/components/icons/databases/MongoDB.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/databases/MongoDB.svelte diff --git a/apps/client/src/lib/components/icons/databases/MySQL.svelte b/apps/trpc-experimental/client/src/lib/components/icons/databases/MySQL.svelte similarity index 100% rename from apps/client/src/lib/components/icons/databases/MySQL.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/databases/MySQL.svelte diff --git a/apps/client/src/lib/components/icons/databases/PostgreSQL.svelte b/apps/trpc-experimental/client/src/lib/components/icons/databases/PostgreSQL.svelte similarity index 100% rename from apps/client/src/lib/components/icons/databases/PostgreSQL.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/databases/PostgreSQL.svelte diff --git a/apps/client/src/lib/components/icons/databases/Redis.svelte b/apps/trpc-experimental/client/src/lib/components/icons/databases/Redis.svelte similarity index 100% rename from apps/client/src/lib/components/icons/databases/Redis.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/databases/Redis.svelte diff --git a/apps/client/src/lib/components/icons/databases/index.ts b/apps/trpc-experimental/client/src/lib/components/icons/databases/index.ts similarity index 100% rename from apps/client/src/lib/components/icons/databases/index.ts rename to apps/trpc-experimental/client/src/lib/components/icons/databases/index.ts diff --git a/apps/client/src/lib/components/icons/destinations/LocalDocker.svelte b/apps/trpc-experimental/client/src/lib/components/icons/destinations/LocalDocker.svelte similarity index 100% rename from apps/client/src/lib/components/icons/destinations/LocalDocker.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/destinations/LocalDocker.svelte diff --git a/apps/client/src/lib/components/icons/destinations/RemoteDocker.svelte b/apps/trpc-experimental/client/src/lib/components/icons/destinations/RemoteDocker.svelte similarity index 100% rename from apps/client/src/lib/components/icons/destinations/RemoteDocker.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/destinations/RemoteDocker.svelte diff --git a/apps/client/src/lib/components/icons/destinations/index.ts b/apps/trpc-experimental/client/src/lib/components/icons/destinations/index.ts similarity index 100% rename from apps/client/src/lib/components/icons/destinations/index.ts rename to apps/trpc-experimental/client/src/lib/components/icons/destinations/index.ts diff --git a/apps/client/src/lib/components/icons/index.ts b/apps/trpc-experimental/client/src/lib/components/icons/index.ts similarity index 100% rename from apps/client/src/lib/components/icons/index.ts rename to apps/trpc-experimental/client/src/lib/components/icons/index.ts diff --git a/apps/client/src/lib/components/icons/services/ServiceIcons.svelte b/apps/trpc-experimental/client/src/lib/components/icons/services/ServiceIcons.svelte similarity index 100% rename from apps/client/src/lib/components/icons/services/ServiceIcons.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/services/ServiceIcons.svelte diff --git a/apps/client/src/lib/components/icons/sources/Github.svelte b/apps/trpc-experimental/client/src/lib/components/icons/sources/Github.svelte similarity index 100% rename from apps/client/src/lib/components/icons/sources/Github.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/sources/Github.svelte diff --git a/apps/client/src/lib/components/icons/sources/Gitlab.svelte b/apps/trpc-experimental/client/src/lib/components/icons/sources/Gitlab.svelte similarity index 100% rename from apps/client/src/lib/components/icons/sources/Gitlab.svelte rename to apps/trpc-experimental/client/src/lib/components/icons/sources/Gitlab.svelte diff --git a/apps/client/src/lib/components/icons/sources/index.ts b/apps/trpc-experimental/client/src/lib/components/icons/sources/index.ts similarity index 100% rename from apps/client/src/lib/components/icons/sources/index.ts rename to apps/trpc-experimental/client/src/lib/components/icons/sources/index.ts diff --git a/apps/client/src/lib/dayjs.ts b/apps/trpc-experimental/client/src/lib/dayjs.ts similarity index 100% rename from apps/client/src/lib/dayjs.ts rename to apps/trpc-experimental/client/src/lib/dayjs.ts diff --git a/apps/client/src/lib/store.ts b/apps/trpc-experimental/client/src/lib/store.ts similarity index 100% rename from apps/client/src/lib/store.ts rename to apps/trpc-experimental/client/src/lib/store.ts diff --git a/apps/client/src/routes/+error.svelte b/apps/trpc-experimental/client/src/routes/+error.svelte similarity index 100% rename from apps/client/src/routes/+error.svelte rename to apps/trpc-experimental/client/src/routes/+error.svelte diff --git a/apps/client/src/routes/+layout.svelte b/apps/trpc-experimental/client/src/routes/+layout.svelte similarity index 100% rename from apps/client/src/routes/+layout.svelte rename to apps/trpc-experimental/client/src/routes/+layout.svelte diff --git a/apps/client/src/routes/+layout.ts b/apps/trpc-experimental/client/src/routes/+layout.ts similarity index 100% rename from apps/client/src/routes/+layout.ts rename to apps/trpc-experimental/client/src/routes/+layout.ts diff --git a/apps/client/src/routes/+page.svelte b/apps/trpc-experimental/client/src/routes/+page.svelte similarity index 100% rename from apps/client/src/routes/+page.svelte rename to apps/trpc-experimental/client/src/routes/+page.svelte diff --git a/apps/client/src/routes/+page.ts b/apps/trpc-experimental/client/src/routes/+page.ts similarity index 100% rename from apps/client/src/routes/+page.ts rename to apps/trpc-experimental/client/src/routes/+page.ts diff --git a/apps/client/src/routes/applications/[id]/+layout.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/+layout.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/+layout.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/+layout.svelte diff --git a/apps/client/src/routes/applications/[id]/+layout.ts b/apps/trpc-experimental/client/src/routes/applications/[id]/+layout.ts similarity index 100% rename from apps/client/src/routes/applications/[id]/+layout.ts rename to apps/trpc-experimental/client/src/routes/applications/[id]/+layout.ts diff --git a/apps/client/src/routes/applications/[id]/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/+page.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/+page.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/+page.svelte diff --git a/apps/client/src/routes/applications/[id]/builds/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/builds/+page.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/builds/+page.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/builds/+page.svelte diff --git a/apps/client/src/routes/applications/[id]/builds/+page.ts b/apps/trpc-experimental/client/src/routes/applications/[id]/builds/+page.ts similarity index 100% rename from apps/client/src/routes/applications/[id]/builds/+page.ts rename to apps/trpc-experimental/client/src/routes/applications/[id]/builds/+page.ts diff --git a/apps/client/src/routes/applications/[id]/builds/BuildLog.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/builds/BuildLog.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/builds/BuildLog.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/builds/BuildLog.svelte diff --git a/apps/client/src/routes/applications/[id]/components/Buttons/Delete.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Delete.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/components/Buttons/Delete.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Delete.svelte diff --git a/apps/client/src/routes/applications/[id]/components/Buttons/Deploy.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Deploy.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/components/Buttons/Deploy.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Deploy.svelte diff --git a/apps/client/src/routes/applications/[id]/components/Buttons/ForceDeploy.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/ForceDeploy.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/components/Buttons/ForceDeploy.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/ForceDeploy.svelte diff --git a/apps/client/src/routes/applications/[id]/components/Buttons/Loading.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Loading.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/components/Buttons/Loading.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Loading.svelte diff --git a/apps/client/src/routes/applications/[id]/components/Buttons/Restart.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Restart.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/components/Buttons/Restart.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Restart.svelte diff --git a/apps/client/src/routes/applications/[id]/components/Buttons/Stop.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Stop.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/components/Buttons/Stop.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Stop.svelte diff --git a/apps/client/src/routes/applications/[id]/components/Buttons/index.ts b/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/index.ts similarity index 100% rename from apps/client/src/routes/applications/[id]/components/Buttons/index.ts rename to apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/index.ts diff --git a/apps/client/src/routes/applications/[id]/components/Menu.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/Menu.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/components/Menu.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/components/Menu.svelte diff --git a/apps/client/src/routes/applications/[id]/components/States/Degraded.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Degraded.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/components/States/Degraded.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Degraded.svelte diff --git a/apps/client/src/routes/applications/[id]/components/States/Healthy.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Healthy.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/components/States/Healthy.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Healthy.svelte diff --git a/apps/client/src/routes/applications/[id]/components/States/Loading.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Loading.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/components/States/Loading.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Loading.svelte diff --git a/apps/client/src/routes/applications/[id]/components/States/Stopped.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Stopped.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/components/States/Stopped.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Stopped.svelte diff --git a/apps/client/src/routes/applications/[id]/components/States/index.ts b/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/index.ts similarity index 100% rename from apps/client/src/routes/applications/[id]/components/States/index.ts rename to apps/trpc-experimental/client/src/routes/applications/[id]/components/States/index.ts diff --git a/apps/client/src/routes/applications/[id]/danger/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/danger/+page.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/danger/+page.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/danger/+page.svelte diff --git a/apps/client/src/routes/applications/[id]/features/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/features/+page.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/features/+page.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/features/+page.svelte diff --git a/apps/client/src/routes/applications/[id]/logs/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/logs/+page.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/logs/+page.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/logs/+page.svelte diff --git a/apps/client/src/routes/applications/[id]/previews/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/previews/+page.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/previews/+page.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/previews/+page.svelte diff --git a/apps/client/src/routes/applications/[id]/revert/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/revert/+page.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/revert/+page.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/revert/+page.svelte diff --git a/apps/client/src/routes/applications/[id]/revert/+page.ts b/apps/trpc-experimental/client/src/routes/applications/[id]/revert/+page.ts similarity index 100% rename from apps/client/src/routes/applications/[id]/revert/+page.ts rename to apps/trpc-experimental/client/src/routes/applications/[id]/revert/+page.ts diff --git a/apps/client/src/routes/applications/[id]/secrets/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/secrets/+page.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/secrets/+page.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/secrets/+page.svelte diff --git a/apps/client/src/routes/applications/[id]/secrets/+page.ts b/apps/trpc-experimental/client/src/routes/applications/[id]/secrets/+page.ts similarity index 100% rename from apps/client/src/routes/applications/[id]/secrets/+page.ts rename to apps/trpc-experimental/client/src/routes/applications/[id]/secrets/+page.ts diff --git a/apps/client/src/routes/applications/[id]/secrets/components/PreviewSecret.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/secrets/components/PreviewSecret.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/secrets/components/PreviewSecret.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/secrets/components/PreviewSecret.svelte diff --git a/apps/client/src/routes/applications/[id]/secrets/components/Secret.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/secrets/components/Secret.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/secrets/components/Secret.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/secrets/components/Secret.svelte diff --git a/apps/client/src/routes/applications/[id]/storages/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/storages/+page.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/storages/+page.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/storages/+page.svelte diff --git a/apps/client/src/routes/applications/[id]/storages/+page.ts b/apps/trpc-experimental/client/src/routes/applications/[id]/storages/+page.ts similarity index 100% rename from apps/client/src/routes/applications/[id]/storages/+page.ts rename to apps/trpc-experimental/client/src/routes/applications/[id]/storages/+page.ts diff --git a/apps/client/src/routes/applications/[id]/storages/components/Storage.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/storages/components/Storage.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/storages/components/Storage.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/storages/components/Storage.svelte diff --git a/apps/client/src/routes/applications/[id]/usage/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/usage/+page.svelte similarity index 100% rename from apps/client/src/routes/applications/[id]/usage/+page.svelte rename to apps/trpc-experimental/client/src/routes/applications/[id]/usage/+page.svelte diff --git a/apps/client/src/routes/applications/[id]/utils.ts b/apps/trpc-experimental/client/src/routes/applications/[id]/utils.ts similarity index 100% rename from apps/client/src/routes/applications/[id]/utils.ts rename to apps/trpc-experimental/client/src/routes/applications/[id]/utils.ts diff --git a/apps/client/src/routes/components/NewResource.svelte b/apps/trpc-experimental/client/src/routes/components/NewResource.svelte similarity index 100% rename from apps/client/src/routes/components/NewResource.svelte rename to apps/trpc-experimental/client/src/routes/components/NewResource.svelte diff --git a/apps/client/src/routes/databases/[id]/+layout.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/+layout.svelte similarity index 100% rename from apps/client/src/routes/databases/[id]/+layout.svelte rename to apps/trpc-experimental/client/src/routes/databases/[id]/+layout.svelte diff --git a/apps/client/src/routes/databases/[id]/+layout.ts b/apps/trpc-experimental/client/src/routes/databases/[id]/+layout.ts similarity index 100% rename from apps/client/src/routes/databases/[id]/+layout.ts rename to apps/trpc-experimental/client/src/routes/databases/[id]/+layout.ts diff --git a/apps/client/src/routes/databases/[id]/+page.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/+page.svelte similarity index 100% rename from apps/client/src/routes/databases/[id]/+page.svelte rename to apps/trpc-experimental/client/src/routes/databases/[id]/+page.svelte diff --git a/apps/client/src/routes/databases/[id]/components/DatabaseLinks.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/components/DatabaseLinks.svelte similarity index 100% rename from apps/client/src/routes/databases/[id]/components/DatabaseLinks.svelte rename to apps/trpc-experimental/client/src/routes/databases/[id]/components/DatabaseLinks.svelte diff --git a/apps/client/src/routes/databases/[id]/components/Databases/CouchDb.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/CouchDb.svelte similarity index 100% rename from apps/client/src/routes/databases/[id]/components/Databases/CouchDb.svelte rename to apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/CouchDb.svelte diff --git a/apps/client/src/routes/databases/[id]/components/Databases/Databases.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/Databases.svelte similarity index 100% rename from apps/client/src/routes/databases/[id]/components/Databases/Databases.svelte rename to apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/Databases.svelte diff --git a/apps/client/src/routes/databases/[id]/components/Databases/EdgeDB.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/EdgeDB.svelte similarity index 100% rename from apps/client/src/routes/databases/[id]/components/Databases/EdgeDB.svelte rename to apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/EdgeDB.svelte diff --git a/apps/client/src/routes/databases/[id]/components/Databases/MariaDB.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/MariaDB.svelte similarity index 100% rename from apps/client/src/routes/databases/[id]/components/Databases/MariaDB.svelte rename to apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/MariaDB.svelte diff --git a/apps/client/src/routes/databases/[id]/components/Databases/MongoDB.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/MongoDB.svelte similarity index 100% rename from apps/client/src/routes/databases/[id]/components/Databases/MongoDB.svelte rename to apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/MongoDB.svelte diff --git a/apps/client/src/routes/databases/[id]/components/Databases/MySQL.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/MySQL.svelte similarity index 100% rename from apps/client/src/routes/databases/[id]/components/Databases/MySQL.svelte rename to apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/MySQL.svelte diff --git a/apps/client/src/routes/databases/[id]/components/Databases/PostgreSQL.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/PostgreSQL.svelte similarity index 100% rename from apps/client/src/routes/databases/[id]/components/Databases/PostgreSQL.svelte rename to apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/PostgreSQL.svelte diff --git a/apps/client/src/routes/databases/[id]/components/Databases/Redis.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/Redis.svelte similarity index 100% rename from apps/client/src/routes/databases/[id]/components/Databases/Redis.svelte rename to apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/Redis.svelte diff --git a/apps/client/src/routes/databases/[id]/utils.ts b/apps/trpc-experimental/client/src/routes/databases/[id]/utils.ts similarity index 100% rename from apps/client/src/routes/databases/[id]/utils.ts rename to apps/trpc-experimental/client/src/routes/databases/[id]/utils.ts diff --git a/apps/client/src/routes/destinations/[id]/+layout.svelte b/apps/trpc-experimental/client/src/routes/destinations/[id]/+layout.svelte similarity index 100% rename from apps/client/src/routes/destinations/[id]/+layout.svelte rename to apps/trpc-experimental/client/src/routes/destinations/[id]/+layout.svelte diff --git a/apps/client/src/routes/destinations/[id]/+layout.ts b/apps/trpc-experimental/client/src/routes/destinations/[id]/+layout.ts similarity index 100% rename from apps/client/src/routes/destinations/[id]/+layout.ts rename to apps/trpc-experimental/client/src/routes/destinations/[id]/+layout.ts diff --git a/apps/client/src/routes/destinations/[id]/+page.svelte b/apps/trpc-experimental/client/src/routes/destinations/[id]/+page.svelte similarity index 100% rename from apps/client/src/routes/destinations/[id]/+page.svelte rename to apps/trpc-experimental/client/src/routes/destinations/[id]/+page.svelte diff --git a/apps/client/src/routes/destinations/[id]/components/Destination.svelte b/apps/trpc-experimental/client/src/routes/destinations/[id]/components/Destination.svelte similarity index 100% rename from apps/client/src/routes/destinations/[id]/components/Destination.svelte rename to apps/trpc-experimental/client/src/routes/destinations/[id]/components/Destination.svelte diff --git a/apps/client/src/routes/destinations/[id]/components/LocalDocker.svelte b/apps/trpc-experimental/client/src/routes/destinations/[id]/components/LocalDocker.svelte similarity index 100% rename from apps/client/src/routes/destinations/[id]/components/LocalDocker.svelte rename to apps/trpc-experimental/client/src/routes/destinations/[id]/components/LocalDocker.svelte diff --git a/apps/client/src/routes/destinations/[id]/components/New.svelte b/apps/trpc-experimental/client/src/routes/destinations/[id]/components/New.svelte similarity index 100% rename from apps/client/src/routes/destinations/[id]/components/New.svelte rename to apps/trpc-experimental/client/src/routes/destinations/[id]/components/New.svelte diff --git a/apps/client/src/routes/destinations/[id]/components/NewLocalDocker.svelte b/apps/trpc-experimental/client/src/routes/destinations/[id]/components/NewLocalDocker.svelte similarity index 100% rename from apps/client/src/routes/destinations/[id]/components/NewLocalDocker.svelte rename to apps/trpc-experimental/client/src/routes/destinations/[id]/components/NewLocalDocker.svelte diff --git a/apps/client/src/routes/destinations/[id]/components/NewRemoteDocker.svelte b/apps/trpc-experimental/client/src/routes/destinations/[id]/components/NewRemoteDocker.svelte similarity index 100% rename from apps/client/src/routes/destinations/[id]/components/NewRemoteDocker.svelte rename to apps/trpc-experimental/client/src/routes/destinations/[id]/components/NewRemoteDocker.svelte diff --git a/apps/client/src/routes/destinations/[id]/components/RemoteDocker.svelte b/apps/trpc-experimental/client/src/routes/destinations/[id]/components/RemoteDocker.svelte similarity index 100% rename from apps/client/src/routes/destinations/[id]/components/RemoteDocker.svelte rename to apps/trpc-experimental/client/src/routes/destinations/[id]/components/RemoteDocker.svelte diff --git a/apps/client/src/routes/login/+page.svelte b/apps/trpc-experimental/client/src/routes/login/+page.svelte similarity index 100% rename from apps/client/src/routes/login/+page.svelte rename to apps/trpc-experimental/client/src/routes/login/+page.svelte diff --git a/apps/client/src/routes/register/+page.svelte b/apps/trpc-experimental/client/src/routes/register/+page.svelte similarity index 100% rename from apps/client/src/routes/register/+page.svelte rename to apps/trpc-experimental/client/src/routes/register/+page.svelte diff --git a/apps/client/src/routes/services/[id]/+layout.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/+layout.svelte similarity index 100% rename from apps/client/src/routes/services/[id]/+layout.svelte rename to apps/trpc-experimental/client/src/routes/services/[id]/+layout.svelte diff --git a/apps/client/src/routes/services/[id]/+layout.ts b/apps/trpc-experimental/client/src/routes/services/[id]/+layout.ts similarity index 100% rename from apps/client/src/routes/services/[id]/+layout.ts rename to apps/trpc-experimental/client/src/routes/services/[id]/+layout.ts diff --git a/apps/client/src/routes/services/[id]/+page.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/+page.svelte similarity index 100% rename from apps/client/src/routes/services/[id]/+page.svelte rename to apps/trpc-experimental/client/src/routes/services/[id]/+page.svelte diff --git a/apps/client/src/routes/services/[id]/components/Menu.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/components/Menu.svelte similarity index 100% rename from apps/client/src/routes/services/[id]/components/Menu.svelte rename to apps/trpc-experimental/client/src/routes/services/[id]/components/Menu.svelte diff --git a/apps/client/src/routes/services/[id]/components/ServiceLinks.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/components/ServiceLinks.svelte similarity index 100% rename from apps/client/src/routes/services/[id]/components/ServiceLinks.svelte rename to apps/trpc-experimental/client/src/routes/services/[id]/components/ServiceLinks.svelte diff --git a/apps/client/src/routes/services/[id]/components/ServiceStatus.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/components/ServiceStatus.svelte similarity index 100% rename from apps/client/src/routes/services/[id]/components/ServiceStatus.svelte rename to apps/trpc-experimental/client/src/routes/services/[id]/components/ServiceStatus.svelte diff --git a/apps/client/src/routes/services/[id]/components/Wordpress.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/components/Wordpress.svelte similarity index 100% rename from apps/client/src/routes/services/[id]/components/Wordpress.svelte rename to apps/trpc-experimental/client/src/routes/services/[id]/components/Wordpress.svelte diff --git a/apps/client/src/routes/services/[id]/danger/+page.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/danger/+page.svelte similarity index 100% rename from apps/client/src/routes/services/[id]/danger/+page.svelte rename to apps/trpc-experimental/client/src/routes/services/[id]/danger/+page.svelte diff --git a/apps/client/src/routes/services/[id]/logs/+page.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/logs/+page.svelte similarity index 100% rename from apps/client/src/routes/services/[id]/logs/+page.svelte rename to apps/trpc-experimental/client/src/routes/services/[id]/logs/+page.svelte diff --git a/apps/client/src/routes/services/[id]/secrets/+page.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/secrets/+page.svelte similarity index 100% rename from apps/client/src/routes/services/[id]/secrets/+page.svelte rename to apps/trpc-experimental/client/src/routes/services/[id]/secrets/+page.svelte diff --git a/apps/client/src/routes/services/[id]/secrets/+page.ts b/apps/trpc-experimental/client/src/routes/services/[id]/secrets/+page.ts similarity index 100% rename from apps/client/src/routes/services/[id]/secrets/+page.ts rename to apps/trpc-experimental/client/src/routes/services/[id]/secrets/+page.ts diff --git a/apps/client/src/routes/services/[id]/secrets/components/Secret.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/secrets/components/Secret.svelte similarity index 100% rename from apps/client/src/routes/services/[id]/secrets/components/Secret.svelte rename to apps/trpc-experimental/client/src/routes/services/[id]/secrets/components/Secret.svelte diff --git a/apps/client/src/routes/services/[id]/secrets/utils.ts b/apps/trpc-experimental/client/src/routes/services/[id]/secrets/utils.ts similarity index 100% rename from apps/client/src/routes/services/[id]/secrets/utils.ts rename to apps/trpc-experimental/client/src/routes/services/[id]/secrets/utils.ts diff --git a/apps/client/src/routes/services/[id]/storages/+page.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/storages/+page.svelte similarity index 100% rename from apps/client/src/routes/services/[id]/storages/+page.svelte rename to apps/trpc-experimental/client/src/routes/services/[id]/storages/+page.svelte diff --git a/apps/client/src/routes/services/[id]/storages/+page.ts b/apps/trpc-experimental/client/src/routes/services/[id]/storages/+page.ts similarity index 100% rename from apps/client/src/routes/services/[id]/storages/+page.ts rename to apps/trpc-experimental/client/src/routes/services/[id]/storages/+page.ts diff --git a/apps/client/src/routes/services/[id]/storages/components/Storage.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/storages/components/Storage.svelte similarity index 100% rename from apps/client/src/routes/services/[id]/storages/components/Storage.svelte rename to apps/trpc-experimental/client/src/routes/services/[id]/storages/components/Storage.svelte diff --git a/apps/client/src/routes/services/[id]/utils.ts b/apps/trpc-experimental/client/src/routes/services/[id]/utils.ts similarity index 100% rename from apps/client/src/routes/services/[id]/utils.ts rename to apps/trpc-experimental/client/src/routes/services/[id]/utils.ts diff --git a/apps/client/src/routes/sources/[id]/+layout.svelte b/apps/trpc-experimental/client/src/routes/sources/[id]/+layout.svelte similarity index 100% rename from apps/client/src/routes/sources/[id]/+layout.svelte rename to apps/trpc-experimental/client/src/routes/sources/[id]/+layout.svelte diff --git a/apps/client/src/routes/sources/[id]/+layout.ts b/apps/trpc-experimental/client/src/routes/sources/[id]/+layout.ts similarity index 100% rename from apps/client/src/routes/sources/[id]/+layout.ts rename to apps/trpc-experimental/client/src/routes/sources/[id]/+layout.ts diff --git a/apps/client/src/routes/sources/[id]/+page.svelte b/apps/trpc-experimental/client/src/routes/sources/[id]/+page.svelte similarity index 100% rename from apps/client/src/routes/sources/[id]/+page.svelte rename to apps/trpc-experimental/client/src/routes/sources/[id]/+page.svelte diff --git a/apps/client/src/routes/sources/[id]/components/Github.svelte b/apps/trpc-experimental/client/src/routes/sources/[id]/components/Github.svelte similarity index 100% rename from apps/client/src/routes/sources/[id]/components/Github.svelte rename to apps/trpc-experimental/client/src/routes/sources/[id]/components/Github.svelte diff --git a/apps/client/src/routes/sources/[id]/components/Gitlab.svelte b/apps/trpc-experimental/client/src/routes/sources/[id]/components/Gitlab.svelte similarity index 100% rename from apps/client/src/routes/sources/[id]/components/Gitlab.svelte rename to apps/trpc-experimental/client/src/routes/sources/[id]/components/Gitlab.svelte diff --git a/apps/client/src/routes/sources/[id]/components/New.svelte b/apps/trpc-experimental/client/src/routes/sources/[id]/components/New.svelte similarity index 100% rename from apps/client/src/routes/sources/[id]/components/New.svelte rename to apps/trpc-experimental/client/src/routes/sources/[id]/components/New.svelte diff --git a/apps/client/src/routes/sources/[id]/components/Source.svelte b/apps/trpc-experimental/client/src/routes/sources/[id]/components/Source.svelte similarity index 100% rename from apps/client/src/routes/sources/[id]/components/Source.svelte rename to apps/trpc-experimental/client/src/routes/sources/[id]/components/Source.svelte diff --git a/apps/client/static/favicon.png b/apps/trpc-experimental/client/static/favicon.png similarity index 100% rename from apps/client/static/favicon.png rename to apps/trpc-experimental/client/static/favicon.png diff --git a/apps/client/static/icons/appsmith.png b/apps/trpc-experimental/client/static/icons/appsmith.png similarity index 100% rename from apps/client/static/icons/appsmith.png rename to apps/trpc-experimental/client/static/icons/appsmith.png diff --git a/apps/client/static/icons/appwrite.png b/apps/trpc-experimental/client/static/icons/appwrite.png similarity index 100% rename from apps/client/static/icons/appwrite.png rename to apps/trpc-experimental/client/static/icons/appwrite.png diff --git a/apps/client/static/icons/compose.png b/apps/trpc-experimental/client/static/icons/compose.png similarity index 100% rename from apps/client/static/icons/compose.png rename to apps/trpc-experimental/client/static/icons/compose.png diff --git a/apps/client/static/icons/default.png b/apps/trpc-experimental/client/static/icons/default.png similarity index 100% rename from apps/client/static/icons/default.png rename to apps/trpc-experimental/client/static/icons/default.png diff --git a/apps/client/static/icons/directus.svg b/apps/trpc-experimental/client/static/icons/directus.svg similarity index 100% rename from apps/client/static/icons/directus.svg rename to apps/trpc-experimental/client/static/icons/directus.svg diff --git a/apps/client/static/icons/fider.png b/apps/trpc-experimental/client/static/icons/fider.png similarity index 100% rename from apps/client/static/icons/fider.png rename to apps/trpc-experimental/client/static/icons/fider.png diff --git a/apps/client/static/icons/ghost.png b/apps/trpc-experimental/client/static/icons/ghost.png similarity index 100% rename from apps/client/static/icons/ghost.png rename to apps/trpc-experimental/client/static/icons/ghost.png diff --git a/apps/client/static/icons/gitea.svg b/apps/trpc-experimental/client/static/icons/gitea.svg similarity index 100% rename from apps/client/static/icons/gitea.svg rename to apps/trpc-experimental/client/static/icons/gitea.svg diff --git a/apps/client/static/icons/glitchtip.svg b/apps/trpc-experimental/client/static/icons/glitchtip.svg similarity index 100% rename from apps/client/static/icons/glitchtip.svg rename to apps/trpc-experimental/client/static/icons/glitchtip.svg diff --git a/apps/client/static/icons/grafana.png b/apps/trpc-experimental/client/static/icons/grafana.png similarity index 100% rename from apps/client/static/icons/grafana.png rename to apps/trpc-experimental/client/static/icons/grafana.png diff --git a/apps/client/static/icons/hasura.png b/apps/trpc-experimental/client/static/icons/hasura.png similarity index 100% rename from apps/client/static/icons/hasura.png rename to apps/trpc-experimental/client/static/icons/hasura.png diff --git a/apps/client/static/icons/keycloak.png b/apps/trpc-experimental/client/static/icons/keycloak.png similarity index 100% rename from apps/client/static/icons/keycloak.png rename to apps/trpc-experimental/client/static/icons/keycloak.png diff --git a/apps/client/static/icons/languagetool.svg b/apps/trpc-experimental/client/static/icons/languagetool.svg similarity index 100% rename from apps/client/static/icons/languagetool.svg rename to apps/trpc-experimental/client/static/icons/languagetool.svg diff --git a/apps/client/static/icons/lavalink.png b/apps/trpc-experimental/client/static/icons/lavalink.png similarity index 100% rename from apps/client/static/icons/lavalink.png rename to apps/trpc-experimental/client/static/icons/lavalink.png diff --git a/apps/client/static/icons/libretranslate.png b/apps/trpc-experimental/client/static/icons/libretranslate.png similarity index 100% rename from apps/client/static/icons/libretranslate.png rename to apps/trpc-experimental/client/static/icons/libretranslate.png diff --git a/apps/client/static/icons/meilisearch.svg b/apps/trpc-experimental/client/static/icons/meilisearch.svg similarity index 100% rename from apps/client/static/icons/meilisearch.svg rename to apps/trpc-experimental/client/static/icons/meilisearch.svg diff --git a/apps/client/static/icons/minio.png b/apps/trpc-experimental/client/static/icons/minio.png similarity index 100% rename from apps/client/static/icons/minio.png rename to apps/trpc-experimental/client/static/icons/minio.png diff --git a/apps/client/static/icons/moodle.png b/apps/trpc-experimental/client/static/icons/moodle.png similarity index 100% rename from apps/client/static/icons/moodle.png rename to apps/trpc-experimental/client/static/icons/moodle.png diff --git a/apps/client/static/icons/n8n.svg b/apps/trpc-experimental/client/static/icons/n8n.svg similarity index 100% rename from apps/client/static/icons/n8n.svg rename to apps/trpc-experimental/client/static/icons/n8n.svg diff --git a/apps/client/static/icons/nocodb.png b/apps/trpc-experimental/client/static/icons/nocodb.png similarity index 100% rename from apps/client/static/icons/nocodb.png rename to apps/trpc-experimental/client/static/icons/nocodb.png diff --git a/apps/client/static/icons/openblocks.png b/apps/trpc-experimental/client/static/icons/openblocks.png similarity index 100% rename from apps/client/static/icons/openblocks.png rename to apps/trpc-experimental/client/static/icons/openblocks.png diff --git a/apps/client/static/icons/plausibleanalytics.png b/apps/trpc-experimental/client/static/icons/plausibleanalytics.png similarity index 100% rename from apps/client/static/icons/plausibleanalytics.png rename to apps/trpc-experimental/client/static/icons/plausibleanalytics.png diff --git a/apps/client/static/icons/pocketbase.svg b/apps/trpc-experimental/client/static/icons/pocketbase.svg similarity index 100% rename from apps/client/static/icons/pocketbase.svg rename to apps/trpc-experimental/client/static/icons/pocketbase.svg diff --git a/apps/client/static/icons/searxng.svg b/apps/trpc-experimental/client/static/icons/searxng.svg similarity index 100% rename from apps/client/static/icons/searxng.svg rename to apps/trpc-experimental/client/static/icons/searxng.svg diff --git a/apps/client/static/icons/trilium.png b/apps/trpc-experimental/client/static/icons/trilium.png similarity index 100% rename from apps/client/static/icons/trilium.png rename to apps/trpc-experimental/client/static/icons/trilium.png diff --git a/apps/client/static/icons/umami.svg b/apps/trpc-experimental/client/static/icons/umami.svg similarity index 100% rename from apps/client/static/icons/umami.svg rename to apps/trpc-experimental/client/static/icons/umami.svg diff --git a/apps/client/static/icons/uptimekuma.svg b/apps/trpc-experimental/client/static/icons/uptimekuma.svg similarity index 100% rename from apps/client/static/icons/uptimekuma.svg rename to apps/trpc-experimental/client/static/icons/uptimekuma.svg diff --git a/apps/client/static/icons/vaultwarden.svg b/apps/trpc-experimental/client/static/icons/vaultwarden.svg similarity index 100% rename from apps/client/static/icons/vaultwarden.svg rename to apps/trpc-experimental/client/static/icons/vaultwarden.svg diff --git a/apps/client/static/icons/vscodeserver.png b/apps/trpc-experimental/client/static/icons/vscodeserver.png similarity index 100% rename from apps/client/static/icons/vscodeserver.png rename to apps/trpc-experimental/client/static/icons/vscodeserver.png diff --git a/apps/client/static/icons/weblate.svg b/apps/trpc-experimental/client/static/icons/weblate.svg similarity index 100% rename from apps/client/static/icons/weblate.svg rename to apps/trpc-experimental/client/static/icons/weblate.svg diff --git a/apps/client/static/icons/whoogle.png b/apps/trpc-experimental/client/static/icons/whoogle.png similarity index 100% rename from apps/client/static/icons/whoogle.png rename to apps/trpc-experimental/client/static/icons/whoogle.png diff --git a/apps/client/static/icons/wordpress.svg b/apps/trpc-experimental/client/static/icons/wordpress.svg similarity index 100% rename from apps/client/static/icons/wordpress.svg rename to apps/trpc-experimental/client/static/icons/wordpress.svg diff --git a/apps/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff b/apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff similarity index 100% rename from apps/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff rename to apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff diff --git a/apps/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff2 b/apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff2 similarity index 100% rename from apps/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff2 rename to apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff2 diff --git a/apps/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff b/apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff similarity index 100% rename from apps/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff rename to apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff diff --git a/apps/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff2 b/apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff2 similarity index 100% rename from apps/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff2 rename to apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff2 diff --git a/apps/client/svelte.config.js b/apps/trpc-experimental/client/svelte.config.js similarity index 100% rename from apps/client/svelte.config.js rename to apps/trpc-experimental/client/svelte.config.js diff --git a/apps/client/tailwind.config.cjs b/apps/trpc-experimental/client/tailwind.config.cjs similarity index 100% rename from apps/client/tailwind.config.cjs rename to apps/trpc-experimental/client/tailwind.config.cjs diff --git a/apps/client/tests/test.ts b/apps/trpc-experimental/client/tests/test.ts similarity index 100% rename from apps/client/tests/test.ts rename to apps/trpc-experimental/client/tests/test.ts diff --git a/apps/client/tsconfig.json b/apps/trpc-experimental/client/tsconfig.json similarity index 100% rename from apps/client/tsconfig.json rename to apps/trpc-experimental/client/tsconfig.json diff --git a/apps/client/vite.config.ts b/apps/trpc-experimental/client/vite.config.ts similarity index 100% rename from apps/client/vite.config.ts rename to apps/trpc-experimental/client/vite.config.ts diff --git a/apps/server/.env-template b/apps/trpc-experimental/server/.env-template similarity index 100% rename from apps/server/.env-template rename to apps/trpc-experimental/server/.env-template diff --git a/apps/server/.prettierrc b/apps/trpc-experimental/server/.prettierrc similarity index 100% rename from apps/server/.prettierrc rename to apps/trpc-experimental/server/.prettierrc diff --git a/apps/trpc-experimental/server/build/api/index.js b/apps/trpc-experimental/server/build/api/index.js new file mode 100644 index 000000000..2a6289ae9 --- /dev/null +++ b/apps/trpc-experimental/server/build/api/index.js @@ -0,0 +1,31 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var api_exports = {}; +__export(api_exports, { + default: () => api_default +}); +module.exports = __toCommonJS(api_exports); +const root = async (fastify) => { + fastify.get("/", async function(_request, _reply) { + return { status: "ok" }; + }); +}; +var api_default = root; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/config.js b/apps/trpc-experimental/server/build/config.js new file mode 100644 index 000000000..9186a9097 --- /dev/null +++ b/apps/trpc-experimental/server/build/config.js @@ -0,0 +1,32 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var config_exports = {}; +__export(config_exports, { + serverConfig: () => serverConfig +}); +module.exports = __toCommonJS(config_exports); +const serverConfig = { + dev: false, + port: 2022, + prefix: "/trpc" +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + serverConfig +}); diff --git a/apps/trpc-experimental/server/build/env.js b/apps/trpc-experimental/server/build/env.js new file mode 100644 index 000000000..455559525 --- /dev/null +++ b/apps/trpc-experimental/server/build/env.js @@ -0,0 +1,18 @@ +"use strict"; +const dotenv = require("dotenv"); +dotenv.config(); +const { z } = require("zod"); +const envSchema = z.object({ + CODESANDBOX_HOST: z.string().optional(), + NODE_ENV: z.enum(["development", "test", "production"]), + COOLIFY_DATABASE_URL: z.string(), + COOLIFY_SECRET_KEY: z.string().length(32), + COOLIFY_WHITE_LABELED: z.string().optional(), + COOLIFY_WHITE_LABELED_ICON: z.string().optional() +}); +const env = envSchema.safeParse(process.env); +if (!env.success) { + console.error("\u274C Invalid environment variables:", JSON.stringify(env.error.format(), null, 4)); + process.exit(1); +} +module.exports.env = env.data; diff --git a/apps/trpc-experimental/server/build/index.js b/apps/trpc-experimental/server/build/index.js new file mode 100644 index 000000000..5d36a4041 --- /dev/null +++ b/apps/trpc-experimental/server/build/index.js @@ -0,0 +1,5 @@ +"use strict"; +var import_config = require("./config"); +var import_server = require("./server"); +const server = (0, import_server.createServer)(import_config.serverConfig); +server.start(); diff --git a/apps/trpc-experimental/server/build/jobs/applicationBuildQueue.js b/apps/trpc-experimental/server/build/jobs/applicationBuildQueue.js new file mode 100644 index 000000000..0c00297a6 --- /dev/null +++ b/apps/trpc-experimental/server/build/jobs/applicationBuildQueue.js @@ -0,0 +1,813 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var import_node_worker_threads = require("node:worker_threads"); +var import_crypto = __toESM(require("crypto")); +var import_promises = __toESM(require("fs/promises")); +var import_js_yaml = __toESM(require("js-yaml")); +var import_common = require("../lib/buildPacks/common"); +var import_common2 = require("../lib/common"); +var importers = __toESM(require("../lib/importers")); +var buildpacks = __toESM(require("../lib/buildPacks")); +var import_prisma = require("../prisma"); +var import_executeCommand = require("../lib/executeCommand"); +var import_docker = require("../lib/docker"); +(async () => { + if (import_node_worker_threads.parentPort) { + import_node_worker_threads.parentPort.on("message", async (message) => { + if (message === "error") + throw new Error("oops"); + if (message === "cancel") { + import_node_worker_threads.parentPort.postMessage("cancelled"); + await import_prisma.prisma.$disconnect(); + process.exit(0); + } + }); + const pThrottle = await import("p-throttle"); + const throttle = pThrottle.default({ + limit: 1, + interval: 2e3 + }); + const th = throttle(async () => { + try { + const queuedBuilds = await import_prisma.prisma.build.findMany({ + where: { status: { in: ["queued", "running"] } }, + orderBy: { createdAt: "asc" } + }); + const { concurrentBuilds } = await import_prisma.prisma.setting.findFirst({}); + if (queuedBuilds.length > 0) { + import_node_worker_threads.parentPort.postMessage({ deploying: true }); + const concurrency = concurrentBuilds; + const pAll = await import("p-all"); + const actions = []; + for (const queueBuild of queuedBuilds) { + actions.push(async () => { + let application = await import_prisma.prisma.application.findUnique({ + where: { id: queueBuild.applicationId }, + include: { + dockerRegistry: true, + destinationDocker: true, + gitSource: { include: { githubApp: true, gitlabApp: true } }, + persistentStorage: true, + secrets: true, + settings: true, + teams: true + } + }); + let { + id: buildId, + type, + gitSourceId, + sourceBranch = null, + pullmergeRequestId = null, + previewApplicationId = null, + forceRebuild, + sourceRepository = null + } = queueBuild; + application = (0, import_common2.decryptApplication)(application); + if (!gitSourceId && application.simpleDockerfile) { + const { + id: applicationId2, + destinationDocker: destinationDocker2, + destinationDockerId: destinationDockerId2, + secrets: secrets2, + port: port2, + persistentStorage: persistentStorage2, + exposePort: exposePort2, + simpleDockerfile, + dockerRegistry: dockerRegistry2 + } = application; + const { workdir: workdir2 } = await (0, import_common2.createDirectories)({ repository: applicationId2, buildId }); + try { + if (queueBuild.status === "running") { + await (0, import_common.saveBuildLog)({ + line: "Building halted, restarting...", + buildId, + applicationId: application.id + }); + } + const volumes = persistentStorage2?.map((storage) => { + if (storage.oldPath) { + return `${applicationId2}${storage.path.replace(/\//gi, "-").replace("-app", "")}:${storage.path}`; + } + return `${applicationId2}${storage.path.replace(/\//gi, "-")}:${storage.path}`; + }) || []; + if (destinationDockerId2) { + await import_prisma.prisma.build.update({ + where: { id: buildId }, + data: { status: "running" } + }); + try { + const { stdout: containers } = await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDockerId2, + command: `docker ps -a --filter 'label=com.docker.compose.service=${applicationId2}' --format {{.ID}}` + }); + if (containers) { + const containerArray = containers.split("\n"); + if (containerArray.length > 0) { + for (const container of containerArray) { + await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDockerId2, + command: `docker stop -t 0 ${container}` + }); + await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDockerId2, + command: `docker rm --force ${container}` + }); + } + } + } + } catch (error) { + } + let envs = []; + if (secrets2.length > 0) { + envs = [ + ...envs, + ...(0, import_common2.generateSecrets)(secrets2, pullmergeRequestId, false, port2) + ]; + } + await import_promises.default.writeFile(`${workdir2}/Dockerfile`, simpleDockerfile); + if (dockerRegistry2) { + const { url, username, password } = dockerRegistry2; + await (0, import_common.saveDockerRegistryCredentials)({ url, username, password, workdir: workdir2 }); + } + const labels = (0, import_common.makeLabelForSimpleDockerfile)({ + applicationId: applicationId2, + type, + port: exposePort2 ? `${exposePort2}:${port2}` : port2 + }); + try { + const composeVolumes = volumes.map((volume) => { + return { + [`${volume.split(":")[0]}`]: { + name: volume.split(":")[0] + } + }; + }); + const composeFile = { + version: "3.8", + services: { + [applicationId2]: { + build: { + context: workdir2 + }, + image: `${applicationId2}:${buildId}`, + container_name: applicationId2, + volumes, + labels, + environment: envs, + depends_on: [], + expose: [port2], + ...exposePort2 ? { ports: [`${exposePort2}:${port2}`] } : {}, + ...(0, import_docker.defaultComposeConfiguration)(destinationDocker2.network) + } + }, + networks: { + [destinationDocker2.network]: { + external: true + } + }, + volumes: Object.assign({}, ...composeVolumes) + }; + await import_promises.default.writeFile(`${workdir2}/docker-compose.yml`, import_js_yaml.default.dump(composeFile)); + await (0, import_executeCommand.executeCommand)({ + debug: true, + dockerId: destinationDocker2.id, + command: `docker compose --project-directory ${workdir2} up -d` + }); + await (0, import_common.saveBuildLog)({ line: "Deployed \u{1F389}", buildId, applicationId: applicationId2 }); + } catch (error) { + await (0, import_common.saveBuildLog)({ line: error, buildId, applicationId: applicationId2 }); + const foundBuild = await import_prisma.prisma.build.findUnique({ where: { id: buildId } }); + if (foundBuild) { + await import_prisma.prisma.build.update({ + where: { id: buildId }, + data: { + status: "failed" + } + }); + } + throw new Error(error); + } + } + } catch (error) { + const foundBuild = await import_prisma.prisma.build.findUnique({ where: { id: buildId } }); + if (foundBuild) { + await import_prisma.prisma.build.update({ + where: { id: buildId }, + data: { + status: "failed" + } + }); + } + if (error !== 1) { + await (0, import_common.saveBuildLog)({ line: error, buildId, applicationId: application.id }); + } + if (error instanceof Error) { + await (0, import_common.saveBuildLog)({ + line: error.message, + buildId, + applicationId: application.id + }); + } + await import_promises.default.rm(workdir2, { recursive: true, force: true }); + return; + } + try { + if (application.dockerRegistryImageName) { + const customTag2 = application.dockerRegistryImageName.split(":")[1] || buildId; + const imageName2 = application.dockerRegistryImageName.split(":")[0]; + await (0, import_common.saveBuildLog)({ + line: `Pushing ${imageName2}:${customTag2} to Docker Registry... It could take a while...`, + buildId, + applicationId: application.id + }); + await (0, import_common2.pushToRegistry)(application, workdir2, buildId, imageName2, customTag2); + await (0, import_common.saveBuildLog)({ line: "Success", buildId, applicationId: application.id }); + } + } catch (error) { + if (error.stdout) { + await (0, import_common.saveBuildLog)({ line: error.stdout, buildId, applicationId: applicationId2 }); + } + if (error.stderr) { + await (0, import_common.saveBuildLog)({ line: error.stderr, buildId, applicationId: applicationId2 }); + } + } finally { + await import_promises.default.rm(workdir2, { recursive: true, force: true }); + await import_prisma.prisma.build.update({ + where: { id: buildId }, + data: { status: "success" } + }); + } + return; + } + const originalApplicationId = application.id; + const { + id: applicationId, + name, + destinationDocker, + destinationDockerId, + gitSource, + configHash, + fqdn, + projectId, + secrets, + phpModules, + settings, + persistentStorage, + pythonWSGI, + pythonModule, + pythonVariable, + denoOptions, + exposePort, + baseImage, + baseBuildImage, + deploymentType, + gitCommitHash, + dockerRegistry + } = application; + let { + branch, + repository, + buildPack, + port, + installCommand, + buildCommand, + startCommand, + baseDirectory, + publishDirectory, + dockerFileLocation, + dockerComposeFileLocation, + dockerComposeConfiguration, + denoMainFile + } = application; + let imageId = applicationId; + let domain = (0, import_common2.getDomain)(fqdn); + let location = null; + let tag = null; + let customTag = null; + let imageName = null; + let imageFoundLocally = false; + let imageFoundRemotely = false; + if (pullmergeRequestId) { + const previewApplications = await import_prisma.prisma.previewApplication.findMany({ + where: { applicationId: originalApplicationId, pullmergeRequestId } + }); + if (previewApplications.length > 0) { + previewApplicationId = previewApplications[0].id; + } + branch = sourceBranch; + domain = `${pullmergeRequestId}.${domain}`; + imageId = `${applicationId}-${pullmergeRequestId}`; + repository = sourceRepository || repository; + } + const { workdir, repodir } = await (0, import_common2.createDirectories)({ repository, buildId }); + try { + if (queueBuild.status === "running") { + await (0, import_common.saveBuildLog)({ + line: "Building halted, restarting...", + buildId, + applicationId: application.id + }); + } + const currentHash = import_crypto.default.createHash("sha256").update( + JSON.stringify({ + pythonWSGI, + pythonModule, + pythonVariable, + deploymentType, + denoOptions, + baseImage, + baseBuildImage, + buildPack, + port, + exposePort, + installCommand, + buildCommand, + startCommand, + secrets, + branch, + repository, + fqdn + }) + ).digest("hex"); + const { debug } = settings; + if (!debug) { + await (0, import_common.saveBuildLog)({ + line: `Debug logging is disabled. Enable it above if necessary!`, + buildId, + applicationId + }); + } + const volumes = persistentStorage?.map((storage) => { + if (storage.oldPath) { + return `${applicationId}${storage.path.replace(/\//gi, "-").replace("-app", "")}:${storage.path}`; + } + return `${applicationId}${storage.path.replace(/\//gi, "-")}:${storage.path}`; + }) || []; + try { + dockerComposeConfiguration = JSON.parse(dockerComposeConfiguration); + } catch (error) { + } + let deployNeeded = true; + let destinationType; + if (destinationDockerId) { + destinationType = "docker"; + } + if (destinationType === "docker") { + await import_prisma.prisma.build.update({ + where: { id: buildId }, + data: { status: "running" } + }); + const configuration = await (0, import_common.setDefaultConfiguration)(application); + buildPack = configuration.buildPack; + port = configuration.port; + installCommand = configuration.installCommand; + startCommand = configuration.startCommand; + buildCommand = configuration.buildCommand; + publishDirectory = configuration.publishDirectory; + baseDirectory = configuration.baseDirectory || ""; + dockerFileLocation = configuration.dockerFileLocation; + dockerComposeFileLocation = configuration.dockerComposeFileLocation; + denoMainFile = configuration.denoMainFile; + const commit = await importers[gitSource.type]({ + applicationId, + debug, + workdir, + repodir, + githubAppId: gitSource.githubApp?.id, + gitlabAppId: gitSource.gitlabApp?.id, + customPort: gitSource.customPort, + gitCommitHash, + configuration, + repository, + branch, + buildId, + apiUrl: gitSource.apiUrl, + htmlUrl: gitSource.htmlUrl, + projectId, + deployKeyId: gitSource.gitlabApp?.deployKeyId || null, + privateSshKey: (0, import_common2.decrypt)(gitSource.gitlabApp?.privateSshKey) || null, + forPublic: gitSource.forPublic + }); + if (!commit) { + throw new Error("No commit found?"); + } + tag = commit.slice(0, 7); + if (pullmergeRequestId) { + tag = `${commit.slice(0, 7)}-${pullmergeRequestId}`; + } + if (application.dockerRegistryImageName) { + imageName = application.dockerRegistryImageName.split(":")[0]; + customTag = application.dockerRegistryImageName.split(":")[1] || tag; + } else { + customTag = tag; + imageName = applicationId; + } + if (pullmergeRequestId) { + customTag = `${customTag}-${pullmergeRequestId}`; + } + try { + await import_prisma.prisma.build.update({ where: { id: buildId }, data: { commit } }); + } catch (err) { + } + if (!pullmergeRequestId) { + if (configHash !== currentHash) { + deployNeeded = true; + if (configHash) { + await (0, import_common.saveBuildLog)({ + line: "Configuration changed", + buildId, + applicationId + }); + } + } else { + deployNeeded = false; + } + } else { + deployNeeded = true; + } + try { + await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDocker.id, + command: `docker image inspect ${applicationId}:${tag}` + }); + imageFoundLocally = true; + } catch (error) { + } + if (dockerRegistry) { + const { url, username, password } = dockerRegistry; + location = await (0, import_common.saveDockerRegistryCredentials)({ + url, + username, + password, + workdir + }); + } + try { + await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDocker.id, + command: `docker ${location ? `--config ${location}` : ""} pull ${imageName}:${customTag}` + }); + imageFoundRemotely = true; + } catch (error) { + } + let imageFound = `${applicationId}:${tag}`; + if (imageFoundRemotely) { + imageFound = `${imageName}:${customTag}`; + } + await (0, import_common.copyBaseConfigurationFiles)( + buildPack, + workdir, + buildId, + applicationId, + baseImage + ); + const labels = (0, import_common.makeLabelForStandaloneApplication)({ + applicationId, + fqdn, + name, + type, + pullmergeRequestId, + buildPack, + repository, + branch, + projectId, + port: exposePort ? `${exposePort}:${port}` : port, + commit, + installCommand, + buildCommand, + startCommand, + baseDirectory, + publishDirectory + }); + if (forceRebuild) + deployNeeded = true; + if (!imageFoundLocally && !imageFoundRemotely || deployNeeded) { + if (buildPack === "static") { + await buildpacks.staticApp({ + dockerId: destinationDocker.id, + network: destinationDocker.network, + buildId, + applicationId, + domain, + name, + type, + volumes, + labels, + pullmergeRequestId, + buildPack, + repository, + branch, + projectId, + publishDirectory, + debug, + commit, + tag, + workdir, + port: exposePort ? `${exposePort}:${port}` : port, + installCommand, + buildCommand, + startCommand, + baseDirectory, + secrets, + phpModules, + pythonWSGI, + pythonModule, + pythonVariable, + dockerFileLocation, + dockerComposeConfiguration, + dockerComposeFileLocation, + denoMainFile, + denoOptions, + baseImage, + baseBuildImage, + deploymentType, + forceRebuild + }); + } else if (buildpacks[buildPack]) + await buildpacks[buildPack]({ + dockerId: destinationDocker.id, + network: destinationDocker.network, + buildId, + applicationId, + domain, + name, + type, + volumes, + labels, + pullmergeRequestId, + buildPack, + repository, + branch, + projectId, + publishDirectory, + debug, + commit, + tag, + workdir, + port: exposePort ? `${exposePort}:${port}` : port, + installCommand, + buildCommand, + startCommand, + baseDirectory, + secrets, + phpModules, + pythonWSGI, + pythonModule, + pythonVariable, + dockerFileLocation, + dockerComposeConfiguration, + dockerComposeFileLocation, + denoMainFile, + denoOptions, + baseImage, + baseBuildImage, + deploymentType, + forceRebuild + }); + else { + await (0, import_common.saveBuildLog)({ + line: `Build pack ${buildPack} not found`, + buildId, + applicationId + }); + throw new Error(`Build pack ${buildPack} not found.`); + } + } else { + if (imageFoundRemotely || deployNeeded) { + await (0, import_common.saveBuildLog)({ + line: `Container image ${imageFound} found in Docker Registry - reuising it`, + buildId, + applicationId + }); + } else { + if (imageFoundLocally || deployNeeded) { + await (0, import_common.saveBuildLog)({ + line: `Container image ${imageFound} found locally - reuising it`, + buildId, + applicationId + }); + } + } + } + if (buildPack === "compose") { + try { + const { stdout: containers } = await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDockerId, + command: `docker ps -a --filter 'label=coolify.applicationId=${applicationId}' --format {{.ID}}` + }); + if (containers) { + const containerArray = containers.split("\n"); + if (containerArray.length > 0) { + for (const container of containerArray) { + await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDockerId, + command: `docker stop -t 0 ${container}` + }); + await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDockerId, + command: `docker rm --force ${container}` + }); + } + } + } + } catch (error) { + } + try { + await (0, import_executeCommand.executeCommand)({ + debug, + buildId, + applicationId, + dockerId: destinationDocker.id, + command: `docker compose --project-directory ${workdir} up -d` + }); + await (0, import_common.saveBuildLog)({ line: "Deployed \u{1F389}", buildId, applicationId }); + await import_prisma.prisma.build.update({ + where: { id: buildId }, + data: { status: "success" } + }); + await import_prisma.prisma.application.update({ + where: { id: applicationId }, + data: { configHash: currentHash } + }); + } catch (error) { + await (0, import_common.saveBuildLog)({ line: error, buildId, applicationId }); + const foundBuild = await import_prisma.prisma.build.findUnique({ where: { id: buildId } }); + if (foundBuild) { + await import_prisma.prisma.build.update({ + where: { id: buildId }, + data: { + status: "failed" + } + }); + } + throw new Error(error); + } + } else { + try { + const { stdout: containers } = await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDockerId, + command: `docker ps -a --filter 'label=com.docker.compose.service=${pullmergeRequestId ? imageId : applicationId}' --format {{.ID}}` + }); + if (containers) { + const containerArray = containers.split("\n"); + if (containerArray.length > 0) { + for (const container of containerArray) { + await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDockerId, + command: `docker stop -t 0 ${container}` + }); + await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDockerId, + command: `docker rm --force ${container}` + }); + } + } + } + } catch (error) { + } + let envs = []; + if (secrets.length > 0) { + envs = [ + ...envs, + ...(0, import_common2.generateSecrets)(secrets, pullmergeRequestId, false, port) + ]; + } + if (dockerRegistry) { + const { url, username, password } = dockerRegistry; + await (0, import_common.saveDockerRegistryCredentials)({ url, username, password, workdir }); + } + try { + const composeVolumes = volumes.map((volume) => { + return { + [`${volume.split(":")[0]}`]: { + name: volume.split(":")[0] + } + }; + }); + const composeFile = { + version: "3.8", + services: { + [imageId]: { + image: imageFound, + container_name: imageId, + volumes, + environment: envs, + labels, + depends_on: [], + expose: [port], + ...exposePort ? { ports: [`${exposePort}:${port}`] } : {}, + ...(0, import_docker.defaultComposeConfiguration)(destinationDocker.network) + } + }, + networks: { + [destinationDocker.network]: { + external: true + } + }, + volumes: Object.assign({}, ...composeVolumes) + }; + await import_promises.default.writeFile(`${workdir}/docker-compose.yml`, import_js_yaml.default.dump(composeFile)); + await (0, import_executeCommand.executeCommand)({ + debug, + dockerId: destinationDocker.id, + command: `docker compose --project-directory ${workdir} up -d` + }); + await (0, import_common.saveBuildLog)({ line: "Deployed \u{1F389}", buildId, applicationId }); + } catch (error) { + await (0, import_common.saveBuildLog)({ line: error, buildId, applicationId }); + const foundBuild = await import_prisma.prisma.build.findUnique({ where: { id: buildId } }); + if (foundBuild) { + await import_prisma.prisma.build.update({ + where: { id: buildId }, + data: { + status: "failed" + } + }); + } + throw new Error(error); + } + if (!pullmergeRequestId) + await import_prisma.prisma.application.update({ + where: { id: applicationId }, + data: { configHash: currentHash } + }); + } + } + } catch (error) { + const foundBuild = await import_prisma.prisma.build.findUnique({ where: { id: buildId } }); + if (foundBuild) { + await import_prisma.prisma.build.update({ + where: { id: buildId }, + data: { + status: "failed" + } + }); + } + if (error !== 1) { + await (0, import_common.saveBuildLog)({ line: error, buildId, applicationId: application.id }); + } + if (error instanceof Error) { + await (0, import_common.saveBuildLog)({ + line: error.message, + buildId, + applicationId: application.id + }); + } + await import_promises.default.rm(workdir, { recursive: true, force: true }); + return; + } + try { + if (application.dockerRegistryImageName && (!imageFoundRemotely || forceRebuild)) { + await (0, import_common.saveBuildLog)({ + line: `Pushing ${imageName}:${customTag} to Docker Registry... It could take a while...`, + buildId, + applicationId: application.id + }); + await (0, import_common2.pushToRegistry)(application, workdir, tag, imageName, customTag); + await (0, import_common.saveBuildLog)({ line: "Success", buildId, applicationId: application.id }); + } + } catch (error) { + if (error.stdout) { + await (0, import_common.saveBuildLog)({ line: error.stdout, buildId, applicationId }); + } + if (error.stderr) { + await (0, import_common.saveBuildLog)({ line: error.stderr, buildId, applicationId }); + } + } finally { + await import_promises.default.rm(workdir, { recursive: true, force: true }); + await import_prisma.prisma.build.update({ where: { id: buildId }, data: { status: "success" } }); + } + }); + } + await pAll.default(actions, { concurrency }); + } + } catch (error) { + console.log(error); + } + }); + while (true) { + await th(); + } + } else { + console.log("hello"); + process.exit(0); + } +})(); diff --git a/apps/trpc-experimental/server/build/lib/buildPacks/common.js b/apps/trpc-experimental/server/build/lib/buildPacks/common.js new file mode 100644 index 000000000..063f4920f --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/buildPacks/common.js @@ -0,0 +1,842 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var common_exports = {}; +__export(common_exports, { + buildCacheImageForLaravel: () => buildCacheImageForLaravel, + buildCacheImageWithCargo: () => buildCacheImageWithCargo, + buildCacheImageWithNode: () => buildCacheImageWithNode, + buildImage: () => buildImage, + checkPnpm: () => checkPnpm, + copyBaseConfigurationFiles: () => copyBaseConfigurationFiles, + makeLabelForSimpleDockerfile: () => makeLabelForSimpleDockerfile, + makeLabelForStandaloneApplication: () => makeLabelForStandaloneApplication, + saveBuildLog: () => saveBuildLog, + saveDockerRegistryCredentials: () => saveDockerRegistryCredentials, + scanningTemplates: () => scanningTemplates, + setDefaultBaseImage: () => setDefaultBaseImage, + setDefaultConfiguration: () => setDefaultConfiguration +}); +module.exports = __toCommonJS(common_exports); +var import_common = require("../common"); +var import_fs = require("fs"); +var import_dayjs = require("../dayjs"); +var import_prisma = require("../../prisma"); +var import_executeCommand = require("../executeCommand"); +const staticApps = ["static", "react", "vuejs", "svelte", "gatsby", "astro", "eleventy"]; +const nodeBased = [ + "react", + "preact", + "vuejs", + "svelte", + "gatsby", + "astro", + "eleventy", + "node", + "nestjs", + "nuxtjs", + "nextjs" +]; +function setDefaultBaseImage(buildPack, deploymentType = null) { + const nodeVersions = [ + { + value: "node:lts", + label: "node:lts" + }, + { + value: "node:18", + label: "node:18" + }, + { + value: "node:17", + label: "node:17" + }, + { + value: "node:16", + label: "node:16" + }, + { + value: "node:14", + label: "node:14" + }, + { + value: "node:12", + label: "node:12" + } + ]; + const staticVersions = [ + { + value: "webdevops/nginx:alpine", + label: "webdevops/nginx:alpine" + }, + { + value: "webdevops/apache:alpine", + label: "webdevops/apache:alpine" + }, + { + value: "nginx:alpine", + label: "nginx:alpine" + }, + { + value: "httpd:alpine", + label: "httpd:alpine (Apache)" + } + ]; + const rustVersions = [ + { + value: "rust:latest", + label: "rust:latest" + }, + { + value: "rust:1.60", + label: "rust:1.60" + }, + { + value: "rust:1.60-buster", + label: "rust:1.60-buster" + }, + { + value: "rust:1.60-bullseye", + label: "rust:1.60-bullseye" + }, + { + value: "rust:1.60-slim-buster", + label: "rust:1.60-slim-buster" + }, + { + value: "rust:1.60-slim-bullseye", + label: "rust:1.60-slim-bullseye" + }, + { + value: "rust:1.60-alpine3.14", + label: "rust:1.60-alpine3.14" + }, + { + value: "rust:1.60-alpine3.15", + label: "rust:1.60-alpine3.15" + } + ]; + const phpVersions = [ + { + value: "webdevops/php-apache:8.2", + label: "webdevops/php-apache:8.2" + }, + { + value: "webdevops/php-nginx:8.2", + label: "webdevops/php-nginx:8.2" + }, + { + value: "webdevops/php-apache:8.1", + label: "webdevops/php-apache:8.1" + }, + { + value: "webdevops/php-nginx:8.1", + label: "webdevops/php-nginx:8.1" + }, + { + value: "webdevops/php-apache:8.0", + label: "webdevops/php-apache:8.0" + }, + { + value: "webdevops/php-nginx:8.0", + label: "webdevops/php-nginx:8.0" + }, + { + value: "webdevops/php-apache:7.4", + label: "webdevops/php-apache:7.4" + }, + { + value: "webdevops/php-nginx:7.4", + label: "webdevops/php-nginx:7.4" + }, + { + value: "webdevops/php-apache:7.3", + label: "webdevops/php-apache:7.3" + }, + { + value: "webdevops/php-nginx:7.3", + label: "webdevops/php-nginx:7.3" + }, + { + value: "webdevops/php-apache:7.2", + label: "webdevops/php-apache:7.2" + }, + { + value: "webdevops/php-nginx:7.2", + label: "webdevops/php-nginx:7.2" + }, + { + value: "webdevops/php-apache:7.1", + label: "webdevops/php-apache:7.1" + }, + { + value: "webdevops/php-nginx:7.1", + label: "webdevops/php-nginx:7.1" + }, + { + value: "webdevops/php-apache:7.0", + label: "webdevops/php-apache:7.0" + }, + { + value: "webdevops/php-nginx:7.0", + label: "webdevops/php-nginx:7.0" + }, + { + value: "webdevops/php-apache:5.6", + label: "webdevops/php-apache:5.6" + }, + { + value: "webdevops/php-nginx:5.6", + label: "webdevops/php-nginx:5.6" + }, + { + value: "webdevops/php-apache:8.2-alpine", + label: "webdevops/php-apache:8.2-alpine" + }, + { + value: "webdevops/php-nginx:8.2-alpine", + label: "webdevops/php-nginx:8.2-alpine" + }, + { + value: "webdevops/php-apache:8.1-alpine", + label: "webdevops/php-apache:8.1-alpine" + }, + { + value: "webdevops/php-nginx:8.1-alpine", + label: "webdevops/php-nginx:8.1-alpine" + }, + { + value: "webdevops/php-apache:8.0-alpine", + label: "webdevops/php-apache:8.0-alpine" + }, + { + value: "webdevops/php-nginx:8.0-alpine", + label: "webdevops/php-nginx:8.0-alpine" + }, + { + value: "webdevops/php-apache:7.4-alpine", + label: "webdevops/php-apache:7.4-alpine" + }, + { + value: "webdevops/php-nginx:7.4-alpine", + label: "webdevops/php-nginx:7.4-alpine" + }, + { + value: "webdevops/php-apache:7.3-alpine", + label: "webdevops/php-apache:7.3-alpine" + }, + { + value: "webdevops/php-nginx:7.3-alpine", + label: "webdevops/php-nginx:7.3-alpine" + }, + { + value: "webdevops/php-apache:7.2-alpine", + label: "webdevops/php-apache:7.2-alpine" + }, + { + value: "webdevops/php-nginx:7.2-alpine", + label: "webdevops/php-nginx:7.2-alpine" + }, + { + value: "webdevops/php-apache:7.1-alpine", + label: "webdevops/php-apache:7.1-alpine" + }, + { + value: "php:8.1-fpm", + label: "php:8.1-fpm" + }, + { + value: "php:8.0-fpm", + label: "php:8.0-fpm" + }, + { + value: "php:8.1-fpm-alpine", + label: "php:8.1-fpm-alpine" + }, + { + value: "php:8.0-fpm-alpine", + label: "php:8.0-fpm-alpine" + } + ]; + const pythonVersions = [ + { + value: "python:3.10-alpine", + label: "python:3.10-alpine" + }, + { + value: "python:3.10-buster", + label: "python:3.10-buster" + }, + { + value: "python:3.10-bullseye", + label: "python:3.10-bullseye" + }, + { + value: "python:3.10-slim-bullseye", + label: "python:3.10-slim-bullseye" + }, + { + value: "python:3.9-alpine", + label: "python:3.9-alpine" + }, + { + value: "python:3.9-buster", + label: "python:3.9-buster" + }, + { + value: "python:3.9-bullseye", + label: "python:3.9-bullseye" + }, + { + value: "python:3.9-slim-bullseye", + label: "python:3.9-slim-bullseye" + }, + { + value: "python:3.8-alpine", + label: "python:3.8-alpine" + }, + { + value: "python:3.8-buster", + label: "python:3.8-buster" + }, + { + value: "python:3.8-bullseye", + label: "python:3.8-bullseye" + }, + { + value: "python:3.8-slim-bullseye", + label: "python:3.8-slim-bullseye" + }, + { + value: "python:3.7-alpine", + label: "python:3.7-alpine" + }, + { + value: "python:3.7-buster", + label: "python:3.7-buster" + }, + { + value: "python:3.7-bullseye", + label: "python:3.7-bullseye" + }, + { + value: "python:3.7-slim-bullseye", + label: "python:3.7-slim-bullseye" + } + ]; + const herokuVersions = [ + { + value: "heroku/builder:22", + label: "heroku/builder:22" + }, + { + value: "heroku/buildpacks:20", + label: "heroku/buildpacks:20" + }, + { + value: "heroku/builder-classic:22", + label: "heroku/builder-classic:22" + } + ]; + let payload = { + baseImage: null, + baseBuildImage: null, + baseImages: [], + baseBuildImages: [] + }; + if (nodeBased.includes(buildPack)) { + if (deploymentType === "static") { + payload.baseImage = (0, import_common.isARM)(process.arch) ? "nginx:alpine" : "webdevops/nginx:alpine"; + payload.baseImages = (0, import_common.isARM)(process.arch) ? staticVersions.filter((version2) => !version2.value.includes("webdevops")) : staticVersions; + payload.baseBuildImage = "node:lts"; + payload.baseBuildImages = nodeVersions; + } else { + payload.baseImage = "node:lts"; + payload.baseImages = nodeVersions; + payload.baseBuildImage = "node:lts"; + payload.baseBuildImages = nodeVersions; + } + } + if (staticApps.includes(buildPack)) { + payload.baseImage = (0, import_common.isARM)(process.arch) ? "nginx:alpine" : "webdevops/nginx:alpine"; + payload.baseImages = (0, import_common.isARM)(process.arch) ? staticVersions.filter((version2) => !version2.value.includes("webdevops")) : staticVersions; + payload.baseBuildImage = "node:lts"; + payload.baseBuildImages = nodeVersions; + } + if (buildPack === "python") { + payload.baseImage = "python:3.10-alpine"; + payload.baseImages = pythonVersions; + } + if (buildPack === "rust") { + payload.baseImage = "rust:latest"; + payload.baseBuildImage = "rust:latest"; + payload.baseImages = rustVersions; + payload.baseBuildImages = rustVersions; + } + if (buildPack === "deno") { + payload.baseImage = "denoland/deno:latest"; + } + if (buildPack === "php") { + payload.baseImage = (0, import_common.isARM)(process.arch) ? "php:8.1-fpm-alpine" : "webdevops/php-apache:8.2-alpine"; + payload.baseImages = (0, import_common.isARM)(process.arch) ? phpVersions.filter((version2) => !version2.value.includes("webdevops")) : phpVersions; + } + if (buildPack === "laravel") { + payload.baseImage = (0, import_common.isARM)(process.arch) ? "php:8.1-fpm-alpine" : "webdevops/php-apache:8.2-alpine"; + payload.baseImages = (0, import_common.isARM)(process.arch) ? phpVersions.filter((version2) => !version2.value.includes("webdevops")) : phpVersions; + payload.baseBuildImage = "node:18"; + payload.baseBuildImages = nodeVersions; + } + if (buildPack === "heroku") { + payload.baseImage = "heroku/buildpacks:20"; + payload.baseImages = herokuVersions; + } + return payload; +} +const setDefaultConfiguration = async (data) => { + let { + buildPack, + port, + installCommand, + startCommand, + buildCommand, + publishDirectory, + baseDirectory, + dockerFileLocation, + dockerComposeFileLocation, + denoMainFile + } = data; + const template = scanningTemplates[buildPack]; + if (!port) { + port = template?.port || 3e3; + if (buildPack === "static") + port = 80; + else if (buildPack === "node") + port = 3e3; + else if (buildPack === "php") + port = 80; + else if (buildPack === "python") + port = 8e3; + } + if (!installCommand && buildPack !== "static" && buildPack !== "laravel") + installCommand = template?.installCommand || "yarn install"; + if (!startCommand && buildPack !== "static" && buildPack !== "laravel") + startCommand = template?.startCommand || "yarn start"; + if (!buildCommand && buildPack !== "static" && buildPack !== "laravel") + buildCommand = template?.buildCommand || null; + if (!publishDirectory) + publishDirectory = template?.publishDirectory || null; + if (baseDirectory) { + if (!baseDirectory.startsWith("/")) + baseDirectory = `/${baseDirectory}`; + if (baseDirectory.endsWith("/") && baseDirectory !== "/") + baseDirectory = baseDirectory.slice(0, -1); + } + if (dockerFileLocation) { + if (!dockerFileLocation.startsWith("/")) + dockerFileLocation = `/${dockerFileLocation}`; + if (dockerFileLocation.endsWith("/")) + dockerFileLocation = dockerFileLocation.slice(0, -1); + } else { + dockerFileLocation = "/Dockerfile"; + } + if (dockerComposeFileLocation) { + if (!dockerComposeFileLocation.startsWith("/")) + dockerComposeFileLocation = `/${dockerComposeFileLocation}`; + if (dockerComposeFileLocation.endsWith("/")) + dockerComposeFileLocation = dockerComposeFileLocation.slice(0, -1); + } else { + dockerComposeFileLocation = "/Dockerfile"; + } + if (!denoMainFile) { + denoMainFile = "main.ts"; + } + return { + buildPack, + port, + installCommand, + startCommand, + buildCommand, + publishDirectory, + baseDirectory, + dockerFileLocation, + dockerComposeFileLocation, + denoMainFile + }; +}; +const scanningTemplates = { + "@sveltejs/kit": { + buildPack: "nodejs" + }, + astro: { + buildPack: "astro" + }, + "@11ty/eleventy": { + buildPack: "eleventy" + }, + svelte: { + buildPack: "svelte" + }, + "@nestjs/core": { + buildPack: "nestjs" + }, + next: { + buildPack: "nextjs" + }, + nuxt: { + buildPack: "nuxtjs" + }, + "react-scripts": { + buildPack: "react" + }, + "parcel-bundler": { + buildPack: "static" + }, + "@vue/cli-service": { + buildPack: "vuejs" + }, + vuejs: { + buildPack: "vuejs" + }, + gatsby: { + buildPack: "gatsby" + }, + "preact-cli": { + buildPack: "react" + } +}; +const saveBuildLog = async ({ + line, + buildId, + applicationId +}) => { + if (buildId === "undefined" || buildId === "null" || !buildId) + return; + if (applicationId === "undefined" || applicationId === "null" || !applicationId) + return; + const { default: got } = await import("got"); + if (typeof line === "object" && line) { + if (line.shortMessage) { + line = line.shortMessage + "\n" + line.stderr; + } else { + line = JSON.stringify(line); + } + } + if (line && typeof line === "string" && line.includes("ghs_")) { + const regex = /ghs_.*@/g; + line = line.replace(regex, "@"); + } + const addTimestamp = `[${(0, import_common.generateTimestamp)()}] ${line}`; + const fluentBitUrl = import_common.isDev ? process.env.COOLIFY_CONTAINER_DEV === "true" ? "http://coolify-fluentbit:24224" : "http://localhost:24224" : "http://coolify-fluentbit:24224"; + if (import_common.isDev && !process.env.COOLIFY_CONTAINER_DEV) { + console.debug(`[${applicationId}] ${addTimestamp}`); + } + try { + return await got.post(`${fluentBitUrl}/${applicationId}_buildlog_${buildId}.csv`, { + json: { + line: (0, import_common.encrypt)(line) + } + }); + } catch (error) { + return await import_prisma.prisma.buildLog.create({ + data: { + line: addTimestamp, + buildId, + time: Number((0, import_dayjs.day)().valueOf()), + applicationId + } + }); + } +}; +async function copyBaseConfigurationFiles(buildPack, workdir, buildId, applicationId, baseImage) { + try { + if (buildPack === "php") { + await import_fs.promises.writeFile(`${workdir}/entrypoint.sh`, `chown -R 1000 /app`); + await saveBuildLog({ + line: "Copied default configuration file for PHP.", + buildId, + applicationId + }); + } else if (baseImage?.includes("nginx")) { + await import_fs.promises.writeFile( + `${workdir}/nginx.conf`, + `user nginx; + worker_processes auto; + + error_log /docker.stdout; + pid /run/nginx.pid; + + events { + worker_connections 1024; + } + + http { + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /docker.stdout main; + + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + + include /etc/nginx/mime.types; + default_type application/octet-stream; + + server { + listen 80; + server_name localhost; + + location / { + root /app; + index index.html; + try_files $uri $uri/index.html $uri/ /index.html =404; + } + + error_page 404 /50x.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /app; + } + + } + + } + ` + ); + } + } catch (error) { + throw new Error(error); + } +} +function checkPnpm(installCommand = null, buildCommand = null, startCommand = null) { + return installCommand?.includes("pnpm") || buildCommand?.includes("pnpm") || startCommand?.includes("pnpm"); +} +async function saveDockerRegistryCredentials({ url, username, password, workdir }) { + if (!username || !password) { + return null; + } + let decryptedPassword = (0, import_common.decrypt)(password); + const location = `${workdir}/.docker`; + try { + await import_fs.promises.mkdir(`${workdir}/.docker`); + } catch (error) { + } + const payload = JSON.stringify({ + auths: { + [url]: { + auth: Buffer.from(`${username}:${decryptedPassword}`).toString("base64") + } + } + }); + await import_fs.promises.writeFile(`${location}/config.json`, payload); + return location; +} +async function buildImage({ + applicationId, + tag, + workdir, + buildId, + dockerId, + isCache = false, + debug = false, + dockerFileLocation = "/Dockerfile", + commit, + forceRebuild = false +}) { + if (isCache) { + await saveBuildLog({ line: `Building cache image...`, buildId, applicationId }); + } else { + await saveBuildLog({ line: `Building production image...`, buildId, applicationId }); + } + const dockerFile = isCache ? `${dockerFileLocation}-cache` : `${dockerFileLocation}`; + const cache = `${applicationId}:${tag}${isCache ? "-cache" : ""}`; + let location = null; + const { dockerRegistry } = await import_prisma.prisma.application.findUnique({ + where: { id: applicationId }, + select: { dockerRegistry: true } + }); + if (dockerRegistry) { + const { url, username, password } = dockerRegistry; + location = await saveDockerRegistryCredentials({ url, username, password, workdir }); + } + await (0, import_executeCommand.executeCommand)({ + stream: true, + debug, + buildId, + applicationId, + dockerId, + command: `docker ${location ? `--config ${location}` : ""} build ${forceRebuild ? "--no-cache" : ""} --progress plain -f ${workdir}/${dockerFile} -t ${cache} --build-arg SOURCE_COMMIT=${commit} ${workdir}` + }); + const { status } = await import_prisma.prisma.build.findUnique({ where: { id: buildId } }); + if (status === "canceled") { + throw new Error("Canceled."); + } +} +function makeLabelForSimpleDockerfile({ applicationId, port, type }) { + return [ + "coolify.managed=true", + `coolify.version=${import_common.version}`, + `coolify.applicationId=${applicationId}`, + `coolify.type=standalone-application` + ]; +} +function makeLabelForStandaloneApplication({ + applicationId, + fqdn, + name, + type, + pullmergeRequestId = null, + buildPack, + repository, + branch, + projectId, + port, + commit, + installCommand, + buildCommand, + startCommand, + baseDirectory, + publishDirectory +}) { + if (pullmergeRequestId) { + const protocol = fqdn.startsWith("https://") ? "https" : "http"; + const domain = (0, import_common.getDomain)(fqdn); + fqdn = `${protocol}://${pullmergeRequestId}.${domain}`; + } + return [ + "coolify.managed=true", + `coolify.version=${import_common.version}`, + `coolify.applicationId=${applicationId}`, + `coolify.type=standalone-application`, + `coolify.name=${name}`, + `coolify.configuration=${(0, import_common.base64Encode)( + JSON.stringify({ + applicationId, + fqdn, + name, + type, + pullmergeRequestId, + buildPack, + repository, + branch, + projectId, + port, + commit, + installCommand, + buildCommand, + startCommand, + baseDirectory, + publishDirectory + }) + )}` + ]; +} +async function buildCacheImageWithNode(data, imageForBuild) { + const { + workdir, + buildId, + baseDirectory, + installCommand, + buildCommand, + secrets, + pullmergeRequestId + } = data; + const isPnpm = checkPnpm(installCommand, buildCommand); + const Dockerfile = []; + Dockerfile.push(`FROM ${imageForBuild}`); + Dockerfile.push("WORKDIR /app"); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); + if (secrets.length > 0) { + (0, import_common.generateSecrets)(secrets, pullmergeRequestId, true).forEach((env) => { + Dockerfile.push(env); + }); + } + if (isPnpm) { + Dockerfile.push("RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@7"); + } + Dockerfile.push(`COPY .${baseDirectory || ""} ./`); + if (installCommand) { + Dockerfile.push(`RUN ${installCommand}`); + } + Dockerfile.push(`RUN ${buildCommand}`); + await import_fs.promises.writeFile(`${workdir}/Dockerfile-cache`, Dockerfile.join("\n")); + await buildImage({ ...data, isCache: true }); +} +async function buildCacheImageForLaravel(data, imageForBuild) { + const { workdir, buildId, secrets, pullmergeRequestId } = data; + const Dockerfile = []; + Dockerfile.push(`FROM ${imageForBuild}`); + Dockerfile.push("WORKDIR /app"); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); + if (secrets.length > 0) { + (0, import_common.generateSecrets)(secrets, pullmergeRequestId, true).forEach((env) => { + Dockerfile.push(env); + }); + } + Dockerfile.push(`COPY *.json *.mix.js /app/`); + Dockerfile.push(`COPY resources /app/resources`); + Dockerfile.push(`RUN yarn install && yarn production`); + await import_fs.promises.writeFile(`${workdir}/Dockerfile-cache`, Dockerfile.join("\n")); + await buildImage({ ...data, isCache: true }); +} +async function buildCacheImageWithCargo(data, imageForBuild) { + const { applicationId, workdir, buildId } = data; + const Dockerfile = []; + Dockerfile.push(`FROM ${imageForBuild} as planner-${applicationId}`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); + Dockerfile.push("WORKDIR /app"); + Dockerfile.push("RUN cargo install cargo-chef"); + Dockerfile.push("COPY . ."); + Dockerfile.push("RUN cargo chef prepare --recipe-path recipe.json"); + Dockerfile.push(`FROM ${imageForBuild}`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); + Dockerfile.push("WORKDIR /app"); + Dockerfile.push("RUN cargo install cargo-chef"); + Dockerfile.push(`COPY --from=planner-${applicationId} /app/recipe.json recipe.json`); + Dockerfile.push("RUN cargo chef cook --release --recipe-path recipe.json"); + await import_fs.promises.writeFile(`${workdir}/Dockerfile-cache`, Dockerfile.join("\n")); + await buildImage({ ...data, isCache: true }); +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + buildCacheImageForLaravel, + buildCacheImageWithCargo, + buildCacheImageWithNode, + buildImage, + checkPnpm, + copyBaseConfigurationFiles, + makeLabelForSimpleDockerfile, + makeLabelForStandaloneApplication, + saveBuildLog, + saveDockerRegistryCredentials, + scanningTemplates, + setDefaultBaseImage, + setDefaultConfiguration +}); diff --git a/apps/trpc-experimental/server/build/lib/buildPacks/compose.js b/apps/trpc-experimental/server/build/lib/buildPacks/compose.js new file mode 100644 index 000000000..073711e91 --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/buildPacks/compose.js @@ -0,0 +1,137 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var compose_exports = {}; +__export(compose_exports, { + default: () => compose_default +}); +module.exports = __toCommonJS(compose_exports); +var import_fs = require("fs"); +var import_common = require("../common"); +var import_common2 = require("./common"); +var import_js_yaml = __toESM(require("js-yaml")); +var import_docker = require("../docker"); +var import_executeCommand = require("../executeCommand"); +async function compose_default(data) { + let { + applicationId, + debug, + buildId, + dockerId, + network, + volumes, + labels, + workdir, + baseDirectory, + secrets, + pullmergeRequestId, + dockerComposeConfiguration, + dockerComposeFileLocation + } = data; + const fileYaml = `${workdir}${baseDirectory}${dockerComposeFileLocation}`; + const dockerComposeRaw = await import_fs.promises.readFile(fileYaml, "utf8"); + const dockerComposeYaml = import_js_yaml.default.load(dockerComposeRaw); + if (!dockerComposeYaml.services) { + throw "No Services found in docker-compose file."; + } + let envs = []; + if (secrets.length > 0) { + envs = [...envs, ...(0, import_common.generateSecrets)(secrets, pullmergeRequestId, false, null)]; + } + const composeVolumes = []; + if (volumes.length > 0) { + for (const volume of volumes) { + let [v, path] = volume.split(":"); + composeVolumes[v] = { + name: v + }; + } + } + let networks = {}; + for (let [key, value] of Object.entries(dockerComposeYaml.services)) { + value["container_name"] = `${applicationId}-${key}`; + let environment = typeof value["environment"] === "undefined" ? [] : value["environment"]; + value["environment"] = [...environment, ...envs]; + value["labels"] = labels; + if (value["volumes"]?.length > 0) { + value["volumes"] = value["volumes"].map((volume) => { + let [v, path, permission] = volume.split(":"); + if (!path) { + path = v; + v = `${applicationId}${v.replace(/\//gi, "-").replace(/\./gi, "")}`; + } else { + v = `${applicationId}${v.replace(/\//gi, "-").replace(/\./gi, "")}`; + } + composeVolumes[v] = { + name: v + }; + return `${v}:${path}${permission ? ":" + permission : ""}`; + }); + } + if (volumes.length > 0) { + for (const volume of volumes) { + value["volumes"].push(volume); + } + } + if (dockerComposeConfiguration[key].port) { + value["expose"] = [dockerComposeConfiguration[key].port]; + } + if (value["networks"]?.length > 0) { + value["networks"].forEach((network2) => { + networks[network2] = { + name: network2 + }; + }); + } + value["networks"] = [...value["networks"] || "", network]; + dockerComposeYaml.services[key] = { + ...dockerComposeYaml.services[key], + restart: (0, import_docker.defaultComposeConfiguration)(network).restart, + deploy: (0, import_docker.defaultComposeConfiguration)(network).deploy + }; + } + if (Object.keys(composeVolumes).length > 0) { + dockerComposeYaml["volumes"] = { ...composeVolumes }; + } + dockerComposeYaml["networks"] = Object.assign({ ...networks }, { [network]: { external: true } }); + await import_fs.promises.writeFile(fileYaml, import_js_yaml.default.dump(dockerComposeYaml)); + await (0, import_executeCommand.executeCommand)({ + debug, + buildId, + applicationId, + dockerId, + command: `docker compose --project-directory ${workdir} pull` + }); + await (0, import_common2.saveBuildLog)({ line: "Pulling images from Compose file...", buildId, applicationId }); + await (0, import_executeCommand.executeCommand)({ + debug, + buildId, + applicationId, + dockerId, + command: `docker compose --project-directory ${workdir} build --progress plain` + }); + await (0, import_common2.saveBuildLog)({ line: "Building images from Compose file...", buildId, applicationId }); +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/lib/buildPacks/deno.js b/apps/trpc-experimental/server/build/lib/buildPacks/deno.js new file mode 100644 index 000000000..2c03960c7 --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/buildPacks/deno.js @@ -0,0 +1,74 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var deno_exports = {}; +__export(deno_exports, { + default: () => deno_default +}); +module.exports = __toCommonJS(deno_exports); +var import_fs = require("fs"); +var import_common = require("../common"); +var import_common2 = require("./common"); +const createDockerfile = async (data, image) => { + const { + workdir, + port, + baseDirectory, + secrets, + pullmergeRequestId, + denoMainFile, + denoOptions, + buildId + } = data; + const Dockerfile = []; + let depsFound = false; + try { + await import_fs.promises.readFile(`${workdir}${baseDirectory || ""}/deps.ts`); + depsFound = true; + } catch (error) { + } + Dockerfile.push(`FROM ${image}`); + Dockerfile.push("WORKDIR /app"); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); + if (secrets.length > 0) { + (0, import_common.generateSecrets)(secrets, pullmergeRequestId, true).forEach((env) => { + Dockerfile.push(env); + }); + } + if (depsFound) { + Dockerfile.push(`COPY .${baseDirectory || ""}/deps.ts /app`); + Dockerfile.push(`RUN deno cache deps.ts`); + } + Dockerfile.push(`COPY .${baseDirectory || ""} ./`); + Dockerfile.push(`RUN deno cache ${denoMainFile}`); + Dockerfile.push(`ENV NO_COLOR true`); + Dockerfile.push(`EXPOSE ${port}`); + Dockerfile.push(`CMD deno run ${denoOptions || ""} ${denoMainFile}`); + await import_fs.promises.writeFile(`${workdir}/Dockerfile`, Dockerfile.join("\n")); +}; +async function deno_default(data) { + try { + const { baseImage, baseBuildImage } = data; + await createDockerfile(data, baseImage); + await (0, import_common2.buildImage)(data); + } catch (error) { + throw error; + } +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/lib/buildPacks/docker.js b/apps/trpc-experimental/server/build/lib/buildPacks/docker.js new file mode 100644 index 000000000..02cde82c2 --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/buildPacks/docker.js @@ -0,0 +1,51 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var docker_exports = {}; +__export(docker_exports, { + default: () => docker_default +}); +module.exports = __toCommonJS(docker_exports); +var import_fs = require("fs"); +var import_common = require("../common"); +var import_common2 = require("./common"); +async function docker_default(data) { + let { workdir, buildId, baseDirectory, secrets, pullmergeRequestId, dockerFileLocation } = data; + const file = `${workdir}${baseDirectory}${dockerFileLocation}`; + data.workdir = `${workdir}${baseDirectory}`; + const DockerfileRaw = await import_fs.promises.readFile(`${file}`, "utf8"); + const Dockerfile = DockerfileRaw.toString().trim().split("\n"); + Dockerfile.forEach((line, index) => { + if (line.startsWith("FROM")) { + Dockerfile.splice(index + 1, 0, `LABEL coolify.buildId=${buildId}`); + } + }); + if (secrets.length > 0) { + (0, import_common.generateSecrets)(secrets, pullmergeRequestId, true).forEach((env) => { + Dockerfile.forEach((line, index) => { + if (line.startsWith("FROM")) { + Dockerfile.splice(index + 1, 0, env); + } + }); + }); + } + await import_fs.promises.writeFile(`${data.workdir}${dockerFileLocation}`, Dockerfile.join("\n")); + await (0, import_common2.buildImage)(data); +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/lib/buildPacks/gatsby.js b/apps/trpc-experimental/server/build/lib/buildPacks/gatsby.js new file mode 100644 index 000000000..b71e587ab --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/buildPacks/gatsby.js @@ -0,0 +1,50 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var gatsby_exports = {}; +__export(gatsby_exports, { + default: () => gatsby_default +}); +module.exports = __toCommonJS(gatsby_exports); +var import_fs = require("fs"); +var import_common = require("./common"); +const createDockerfile = async (data, imageforBuild) => { + const { applicationId, tag, workdir, publishDirectory, baseImage, buildId, port } = data; + const Dockerfile = []; + Dockerfile.push(`FROM ${imageforBuild}`); + Dockerfile.push("WORKDIR /app"); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); + Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /app/${publishDirectory} ./`); + if (baseImage?.includes("nginx")) { + Dockerfile.push(`COPY /nginx.conf /etc/nginx/nginx.conf`); + } + Dockerfile.push(`EXPOSE ${port}`); + await import_fs.promises.writeFile(`${workdir}/Dockerfile`, Dockerfile.join("\n")); +}; +async function gatsby_default(data) { + try { + const { baseImage, baseBuildImage } = data; + await (0, import_common.buildCacheImageWithNode)(data, baseBuildImage); + await createDockerfile(data, baseImage); + await (0, import_common.buildImage)(data); + } catch (error) { + throw error; + } +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/lib/buildPacks/heroku.js b/apps/trpc-experimental/server/build/lib/buildPacks/heroku.js new file mode 100644 index 000000000..6b5627a51 --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/buildPacks/heroku.js @@ -0,0 +1,41 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var heroku_exports = {}; +__export(heroku_exports, { + default: () => heroku_default +}); +module.exports = __toCommonJS(heroku_exports); +var import_executeCommand = require("../executeCommand"); +var import_common = require("./common"); +async function heroku_default(data) { + const { buildId, applicationId, tag, dockerId, debug, workdir, baseDirectory, baseImage } = data; + try { + await (0, import_common.saveBuildLog)({ line: `Building production image...`, buildId, applicationId }); + await (0, import_executeCommand.executeCommand)({ + buildId, + debug, + dockerId, + command: `pack build -p ${workdir}${baseDirectory} ${applicationId}:${tag} --builder ${baseImage}` + }); + } catch (error) { + throw error; + } +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/lib/buildPacks/index.js b/apps/trpc-experimental/server/build/lib/buildPacks/index.js new file mode 100644 index 000000000..5f4590110 --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/buildPacks/index.js @@ -0,0 +1,88 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var buildPacks_exports = {}; +__export(buildPacks_exports, { + astro: () => import_static2.default, + compose: () => import_compose.default, + deno: () => import_deno.default, + docker: () => import_docker.default, + eleventy: () => import_static3.default, + gatsby: () => import_gatsby.default, + heroku: () => import_heroku.default, + laravel: () => import_laravel.default, + nestjs: () => import_nestjs.default, + nextjs: () => import_nextjs.default, + node: () => import_node.default, + nuxtjs: () => import_nuxtjs.default, + php: () => import_php.default, + python: () => import_python.default, + react: () => import_react.default, + rust: () => import_rust.default, + staticApp: () => import_static.default, + svelte: () => import_svelte.default, + vuejs: () => import_vuejs.default +}); +module.exports = __toCommonJS(buildPacks_exports); +var import_node = __toESM(require("./node")); +var import_static = __toESM(require("./static")); +var import_docker = __toESM(require("./docker")); +var import_gatsby = __toESM(require("./gatsby")); +var import_svelte = __toESM(require("./svelte")); +var import_react = __toESM(require("./react")); +var import_nestjs = __toESM(require("./nestjs")); +var import_nextjs = __toESM(require("./nextjs")); +var import_nuxtjs = __toESM(require("./nuxtjs")); +var import_vuejs = __toESM(require("./vuejs")); +var import_php = __toESM(require("./php")); +var import_rust = __toESM(require("./rust")); +var import_static2 = __toESM(require("./static")); +var import_static3 = __toESM(require("./static")); +var import_python = __toESM(require("./python")); +var import_deno = __toESM(require("./deno")); +var import_laravel = __toESM(require("./laravel")); +var import_heroku = __toESM(require("./heroku")); +var import_compose = __toESM(require("./compose")); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + astro, + compose, + deno, + docker, + eleventy, + gatsby, + heroku, + laravel, + nestjs, + nextjs, + node, + nuxtjs, + php, + python, + react, + rust, + staticApp, + svelte, + vuejs +}); diff --git a/apps/trpc-experimental/server/build/lib/buildPacks/laravel.js b/apps/trpc-experimental/server/build/lib/buildPacks/laravel.js new file mode 100644 index 000000000..6bd5237a1 --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/buildPacks/laravel.js @@ -0,0 +1,68 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var laravel_exports = {}; +__export(laravel_exports, { + default: () => laravel_default +}); +module.exports = __toCommonJS(laravel_exports); +var import_fs = require("fs"); +var import_common = require("../common"); +var import_common2 = require("./common"); +const createDockerfile = async (data, image) => { + const { workdir, applicationId, tag, buildId, port, secrets, pullmergeRequestId } = data; + const Dockerfile = []; + Dockerfile.push(`FROM ${image}`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); + if (secrets.length > 0) { + (0, import_common.generateSecrets)(secrets, pullmergeRequestId, true).forEach((env) => { + Dockerfile.push(env); + }); + } + Dockerfile.push("WORKDIR /app"); + Dockerfile.push(`ENV WEB_DOCUMENT_ROOT /app/public`); + Dockerfile.push(`COPY --chown=application:application composer.* ./`); + Dockerfile.push(`COPY --chown=application:application database/ database/`); + Dockerfile.push( + `RUN composer install --ignore-platform-reqs --no-interaction --no-plugins --no-scripts --prefer-dist` + ); + Dockerfile.push( + `COPY --chown=application:application --from=${applicationId}:${tag}-cache /app/public/js/ /app/public/js/` + ); + Dockerfile.push( + `COPY --chown=application:application --from=${applicationId}:${tag}-cache /app/public/css/ /app/public/css/` + ); + Dockerfile.push( + `COPY --chown=application:application --from=${applicationId}:${tag}-cache /app/mix-manifest.json /app/public/mix-manifest.json` + ); + Dockerfile.push(`COPY --chown=application:application . ./`); + Dockerfile.push(`EXPOSE ${port}`); + await import_fs.promises.writeFile(`${workdir}/Dockerfile`, Dockerfile.join("\n")); +}; +async function laravel_default(data) { + const { baseImage, baseBuildImage } = data; + try { + await (0, import_common2.buildCacheImageForLaravel)(data, baseBuildImage); + await createDockerfile(data, baseImage); + await (0, import_common2.buildImage)(data); + } catch (error) { + throw error; + } +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/lib/buildPacks/nestjs.js b/apps/trpc-experimental/server/build/lib/buildPacks/nestjs.js new file mode 100644 index 000000000..945a0f960 --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/buildPacks/nestjs.js @@ -0,0 +1,52 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var nestjs_exports = {}; +__export(nestjs_exports, { + default: () => nestjs_default +}); +module.exports = __toCommonJS(nestjs_exports); +var import_fs = require("fs"); +var import_common = require("./common"); +const createDockerfile = async (data, image) => { + const { buildId, applicationId, tag, port, startCommand, workdir, baseDirectory } = data; + const Dockerfile = []; + const isPnpm = startCommand.includes("pnpm"); + Dockerfile.push(`FROM ${image}`); + Dockerfile.push("WORKDIR /app"); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); + if (isPnpm) { + Dockerfile.push("RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@7"); + } + Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /app/${baseDirectory || ""} ./`); + Dockerfile.push(`EXPOSE ${port}`); + Dockerfile.push(`CMD ${startCommand}`); + await import_fs.promises.writeFile(`${workdir}/Dockerfile`, Dockerfile.join("\n")); +}; +async function nestjs_default(data) { + try { + const { baseImage, baseBuildImage } = data; + await (0, import_common.buildCacheImageWithNode)(data, baseBuildImage); + await createDockerfile(data, baseImage); + await (0, import_common.buildImage)(data); + } catch (error) { + throw error; + } +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/lib/buildPacks/nextjs.js b/apps/trpc-experimental/server/build/lib/buildPacks/nextjs.js new file mode 100644 index 000000000..57a9aced1 --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/buildPacks/nextjs.js @@ -0,0 +1,89 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var nextjs_exports = {}; +__export(nextjs_exports, { + default: () => nextjs_default +}); +module.exports = __toCommonJS(nextjs_exports); +var import_fs = require("fs"); +var import_common = require("../common"); +var import_common2 = require("./common"); +const createDockerfile = async (data, image) => { + const { + applicationId, + buildId, + tag, + workdir, + publishDirectory, + port, + installCommand, + buildCommand, + startCommand, + baseDirectory, + secrets, + pullmergeRequestId, + deploymentType, + baseImage + } = data; + const Dockerfile = []; + const isPnpm = (0, import_common2.checkPnpm)(installCommand, buildCommand, startCommand); + Dockerfile.push(`FROM ${image}`); + Dockerfile.push("WORKDIR /app"); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); + if (secrets.length > 0) { + (0, import_common.generateSecrets)(secrets, pullmergeRequestId, true).forEach((env) => { + Dockerfile.push(env); + }); + } + if (isPnpm) { + Dockerfile.push("RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@7"); + } + if (deploymentType === "node") { + Dockerfile.push(`COPY .${baseDirectory || ""} ./`); + Dockerfile.push(`RUN ${installCommand}`); + Dockerfile.push(`RUN ${buildCommand}`); + Dockerfile.push(`EXPOSE ${port}`); + Dockerfile.push(`CMD ${startCommand}`); + } else if (deploymentType === "static") { + if (baseImage?.includes("nginx")) { + Dockerfile.push(`COPY /nginx.conf /etc/nginx/nginx.conf`); + } + Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /app/${publishDirectory} ./`); + Dockerfile.push(`EXPOSE 80`); + } + await import_fs.promises.writeFile(`${workdir}/Dockerfile`, Dockerfile.join("\n")); +}; +async function nextjs_default(data) { + try { + const { baseImage, baseBuildImage, deploymentType, buildCommand } = data; + if (deploymentType === "node") { + await createDockerfile(data, baseImage); + await (0, import_common2.buildImage)(data); + } else if (deploymentType === "static") { + if (buildCommand) + await (0, import_common2.buildCacheImageWithNode)(data, baseBuildImage); + await createDockerfile(data, baseImage); + await (0, import_common2.buildImage)(data); + } + } catch (error) { + throw error; + } +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/lib/buildPacks/node.js b/apps/trpc-experimental/server/build/lib/buildPacks/node.js new file mode 100644 index 000000000..e1d246e22 --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/buildPacks/node.js @@ -0,0 +1,71 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var node_exports = {}; +__export(node_exports, { + default: () => node_default +}); +module.exports = __toCommonJS(node_exports); +var import_fs = require("fs"); +var import_common = require("../common"); +var import_common2 = require("./common"); +const createDockerfile = async (data, image) => { + const { + workdir, + port, + installCommand, + buildCommand, + startCommand, + baseDirectory, + secrets, + pullmergeRequestId, + buildId + } = data; + const Dockerfile = []; + const isPnpm = (0, import_common2.checkPnpm)(installCommand, buildCommand, startCommand); + Dockerfile.push(`FROM ${image}`); + Dockerfile.push("WORKDIR /app"); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); + if (secrets.length > 0) { + (0, import_common.generateSecrets)(secrets, pullmergeRequestId, true).forEach((env) => { + Dockerfile.push(env); + }); + } + if (isPnpm) { + Dockerfile.push("RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@7"); + } + Dockerfile.push(`COPY .${baseDirectory || ""} ./`); + Dockerfile.push(`RUN ${installCommand}`); + if (buildCommand) { + Dockerfile.push(`RUN ${buildCommand}`); + } + Dockerfile.push(`EXPOSE ${port}`); + Dockerfile.push(`CMD ${startCommand}`); + await import_fs.promises.writeFile(`${workdir}/Dockerfile`, Dockerfile.join("\n")); +}; +async function node_default(data) { + try { + const { baseImage } = data; + await createDockerfile(data, baseImage); + await (0, import_common2.buildImage)(data); + } catch (error) { + throw error; + } +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/lib/buildPacks/nuxtjs.js b/apps/trpc-experimental/server/build/lib/buildPacks/nuxtjs.js new file mode 100644 index 000000000..edc953bf2 --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/buildPacks/nuxtjs.js @@ -0,0 +1,89 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var nuxtjs_exports = {}; +__export(nuxtjs_exports, { + default: () => nuxtjs_default +}); +module.exports = __toCommonJS(nuxtjs_exports); +var import_fs = require("fs"); +var import_common = require("../common"); +var import_common2 = require("./common"); +const createDockerfile = async (data, image) => { + const { + applicationId, + buildId, + tag, + workdir, + publishDirectory, + port, + installCommand, + buildCommand, + startCommand, + baseDirectory, + secrets, + pullmergeRequestId, + deploymentType, + baseImage + } = data; + const Dockerfile = []; + const isPnpm = (0, import_common2.checkPnpm)(installCommand, buildCommand, startCommand); + Dockerfile.push(`FROM ${image}`); + Dockerfile.push("WORKDIR /app"); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); + if (secrets.length > 0) { + (0, import_common.generateSecrets)(secrets, pullmergeRequestId, true).forEach((env) => { + Dockerfile.push(env); + }); + } + if (isPnpm) { + Dockerfile.push("RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@7"); + } + if (deploymentType === "node") { + Dockerfile.push(`COPY .${baseDirectory || ""} ./`); + Dockerfile.push(`RUN ${installCommand}`); + Dockerfile.push(`RUN ${buildCommand}`); + Dockerfile.push(`EXPOSE ${port}`); + Dockerfile.push(`CMD ${startCommand}`); + } else if (deploymentType === "static") { + if (baseImage?.includes("nginx")) { + Dockerfile.push(`COPY /nginx.conf /etc/nginx/nginx.conf`); + } + Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /app/${publishDirectory} ./`); + Dockerfile.push(`EXPOSE 80`); + } + await import_fs.promises.writeFile(`${workdir}/Dockerfile`, Dockerfile.join("\n")); +}; +async function nuxtjs_default(data) { + try { + const { baseImage, baseBuildImage, deploymentType, buildCommand } = data; + if (deploymentType === "node") { + await createDockerfile(data, baseImage); + await (0, import_common2.buildImage)(data); + } else if (deploymentType === "static") { + if (buildCommand) + await (0, import_common2.buildCacheImageWithNode)(data, baseBuildImage); + await createDockerfile(data, baseImage); + await (0, import_common2.buildImage)(data); + } + } catch (error) { + throw error; + } +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/lib/buildPacks/php.js b/apps/trpc-experimental/server/build/lib/buildPacks/php.js new file mode 100644 index 000000000..e68b46cd0 --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/buildPacks/php.js @@ -0,0 +1,71 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var php_exports = {}; +__export(php_exports, { + default: () => php_default +}); +module.exports = __toCommonJS(php_exports); +var import_fs = require("fs"); +var import_common = require("../common"); +var import_common2 = require("./common"); +const createDockerfile = async (data, image, htaccessFound) => { + const { workdir, baseDirectory, buildId, port, secrets, pullmergeRequestId } = data; + const Dockerfile = []; + let composerFound = false; + try { + await import_fs.promises.readFile(`${workdir}${baseDirectory || ""}/composer.json`); + composerFound = true; + } catch (error) { + } + Dockerfile.push(`FROM ${image}`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); + if (secrets.length > 0) { + (0, import_common.generateSecrets)(secrets, pullmergeRequestId, true).forEach((env) => { + Dockerfile.push(env); + }); + } + Dockerfile.push("WORKDIR /app"); + Dockerfile.push(`COPY .${baseDirectory || ""} /app`); + if (htaccessFound) { + Dockerfile.push(`COPY .${baseDirectory || ""}/.htaccess ./`); + } + if (composerFound) { + Dockerfile.push(`RUN composer install`); + } + Dockerfile.push(`COPY /entrypoint.sh /opt/docker/provision/entrypoint.d/30-entrypoint.sh`); + Dockerfile.push(`EXPOSE ${port}`); + await import_fs.promises.writeFile(`${workdir}/Dockerfile`, Dockerfile.join("\n")); +}; +async function php_default(data) { + const { workdir, baseDirectory, baseImage } = data; + try { + let htaccessFound = false; + try { + await import_fs.promises.readFile(`${workdir}${baseDirectory || ""}/.htaccess`); + htaccessFound = true; + } catch (e) { + } + await createDockerfile(data, baseImage, htaccessFound); + await (0, import_common2.buildImage)(data); + } catch (error) { + throw error; + } +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/lib/buildPacks/python.js b/apps/trpc-experimental/server/build/lib/buildPacks/python.js new file mode 100644 index 000000000..9221d5d66 --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/buildPacks/python.js @@ -0,0 +1,86 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var python_exports = {}; +__export(python_exports, { + default: () => python_default +}); +module.exports = __toCommonJS(python_exports); +var import_fs = require("fs"); +var import_common = require("../common"); +var import_common2 = require("./common"); +const createDockerfile = async (data, image) => { + const { + workdir, + port, + baseDirectory, + secrets, + pullmergeRequestId, + pythonWSGI, + pythonModule, + pythonVariable, + buildId + } = data; + const Dockerfile = []; + Dockerfile.push(`FROM ${image}`); + Dockerfile.push("WORKDIR /app"); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); + if (secrets.length > 0) { + (0, import_common.generateSecrets)(secrets, pullmergeRequestId, true).forEach((env) => { + Dockerfile.push(env); + }); + } + if (pythonWSGI?.toLowerCase() === "gunicorn") { + Dockerfile.push(`RUN pip install gunicorn`); + } else if (pythonWSGI?.toLowerCase() === "uvicorn") { + Dockerfile.push(`RUN pip install uvicorn`); + } else if (pythonWSGI?.toLowerCase() === "uwsgi") { + Dockerfile.push(`RUN apk add --no-cache uwsgi-python3`); + } + try { + await import_fs.promises.stat(`${workdir}${baseDirectory || ""}/requirements.txt`); + Dockerfile.push(`COPY .${baseDirectory || ""}/requirements.txt ./`); + Dockerfile.push(`RUN pip install --no-cache-dir -r .${baseDirectory || ""}/requirements.txt`); + } catch (e) { + } + Dockerfile.push(`COPY .${baseDirectory || ""} ./`); + Dockerfile.push(`EXPOSE ${port}`); + if (pythonWSGI?.toLowerCase() === "gunicorn") { + Dockerfile.push(`CMD gunicorn -w=4 -b=0.0.0.0:8000 ${pythonModule}:${pythonVariable}`); + } else if (pythonWSGI?.toLowerCase() === "uvicorn") { + Dockerfile.push(`CMD uvicorn ${pythonModule}:${pythonVariable} --port ${port} --host 0.0.0.0`); + } else if (pythonWSGI?.toLowerCase() === "uwsgi") { + Dockerfile.push( + `CMD uwsgi --master -p 4 --http-socket 0.0.0.0:8000 --uid uwsgi --plugins python3 --protocol uwsgi --wsgi ${pythonModule}:${pythonVariable}` + ); + } else { + Dockerfile.push(`CMD python ${pythonModule}`); + } + await import_fs.promises.writeFile(`${workdir}/Dockerfile`, Dockerfile.join("\n")); +}; +async function python_default(data) { + try { + const { baseImage, baseBuildImage } = data; + await createDockerfile(data, baseImage); + await (0, import_common2.buildImage)(data); + } catch (error) { + throw error; + } +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/lib/buildPacks/react.js b/apps/trpc-experimental/server/build/lib/buildPacks/react.js new file mode 100644 index 000000000..dc97fc657 --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/buildPacks/react.js @@ -0,0 +1,50 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var react_exports = {}; +__export(react_exports, { + default: () => react_default +}); +module.exports = __toCommonJS(react_exports); +var import_fs = require("fs"); +var import_common = require("./common"); +const createDockerfile = async (data, image) => { + const { applicationId, tag, workdir, publishDirectory, baseImage, buildId, port } = data; + const Dockerfile = []; + Dockerfile.push(`FROM ${image}`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); + Dockerfile.push("WORKDIR /app"); + Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /app/${publishDirectory} ./`); + if (baseImage?.includes("nginx")) { + Dockerfile.push(`COPY /nginx.conf /etc/nginx/nginx.conf`); + } + Dockerfile.push(`EXPOSE ${port}`); + await import_fs.promises.writeFile(`${workdir}/Dockerfile`, Dockerfile.join("\n")); +}; +async function react_default(data) { + try { + const { baseImage, baseBuildImage } = data; + await (0, import_common.buildCacheImageWithNode)(data, baseBuildImage); + await createDockerfile(data, baseImage); + await (0, import_common.buildImage)(data); + } catch (error) { + throw error; + } +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/lib/buildPacks/rust.js b/apps/trpc-experimental/server/build/lib/buildPacks/rust.js new file mode 100644 index 000000000..5fbb0af0d --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/buildPacks/rust.js @@ -0,0 +1,69 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var rust_exports = {}; +__export(rust_exports, { + default: () => rust_default +}); +module.exports = __toCommonJS(rust_exports); +var import_fs = require("fs"); +var import_toml = __toESM(require("@iarna/toml")); +var import_common = require("./common"); +var import_executeCommand = require("../executeCommand"); +const createDockerfile = async (data, image, name) => { + const { workdir, port, applicationId, tag, buildId } = data; + const Dockerfile = []; + Dockerfile.push(`FROM ${image}`); + Dockerfile.push("WORKDIR /app"); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); + Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /app/target target`); + Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /usr/local/cargo /usr/local/cargo`); + Dockerfile.push(`COPY . .`); + Dockerfile.push(`RUN cargo build --release --bin ${name}`); + Dockerfile.push("FROM debian:buster-slim"); + Dockerfile.push("WORKDIR /app"); + Dockerfile.push( + `RUN apt-get update -y && apt-get install -y --no-install-recommends openssl libcurl4 ca-certificates && apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/*` + ); + Dockerfile.push(`RUN update-ca-certificates`); + Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /app/target/release/${name} ${name}`); + Dockerfile.push(`EXPOSE ${port}`); + Dockerfile.push(`CMD ["/app/${name}"]`); + await import_fs.promises.writeFile(`${workdir}/Dockerfile`, Dockerfile.join("\n")); +}; +async function rust_default(data) { + try { + const { workdir, baseImage, baseBuildImage } = data; + const { stdout: cargoToml } = await (0, import_executeCommand.executeCommand)({ command: `cat ${workdir}/Cargo.toml` }); + const parsedToml = import_toml.default.parse(cargoToml); + const name = parsedToml.package.name; + await (0, import_common.buildCacheImageWithCargo)(data, baseBuildImage); + await createDockerfile(data, baseImage, name); + await (0, import_common.buildImage)(data); + } catch (error) { + throw error; + } +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/lib/buildPacks/static.js b/apps/trpc-experimental/server/build/lib/buildPacks/static.js new file mode 100644 index 000000000..38e193cef --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/buildPacks/static.js @@ -0,0 +1,77 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var static_exports = {}; +__export(static_exports, { + default: () => static_default +}); +module.exports = __toCommonJS(static_exports); +var import_fs = require("fs"); +var import_common = require("../common"); +var import_common2 = require("./common"); +const createDockerfile = async (data, image) => { + const { + applicationId, + tag, + workdir, + buildCommand, + baseDirectory, + publishDirectory, + secrets, + pullmergeRequestId, + baseImage, + buildId, + port + } = data; + const Dockerfile = []; + Dockerfile.push(`FROM ${image}`); + if (baseImage?.includes("httpd")) { + Dockerfile.push("WORKDIR /usr/local/apache2/htdocs/"); + } else { + Dockerfile.push("WORKDIR /app"); + } + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); + if (secrets.length > 0) { + (0, import_common.generateSecrets)(secrets, pullmergeRequestId, true).forEach((env) => { + Dockerfile.push(env); + }); + } + if (buildCommand) { + Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /app/${publishDirectory} ./`); + } else { + Dockerfile.push(`COPY .${baseDirectory || ""} ./`); + } + if (baseImage?.includes("nginx")) { + Dockerfile.push(`COPY /nginx.conf /etc/nginx/nginx.conf`); + } + Dockerfile.push(`EXPOSE ${port}`); + await import_fs.promises.writeFile(`${workdir}/Dockerfile`, Dockerfile.join("\n")); +}; +async function static_default(data) { + try { + const { baseImage, baseBuildImage } = data; + if (data.buildCommand) + await (0, import_common2.buildCacheImageWithNode)(data, baseBuildImage); + await createDockerfile(data, baseImage); + await (0, import_common2.buildImage)(data); + } catch (error) { + throw error; + } +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/lib/buildPacks/svelte.js b/apps/trpc-experimental/server/build/lib/buildPacks/svelte.js new file mode 100644 index 000000000..e1af2492b --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/buildPacks/svelte.js @@ -0,0 +1,50 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var svelte_exports = {}; +__export(svelte_exports, { + default: () => svelte_default +}); +module.exports = __toCommonJS(svelte_exports); +var import_fs = require("fs"); +var import_common = require("./common"); +const createDockerfile = async (data, image) => { + const { applicationId, tag, workdir, publishDirectory, baseImage, buildId, port } = data; + const Dockerfile = []; + Dockerfile.push(`FROM ${image}`); + Dockerfile.push("WORKDIR /app"); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); + Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /app/${publishDirectory} ./`); + if (baseImage?.includes("nginx")) { + Dockerfile.push(`COPY /nginx.conf /etc/nginx/nginx.conf`); + } + Dockerfile.push(`EXPOSE ${port}`); + await import_fs.promises.writeFile(`${workdir}/Dockerfile`, Dockerfile.join("\n")); +}; +async function svelte_default(data) { + try { + const { baseImage, baseBuildImage } = data; + await (0, import_common.buildCacheImageWithNode)(data, baseBuildImage); + await createDockerfile(data, baseImage); + await (0, import_common.buildImage)(data); + } catch (error) { + throw error; + } +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/lib/buildPacks/vuejs.js b/apps/trpc-experimental/server/build/lib/buildPacks/vuejs.js new file mode 100644 index 000000000..bc787e644 --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/buildPacks/vuejs.js @@ -0,0 +1,50 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var vuejs_exports = {}; +__export(vuejs_exports, { + default: () => vuejs_default +}); +module.exports = __toCommonJS(vuejs_exports); +var import_fs = require("fs"); +var import_common = require("./common"); +const createDockerfile = async (data, image) => { + const { applicationId, tag, workdir, publishDirectory, baseImage, buildId, port } = data; + const Dockerfile = []; + Dockerfile.push(`FROM ${image}`); + Dockerfile.push("WORKDIR /app"); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); + Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /app/${publishDirectory} ./`); + if (baseImage?.includes("nginx")) { + Dockerfile.push(`COPY /nginx.conf /etc/nginx/nginx.conf`); + } + Dockerfile.push(`EXPOSE ${port}`); + await import_fs.promises.writeFile(`${workdir}/Dockerfile`, Dockerfile.join("\n")); +}; +async function vuejs_default(data) { + try { + const { baseImage, baseBuildImage } = data; + await (0, import_common.buildCacheImageWithNode)(data, baseBuildImage); + await createDockerfile(data, baseImage); + await (0, import_common.buildImage)(data); + } catch (error) { + throw error; + } +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/lib/common.js b/apps/trpc-experimental/server/build/lib/common.js new file mode 100644 index 000000000..a501790b7 --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/common.js @@ -0,0 +1,952 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var common_exports = {}; +__export(common_exports, { + asyncSleep: () => asyncSleep, + base64Decode: () => base64Decode, + base64Encode: () => base64Encode, + checkDomainsIsValidInDNS: () => checkDomainsIsValidInDNS, + checkExposedPort: () => checkExposedPort, + cleanupDB: () => cleanupDB, + comparePassword: () => comparePassword, + configureNetworkTraefikProxy: () => configureNetworkTraefikProxy, + createDirectories: () => createDirectories, + decrypt: () => decrypt, + decryptApplication: () => decryptApplication, + defaultTraefikImage: () => defaultTraefikImage, + encrypt: () => encrypt, + fixType: () => fixType, + generateRangeArray: () => generateRangeArray, + generateSecrets: () => generateSecrets, + generateTimestamp: () => generateTimestamp, + getAPIUrl: () => getAPIUrl, + getContainerUsage: () => getContainerUsage, + getCurrentUser: () => getCurrentUser, + getDomain: () => getDomain, + getFreeExposedPort: () => getFreeExposedPort, + getTags: () => getTags, + getTeamInvitation: () => getTeamInvitation, + getTemplates: () => getTemplates, + getUIUrl: () => getUIUrl, + hashPassword: () => hashPassword, + isARM: () => isARM, + isDev: () => isDev, + isDomainConfigured: () => isDomainConfigured, + listSettings: () => listSettings, + makeLabelForServices: () => makeLabelForServices, + pushToRegistry: () => pushToRegistry, + removeService: () => removeService, + saveDockerRegistryCredentials: () => saveDockerRegistryCredentials, + scanningTemplates: () => scanningTemplates, + sentryDSN: () => sentryDSN, + setDefaultConfiguration: () => setDefaultConfiguration, + startTraefikProxy: () => startTraefikProxy, + startTraefikTCPProxy: () => startTraefikTCPProxy, + stopTraefikProxy: () => stopTraefikProxy, + uniqueName: () => uniqueName, + version: () => version +}); +module.exports = __toCommonJS(common_exports); +var import_prisma = require("../prisma"); +var import_bcryptjs = __toESM(require("bcryptjs")); +var import_crypto = __toESM(require("crypto")); +var import_dns = require("dns"); +var import_promises = __toESM(require("fs/promises")); +var import_unique_names_generator = require("unique-names-generator"); +var import_env = require("../env"); +var import_dayjs = require("./dayjs"); +var import_executeCommand = require("./executeCommand"); +var import_logging = require("./logging"); +var import_docker = require("./docker"); +var import_js_yaml = __toESM(require("js-yaml")); +const customConfig = { + dictionaries: [import_unique_names_generator.adjectives, import_unique_names_generator.colors, import_unique_names_generator.animals], + style: "capital", + separator: " ", + length: 3 +}; +const algorithm = "aes-256-ctr"; +const isDev = import_env.env.NODE_ENV === "development"; +const version = "3.13.0"; +const sentryDSN = "https://409f09bcb7af47928d3e0f46b78987f3@o1082494.ingest.sentry.io/4504236622217216"; +const defaultTraefikImage = `traefik:v2.8`; +function getAPIUrl() { + if (process.env.GITPOD_WORKSPACE_URL) { + const { href } = new URL(process.env.GITPOD_WORKSPACE_URL); + const newURL = href.replace("https://", "https://3001-").replace(/\/$/, ""); + return newURL; + } + if (process.env.CODESANDBOX_HOST) { + return `https://${process.env.CODESANDBOX_HOST.replace(/\$PORT/, "3001")}`; + } + return isDev ? "http://host.docker.internal:3001" : "http://localhost:3000"; +} +function getUIUrl() { + if (process.env.GITPOD_WORKSPACE_URL) { + const { href } = new URL(process.env.GITPOD_WORKSPACE_URL); + const newURL = href.replace("https://", "https://3000-").replace(/\/$/, ""); + return newURL; + } + if (process.env.CODESANDBOX_HOST) { + return `https://${process.env.CODESANDBOX_HOST.replace(/\$PORT/, "3000")}`; + } + return "http://localhost:3000"; +} +const mainTraefikEndpoint = isDev ? `${getAPIUrl()}/webhooks/traefik/main.json` : "http://coolify:3000/webhooks/traefik/main.json"; +const otherTraefikEndpoint = isDev ? `${getAPIUrl()}/webhooks/traefik/other.json` : "http://coolify:3000/webhooks/traefik/other.json"; +async function listSettings() { + return await import_prisma.prisma.setting.findUnique({ where: { id: "0" } }); +} +async function getCurrentUser(userId) { + return await import_prisma.prisma.user.findUnique({ + where: { id: userId }, + include: { teams: true, permission: true } + }); +} +async function getTeamInvitation(userId) { + return await import_prisma.prisma.teamInvitation.findMany({ where: { uid: userId } }); +} +async function hashPassword(password) { + const saltRounds = 15; + return import_bcryptjs.default.hash(password, saltRounds); +} +async function comparePassword(password, hashedPassword) { + return import_bcryptjs.default.compare(password, hashedPassword); +} +const uniqueName = () => (0, import_unique_names_generator.uniqueNamesGenerator)(customConfig); +const decrypt = (hashString) => { + if (hashString) { + try { + const hash = JSON.parse(hashString); + const decipher = import_crypto.default.createDecipheriv( + algorithm, + import_env.env.COOLIFY_SECRET_KEY, + Buffer.from(hash.iv, "hex") + ); + const decrpyted = Buffer.concat([ + decipher.update(Buffer.from(hash.content, "hex")), + decipher.final() + ]); + return decrpyted.toString(); + } catch (error) { + if (error instanceof Error) { + console.log({ decryptionError: error.message }); + } + return hashString; + } + } + return false; +}; +function generateRangeArray(start, end) { + return Array.from({ length: end - start }, (_v, k) => k + start); +} +function generateTimestamp() { + return `${(0, import_dayjs.day)().format("HH:mm:ss.SSS")}`; +} +const encrypt = (text) => { + if (text) { + const iv = import_crypto.default.randomBytes(16); + const cipher = import_crypto.default.createCipheriv(algorithm, import_env.env.COOLIFY_SECRET_KEY, iv); + const encrypted = Buffer.concat([cipher.update(text.trim()), cipher.final()]); + return JSON.stringify({ + iv: iv.toString("hex"), + content: encrypted.toString("hex") + }); + } + return false; +}; +async function getTemplates() { + const templatePath = isDev ? "./templates.json" : "/app/templates.json"; + const open = await import_promises.default.open(templatePath, "r"); + try { + let data = await open.readFile({ encoding: "utf-8" }); + let jsonData = JSON.parse(data); + if (isARM(process.arch)) { + jsonData = jsonData.filter((d) => d.arch !== "amd64"); + } + return jsonData; + } catch (error) { + return []; + } finally { + await open?.close(); + } +} +function isARM(arch) { + if (arch === "arm" || arch === "arm64" || arch === "aarch" || arch === "aarch64") { + return true; + } + return false; +} +async function removeService({ id }) { + await import_prisma.prisma.serviceSecret.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.serviceSetting.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.servicePersistentStorage.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.meiliSearch.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.fider.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.ghost.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.umami.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.hasura.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.plausibleAnalytics.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.minio.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.vscodeserver.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.wordpress.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.glitchTip.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.moodle.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.appwrite.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.searxng.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.weblate.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.taiga.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.service.delete({ where: { id } }); +} +const createDirectories = async ({ + repository, + buildId +}) => { + if (repository) + repository = repository.replaceAll(" ", ""); + const repodir = `/tmp/build-sources/${repository}/`; + const workdir = `/tmp/build-sources/${repository}/${buildId}`; + let workdirFound = false; + try { + workdirFound = !!await import_promises.default.stat(workdir); + } catch (error) { + } + if (workdirFound) { + await (0, import_executeCommand.executeCommand)({ command: `rm -fr ${workdir}` }); + } + await (0, import_executeCommand.executeCommand)({ command: `mkdir -p ${workdir}` }); + return { + workdir, + repodir + }; +}; +async function saveDockerRegistryCredentials({ url, username, password, workdir }) { + if (!username || !password) { + return null; + } + let decryptedPassword = decrypt(password); + const location = `${workdir}/.docker`; + try { + await import_promises.default.mkdir(`${workdir}/.docker`); + } catch (error) { + console.log(error); + } + const payload = JSON.stringify({ + auths: { + [url]: { + auth: Buffer.from(`${username}:${decryptedPassword}`).toString("base64") + } + } + }); + await import_promises.default.writeFile(`${location}/config.json`, payload); + return location; +} +function getDomain(domain) { + if (domain) { + return domain?.replace("https://", "").replace("http://", ""); + } else { + return ""; + } +} +async function isDomainConfigured({ + id, + fqdn, + checkOwn = false, + remoteIpAddress = void 0 +}) { + const domain = getDomain(fqdn); + const nakedDomain = domain.replace("www.", ""); + const foundApp = await import_prisma.prisma.application.findFirst({ + where: { + OR: [ + { fqdn: { endsWith: `//${nakedDomain}` } }, + { fqdn: { endsWith: `//www.${nakedDomain}` } }, + { dockerComposeConfiguration: { contains: `//${nakedDomain}` } }, + { dockerComposeConfiguration: { contains: `//www.${nakedDomain}` } } + ], + id: { not: id }, + destinationDocker: { + remoteIpAddress + } + }, + select: { fqdn: true } + }); + const foundService = await import_prisma.prisma.service.findFirst({ + where: { + OR: [ + { fqdn: { endsWith: `//${nakedDomain}` } }, + { fqdn: { endsWith: `//www.${nakedDomain}` } } + ], + id: { not: checkOwn ? void 0 : id }, + destinationDocker: { + remoteIpAddress + } + }, + select: { fqdn: true } + }); + const coolifyFqdn = await import_prisma.prisma.setting.findFirst({ + where: { + OR: [ + { fqdn: { endsWith: `//${nakedDomain}` } }, + { fqdn: { endsWith: `//www.${nakedDomain}` } } + ], + id: { not: id } + }, + select: { fqdn: true } + }); + return !!(foundApp || foundService || coolifyFqdn); +} +async function checkExposedPort({ + id, + configuredPort, + exposePort, + engine, + remoteEngine, + remoteIpAddress +}) { + if (exposePort < 1024 || exposePort > 65535) { + throw { status: 500, message: `Exposed Port needs to be between 1024 and 65535.` }; + } + if (configuredPort) { + if (configuredPort !== exposePort) { + const availablePort = await getFreeExposedPort( + id, + exposePort, + engine, + remoteEngine, + remoteIpAddress + ); + if (availablePort.toString() !== exposePort.toString()) { + throw { status: 500, message: `Port ${exposePort} is already in use.` }; + } + } + } else { + const availablePort = await getFreeExposedPort( + id, + exposePort, + engine, + remoteEngine, + remoteIpAddress + ); + if (availablePort.toString() !== exposePort.toString()) { + throw { status: 500, message: `Port ${exposePort} is already in use.` }; + } + } +} +async function getFreeExposedPort(id, exposePort, engine, remoteEngine, remoteIpAddress) { + const { default: checkPort } = await import("is-port-reachable"); + if (remoteEngine) { + const applicationUsed = await (await import_prisma.prisma.application.findMany({ + where: { + exposePort: { not: null }, + id: { not: id }, + destinationDocker: { remoteIpAddress } + }, + select: { exposePort: true } + })).map((a) => a.exposePort); + const serviceUsed = await (await import_prisma.prisma.service.findMany({ + where: { + exposePort: { not: null }, + id: { not: id }, + destinationDocker: { remoteIpAddress } + }, + select: { exposePort: true } + })).map((a) => a.exposePort); + const usedPorts = [...applicationUsed, ...serviceUsed]; + if (usedPorts.includes(exposePort)) { + return false; + } + const found = await checkPort(exposePort, { host: remoteIpAddress }); + if (!found) { + return exposePort; + } + return false; + } else { + const applicationUsed = await (await import_prisma.prisma.application.findMany({ + where: { exposePort: { not: null }, id: { not: id }, destinationDocker: { engine } }, + select: { exposePort: true } + })).map((a) => a.exposePort); + const serviceUsed = await (await import_prisma.prisma.service.findMany({ + where: { exposePort: { not: null }, id: { not: id }, destinationDocker: { engine } }, + select: { exposePort: true } + })).map((a) => a.exposePort); + const usedPorts = [...applicationUsed, ...serviceUsed]; + if (usedPorts.includes(exposePort)) { + return false; + } + const found = await checkPort(exposePort, { host: "localhost" }); + if (!found) { + return exposePort; + } + return false; + } +} +async function checkDomainsIsValidInDNS({ hostname, fqdn, dualCerts }) { + const { isIP } = await import("is-ip"); + const domain = getDomain(fqdn); + const domainDualCert = domain.includes("www.") ? domain.replace("www.", "") : `www.${domain}`; + const { DNSServers } = await listSettings(); + if (DNSServers) { + import_dns.promises.setServers([...DNSServers.split(",")]); + } + let resolves = []; + try { + if (isIP(hostname)) { + resolves = [hostname]; + } else { + resolves = await import_dns.promises.resolve4(hostname); + } + } catch (error) { + throw { status: 500, message: `Could not determine IP address for ${hostname}.` }; + } + if (dualCerts) { + try { + const ipDomain = await import_dns.promises.resolve4(domain); + const ipDomainDualCert = await import_dns.promises.resolve4(domainDualCert); + let ipDomainFound = false; + let ipDomainDualCertFound = false; + for (const ip of ipDomain) { + if (resolves.includes(ip)) { + ipDomainFound = true; + } + } + for (const ip of ipDomainDualCert) { + if (resolves.includes(ip)) { + ipDomainDualCertFound = true; + } + } + if (ipDomainFound && ipDomainDualCertFound) + return { status: 200 }; + throw { + status: 500, + message: `DNS not set correctly or propogated.
Please check your DNS settings.` + }; + } catch (error) { + throw { + status: 500, + message: `DNS not set correctly or propogated.
Please check your DNS settings.` + }; + } + } else { + try { + const ipDomain = await import_dns.promises.resolve4(domain); + let ipDomainFound = false; + for (const ip of ipDomain) { + if (resolves.includes(ip)) { + ipDomainFound = true; + } + } + if (ipDomainFound) + return { status: 200 }; + throw { + status: 500, + message: `DNS not set correctly or propogated.
Please check your DNS settings.` + }; + } catch (error) { + throw { + status: 500, + message: `DNS not set correctly or propogated.
Please check your DNS settings.` + }; + } + } +} +const setDefaultConfiguration = async (data) => { + let { + buildPack, + port, + installCommand, + startCommand, + buildCommand, + publishDirectory, + baseDirectory, + dockerFileLocation, + dockerComposeFileLocation, + denoMainFile + } = data; + const template = scanningTemplates[buildPack]; + if (!port) { + port = template?.port || 3e3; + if (buildPack === "static") + port = 80; + else if (buildPack === "node") + port = 3e3; + else if (buildPack === "php") + port = 80; + else if (buildPack === "python") + port = 8e3; + } + if (!installCommand && buildPack !== "static" && buildPack !== "laravel") + installCommand = template?.installCommand || "yarn install"; + if (!startCommand && buildPack !== "static" && buildPack !== "laravel") + startCommand = template?.startCommand || "yarn start"; + if (!buildCommand && buildPack !== "static" && buildPack !== "laravel") + buildCommand = template?.buildCommand || null; + if (!publishDirectory) + publishDirectory = template?.publishDirectory || null; + if (baseDirectory) { + if (!baseDirectory.startsWith("/")) + baseDirectory = `/${baseDirectory}`; + if (baseDirectory.endsWith("/") && baseDirectory !== "/") + baseDirectory = baseDirectory.slice(0, -1); + } + if (dockerFileLocation) { + if (!dockerFileLocation.startsWith("/")) + dockerFileLocation = `/${dockerFileLocation}`; + if (dockerFileLocation.endsWith("/")) + dockerFileLocation = dockerFileLocation.slice(0, -1); + } else { + dockerFileLocation = "/Dockerfile"; + } + if (dockerComposeFileLocation) { + if (!dockerComposeFileLocation.startsWith("/")) + dockerComposeFileLocation = `/${dockerComposeFileLocation}`; + if (dockerComposeFileLocation.endsWith("/")) + dockerComposeFileLocation = dockerComposeFileLocation.slice(0, -1); + } else { + dockerComposeFileLocation = "/Dockerfile"; + } + if (!denoMainFile) { + denoMainFile = "main.ts"; + } + return { + buildPack, + port, + installCommand, + startCommand, + buildCommand, + publishDirectory, + baseDirectory, + dockerFileLocation, + dockerComposeFileLocation, + denoMainFile + }; +}; +const scanningTemplates = { + "@sveltejs/kit": { + buildPack: "nodejs" + }, + astro: { + buildPack: "astro" + }, + "@11ty/eleventy": { + buildPack: "eleventy" + }, + svelte: { + buildPack: "svelte" + }, + "@nestjs/core": { + buildPack: "nestjs" + }, + next: { + buildPack: "nextjs" + }, + nuxt: { + buildPack: "nuxtjs" + }, + "react-scripts": { + buildPack: "react" + }, + "parcel-bundler": { + buildPack: "static" + }, + "@vue/cli-service": { + buildPack: "vuejs" + }, + vuejs: { + buildPack: "vuejs" + }, + gatsby: { + buildPack: "gatsby" + }, + "preact-cli": { + buildPack: "react" + } +}; +async function cleanupDB(buildId, applicationId) { + const data = await import_prisma.prisma.build.findUnique({ where: { id: buildId } }); + if (data?.status === "queued" || data?.status === "running") { + await import_prisma.prisma.build.update({ where: { id: buildId }, data: { status: "canceled" } }); + } + await (0, import_logging.saveBuildLog)({ line: "Canceled.", buildId, applicationId }); +} +const base64Encode = (text) => { + return Buffer.from(text).toString("base64"); +}; +const base64Decode = (text) => { + return Buffer.from(text, "base64").toString("ascii"); +}; +function parseSecret(secret, isBuild) { + if (secret.value.includes("$")) { + secret.value = secret.value.replaceAll("$", "$$$$"); + } + if (secret.value.includes("\\n")) { + if (isBuild) { + return `ARG ${secret.name}=${secret.value}`; + } else { + return `${secret.name}=${secret.value}`; + } + } else if (secret.value.includes(" ")) { + if (isBuild) { + return `ARG ${secret.name}='${secret.value}'`; + } else { + return `${secret.name}='${secret.value}'`; + } + } else { + if (isBuild) { + return `ARG ${secret.name}=${secret.value}`; + } else { + return `${secret.name}=${secret.value}`; + } + } +} +function generateSecrets(secrets, pullmergeRequestId, isBuild = false, port = null) { + const envs = []; + const isPRMRSecret = secrets.filter((s) => s.isPRMRSecret); + const normalSecrets = secrets.filter((s) => !s.isPRMRSecret); + if (pullmergeRequestId && isPRMRSecret.length > 0) { + isPRMRSecret.forEach((secret) => { + if (isBuild && !secret.isBuildSecret) { + return; + } + const build = isBuild && secret.isBuildSecret; + envs.push(parseSecret(secret, build)); + }); + } + if (!pullmergeRequestId && normalSecrets.length > 0) { + normalSecrets.forEach((secret) => { + if (isBuild && !secret.isBuildSecret) { + return; + } + const build = isBuild && secret.isBuildSecret; + envs.push(parseSecret(secret, build)); + }); + } + const portFound = envs.filter((env2) => env2.startsWith("PORT")); + if (portFound.length === 0 && port && !isBuild) { + envs.push(`PORT=${port}`); + } + const nodeEnv = envs.filter((env2) => env2.startsWith("NODE_ENV")); + if (nodeEnv.length === 0 && !isBuild) { + envs.push(`NODE_ENV=production`); + } + return envs; +} +function decryptApplication(application) { + if (application) { + if (application?.gitSource?.githubApp?.clientSecret) { + application.gitSource.githubApp.clientSecret = decrypt(application.gitSource.githubApp.clientSecret) || null; + } + if (application?.gitSource?.githubApp?.webhookSecret) { + application.gitSource.githubApp.webhookSecret = decrypt(application.gitSource.githubApp.webhookSecret) || null; + } + if (application?.gitSource?.githubApp?.privateKey) { + application.gitSource.githubApp.privateKey = decrypt(application.gitSource.githubApp.privateKey) || null; + } + if (application?.gitSource?.gitlabApp?.appSecret) { + application.gitSource.gitlabApp.appSecret = decrypt(application.gitSource.gitlabApp.appSecret) || null; + } + if (application?.secrets.length > 0) { + application.secrets = application.secrets.map((s) => { + s.value = decrypt(s.value) || null; + return s; + }); + } + return application; + } +} +async function pushToRegistry(application, workdir, tag, imageName, customTag) { + const location = `${workdir}/.docker`; + const tagCommand = `docker tag ${application.id}:${tag} ${imageName}:${customTag}`; + const pushCommand = `docker --config ${location} push ${imageName}:${customTag}`; + await (0, import_executeCommand.executeCommand)({ + dockerId: application.destinationDockerId, + command: tagCommand + }); + await (0, import_executeCommand.executeCommand)({ + dockerId: application.destinationDockerId, + command: pushCommand + }); +} +async function getContainerUsage(dockerId, container) { + try { + const { stdout } = await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker container stats ${container} --no-stream --no-trunc --format "{{json .}}"` + }); + return JSON.parse(stdout); + } catch (err) { + return { + MemUsage: 0, + CPUPerc: 0, + NetIO: 0 + }; + } +} +function fixType(type) { + return type?.replaceAll(" ", "").toLowerCase() || null; +} +const compareSemanticVersions = (a, b) => { + const a1 = a.split("."); + const b1 = b.split("."); + const len = Math.min(a1.length, b1.length); + for (let i = 0; i < len; i++) { + const a2 = +a1[i] || 0; + const b2 = +b1[i] || 0; + if (a2 !== b2) { + return a2 > b2 ? 1 : -1; + } + } + return b1.length - a1.length; +}; +async function getTags(type) { + try { + if (type) { + const tagsPath = isDev ? "./tags.json" : "/app/tags.json"; + const data = await import_promises.default.readFile(tagsPath, "utf8"); + let tags = JSON.parse(data); + if (tags) { + tags = tags.find((tag) => tag.name.includes(type)); + tags.tags = tags.tags.sort(compareSemanticVersions).reverse(); + return tags; + } + } + } catch (error) { + return []; + } +} +function makeLabelForServices(type) { + return [ + "coolify.managed=true", + `coolify.version=${version}`, + `coolify.type=service`, + `coolify.service.type=${type}` + ]; +} +const asyncSleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay)); +async function startTraefikTCPProxy(destinationDocker, id, publicPort, privatePort, type) { + const { network, id: dockerId, remoteEngine } = destinationDocker; + const container = `${id}-${publicPort}`; + const { found } = await (0, import_docker.checkContainer)({ dockerId, container, remove: true }); + const { ipv4, ipv6 } = await listSettings(); + let dependentId = id; + if (type === "wordpressftp") + dependentId = `${id}-ftp`; + const { found: foundDependentContainer } = await (0, import_docker.checkContainer)({ + dockerId, + container: dependentId, + remove: true + }); + if (foundDependentContainer && !found) { + const { stdout: Config } = await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker network inspect ${network} --format '{{json .IPAM.Config }}'` + }); + const ip = JSON.parse(Config)[0].Gateway; + let traefikUrl = otherTraefikEndpoint; + if (remoteEngine) { + let ip2 = null; + if (isDev) { + ip2 = getAPIUrl(); + } else { + ip2 = `http://${ipv4 || ipv6}:3000`; + } + traefikUrl = `${ip2}/webhooks/traefik/other.json`; + } + const tcpProxy = { + version: "3.8", + services: { + [`${id}-${publicPort}`]: { + container_name: container, + image: defaultTraefikImage, + command: [ + `--entrypoints.tcp.address=:${publicPort}`, + `--entryPoints.tcp.forwardedHeaders.insecure=true`, + `--providers.http.endpoint=${traefikUrl}?id=${id}&privatePort=${privatePort}&publicPort=${publicPort}&type=tcp&address=${dependentId}`, + "--providers.http.pollTimeout=10s", + "--log.level=error" + ], + ports: [`${publicPort}:${publicPort}`], + extra_hosts: ["host.docker.internal:host-gateway", `host.docker.internal: ${ip}`], + volumes: ["/var/run/docker.sock:/var/run/docker.sock"], + networks: ["coolify-infra", network] + } + }, + networks: { + [network]: { + external: false, + name: network + }, + "coolify-infra": { + external: false, + name: "coolify-infra" + } + } + }; + await import_promises.default.writeFile(`/tmp/docker-compose-${id}.yaml`, import_js_yaml.default.dump(tcpProxy)); + await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker compose -f /tmp/docker-compose-${id}.yaml up -d` + }); + await import_promises.default.rm(`/tmp/docker-compose-${id}.yaml`); + } + if (!foundDependentContainer && found) { + await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker stop -t 0 ${container} && docker rm ${container}`, + shell: true + }); + } +} +async function startTraefikProxy(id) { + const { engine, network, remoteEngine, remoteIpAddress } = await import_prisma.prisma.destinationDocker.findUnique({ where: { id } }); + const { found } = await (0, import_docker.checkContainer)({ + dockerId: id, + container: "coolify-proxy", + remove: true + }); + const { id: settingsId, ipv4, ipv6 } = await listSettings(); + if (!found) { + const { stdout: coolifyNetwork } = await (0, import_executeCommand.executeCommand)({ + dockerId: id, + command: `docker network ls --filter 'name=coolify-infra' --no-trunc --format "{{json .}}"` + }); + if (!coolifyNetwork) { + await (0, import_executeCommand.executeCommand)({ + dockerId: id, + command: `docker network create --attachable coolify-infra` + }); + } + const { stdout: Config } = await (0, import_executeCommand.executeCommand)({ + dockerId: id, + command: `docker network inspect ${network} --format '{{json .IPAM.Config }}'` + }); + const ip = JSON.parse(Config)[0].Gateway; + let traefikUrl = mainTraefikEndpoint; + if (remoteEngine) { + let ip2 = null; + if (isDev) { + ip2 = getAPIUrl(); + } else { + ip2 = `http://${ipv4 || ipv6}:3000`; + } + traefikUrl = `${ip2}/webhooks/traefik/remote/${id}`; + } + await (0, import_executeCommand.executeCommand)({ + dockerId: id, + command: `docker run --restart always --add-host 'host.docker.internal:host-gateway' ${ip ? `--add-host 'host.docker.internal:${ip}'` : ""} -v coolify-traefik-letsencrypt:/etc/traefik/acme -v /var/run/docker.sock:/var/run/docker.sock --network coolify-infra -p "80:80" -p "443:443" --name coolify-proxy -d ${defaultTraefikImage} --entrypoints.web.address=:80 --entrypoints.web.forwardedHeaders.insecure=true --entrypoints.websecure.address=:443 --entrypoints.websecure.forwardedHeaders.insecure=true --providers.docker=true --providers.docker.exposedbydefault=false --providers.http.endpoint=${traefikUrl} --providers.http.pollTimeout=5s --certificatesresolvers.letsencrypt.acme.httpchallenge=true --certificatesresolvers.letsencrypt.acme.storage=/etc/traefik/acme/acme.json --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web --log.level=error` + }); + await import_prisma.prisma.destinationDocker.update({ + where: { id }, + data: { isCoolifyProxyUsed: true } + }); + } + if (engine) { + const destinations = await import_prisma.prisma.destinationDocker.findMany({ where: { engine } }); + for (const destination of destinations) { + await configureNetworkTraefikProxy(destination); + } + } + if (remoteEngine) { + const destinations = await import_prisma.prisma.destinationDocker.findMany({ where: { remoteIpAddress } }); + for (const destination of destinations) { + await configureNetworkTraefikProxy(destination); + } + } +} +async function configureNetworkTraefikProxy(destination) { + const { id } = destination; + const { stdout: networks } = await (0, import_executeCommand.executeCommand)({ + dockerId: id, + command: `docker ps -a --filter name=coolify-proxy --format '{{json .Networks}}'` + }); + const configuredNetworks = networks.replace(/"/g, "").replace("\n", "").split(","); + if (!configuredNetworks.includes(destination.network)) { + await (0, import_executeCommand.executeCommand)({ + dockerId: destination.id, + command: `docker network connect ${destination.network} coolify-proxy` + }); + } +} +async function stopTraefikProxy(id) { + const { found } = await (0, import_docker.checkContainer)({ dockerId: id, container: "coolify-proxy" }); + await import_prisma.prisma.destinationDocker.update({ + where: { id }, + data: { isCoolifyProxyUsed: false } + }); + if (found) { + return await (0, import_executeCommand.executeCommand)({ + dockerId: id, + command: `docker stop -t 0 coolify-proxy && docker rm coolify-proxy`, + shell: true + }); + } + return { stdout: "", stderr: "" }; +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + asyncSleep, + base64Decode, + base64Encode, + checkDomainsIsValidInDNS, + checkExposedPort, + cleanupDB, + comparePassword, + configureNetworkTraefikProxy, + createDirectories, + decrypt, + decryptApplication, + defaultTraefikImage, + encrypt, + fixType, + generateRangeArray, + generateSecrets, + generateTimestamp, + getAPIUrl, + getContainerUsage, + getCurrentUser, + getDomain, + getFreeExposedPort, + getTags, + getTeamInvitation, + getTemplates, + getUIUrl, + hashPassword, + isARM, + isDev, + isDomainConfigured, + listSettings, + makeLabelForServices, + pushToRegistry, + removeService, + saveDockerRegistryCredentials, + scanningTemplates, + sentryDSN, + setDefaultConfiguration, + startTraefikProxy, + startTraefikTCPProxy, + stopTraefikProxy, + uniqueName, + version +}); diff --git a/apps/trpc-experimental/server/build/lib/dayjs.js b/apps/trpc-experimental/server/build/lib/dayjs.js new file mode 100644 index 000000000..bc709ce17 --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/dayjs.js @@ -0,0 +1,38 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var dayjs_exports = {}; +__export(dayjs_exports, { + day: () => import_dayjs.default +}); +module.exports = __toCommonJS(dayjs_exports); +var import_dayjs = __toESM(require("dayjs")); +var import_utc = __toESM(require("dayjs/plugin/utc.js")); +var import_relativeTime = __toESM(require("dayjs/plugin/relativeTime.js")); +import_dayjs.default.extend(import_utc.default); +import_dayjs.default.extend(import_relativeTime.default); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + day +}); diff --git a/apps/trpc-experimental/server/build/lib/docker.js b/apps/trpc-experimental/server/build/lib/docker.js new file mode 100644 index 000000000..58fd81f5d --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/docker.js @@ -0,0 +1,168 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var docker_exports = {}; +__export(docker_exports, { + checkContainer: () => checkContainer, + defaultComposeConfiguration: () => defaultComposeConfiguration, + formatLabelsOnDocker: () => formatLabelsOnDocker, + removeContainer: () => removeContainer, + stopDatabaseContainer: () => stopDatabaseContainer, + stopTcpHttpProxy: () => stopTcpHttpProxy +}); +module.exports = __toCommonJS(docker_exports); +var import_executeCommand = require("./executeCommand"); +async function checkContainer({ + dockerId, + container, + remove = false +}) { + let containerFound = false; + try { + const { stdout } = await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker inspect --format '{{json .State}}' ${container}` + }); + containerFound = true; + const parsedStdout = JSON.parse(stdout); + const status = parsedStdout.Status; + const isRunning = status === "running"; + const isRestarting = status === "restarting"; + const isExited = status === "exited"; + if (status === "created") { + await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker rm ${container}` + }); + } + if (remove && status === "exited") { + await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker rm ${container}` + }); + } + return { + found: containerFound, + status: { + isRunning, + isRestarting, + isExited + } + }; + } catch (err) { + } + return { + found: false + }; +} +async function removeContainer({ + id, + dockerId +}) { + try { + const { stdout } = await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker inspect --format '{{json .State}}' ${id}` + }); + if (JSON.parse(stdout).Running) { + await (0, import_executeCommand.executeCommand)({ dockerId, command: `docker stop -t 0 ${id}` }); + await (0, import_executeCommand.executeCommand)({ dockerId, command: `docker rm ${id}` }); + } + if (JSON.parse(stdout).Status === "exited") { + await (0, import_executeCommand.executeCommand)({ dockerId, command: `docker rm ${id}` }); + } + } catch (error) { + throw error; + } +} +async function stopDatabaseContainer(database) { + let everStarted = false; + const { + id, + destinationDockerId, + destinationDocker: { engine, id: dockerId } + } = database; + if (destinationDockerId) { + try { + const { stdout } = await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker inspect --format '{{json .State}}' ${id}` + }); + if (stdout) { + everStarted = true; + await removeContainer({ id, dockerId }); + } + } catch (error) { + } + } + return everStarted; +} +async function stopTcpHttpProxy(id, destinationDocker, publicPort, forceName = null) { + const { id: dockerId } = destinationDocker; + let container = `${id}-${publicPort}`; + if (forceName) + container = forceName; + const { found } = await checkContainer({ dockerId, container }); + try { + if (!found) + return true; + return await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker stop -t 0 ${container} && docker rm ${container}`, + shell: true + }); + } catch (error) { + return error; + } +} +function formatLabelsOnDocker(data) { + return data.trim().split("\n").map((a) => JSON.parse(a)).map((container) => { + const labels = container.Labels.split(","); + let jsonLabels = {}; + labels.forEach((l) => { + const name = l.split("=")[0]; + const value = l.split("=")[1]; + jsonLabels = { ...jsonLabels, ...{ [name]: value } }; + }); + container.Labels = jsonLabels; + return container; + }); +} +function defaultComposeConfiguration(network) { + return { + networks: [network], + restart: "on-failure", + deploy: { + restart_policy: { + condition: "on-failure", + delay: "5s", + max_attempts: 10, + window: "120s" + } + } + }; +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + checkContainer, + defaultComposeConfiguration, + formatLabelsOnDocker, + removeContainer, + stopDatabaseContainer, + stopTcpHttpProxy +}); diff --git a/apps/trpc-experimental/server/build/lib/executeCommand.js b/apps/trpc-experimental/server/build/lib/executeCommand.js new file mode 100644 index 000000000..b1a12607b --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/executeCommand.js @@ -0,0 +1,207 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var executeCommand_exports = {}; +__export(executeCommand_exports, { + createRemoteEngineConfiguration: () => createRemoteEngineConfiguration, + executeCommand: () => executeCommand +}); +module.exports = __toCommonJS(executeCommand_exports); +var import_prisma = require("../prisma"); +var import_os = __toESM(require("os")); +var import_promises = __toESM(require("fs/promises")); +var import_ssh_config = __toESM(require("ssh-config")); +var import_ssh = require("./ssh"); +var import_env = require("../env"); +var import_logging = require("./logging"); +var import_common = require("./common"); +async function executeCommand({ + command, + dockerId = null, + sshCommand = false, + shell = false, + stream = false, + buildId, + applicationId, + debug +}) { + const { execa, execaCommand } = await import("execa"); + const { parse } = await import("shell-quote"); + const parsedCommand = parse(command); + const dockerCommand = parsedCommand[0]; + const dockerArgs = parsedCommand.slice(1); + if (dockerId && dockerCommand && dockerArgs) { + const destinationDocker = await import_prisma.prisma.destinationDocker.findUnique({ + where: { id: dockerId } + }); + if (!destinationDocker) { + throw new Error("Destination docker not found"); + } + let { remoteEngine, remoteIpAddress, engine } = destinationDocker; + if (remoteEngine) { + await createRemoteEngineConfiguration(dockerId); + engine = `ssh://${remoteIpAddress}-remote`; + } else { + engine = "unix:///var/run/docker.sock"; + } + if (import_env.env.CODESANDBOX_HOST) { + if (command.startsWith("docker compose")) { + command = command.replace(/docker compose/gi, "docker-compose"); + } + } + if (sshCommand) { + if (shell) { + return execaCommand(`ssh ${remoteIpAddress}-remote ${command}`); + } + return await execa("ssh", [`${remoteIpAddress}-remote`, dockerCommand, ...dockerArgs]); + } + if (stream) { + return await new Promise(async (resolve, reject) => { + let subprocess = null; + if (shell) { + subprocess = execaCommand(command, { + env: { DOCKER_BUILDKIT: "1", DOCKER_HOST: engine } + }); + } else { + subprocess = execa(dockerCommand, dockerArgs, { + env: { DOCKER_BUILDKIT: "1", DOCKER_HOST: engine } + }); + } + const logs = []; + if (subprocess && subprocess.stdout && subprocess.stderr) { + subprocess.stdout.on("data", async (data) => { + const stdout = data.toString(); + const array = stdout.split("\n"); + for (const line of array) { + if (line !== "\n" && line !== "") { + const log = { + line: `${line.replace("\n", "")}`, + buildId, + applicationId + }; + logs.push(log); + if (debug) { + await (0, import_logging.saveBuildLog)(log); + } + } + } + }); + subprocess.stderr.on("data", async (data) => { + const stderr = data.toString(); + const array = stderr.split("\n"); + for (const line of array) { + if (line !== "\n" && line !== "") { + const log = { + line: `${line.replace("\n", "")}`, + buildId, + applicationId + }; + logs.push(log); + if (debug) { + await (0, import_logging.saveBuildLog)(log); + } + } + } + }); + subprocess.on("exit", async (code) => { + if (code === 0) { + resolve(code); + } else { + if (!debug) { + for (const log of logs) { + await (0, import_logging.saveBuildLog)(log); + } + } + reject(code); + } + }); + } + }); + } else { + if (shell) { + return await execaCommand(command, { + env: { DOCKER_BUILDKIT: "1", DOCKER_HOST: engine } + }); + } else { + return await execa(dockerCommand, dockerArgs, { + env: { DOCKER_BUILDKIT: "1", DOCKER_HOST: engine } + }); + } + } + } else { + if (shell) { + return execaCommand(command, { shell: true }); + } + return await execa(dockerCommand, dockerArgs); + } +} +async function createRemoteEngineConfiguration(id) { + const homedir = import_os.default.homedir(); + const sshKeyFile = `/tmp/id_rsa-${id}`; + const localPort = await (0, import_ssh.getFreeSSHLocalPort)(id); + const { + sshKey: { privateKey }, + network, + remoteIpAddress, + remotePort, + remoteUser + } = await import_prisma.prisma.destinationDocker.findFirst({ where: { id }, include: { sshKey: true } }); + await import_promises.default.writeFile(sshKeyFile, (0, import_common.decrypt)(privateKey) + "\n", { encoding: "utf8", mode: 400 }); + const config = import_ssh_config.default.parse(""); + const Host = `${remoteIpAddress}-remote`; + try { + await executeCommand({ command: `ssh-keygen -R ${Host}` }); + await executeCommand({ command: `ssh-keygen -R ${remoteIpAddress}` }); + await executeCommand({ command: `ssh-keygen -R localhost:${localPort}` }); + } catch (error) { + } + const found = config.find({ Host }); + const foundIp = config.find({ Host: remoteIpAddress }); + if (found) + config.remove({ Host }); + if (foundIp) + config.remove({ Host: remoteIpAddress }); + config.append({ + Host, + Hostname: remoteIpAddress, + Port: remotePort.toString(), + User: remoteUser, + StrictHostKeyChecking: "no", + IdentityFile: sshKeyFile, + ControlMaster: "auto", + ControlPath: `${homedir}/.ssh/coolify-${remoteIpAddress}-%r@%h:%p`, + ControlPersist: "10m" + }); + try { + await import_promises.default.stat(`${homedir}/.ssh/`); + } catch (error) { + await import_promises.default.mkdir(`${homedir}/.ssh/`); + } + return await import_promises.default.writeFile(`${homedir}/.ssh/config`, import_ssh_config.default.stringify(config)); +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + createRemoteEngineConfiguration, + executeCommand +}); diff --git a/apps/trpc-experimental/server/build/lib/importers/github.js b/apps/trpc-experimental/server/build/lib/importers/github.js new file mode 100644 index 000000000..c03410e05 --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/importers/github.js @@ -0,0 +1,108 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var github_exports = {}; +__export(github_exports, { + default: () => github_default +}); +module.exports = __toCommonJS(github_exports); +var import_jsonwebtoken = __toESM(require("jsonwebtoken")); +var import_prisma = require("../../prisma"); +var import_common = require("../buildPacks/common"); +var import_common2 = require("../common"); +var import_executeCommand = require("../executeCommand"); +async function github_default({ + applicationId, + workdir, + githubAppId, + repository, + apiUrl, + gitCommitHash, + htmlUrl, + branch, + buildId, + customPort, + forPublic +}) { + const { default: got } = await import("got"); + const url = htmlUrl.replace("https://", "").replace("http://", ""); + if (forPublic) { + await (0, import_common.saveBuildLog)({ + line: `Cloning ${repository}:${branch}...`, + buildId, + applicationId + }); + if (gitCommitHash) { + await (0, import_common.saveBuildLog)({ + line: `Checking out ${gitCommitHash} commit...`, + buildId, + applicationId + }); + } + await (0, import_executeCommand.executeCommand)({ + command: `git clone -q -b ${branch} https://${url}/${repository}.git ${workdir}/ && cd ${workdir} && git checkout ${gitCommitHash || ""} && git submodule update --init --recursive && git lfs pull && cd .. `, + shell: true + }); + } else { + const body = await import_prisma.prisma.githubApp.findUnique({ where: { id: githubAppId } }); + if (body.privateKey) + body.privateKey = (0, import_common2.decrypt)(body.privateKey); + const { privateKey, appId, installationId } = body; + const githubPrivateKey = privateKey.replace(/\\n/g, "\n").replace(/"/g, ""); + const payload = { + iat: Math.round(new Date().getTime() / 1e3), + exp: Math.round(new Date().getTime() / 1e3 + 60), + iss: appId + }; + const jwtToken = import_jsonwebtoken.default.sign(payload, githubPrivateKey, { + algorithm: "RS256" + }); + const { token } = await got.post(`${apiUrl}/app/installations/${installationId}/access_tokens`, { + headers: { + Authorization: `Bearer ${jwtToken}`, + Accept: "application/vnd.github.machine-man-preview+json" + } + }).json(); + await (0, import_common.saveBuildLog)({ + line: `Cloning ${repository}:${branch}...`, + buildId, + applicationId + }); + if (gitCommitHash) { + await (0, import_common.saveBuildLog)({ + line: `Checking out ${gitCommitHash} commit...`, + buildId, + applicationId + }); + } + await (0, import_executeCommand.executeCommand)({ + command: `git clone -q -b ${branch} https://x-access-token:${token}@${url}/${repository}.git --config core.sshCommand="ssh -p ${customPort}" ${workdir}/ && cd ${workdir} && git checkout ${gitCommitHash || ""} && git submodule update --init --recursive && git lfs pull && cd .. `, + shell: true + }); + } + const { stdout: commit } = await (0, import_executeCommand.executeCommand)({ command: `cd ${workdir}/ && git rev-parse HEAD`, shell: true }); + return commit.replace("\n", ""); +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/lib/importers/gitlab.js b/apps/trpc-experimental/server/build/lib/importers/gitlab.js new file mode 100644 index 000000000..d34c5bb7b --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/importers/gitlab.js @@ -0,0 +1,76 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var gitlab_exports = {}; +__export(gitlab_exports, { + default: () => gitlab_default +}); +module.exports = __toCommonJS(gitlab_exports); +var import_common = require("../buildPacks/common"); +var import_executeCommand = require("../executeCommand"); +async function gitlab_default({ + applicationId, + workdir, + repodir, + htmlUrl, + gitCommitHash, + repository, + branch, + buildId, + privateSshKey, + customPort, + forPublic, + customUser +}) { + const url = htmlUrl.replace("https://", "").replace("http://", "").replace(/\/$/, ""); + if (!forPublic) { + await (0, import_executeCommand.executeCommand)({ command: `echo '${privateSshKey}' > ${repodir}/id.rsa`, shell: true }); + await (0, import_executeCommand.executeCommand)({ command: `chmod 600 ${repodir}/id.rsa` }); + } + await (0, import_common.saveBuildLog)({ + line: `Cloning ${repository}:${branch}...`, + buildId, + applicationId + }); + if (gitCommitHash) { + await (0, import_common.saveBuildLog)({ + line: `Checking out ${gitCommitHash} commit...`, + buildId, + applicationId + }); + } + if (forPublic) { + await (0, import_executeCommand.executeCommand)( + { + command: `git clone -q -b ${branch} https://${url}/${repository}.git ${workdir}/ && cd ${workdir}/ && git checkout ${gitCommitHash || ""} && git submodule update --init --recursive && git lfs pull && cd .. `, + shell: true + } + ); + } else { + await (0, import_executeCommand.executeCommand)( + { + command: `git clone -q -b ${branch} ${customUser}@${url}:${repository}.git --config core.sshCommand="ssh -p ${customPort} -q -i ${repodir}id.rsa -o StrictHostKeyChecking=no" ${workdir}/ && cd ${workdir}/ && git checkout ${gitCommitHash || ""} && git submodule update --init --recursive && git lfs pull && cd .. `, + shell: true + } + ); + } + const { stdout: commit } = await (0, import_executeCommand.executeCommand)({ command: `cd ${workdir}/ && git rev-parse HEAD`, shell: true }); + return commit.replace("\n", ""); +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = {}); diff --git a/apps/trpc-experimental/server/build/lib/importers/index.js b/apps/trpc-experimental/server/build/lib/importers/index.js new file mode 100644 index 000000000..c6d1a4b55 --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/importers/index.js @@ -0,0 +1,37 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var importers_exports = {}; +__export(importers_exports, { + github: () => import_github.default, + gitlab: () => import_gitlab.default +}); +module.exports = __toCommonJS(importers_exports); +var import_github = __toESM(require("./github")); +var import_gitlab = __toESM(require("./gitlab")); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + github, + gitlab +}); diff --git a/apps/trpc-experimental/server/build/lib/logging.js b/apps/trpc-experimental/server/build/lib/logging.js new file mode 100644 index 000000000..e820a7925 --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/logging.js @@ -0,0 +1,75 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var logging_exports = {}; +__export(logging_exports, { + saveBuildLog: () => saveBuildLog +}); +module.exports = __toCommonJS(logging_exports); +var import_prisma = require("../prisma"); +var import_common = require("./common"); +var import_dayjs = require("./dayjs"); +const saveBuildLog = async ({ line, buildId, applicationId }) => { + if (buildId === "undefined" || buildId === "null" || !buildId) + return; + if (applicationId === "undefined" || applicationId === "null" || !applicationId) + return; + const { default: got } = await import("got"); + if (typeof line === "object" && line) { + if (line.shortMessage) { + line = line.shortMessage + "\n" + line.stderr; + } else { + line = JSON.stringify(line); + } + } + if (line && typeof line === "string" && line.includes("ghs_")) { + const regex = /ghs_.*@/g; + line = line.replace(regex, "@"); + } + const addTimestamp = `[${(0, import_common.generateTimestamp)()}] ${line}`; + const fluentBitUrl = import_common.isDev ? "http://localhost:24224" : "http://coolify-fluentbit:24224"; + if (import_common.isDev) { + console.debug(`[${applicationId}] ${addTimestamp}`); + } + try { + return await got.post(`${fluentBitUrl}/${applicationId}_buildlog_${buildId}.csv`, { + json: { + line: (0, import_common.encrypt)(line) + } + }); + } catch (error) { + return await import_prisma.prisma.buildLog.create({ + data: { + line: addTimestamp, + buildId, + time: Number((0, import_dayjs.day)().valueOf()), + applicationId + } + }); + } +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + saveBuildLog +}); diff --git a/apps/trpc-experimental/server/build/lib/ssh.js b/apps/trpc-experimental/server/build/lib/ssh.js new file mode 100644 index 000000000..508741eeb --- /dev/null +++ b/apps/trpc-experimental/server/build/lib/ssh.js @@ -0,0 +1,76 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var ssh_exports = {}; +__export(ssh_exports, { + getFreeSSHLocalPort: () => getFreeSSHLocalPort +}); +module.exports = __toCommonJS(ssh_exports); +var import_prisma = require("../prisma"); +var import_common = require("./common"); +async function getFreeSSHLocalPort(id) { + const { default: isReachable } = await import("is-port-reachable"); + const { remoteIpAddress, sshLocalPort } = await import_prisma.prisma.destinationDocker.findUnique({ + where: { id } + }); + if (sshLocalPort) { + return Number(sshLocalPort); + } + const data = await import_prisma.prisma.setting.findFirst(); + const { minPort, maxPort } = data; + const ports = await import_prisma.prisma.destinationDocker.findMany({ + where: { sshLocalPort: { not: null }, remoteIpAddress: { not: remoteIpAddress } } + }); + const alreadyConfigured = await import_prisma.prisma.destinationDocker.findFirst({ + where: { + remoteIpAddress, + id: { not: id }, + sshLocalPort: { not: null } + } + }); + if (alreadyConfigured?.sshLocalPort) { + await import_prisma.prisma.destinationDocker.update({ + where: { id }, + data: { sshLocalPort: alreadyConfigured.sshLocalPort } + }); + return Number(alreadyConfigured.sshLocalPort); + } + const range = (0, import_common.generateRangeArray)(minPort, maxPort); + const availablePorts = range.filter((port) => !ports.map((p) => p.sshLocalPort).includes(port)); + for (const port of availablePorts) { + const found = await isReachable(port, { host: "localhost" }); + if (!found) { + await import_prisma.prisma.destinationDocker.update({ + where: { id }, + data: { sshLocalPort: Number(port) } + }); + return Number(port); + } + } + return false; +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + getFreeSSHLocalPort +}); diff --git a/apps/trpc-experimental/server/build/prisma.js b/apps/trpc-experimental/server/build/prisma.js new file mode 100644 index 000000000..ec44b3000 --- /dev/null +++ b/apps/trpc-experimental/server/build/prisma.js @@ -0,0 +1,36 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var prisma_exports = {}; +__export(prisma_exports, { + prisma: () => prisma +}); +module.exports = __toCommonJS(prisma_exports); +var import_env = require("./env"); +var import_client = require("@prisma/client"); +const prismaGlobal = global; +const prisma = prismaGlobal.prisma || new import_client.PrismaClient({ + log: import_env.env.NODE_ENV !== "development" ? ["query", "error", "warn"] : ["error"] +}); +if (import_env.env.NODE_ENV !== "production") { + prismaGlobal.prisma = prisma; +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + prisma +}); diff --git a/apps/trpc-experimental/server/build/scheduler.js b/apps/trpc-experimental/server/build/scheduler.js new file mode 100644 index 000000000..2a9b35e73 --- /dev/null +++ b/apps/trpc-experimental/server/build/scheduler.js @@ -0,0 +1,48 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var scheduler_exports = {}; +__export(scheduler_exports, { + isDev: () => isDev, + scheduler: () => scheduler +}); +module.exports = __toCommonJS(scheduler_exports); +var import_bree = __toESM(require("bree")); +var import_path = __toESM(require("path")); +var import_ts_worker = __toESM(require("@breejs/ts-worker")); +const isDev = process.env["NODE_ENV"] === "development"; +import_bree.default.extend(import_ts_worker.default); +const options = { + defaultExtension: "js", + logger: false, + jobs: [{ name: "applicationBuildQueue" }] +}; +if (isDev) + options.root = import_path.default.join(__dirname, "./jobs"); +const scheduler = new import_bree.default(options); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + isDev, + scheduler +}); diff --git a/apps/trpc-experimental/server/build/server.js b/apps/trpc-experimental/server/build/server.js new file mode 100644 index 000000000..f821124ac --- /dev/null +++ b/apps/trpc-experimental/server/build/server.js @@ -0,0 +1,99 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var server_exports = {}; +__export(server_exports, { + createServer: () => createServer +}); +module.exports = __toCommonJS(server_exports); +var import_fastify = require("@trpc/server/adapters/fastify"); +var import_fastify2 = __toESM(require("fastify")); +var import_trpc = require("./trpc"); +var import_context = require("./trpc/context"); +var import_cors = __toESM(require("@fastify/cors")); +var path = __toESM(require("node:path")); +var import_static = __toESM(require("@fastify/static")); +var import_autoload = __toESM(require("@fastify/autoload")); +var import_graceful = __toESM(require("@ladjs/graceful")); +var import_scheduler = require("./scheduler"); +const isDev = process.env["NODE_ENV"] === "development"; +function createServer(opts) { + const dev = opts.dev ?? true; + const port = opts.port ?? 3e3; + const prefix = opts.prefix ?? "/trpc"; + const server = (0, import_fastify2.default)({ logger: dev, trustProxy: true }); + server.register(import_cors.default); + server.register(import_fastify.fastifyTRPCPlugin, { + prefix, + trpcOptions: { + router: import_trpc.appRouter, + createContext: import_context.createContext, + onError({ error, type, path: path2, input, ctx, req }) { + console.error("Error:", error); + if (error.code === "INTERNAL_SERVER_ERROR") { + } + } + } + }); + if (!isDev) { + server.register(import_static.default, { + root: path.join(__dirname, "./public"), + preCompressed: true + }); + server.setNotFoundHandler(async function(request, reply) { + if (request.raw.url && request.raw.url.startsWith("/api")) { + return reply.status(404).send({ + success: false + }); + } + return reply.status(200).sendFile("index.html"); + }); + } + server.register(import_autoload.default, { + dir: path.join(__dirname, "api"), + options: { prefix: "/api" } + }); + const stop = () => server.close(); + const start = async () => { + try { + await server.listen({ host: "0.0.0.0", port }); + console.log("Coolify server is listening on port", port, "at 0.0.0.0 \u{1F680}"); + const graceful = new import_graceful.default({ brees: [import_scheduler.scheduler] }); + graceful.listen(); + setInterval(async () => { + if (!import_scheduler.scheduler.workers.has("applicationBuildQueue")) { + import_scheduler.scheduler.run("applicationBuildQueue"); + } + }, 2e3); + } catch (err) { + server.log.error(err); + process.exit(1); + } + }; + return { server, start, stop }; +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + createServer +}); diff --git a/apps/trpc-experimental/server/build/trpc/context.js b/apps/trpc-experimental/server/build/trpc/context.js new file mode 100644 index 000000000..953bece68 --- /dev/null +++ b/apps/trpc-experimental/server/build/trpc/context.js @@ -0,0 +1,43 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var context_exports = {}; +__export(context_exports, { + createContext: () => createContext +}); +module.exports = __toCommonJS(context_exports); +var import_jsonwebtoken = __toESM(require("jsonwebtoken")); +var import_env = require("../env"); +function createContext({ req }) { + const token = req.headers.authorization; + let user = null; + if (token) { + user = import_jsonwebtoken.default.verify(token, import_env.env.COOLIFY_SECRET_KEY); + } + return { user, hostname: req.hostname }; +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + createContext +}); diff --git a/apps/trpc-experimental/server/build/trpc/index.js b/apps/trpc-experimental/server/build/trpc/index.js new file mode 100644 index 000000000..a325a5955 --- /dev/null +++ b/apps/trpc-experimental/server/build/trpc/index.js @@ -0,0 +1,39 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var trpc_exports = {}; +__export(trpc_exports, { + appRouter: () => appRouter +}); +module.exports = __toCommonJS(trpc_exports); +var import_trpc = require("./trpc"); +var import_routers = require("./routers"); +const appRouter = (0, import_trpc.router)({ + settings: import_routers.settingsRouter, + auth: import_routers.authRouter, + dashboard: import_routers.dashboardRouter, + applications: import_routers.applicationsRouter, + services: import_routers.servicesRouter, + databases: import_routers.databasesRouter, + sources: import_routers.sourcesRouter, + destinations: import_routers.destinationsRouter +}); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + appRouter +}); diff --git a/apps/trpc-experimental/server/build/trpc/routers/applications/index.js b/apps/trpc-experimental/server/build/trpc/routers/applications/index.js new file mode 100644 index 000000000..b34785834 --- /dev/null +++ b/apps/trpc-experimental/server/build/trpc/routers/applications/index.js @@ -0,0 +1,1277 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var applications_exports = {}; +__export(applications_exports, { + applicationsRouter: () => applicationsRouter +}); +module.exports = __toCommonJS(applications_exports); +var import_zod = require("zod"); +var import_promises = __toESM(require("fs/promises")); +var import_js_yaml = __toESM(require("js-yaml")); +var import_trpc = require("../../trpc"); +var import_prisma = require("../../../prisma"); +var import_executeCommand = require("../../../lib/executeCommand"); +var import_docker = require("../../../lib/docker"); +var import_lib = require("./lib"); +var import_cuid = __toESM(require("cuid")); +var import_common = require("../../../lib/common"); +var import_dayjs = require("../../../lib/dayjs"); +var import_csvtojson = __toESM(require("csvtojson")); +const applicationsRouter = (0, import_trpc.router)({ + deleteApplication: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + force: import_zod.z.boolean().default(false) + }) + ).mutation(async ({ input, ctx }) => { + const { id, force } = input; + const teamId = ctx.user.teamId; + const application = await import_prisma.prisma.application.findUnique({ + where: { id }, + include: { destinationDocker: true } + }); + if (!force && application?.destinationDockerId && application.destinationDocker?.network) { + const { stdout: containers } = await (0, import_executeCommand.executeCommand)({ + dockerId: application.destinationDocker.id, + command: `docker ps -a --filter network=${application.destinationDocker.network} --filter name=${id} --format '{{json .}}'` + }); + if (containers) { + const containersArray = containers.trim().split("\n"); + for (const container of containersArray) { + const containerObj = JSON.parse(container); + const id2 = containerObj.ID; + await (0, import_docker.removeContainer)({ id: id2, dockerId: application.destinationDocker.id }); + } + } + } + await import_prisma.prisma.applicationSettings.deleteMany({ where: { application: { id } } }); + await import_prisma.prisma.buildLog.deleteMany({ where: { applicationId: id } }); + await import_prisma.prisma.build.deleteMany({ where: { applicationId: id } }); + await import_prisma.prisma.secret.deleteMany({ where: { applicationId: id } }); + await import_prisma.prisma.applicationPersistentStorage.deleteMany({ where: { applicationId: id } }); + await import_prisma.prisma.applicationConnectedDatabase.deleteMany({ where: { applicationId: id } }); + if (teamId === "0") { + await import_prisma.prisma.application.deleteMany({ where: { id } }); + } else { + await import_prisma.prisma.application.deleteMany({ where: { id, teams: { some: { id: teamId } } } }); + } + return {}; + }), + restartPreview: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + pullmergeRequestId: import_zod.z.string() + }) + ).mutation(async ({ input, ctx }) => { + const { id, pullmergeRequestId } = input; + const teamId = ctx.user.teamId; + let application = await (0, import_lib.getApplicationFromDB)(id, teamId); + if (application?.destinationDockerId) { + const buildId = (0, import_cuid.default)(); + const { id: dockerId, network } = application.destinationDocker; + const { + secrets, + port, + repository, + persistentStorage, + id: applicationId, + buildPack, + exposePort + } = application; + let envs = []; + if (secrets.length > 0) { + envs = [...envs, ...(0, import_common.generateSecrets)(secrets, pullmergeRequestId, false, port)]; + } + const { workdir } = await (0, import_common.createDirectories)({ repository, buildId }); + const labels = []; + let image = null; + const { stdout: container } = await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker container ls --filter 'label=com.docker.compose.service=${id}-${pullmergeRequestId}' --format '{{json .}}'` + }); + const containersArray = container.trim().split("\n"); + for (const container2 of containersArray) { + const containerObj = (0, import_docker.formatLabelsOnDocker)(container2); + image = containerObj[0].Image; + Object.keys(containerObj[0].Labels).forEach(function(key) { + if (key.startsWith("coolify")) { + labels.push(`${key}=${containerObj[0].Labels[key]}`); + } + }); + } + let imageFound = false; + try { + await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker image inspect ${image}` + }); + imageFound = true; + } catch (error) { + } + if (!imageFound) { + throw { status: 500, message: "Image not found, cannot restart application." }; + } + const volumes = persistentStorage?.map((storage) => { + return `${applicationId}${storage.path.replace(/\//gi, "-")}:${buildPack !== "docker" ? "/app" : ""}${storage.path}`; + }) || []; + const composeVolumes = volumes.map((volume) => { + return { + [`${volume.split(":")[0]}`]: { + name: volume.split(":")[0] + } + }; + }); + const composeFile = { + version: "3.8", + services: { + [`${applicationId}-${pullmergeRequestId}`]: { + image, + container_name: `${applicationId}-${pullmergeRequestId}`, + volumes, + environment: envs, + labels, + depends_on: [], + expose: [port], + ...exposePort ? { ports: [`${exposePort}:${port}`] } : {}, + ...(0, import_docker.defaultComposeConfiguration)(network) + } + }, + networks: { + [network]: { + external: true + } + }, + volumes: Object.assign({}, ...composeVolumes) + }; + await import_promises.default.writeFile(`${workdir}/docker-compose.yml`, import_js_yaml.default.dump(composeFile)); + await (0, import_executeCommand.executeCommand)({ dockerId, command: `docker stop -t 0 ${id}-${pullmergeRequestId}` }); + await (0, import_executeCommand.executeCommand)({ dockerId, command: `docker rm ${id}-${pullmergeRequestId}` }); + await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker compose --project-directory ${workdir} up -d` + }); + } + }), + getPreviewStatus: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + pullmergeRequestId: import_zod.z.string() + }) + ).query(async ({ input, ctx }) => { + const { id, pullmergeRequestId } = input; + const teamId = ctx.user.teamId; + let isRunning = false; + let isExited = false; + let isRestarting = false; + let isBuilding = false; + const application = await (0, import_lib.getApplicationFromDB)(id, teamId); + if (application?.destinationDockerId) { + const status = await (0, import_docker.checkContainer)({ + dockerId: application.destinationDocker.id, + container: `${id}-${pullmergeRequestId}` + }); + if (status?.found) { + isRunning = status.status.isRunning; + isExited = status.status.isExited; + isRestarting = status.status.isRestarting; + } + const building = await import_prisma.prisma.build.findMany({ + where: { applicationId: id, pullmergeRequestId, status: { in: ["queued", "running"] } } + }); + isBuilding = building.length > 0; + } + return { + success: true, + data: { + isBuilding, + isRunning, + isRestarting, + isExited + } + }; + }), + loadPreviews: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string() + }) + ).mutation(async ({ input, ctx }) => { + const { id } = input; + const application = await import_prisma.prisma.application.findUnique({ + where: { id }, + include: { destinationDocker: true } + }); + const { stdout } = await (0, import_executeCommand.executeCommand)({ + dockerId: application.destinationDocker.id, + command: `docker container ls --filter 'name=${id}-' --format "{{json .}}"` + }); + if (stdout === "") { + throw { status: 500, message: "No previews found." }; + } + const containers = (0, import_docker.formatLabelsOnDocker)(stdout).filter( + (container) => container.Labels["coolify.configuration"] && container.Labels["coolify.type"] === "standalone-application" + ); + const jsonContainers = containers.map( + (container) => JSON.parse(Buffer.from(container.Labels["coolify.configuration"], "base64").toString()) + ).filter((container) => { + return container.pullmergeRequestId && container.applicationId === id; + }); + for (const container of jsonContainers) { + const found = await import_prisma.prisma.previewApplication.findMany({ + where: { + applicationId: container.applicationId, + pullmergeRequestId: container.pullmergeRequestId + } + }); + if (found.length === 0) { + await import_prisma.prisma.previewApplication.create({ + data: { + pullmergeRequestId: container.pullmergeRequestId, + sourceBranch: container.branch, + customDomain: container.fqdn, + application: { connect: { id: container.applicationId } } + } + }); + } + } + return { + success: true, + data: { + previews: await import_prisma.prisma.previewApplication.findMany({ where: { applicationId: id } }) + } + }; + }), + stopPreview: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + pullmergeRequestId: import_zod.z.string() + }) + ).mutation(async ({ input, ctx }) => { + const { id, pullmergeRequestId } = input; + const teamId = ctx.user.teamId; + const application = await (0, import_lib.getApplicationFromDB)(id, teamId); + if (application?.destinationDockerId) { + const container = `${id}-${pullmergeRequestId}`; + const { id: dockerId } = application.destinationDocker; + const { found } = await (0, import_docker.checkContainer)({ dockerId, container }); + if (found) { + await (0, import_docker.removeContainer)({ id: container, dockerId: application.destinationDocker.id }); + } + await import_prisma.prisma.previewApplication.deleteMany({ + where: { applicationId: application.id, pullmergeRequestId } + }); + } + return {}; + }), + getUsage: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + containerId: import_zod.z.string() + }) + ).query(async ({ input, ctx }) => { + const { id, containerId } = input; + const teamId = ctx.user.teamId; + let usage = {}; + const application = await (0, import_lib.getApplicationFromDB)(id, teamId); + if (application.destinationDockerId) { + [usage] = await Promise.all([ + (0, import_common.getContainerUsage)(application.destinationDocker.id, containerId) + ]); + } + return { + success: true, + data: { + usage + } + }; + }), + getLocalImages: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string() + }) + ).query(async ({ input, ctx }) => { + const { id } = input; + const teamId = ctx.user.teamId; + const application = await (0, import_lib.getApplicationFromDB)(id, teamId); + let imagesAvailables = []; + const { stdout } = await (0, import_executeCommand.executeCommand)({ + dockerId: application.destinationDocker.id, + command: `docker images --format '{{.Repository}}#{{.Tag}}#{{.CreatedAt}}'` + }); + const { stdout: runningImage } = await (0, import_executeCommand.executeCommand)({ + dockerId: application.destinationDocker.id, + command: `docker ps -a --filter 'label=com.docker.compose.service=${id}' --format {{.Image}}` + }); + const images = stdout.trim().split("\n").filter((image) => image.includes(id) && !image.includes("-cache")); + for (const image of images) { + const [repository, tag, createdAt] = image.split("#"); + if (tag.includes("-")) { + continue; + } + const [year, time] = createdAt.split(" "); + imagesAvailables.push({ + repository, + tag, + createdAt: (0, import_dayjs.day)(year + time).unix() + }); + } + imagesAvailables = imagesAvailables.sort((a, b) => b.tag - a.tag); + return { + success: true, + data: { + imagesAvailables, + runningImage + } + }; + }), + resetQueue: import_trpc.privateProcedure.mutation(async ({ ctx }) => { + const teamId = ctx.user.teamId; + if (teamId === "0") { + await import_prisma.prisma.build.updateMany({ + where: { status: { in: ["queued", "running"] } }, + data: { status: "canceled" } + }); + } + }), + cancelBuild: import_trpc.privateProcedure.input( + import_zod.z.object({ + buildId: import_zod.z.string(), + applicationId: import_zod.z.string() + }) + ).mutation(async ({ input }) => { + const { buildId, applicationId } = input; + let count = 0; + await new Promise(async (resolve, reject) => { + const { destinationDockerId, status } = await import_prisma.prisma.build.findFirst({ + where: { id: buildId } + }); + const { id: dockerId } = await import_prisma.prisma.destinationDocker.findFirst({ + where: { id: destinationDockerId } + }); + const interval = setInterval(async () => { + try { + if (status === "failed" || status === "canceled") { + clearInterval(interval); + return resolve(); + } + if (count > 15) { + clearInterval(interval); + await (0, import_common.cleanupDB)(buildId, applicationId); + return reject(new Error("Canceled.")); + } + const { stdout: buildContainers } = await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker container ls --filter "label=coolify.buildId=${buildId}" --format '{{json .}}'` + }); + if (buildContainers) { + const containersArray = buildContainers.trim().split("\n"); + for (const container of containersArray) { + const containerObj = JSON.parse(container); + const id = containerObj.ID; + if (!containerObj.Names.startsWith(`${applicationId} `)) { + await (0, import_docker.removeContainer)({ id, dockerId }); + clearInterval(interval); + await (0, import_common.cleanupDB)(buildId, applicationId); + return resolve(); + } + } + } + count++; + } catch (error) { + } + }, 100); + }); + }), + getBuildLogs: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + buildId: import_zod.z.string(), + sequence: import_zod.z.number() + }) + ).query(async ({ input }) => { + let { id, buildId, sequence } = input; + let file = `/app/logs/${id}_buildlog_${buildId}.csv`; + if (import_common.isDev) { + file = `${process.cwd()}/../../logs/${id}_buildlog_${buildId}.csv`; + } + const data = await import_prisma.prisma.build.findFirst({ where: { id: buildId } }); + const createdAt = (0, import_dayjs.day)(data.createdAt).utc(); + try { + await import_promises.default.stat(file); + } catch (error) { + let logs2 = await import_prisma.prisma.buildLog.findMany({ + where: { buildId, time: { gt: sequence } }, + orderBy: { time: "asc" } + }); + const data2 = await import_prisma.prisma.build.findFirst({ where: { id: buildId } }); + const createdAt2 = (0, import_dayjs.day)(data2.createdAt).utc(); + return { + logs: logs2.map((log) => { + log.time = Number(log.time); + return log; + }), + fromDb: true, + took: (0, import_dayjs.day)().diff(createdAt2) / 1e3, + status: data2?.status || "queued" + }; + } + let fileLogs = (await import_promises.default.readFile(file)).toString(); + let decryptedLogs = await (0, import_csvtojson.default)({ noheader: true }).fromString(fileLogs); + let logs = decryptedLogs.map((log) => { + const parsed = { + time: log["field1"], + line: (0, import_common.decrypt)(log["field2"] + '","' + log["field3"]) + }; + return parsed; + }).filter((log) => log.time > sequence); + return { + logs, + fromDb: false, + took: (0, import_dayjs.day)().diff(createdAt) / 1e3, + status: data?.status || "queued" + }; + }), + getBuilds: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + buildId: import_zod.z.string().optional(), + skip: import_zod.z.number() + }) + ).query(async ({ input }) => { + let { id, buildId, skip } = input; + let builds = []; + const buildCount = await import_prisma.prisma.build.count({ where: { applicationId: id } }); + if (buildId) { + builds = await import_prisma.prisma.build.findMany({ where: { applicationId: id, id: buildId } }); + } else { + builds = await import_prisma.prisma.build.findMany({ + where: { applicationId: id }, + orderBy: { createdAt: "desc" }, + take: 5 + skip + }); + } + builds = builds.map((build) => { + if (build.status === "running") { + build.elapsed = ((0, import_dayjs.day)().utc().diff((0, import_dayjs.day)(build.createdAt)) / 1e3).toFixed(0); + } + return build; + }); + return { + builds, + buildCount + }; + }), + loadLogs: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + containerId: import_zod.z.string(), + since: import_zod.z.number() + }) + ).query(async ({ input }) => { + let { id, containerId, since } = input; + if (since !== 0) { + since = (0, import_dayjs.day)(since).unix(); + } + const { + destinationDockerId, + destinationDocker: { id: dockerId } + } = await import_prisma.prisma.application.findUnique({ + where: { id }, + include: { destinationDocker: true } + }); + if (destinationDockerId) { + try { + const { default: ansi } = await import("strip-ansi"); + const { stdout, stderr } = await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker logs --since ${since} --tail 5000 --timestamps ${containerId}` + }); + const stripLogsStdout = stdout.toString().split("\n").map((l) => ansi(l)).filter((a) => a); + const stripLogsStderr = stderr.toString().split("\n").map((l) => ansi(l)).filter((a) => a); + const logs = stripLogsStderr.concat(stripLogsStdout); + const sortedLogs = logs.sort( + (a, b) => (0, import_dayjs.day)(a.split(" ")[0]).isAfter((0, import_dayjs.day)(b.split(" ")[0])) ? 1 : -1 + ); + return { logs: sortedLogs }; + } catch (error) { + const { statusCode, stderr } = error; + if (stderr.startsWith("Error: No such container")) { + return { logs: [], noContainer: true }; + } + if (statusCode === 404) { + return { + logs: [] + }; + } + } + } + return { + message: "No logs found." + }; + }), + getStorages: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string() + }) + ).query(async ({ input }) => { + const { id } = input; + const persistentStorages = await import_prisma.prisma.applicationPersistentStorage.findMany({ + where: { applicationId: id } + }); + return { + success: true, + data: { + persistentStorages + } + }; + }), + deleteStorage: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + path: import_zod.z.string() + }) + ).mutation(async ({ input }) => { + const { id, path } = input; + await import_prisma.prisma.applicationPersistentStorage.deleteMany({ where: { applicationId: id, path } }); + }), + updateStorage: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + path: import_zod.z.string(), + storageId: import_zod.z.string(), + newStorage: import_zod.z.boolean().optional().default(false) + }) + ).mutation(async ({ input }) => { + const { id, path, newStorage, storageId } = input; + if (newStorage) { + await import_prisma.prisma.applicationPersistentStorage.create({ + data: { path, application: { connect: { id } } } + }); + } else { + await import_prisma.prisma.applicationPersistentStorage.update({ + where: { id: storageId }, + data: { path } + }); + } + }), + deleteSecret: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + name: import_zod.z.string() + }) + ).mutation(async ({ input }) => { + const { id, name } = input; + await import_prisma.prisma.secret.deleteMany({ where: { applicationId: id, name } }); + }), + updateSecret: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + name: import_zod.z.string(), + value: import_zod.z.string(), + isBuildSecret: import_zod.z.boolean().optional().default(false), + isPreview: import_zod.z.boolean().optional().default(false) + }) + ).mutation(async ({ input }) => { + const { id, name, value, isBuildSecret, isPreview } = input; + console.log({ isBuildSecret }); + await import_prisma.prisma.secret.updateMany({ + where: { applicationId: id, name, isPRMRSecret: isPreview }, + data: { value: (0, import_common.encrypt)(value.trim()), isBuildSecret } + }); + }), + newSecret: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + name: import_zod.z.string(), + value: import_zod.z.string(), + isBuildSecret: import_zod.z.boolean().optional().default(false) + }) + ).mutation(async ({ input }) => { + const { id, name, value, isBuildSecret } = input; + const found = await import_prisma.prisma.secret.findMany({ where: { applicationId: id, name } }); + if (found.length > 0) { + throw { message: "Secret already exists." }; + } + await import_prisma.prisma.secret.create({ + data: { + name, + value: (0, import_common.encrypt)(value.trim()), + isBuildSecret, + isPRMRSecret: false, + application: { connect: { id } } + } + }); + await import_prisma.prisma.secret.create({ + data: { + name, + value: (0, import_common.encrypt)(value.trim()), + isBuildSecret, + isPRMRSecret: true, + application: { connect: { id } } + } + }); + }), + getSecrets: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string() + }) + ).query(async ({ input }) => { + const { id } = input; + let secrets = await import_prisma.prisma.secret.findMany({ + where: { applicationId: id, isPRMRSecret: false }, + orderBy: { createdAt: "asc" } + }); + let previewSecrets = await import_prisma.prisma.secret.findMany({ + where: { applicationId: id, isPRMRSecret: true }, + orderBy: { createdAt: "asc" } + }); + secrets = secrets.map((secret) => { + secret.value = (0, import_common.decrypt)(secret.value); + return secret; + }); + previewSecrets = previewSecrets.map((secret) => { + secret.value = (0, import_common.decrypt)(secret.value); + return secret; + }); + return { + success: true, + data: { + previewSecrets: previewSecrets.sort((a, b) => { + return ("" + a.name).localeCompare(b.name); + }), + secrets: secrets.sort((a, b) => { + return ("" + a.name).localeCompare(b.name); + }) + } + }; + }), + checkDomain: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + domain: import_zod.z.string() + }) + ).query(async ({ input, ctx }) => { + const { id, domain } = input; + const { + fqdn, + settings: { dualCerts } + } = await import_prisma.prisma.application.findUnique({ where: { id }, include: { settings: true } }); + return await (0, import_common.checkDomainsIsValidInDNS)({ hostname: domain, fqdn, dualCerts }); + }), + checkDNS: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + fqdn: import_zod.z.string(), + forceSave: import_zod.z.boolean(), + dualCerts: import_zod.z.boolean(), + exposePort: import_zod.z.number().nullable().optional() + }) + ).mutation(async ({ input, ctx }) => { + let { id, exposePort, fqdn, forceSave, dualCerts } = input; + if (!fqdn) { + return {}; + } else { + fqdn = fqdn.toLowerCase(); + } + if (exposePort) + exposePort = Number(exposePort); + const { + destinationDocker: { engine, remoteIpAddress, remoteEngine }, + exposePort: configuredPort + } = await import_prisma.prisma.application.findUnique({ + where: { id }, + include: { destinationDocker: true } + }); + const { isDNSCheckEnabled } = await import_prisma.prisma.setting.findFirst({}); + const found = await (0, import_common.isDomainConfigured)({ id, fqdn, remoteIpAddress }); + if (found) { + throw { + status: 500, + message: `Domain ${(0, import_common.getDomain)(fqdn).replace("www.", "")} is already in use!` + }; + } + if (exposePort) + await (0, import_common.checkExposedPort)({ + id, + configuredPort, + exposePort, + engine, + remoteEngine, + remoteIpAddress + }); + if (isDNSCheckEnabled && !import_common.isDev && !forceSave) { + let hostname = ctx.hostname.split(":")[0]; + if (remoteEngine) + hostname = remoteIpAddress; + return await (0, import_common.checkDomainsIsValidInDNS)({ hostname, fqdn, dualCerts }); + } + }), + saveSettings: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + previews: import_zod.z.boolean().optional(), + debug: import_zod.z.boolean().optional(), + dualCerts: import_zod.z.boolean().optional(), + isBot: import_zod.z.boolean().optional(), + autodeploy: import_zod.z.boolean().optional(), + isDBBranching: import_zod.z.boolean().optional(), + isCustomSSL: import_zod.z.boolean().optional() + }) + ).mutation(async ({ ctx, input }) => { + const { id, debug, previews, dualCerts, autodeploy, isBot, isDBBranching, isCustomSSL } = input; + await import_prisma.prisma.application.update({ + where: { id }, + data: { + fqdn: isBot ? null : void 0, + settings: { + update: { debug, previews, dualCerts, autodeploy, isBot, isDBBranching, isCustomSSL } + } + }, + include: { destinationDocker: true } + }); + }), + getImages: import_trpc.privateProcedure.input(import_zod.z.object({ buildPack: import_zod.z.string(), deploymentType: import_zod.z.string().nullable() })).query(async ({ ctx, input }) => { + const { buildPack, deploymentType } = input; + let publishDirectory = void 0; + let port = void 0; + const { baseImage, baseBuildImage, baseBuildImages, baseImages } = (0, import_lib.setDefaultBaseImage)( + buildPack, + deploymentType + ); + if (buildPack === "nextjs") { + if (deploymentType === "static") { + publishDirectory = "out"; + port = "80"; + } else { + publishDirectory = ""; + port = "3000"; + } + } + if (buildPack === "nuxtjs") { + if (deploymentType === "static") { + publishDirectory = "dist"; + port = "80"; + } else { + publishDirectory = ""; + port = "3000"; + } + } + return { + success: true, + data: { baseImage, baseImages, baseBuildImage, baseBuildImages, publishDirectory, port } + }; + }), + getApplicationById: import_trpc.privateProcedure.input(import_zod.z.object({ id: import_zod.z.string() })).query(async ({ ctx, input }) => { + const id = input.id; + const teamId = ctx.user?.teamId; + if (!teamId) { + throw { status: 400, message: "Team not found." }; + } + const application = await (0, import_lib.getApplicationFromDB)(id, teamId); + return { + success: true, + data: { ...application } + }; + }), + save: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + name: import_zod.z.string(), + buildPack: import_zod.z.string(), + fqdn: import_zod.z.string().nullable().optional(), + port: import_zod.z.number(), + exposePort: import_zod.z.number().nullable().optional(), + installCommand: import_zod.z.string(), + buildCommand: import_zod.z.string(), + startCommand: import_zod.z.string(), + baseDirectory: import_zod.z.string().nullable().optional(), + publishDirectory: import_zod.z.string().nullable().optional(), + pythonWSGI: import_zod.z.string().nullable().optional(), + pythonModule: import_zod.z.string().nullable().optional(), + pythonVariable: import_zod.z.string().nullable().optional(), + dockerFileLocation: import_zod.z.string(), + denoMainFile: import_zod.z.string().nullable().optional(), + denoOptions: import_zod.z.string().nullable().optional(), + gitCommitHash: import_zod.z.string(), + baseImage: import_zod.z.string(), + baseBuildImage: import_zod.z.string(), + deploymentType: import_zod.z.string().nullable().optional(), + baseDatabaseBranch: import_zod.z.string().nullable().optional(), + dockerComposeFile: import_zod.z.string().nullable().optional(), + dockerComposeFileLocation: import_zod.z.string().nullable().optional(), + dockerComposeConfiguration: import_zod.z.string().nullable().optional(), + simpleDockerfile: import_zod.z.string().nullable().optional(), + dockerRegistryImageName: import_zod.z.string().nullable().optional() + }) + ).mutation(async ({ input }) => { + let { + id, + name, + buildPack, + fqdn, + port, + exposePort, + installCommand, + buildCommand, + startCommand, + baseDirectory, + publishDirectory, + pythonWSGI, + pythonModule, + pythonVariable, + dockerFileLocation, + denoMainFile, + denoOptions, + gitCommitHash, + baseImage, + baseBuildImage, + deploymentType, + baseDatabaseBranch, + dockerComposeFile, + dockerComposeFileLocation, + dockerComposeConfiguration, + simpleDockerfile, + dockerRegistryImageName + } = input; + const { + destinationDocker: { engine, remoteEngine, remoteIpAddress }, + exposePort: configuredPort + } = await import_prisma.prisma.application.findUnique({ + where: { id }, + include: { destinationDocker: true } + }); + if (exposePort) + await (0, import_common.checkExposedPort)({ + id, + configuredPort, + exposePort, + engine, + remoteEngine, + remoteIpAddress + }); + if (denoOptions) + denoOptions = denoOptions.trim(); + const defaultConfiguration = await (0, import_common.setDefaultConfiguration)({ + buildPack, + port, + installCommand, + startCommand, + buildCommand, + publishDirectory, + baseDirectory, + dockerFileLocation, + dockerComposeFileLocation, + denoMainFile + }); + if (baseDatabaseBranch) { + await import_prisma.prisma.application.update({ + where: { id }, + data: { + name, + fqdn, + exposePort, + pythonWSGI, + pythonModule, + pythonVariable, + denoOptions, + baseImage, + gitCommitHash, + baseBuildImage, + deploymentType, + dockerComposeFile, + dockerComposeConfiguration, + simpleDockerfile, + dockerRegistryImageName, + ...defaultConfiguration, + connectedDatabase: { update: { hostedDatabaseDBName: baseDatabaseBranch } } + } + }); + } else { + await import_prisma.prisma.application.update({ + where: { id }, + data: { + name, + fqdn, + exposePort, + pythonWSGI, + pythonModule, + gitCommitHash, + pythonVariable, + denoOptions, + baseImage, + baseBuildImage, + deploymentType, + dockerComposeFile, + dockerComposeConfiguration, + simpleDockerfile, + dockerRegistryImageName, + ...defaultConfiguration + } + }); + } + }), + status: import_trpc.privateProcedure.input(import_zod.z.object({ id: import_zod.z.string() })).query(async ({ ctx, input }) => { + const id = input.id; + const teamId = ctx.user?.teamId; + if (!teamId) { + throw { status: 400, message: "Team not found." }; + } + let payload = []; + const application = await (0, import_lib.getApplicationFromDB)(id, teamId); + if (application?.destinationDockerId) { + if (application.buildPack === "compose") { + const { stdout: containers } = await (0, import_executeCommand.executeCommand)({ + dockerId: application.destinationDocker.id, + command: `docker ps -a --filter "label=coolify.applicationId=${id}" --format '{{json .}}'` + }); + const containersArray = containers.trim().split("\n"); + if (containersArray.length > 0 && containersArray[0] !== "") { + for (const container of containersArray) { + let isRunning = false; + let isExited = false; + let isRestarting = false; + const containerObj = JSON.parse(container); + const status = containerObj.State; + if (status === "running") { + isRunning = true; + } + if (status === "exited") { + isExited = true; + } + if (status === "restarting") { + isRestarting = true; + } + payload.push({ + name: containerObj.Names, + status: { + isRunning, + isExited, + isRestarting + } + }); + } + } + } else { + let isRunning = false; + let isExited = false; + let isRestarting = false; + const status = await (0, import_docker.checkContainer)({ + dockerId: application.destinationDocker.id, + container: id + }); + if (status?.found) { + isRunning = status.status.isRunning; + isExited = status.status.isExited; + isRestarting = status.status.isRestarting; + payload.push({ + name: id, + status: { + isRunning, + isExited, + isRestarting + } + }); + } + } + } + return payload; + }), + cleanup: import_trpc.privateProcedure.query(async ({ ctx }) => { + const teamId = ctx.user?.teamId; + let applications = await import_prisma.prisma.application.findMany({ + where: { teams: { some: { id: teamId === "0" ? void 0 : teamId } } }, + include: { settings: true, destinationDocker: true, teams: true } + }); + for (const application of applications) { + if (!application.buildPack || !application.destinationDockerId || !application.branch || !application.settings?.isBot && !application?.fqdn) { + if (application?.destinationDockerId && application.destinationDocker?.network) { + const { stdout: containers } = await (0, import_executeCommand.executeCommand)({ + dockerId: application.destinationDocker.id, + command: `docker ps -a --filter network=${application.destinationDocker.network} --filter name=${application.id} --format '{{json .}}'` + }); + if (containers) { + const containersArray = containers.trim().split("\n"); + for (const container of containersArray) { + const containerObj = JSON.parse(container); + const id = containerObj.ID; + await (0, import_docker.removeContainer)({ id, dockerId: application.destinationDocker.id }); + } + } + } + await import_prisma.prisma.applicationSettings.deleteMany({ where: { applicationId: application.id } }); + await import_prisma.prisma.buildLog.deleteMany({ where: { applicationId: application.id } }); + await import_prisma.prisma.build.deleteMany({ where: { applicationId: application.id } }); + await import_prisma.prisma.secret.deleteMany({ where: { applicationId: application.id } }); + await import_prisma.prisma.applicationPersistentStorage.deleteMany({ + where: { applicationId: application.id } + }); + await import_prisma.prisma.applicationConnectedDatabase.deleteMany({ + where: { applicationId: application.id } + }); + await import_prisma.prisma.application.deleteMany({ where: { id: application.id } }); + } + } + return {}; + }), + stop: import_trpc.privateProcedure.input(import_zod.z.object({ id: import_zod.z.string() })).mutation(async ({ ctx, input }) => { + const { id } = input; + const teamId = ctx.user?.teamId; + const application = await (0, import_lib.getApplicationFromDB)(id, teamId); + if (application?.destinationDockerId) { + const { id: dockerId } = application.destinationDocker; + if (application.buildPack === "compose") { + const { stdout: containers } = await (0, import_executeCommand.executeCommand)({ + dockerId: application.destinationDocker.id, + command: `docker ps -a --filter "label=coolify.applicationId=${id}" --format '{{json .}}'` + }); + const containersArray = containers.trim().split("\n"); + if (containersArray.length > 0 && containersArray[0] !== "") { + for (const container of containersArray) { + const containerObj = JSON.parse(container); + await (0, import_docker.removeContainer)({ + id: containerObj.ID, + dockerId: application.destinationDocker.id + }); + } + } + return; + } + const { found } = await (0, import_docker.checkContainer)({ dockerId, container: id }); + if (found) { + await (0, import_docker.removeContainer)({ id, dockerId: application.destinationDocker.id }); + } + } + return {}; + }), + restart: import_trpc.privateProcedure.input(import_zod.z.object({ id: import_zod.z.string(), imageId: import_zod.z.string().nullable() })).mutation(async ({ ctx, input }) => { + const { id, imageId } = input; + const teamId = ctx.user?.teamId; + let application = await (0, import_lib.getApplicationFromDB)(id, teamId); + if (application?.destinationDockerId) { + const buildId = (0, import_cuid.default)(); + const { id: dockerId, network } = application.destinationDocker; + const { + dockerRegistry, + secrets, + pullmergeRequestId, + port, + repository, + persistentStorage, + id: applicationId, + buildPack, + exposePort + } = application; + let location = null; + const labels = []; + let image = null; + const envs = [`PORT=${port}`, "NODE_ENV=production"]; + if (secrets.length > 0) { + secrets.forEach((secret) => { + if (pullmergeRequestId) { + const isSecretFound = secrets.filter((s) => s.name === secret.name && s.isPRMRSecret); + if (isSecretFound.length > 0) { + if (isSecretFound[0].value.includes("\\n") || isSecretFound[0].value.includes("'")) { + envs.push(`${secret.name}=${isSecretFound[0].value}`); + } else { + envs.push(`${secret.name}='${isSecretFound[0].value}'`); + } + } else { + if (secret.value.includes("\\n") || secret.value.includes("'")) { + envs.push(`${secret.name}=${secret.value}`); + } else { + envs.push(`${secret.name}='${secret.value}'`); + } + } + } else { + if (!secret.isPRMRSecret) { + if (secret.value.includes("\\n") || secret.value.includes("'")) { + envs.push(`${secret.name}=${secret.value}`); + } else { + envs.push(`${secret.name}='${secret.value}'`); + } + } + } + }); + } + const { workdir } = await (0, import_common.createDirectories)({ repository, buildId }); + if (imageId) { + image = imageId; + } else { + const { stdout: container } = await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker container ls --filter 'label=com.docker.compose.service=${id}' --format '{{json .}}'` + }); + const containersArray = container.trim().split("\n"); + for (const container2 of containersArray) { + const containerObj = (0, import_docker.formatLabelsOnDocker)(container2); + image = containerObj[0].Image; + Object.keys(containerObj[0].Labels).forEach(function(key) { + if (key.startsWith("coolify")) { + labels.push(`${key}=${containerObj[0].Labels[key]}`); + } + }); + } + } + if (dockerRegistry) { + const { url, username, password } = dockerRegistry; + location = await (0, import_common.saveDockerRegistryCredentials)({ url, username, password, workdir }); + } + let imageFoundLocally = false; + try { + await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker image inspect ${image}` + }); + imageFoundLocally = true; + } catch (error) { + } + let imageFoundRemotely = false; + try { + await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker ${location ? `--config ${location}` : ""} pull ${image}` + }); + imageFoundRemotely = true; + } catch (error) { + } + if (!imageFoundLocally && !imageFoundRemotely) { + throw { status: 500, message: "Image not found, cannot restart application." }; + } + await import_promises.default.writeFile(`${workdir}/.env`, envs.join("\n")); + let envFound = false; + try { + envFound = !!await import_promises.default.stat(`${workdir}/.env`); + } catch (error) { + } + const volumes = persistentStorage?.map((storage) => { + return `${applicationId}${storage.path.replace(/\//gi, "-")}:${buildPack !== "docker" ? "/app" : ""}${storage.path}`; + }) || []; + const composeVolumes = volumes.map((volume) => { + return { + [`${volume.split(":")[0]}`]: { + name: volume.split(":")[0] + } + }; + }); + const composeFile = { + version: "3.8", + services: { + [applicationId]: { + image, + container_name: applicationId, + volumes, + env_file: envFound ? [`${workdir}/.env`] : [], + labels, + depends_on: [], + expose: [port], + ...exposePort ? { ports: [`${exposePort}:${port}`] } : {}, + ...(0, import_docker.defaultComposeConfiguration)(network) + } + }, + networks: { + [network]: { + external: true + } + }, + volumes: Object.assign({}, ...composeVolumes) + }; + await import_promises.default.writeFile(`${workdir}/docker-compose.yml`, import_js_yaml.default.dump(composeFile)); + try { + await (0, import_executeCommand.executeCommand)({ dockerId, command: `docker stop -t 0 ${id}` }); + await (0, import_executeCommand.executeCommand)({ dockerId, command: `docker rm ${id}` }); + } catch (error) { + } + await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker compose --project-directory ${workdir} up -d` + }); + } + return {}; + }), + deploy: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + forceRebuild: import_zod.z.boolean().default(false), + pullmergeRequestId: import_zod.z.string().nullable().optional(), + branch: import_zod.z.string().nullable().optional() + }) + ).mutation(async ({ ctx, input }) => { + const { id, pullmergeRequestId, branch, forceRebuild } = input; + const teamId = ctx.user?.teamId; + const buildId = await (0, import_lib.deployApplication)(id, teamId, forceRebuild, pullmergeRequestId, branch); + return { + buildId + }; + }), + forceRedeploy: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string() + }) + ).mutation(async ({ ctx, input }) => { + const { id } = input; + const teamId = ctx.user?.teamId; + const buildId = await (0, import_lib.deployApplication)(id, teamId, true); + return { + buildId + }; + }), + delete: import_trpc.privateProcedure.input(import_zod.z.object({ force: import_zod.z.boolean(), id: import_zod.z.string() })).mutation(async ({ ctx, input }) => { + const { id, force } = input; + const teamId = ctx.user?.teamId; + const application = await import_prisma.prisma.application.findUnique({ + where: { id }, + include: { destinationDocker: true } + }); + if (!force && application?.destinationDockerId && application.destinationDocker?.network) { + const { stdout: containers } = await (0, import_executeCommand.executeCommand)({ + dockerId: application.destinationDocker.id, + command: `docker ps -a --filter network=${application.destinationDocker.network} --filter name=${id} --format '{{json .}}'` + }); + if (containers) { + const containersArray = containers.trim().split("\n"); + for (const container of containersArray) { + const containerObj = JSON.parse(container); + const id2 = containerObj.ID; + await (0, import_docker.removeContainer)({ id: id2, dockerId: application.destinationDocker.id }); + } + } + } + await import_prisma.prisma.applicationSettings.deleteMany({ where: { application: { id } } }); + await import_prisma.prisma.buildLog.deleteMany({ where: { applicationId: id } }); + await import_prisma.prisma.build.deleteMany({ where: { applicationId: id } }); + await import_prisma.prisma.secret.deleteMany({ where: { applicationId: id } }); + await import_prisma.prisma.applicationPersistentStorage.deleteMany({ where: { applicationId: id } }); + await import_prisma.prisma.applicationConnectedDatabase.deleteMany({ where: { applicationId: id } }); + if (teamId === "0") { + await import_prisma.prisma.application.deleteMany({ where: { id } }); + } else { + await import_prisma.prisma.application.deleteMany({ where: { id, teams: { some: { id: teamId } } } }); + } + return {}; + }) +}); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + applicationsRouter +}); diff --git a/apps/trpc-experimental/server/build/trpc/routers/applications/lib.js b/apps/trpc-experimental/server/build/trpc/routers/applications/lib.js new file mode 100644 index 000000000..95a6d7b1d --- /dev/null +++ b/apps/trpc-experimental/server/build/trpc/routers/applications/lib.js @@ -0,0 +1,526 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var lib_exports = {}; +__export(lib_exports, { + deployApplication: () => deployApplication, + generateConfigHash: () => generateConfigHash, + getApplicationFromDB: () => getApplicationFromDB, + setDefaultBaseImage: () => setDefaultBaseImage +}); +module.exports = __toCommonJS(lib_exports); +var import_cuid = __toESM(require("cuid")); +var import_node_crypto = __toESM(require("node:crypto")); +var import_common = require("../../../lib/common"); +var import_prisma = require("../../../prisma"); +async function deployApplication(id, teamId, forceRebuild, pullmergeRequestId = null, branch = null) { + const buildId = (0, import_cuid.default)(); + const application = await getApplicationFromDB(id, teamId); + if (application) { + if (!application?.configHash) { + await generateConfigHash( + id, + application.buildPack, + application.port, + application.exposePort, + application.installCommand, + application.buildCommand, + application.startCommand + ); + } + await import_prisma.prisma.application.update({ where: { id }, data: { updatedAt: new Date() } }); + if (application.gitSourceId) { + await import_prisma.prisma.build.create({ + data: { + id: buildId, + applicationId: id, + sourceBranch: branch, + branch: application.branch, + pullmergeRequestId: pullmergeRequestId?.toString(), + forceRebuild, + destinationDockerId: application.destinationDocker?.id, + gitSourceId: application.gitSource?.id, + githubAppId: application.gitSource?.githubApp?.id, + gitlabAppId: application.gitSource?.gitlabApp?.id, + status: "queued", + type: pullmergeRequestId ? application.gitSource?.githubApp?.id ? "manual_pr" : "manual_mr" : "manual" + } + }); + } else { + await import_prisma.prisma.build.create({ + data: { + id: buildId, + applicationId: id, + branch: "latest", + forceRebuild, + destinationDockerId: application.destinationDocker?.id, + status: "queued", + type: "manual" + } + }); + } + return buildId; + } + throw { status: 500, message: "Application cannot be deployed." }; +} +async function generateConfigHash(id, buildPack, port, exposePort, installCommand, buildCommand, startCommand) { + const configHash = import_node_crypto.default.createHash("sha256").update( + JSON.stringify({ + buildPack, + port, + exposePort, + installCommand, + buildCommand, + startCommand + }) + ).digest("hex"); + return await import_prisma.prisma.application.update({ where: { id }, data: { configHash } }); +} +async function getApplicationFromDB(id, teamId) { + let application = await import_prisma.prisma.application.findFirst({ + where: { id, teams: { some: { id: teamId === "0" ? void 0 : teamId } } }, + include: { + destinationDocker: true, + settings: true, + gitSource: { include: { githubApp: true, gitlabApp: true } }, + secrets: true, + persistentStorage: true, + connectedDatabase: true, + previewApplication: true, + dockerRegistry: true + } + }); + if (!application) { + throw { status: 404, message: "Application not found." }; + } + application = decryptApplication(application); + const buildPack = application?.buildPack || null; + const { baseImage, baseBuildImage, baseBuildImages, baseImages } = setDefaultBaseImage(buildPack); + if (application && !application.baseImage) { + application.baseImage = baseImage; + } + if (application && !application.baseBuildImage) { + application.baseBuildImage = baseBuildImage; + } + return { ...application, baseBuildImages, baseImages }; +} +function decryptApplication(application) { + if (application) { + if (application?.gitSource?.githubApp?.clientSecret) { + application.gitSource.githubApp.clientSecret = (0, import_common.decrypt)(application.gitSource.githubApp.clientSecret) || null; + } + if (application?.gitSource?.githubApp?.webhookSecret) { + application.gitSource.githubApp.webhookSecret = (0, import_common.decrypt)(application.gitSource.githubApp.webhookSecret) || null; + } + if (application?.gitSource?.githubApp?.privateKey) { + application.gitSource.githubApp.privateKey = (0, import_common.decrypt)(application.gitSource.githubApp.privateKey) || null; + } + if (application?.gitSource?.gitlabApp?.appSecret) { + application.gitSource.gitlabApp.appSecret = (0, import_common.decrypt)(application.gitSource.gitlabApp.appSecret) || null; + } + if (application?.secrets.length > 0) { + application.secrets = application.secrets.map((s) => { + s.value = (0, import_common.decrypt)(s.value) || null; + return s; + }); + } + return application; + } +} +const staticApps = ["static", "react", "vuejs", "svelte", "gatsby", "astro", "eleventy"]; +const nodeBased = [ + "react", + "preact", + "vuejs", + "svelte", + "gatsby", + "astro", + "eleventy", + "node", + "nestjs", + "nuxtjs", + "nextjs" +]; +function setDefaultBaseImage(buildPack, deploymentType = null) { + const nodeVersions = [ + { + value: "node:lts", + label: "node:lts" + }, + { + value: "node:18", + label: "node:18" + }, + { + value: "node:17", + label: "node:17" + }, + { + value: "node:16", + label: "node:16" + }, + { + value: "node:14", + label: "node:14" + }, + { + value: "node:12", + label: "node:12" + } + ]; + const staticVersions = [ + { + value: "webdevops/nginx:alpine", + label: "webdevops/nginx:alpine" + }, + { + value: "webdevops/apache:alpine", + label: "webdevops/apache:alpine" + }, + { + value: "nginx:alpine", + label: "nginx:alpine" + }, + { + value: "httpd:alpine", + label: "httpd:alpine (Apache)" + } + ]; + const rustVersions = [ + { + value: "rust:latest", + label: "rust:latest" + }, + { + value: "rust:1.60", + label: "rust:1.60" + }, + { + value: "rust:1.60-buster", + label: "rust:1.60-buster" + }, + { + value: "rust:1.60-bullseye", + label: "rust:1.60-bullseye" + }, + { + value: "rust:1.60-slim-buster", + label: "rust:1.60-slim-buster" + }, + { + value: "rust:1.60-slim-bullseye", + label: "rust:1.60-slim-bullseye" + }, + { + value: "rust:1.60-alpine3.14", + label: "rust:1.60-alpine3.14" + }, + { + value: "rust:1.60-alpine3.15", + label: "rust:1.60-alpine3.15" + } + ]; + const phpVersions = [ + { + value: "webdevops/php-apache:8.2", + label: "webdevops/php-apache:8.2" + }, + { + value: "webdevops/php-nginx:8.2", + label: "webdevops/php-nginx:8.2" + }, + { + value: "webdevops/php-apache:8.1", + label: "webdevops/php-apache:8.1" + }, + { + value: "webdevops/php-nginx:8.1", + label: "webdevops/php-nginx:8.1" + }, + { + value: "webdevops/php-apache:8.0", + label: "webdevops/php-apache:8.0" + }, + { + value: "webdevops/php-nginx:8.0", + label: "webdevops/php-nginx:8.0" + }, + { + value: "webdevops/php-apache:7.4", + label: "webdevops/php-apache:7.4" + }, + { + value: "webdevops/php-nginx:7.4", + label: "webdevops/php-nginx:7.4" + }, + { + value: "webdevops/php-apache:7.3", + label: "webdevops/php-apache:7.3" + }, + { + value: "webdevops/php-nginx:7.3", + label: "webdevops/php-nginx:7.3" + }, + { + value: "webdevops/php-apache:7.2", + label: "webdevops/php-apache:7.2" + }, + { + value: "webdevops/php-nginx:7.2", + label: "webdevops/php-nginx:7.2" + }, + { + value: "webdevops/php-apache:7.1", + label: "webdevops/php-apache:7.1" + }, + { + value: "webdevops/php-nginx:7.1", + label: "webdevops/php-nginx:7.1" + }, + { + value: "webdevops/php-apache:7.0", + label: "webdevops/php-apache:7.0" + }, + { + value: "webdevops/php-nginx:7.0", + label: "webdevops/php-nginx:7.0" + }, + { + value: "webdevops/php-apache:5.6", + label: "webdevops/php-apache:5.6" + }, + { + value: "webdevops/php-nginx:5.6", + label: "webdevops/php-nginx:5.6" + }, + { + value: "webdevops/php-apache:8.2-alpine", + label: "webdevops/php-apache:8.2-alpine" + }, + { + value: "webdevops/php-nginx:8.2-alpine", + label: "webdevops/php-nginx:8.2-alpine" + }, + { + value: "webdevops/php-apache:8.1-alpine", + label: "webdevops/php-apache:8.1-alpine" + }, + { + value: "webdevops/php-nginx:8.1-alpine", + label: "webdevops/php-nginx:8.1-alpine" + }, + { + value: "webdevops/php-apache:8.0-alpine", + label: "webdevops/php-apache:8.0-alpine" + }, + { + value: "webdevops/php-nginx:8.0-alpine", + label: "webdevops/php-nginx:8.0-alpine" + }, + { + value: "webdevops/php-apache:7.4-alpine", + label: "webdevops/php-apache:7.4-alpine" + }, + { + value: "webdevops/php-nginx:7.4-alpine", + label: "webdevops/php-nginx:7.4-alpine" + }, + { + value: "webdevops/php-apache:7.3-alpine", + label: "webdevops/php-apache:7.3-alpine" + }, + { + value: "webdevops/php-nginx:7.3-alpine", + label: "webdevops/php-nginx:7.3-alpine" + }, + { + value: "webdevops/php-apache:7.2-alpine", + label: "webdevops/php-apache:7.2-alpine" + }, + { + value: "webdevops/php-nginx:7.2-alpine", + label: "webdevops/php-nginx:7.2-alpine" + }, + { + value: "webdevops/php-apache:7.1-alpine", + label: "webdevops/php-apache:7.1-alpine" + }, + { + value: "php:8.1-fpm", + label: "php:8.1-fpm" + }, + { + value: "php:8.0-fpm", + label: "php:8.0-fpm" + }, + { + value: "php:8.1-fpm-alpine", + label: "php:8.1-fpm-alpine" + }, + { + value: "php:8.0-fpm-alpine", + label: "php:8.0-fpm-alpine" + } + ]; + const pythonVersions = [ + { + value: "python:3.10-alpine", + label: "python:3.10-alpine" + }, + { + value: "python:3.10-buster", + label: "python:3.10-buster" + }, + { + value: "python:3.10-bullseye", + label: "python:3.10-bullseye" + }, + { + value: "python:3.10-slim-bullseye", + label: "python:3.10-slim-bullseye" + }, + { + value: "python:3.9-alpine", + label: "python:3.9-alpine" + }, + { + value: "python:3.9-buster", + label: "python:3.9-buster" + }, + { + value: "python:3.9-bullseye", + label: "python:3.9-bullseye" + }, + { + value: "python:3.9-slim-bullseye", + label: "python:3.9-slim-bullseye" + }, + { + value: "python:3.8-alpine", + label: "python:3.8-alpine" + }, + { + value: "python:3.8-buster", + label: "python:3.8-buster" + }, + { + value: "python:3.8-bullseye", + label: "python:3.8-bullseye" + }, + { + value: "python:3.8-slim-bullseye", + label: "python:3.8-slim-bullseye" + }, + { + value: "python:3.7-alpine", + label: "python:3.7-alpine" + }, + { + value: "python:3.7-buster", + label: "python:3.7-buster" + }, + { + value: "python:3.7-bullseye", + label: "python:3.7-bullseye" + }, + { + value: "python:3.7-slim-bullseye", + label: "python:3.7-slim-bullseye" + } + ]; + const herokuVersions = [ + { + value: "heroku/builder:22", + label: "heroku/builder:22" + }, + { + value: "heroku/buildpacks:20", + label: "heroku/buildpacks:20" + }, + { + value: "heroku/builder-classic:22", + label: "heroku/builder-classic:22" + } + ]; + let payload = { + baseImage: null, + baseBuildImage: null, + baseImages: [], + baseBuildImages: [] + }; + if (nodeBased.includes(buildPack)) { + if (deploymentType === "static") { + payload.baseImage = (0, import_common.isARM)(process.arch) ? "nginx:alpine" : "webdevops/nginx:alpine"; + payload.baseImages = (0, import_common.isARM)(process.arch) ? staticVersions.filter((version) => !version.value.includes("webdevops")) : staticVersions; + payload.baseBuildImage = "node:lts"; + payload.baseBuildImages = nodeVersions; + } else { + payload.baseImage = "node:lts"; + payload.baseImages = nodeVersions; + payload.baseBuildImage = "node:lts"; + payload.baseBuildImages = nodeVersions; + } + } + if (staticApps.includes(buildPack)) { + payload.baseImage = (0, import_common.isARM)(process.arch) ? "nginx:alpine" : "webdevops/nginx:alpine"; + payload.baseImages = (0, import_common.isARM)(process.arch) ? staticVersions.filter((version) => !version.value.includes("webdevops")) : staticVersions; + payload.baseBuildImage = "node:lts"; + payload.baseBuildImages = nodeVersions; + } + if (buildPack === "python") { + payload.baseImage = "python:3.10-alpine"; + payload.baseImages = pythonVersions; + } + if (buildPack === "rust") { + payload.baseImage = "rust:latest"; + payload.baseBuildImage = "rust:latest"; + payload.baseImages = rustVersions; + payload.baseBuildImages = rustVersions; + } + if (buildPack === "deno") { + payload.baseImage = "denoland/deno:latest"; + } + if (buildPack === "php") { + payload.baseImage = (0, import_common.isARM)(process.arch) ? "php:8.1-fpm-alpine" : "webdevops/php-apache:8.2-alpine"; + payload.baseImages = (0, import_common.isARM)(process.arch) ? phpVersions.filter((version) => !version.value.includes("webdevops")) : phpVersions; + } + if (buildPack === "laravel") { + payload.baseImage = (0, import_common.isARM)(process.arch) ? "php:8.1-fpm-alpine" : "webdevops/php-apache:8.2-alpine"; + payload.baseImages = (0, import_common.isARM)(process.arch) ? phpVersions.filter((version) => !version.value.includes("webdevops")) : phpVersions; + payload.baseBuildImage = "node:18"; + payload.baseBuildImages = nodeVersions; + } + if (buildPack === "heroku") { + payload.baseImage = "heroku/buildpacks:20"; + payload.baseImages = herokuVersions; + } + return payload; +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + deployApplication, + generateConfigHash, + getApplicationFromDB, + setDefaultBaseImage +}); diff --git a/apps/trpc-experimental/server/build/trpc/routers/auth.js b/apps/trpc-experimental/server/build/trpc/routers/auth.js new file mode 100644 index 000000000..5f41172d4 --- /dev/null +++ b/apps/trpc-experimental/server/build/trpc/routers/auth.js @@ -0,0 +1,201 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var auth_exports = {}; +__export(auth_exports, { + authRouter: () => authRouter +}); +module.exports = __toCommonJS(auth_exports); +var import_zod = require("zod"); +var import_trpc = require("../trpc"); +var import_server = require("@trpc/server"); +var import_common = require("../../lib/common"); +var import_env = require("../../env"); +var import_jsonwebtoken = __toESM(require("jsonwebtoken")); +var import_prisma = require("../../prisma"); +var import_cuid = __toESM(require("cuid")); +const authRouter = (0, import_trpc.router)({ + register: import_trpc.publicProcedure.input( + import_zod.z.object({ + email: import_zod.z.string(), + password: import_zod.z.string() + }) + ).mutation(async ({ input }) => { + const { email, password } = input; + const userFound = await import_prisma.prisma.user.findUnique({ + where: { email }, + include: { teams: true, permission: true } + }); + if (userFound) { + throw new import_server.TRPCError({ + code: "BAD_REQUEST", + message: "User already exists." + }); + } + const settings = await (0, import_common.listSettings)(); + if (!settings?.isRegistrationEnabled) { + throw new import_server.TRPCError({ + code: "FORBIDDEN", + message: "Registration is disabled." + }); + } + const usersCount = await import_prisma.prisma.user.count(); + const uid = usersCount === 0 ? "0" : (0, import_cuid.default)(); + const permission = "owner"; + const isAdmin = true; + const hashedPassword = await (0, import_common.hashPassword)(password); + if (usersCount === 0) { + await import_prisma.prisma.user.create({ + data: { + id: uid, + email, + password: hashedPassword, + type: "email", + teams: { + create: { + id: uid, + name: (0, import_common.uniqueName)(), + destinationDocker: { connect: { network: "coolify" } } + } + }, + permission: { create: { teamId: uid, permission } } + }, + include: { teams: true } + }); + await import_prisma.prisma.setting.update({ + where: { id: "0" }, + data: { isRegistrationEnabled: false } + }); + } else { + await import_prisma.prisma.user.create({ + data: { + id: uid, + email, + password: hashedPassword, + type: "email", + teams: { + create: { + id: uid, + name: (0, import_common.uniqueName)() + } + }, + permission: { create: { teamId: uid, permission } } + }, + include: { teams: true } + }); + } + const payload = { + userId: uid, + teamId: uid, + permission, + isAdmin + }; + return { + ...payload, + token: import_jsonwebtoken.default.sign(payload, import_env.env.COOLIFY_SECRET_KEY) + }; + }), + login: import_trpc.publicProcedure.input( + import_zod.z.object({ + email: import_zod.z.string(), + password: import_zod.z.string() + }) + ).mutation(async ({ input }) => { + const { email, password } = input; + const userFound = await import_prisma.prisma.user.findUnique({ + where: { email }, + include: { teams: true, permission: true } + }); + if (!userFound) { + throw new import_server.TRPCError({ + code: "BAD_REQUEST", + message: "User already exists." + }); + } + if (userFound.type === "email") { + if (userFound.password === "RESETME") { + const hashedPassword = await (0, import_common.hashPassword)(password); + if (userFound.updatedAt < new Date(Date.now() - 1e3 * 60 * 10)) { + if (userFound.id === "0") { + await import_prisma.prisma.user.update({ + where: { email: userFound.email }, + data: { password: "RESETME" } + }); + } else { + await import_prisma.prisma.user.update({ + where: { email: userFound.email }, + data: { password: "RESETTIMEOUT" } + }); + } + } else { + await import_prisma.prisma.user.update({ + where: { email: userFound.email }, + data: { password: hashedPassword } + }); + const payload2 = { + userId: userFound.id, + teamId: userFound.id, + permission: userFound.permission, + isAdmin: true + }; + return { + ...payload2, + token: import_jsonwebtoken.default.sign(payload2, import_env.env.COOLIFY_SECRET_KEY) + }; + } + } + if (!userFound.password) { + throw new import_server.TRPCError({ + code: "BAD_REQUEST", + message: "Something went wrong. Please try again later." + }); + } + const passwordMatch = (0, import_common.comparePassword)(password, userFound.password); + if (!passwordMatch) { + throw new import_server.TRPCError({ + code: "BAD_REQUEST", + message: "Incorrect password." + }); + } + const payload = { + userId: userFound.id, + teamId: userFound.id, + permission: userFound.permission, + isAdmin: true + }; + return { + ...payload, + token: import_jsonwebtoken.default.sign(payload, import_env.env.COOLIFY_SECRET_KEY) + }; + } + throw new import_server.TRPCError({ + code: "BAD_REQUEST", + message: "Not implemented yet." + }); + }) +}); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + authRouter +}); diff --git a/apps/trpc-experimental/server/build/trpc/routers/dashboard.js b/apps/trpc-experimental/server/build/trpc/routers/dashboard.js new file mode 100644 index 000000000..cd1519b5d --- /dev/null +++ b/apps/trpc-experimental/server/build/trpc/routers/dashboard.js @@ -0,0 +1,87 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var dashboard_exports = {}; +__export(dashboard_exports, { + dashboardRouter: () => dashboardRouter +}); +module.exports = __toCommonJS(dashboard_exports); +var import_trpc = require("../trpc"); +var import_common = require("../../lib/common"); +var import_prisma = require("../../prisma"); +const dashboardRouter = (0, import_trpc.router)({ + resources: import_trpc.privateProcedure.query(async ({ ctx }) => { + const id = ctx.user?.teamId === "0" ? void 0 : ctx.user?.teamId; + let applications = await import_prisma.prisma.application.findMany({ + where: { teams: { some: { id } } }, + include: { settings: true, destinationDocker: true, teams: true } + }); + const databases = await import_prisma.prisma.database.findMany({ + where: { teams: { some: { id } } }, + include: { settings: true, destinationDocker: true, teams: true } + }); + const services = await import_prisma.prisma.service.findMany({ + where: { teams: { some: { id } } }, + include: { destinationDocker: true, teams: true } + }); + const gitSources = await import_prisma.prisma.gitSource.findMany({ + where: { + OR: [{ teams: { some: { id } } }, { isSystemWide: true }] + }, + include: { teams: true } + }); + const destinations = await import_prisma.prisma.destinationDocker.findMany({ + where: { teams: { some: { id } } }, + include: { teams: true } + }); + const settings = await (0, import_common.listSettings)(); + let foundUnconfiguredApplication = false; + for (const application of applications) { + if ((!application.buildPack || !application.branch) && !application.simpleDockerfile || !application.destinationDockerId || !application.settings?.isBot && !application?.fqdn && application.buildPack !== "compose") { + foundUnconfiguredApplication = true; + } + } + let foundUnconfiguredService = false; + for (const service of services) { + if (!service.fqdn) { + foundUnconfiguredService = true; + } + } + let foundUnconfiguredDatabase = false; + for (const database of databases) { + if (!database.version) { + foundUnconfiguredDatabase = true; + } + } + return { + foundUnconfiguredApplication, + foundUnconfiguredDatabase, + foundUnconfiguredService, + applications, + databases, + services, + gitSources, + destinations, + settings + }; + }) +}); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + dashboardRouter +}); diff --git a/apps/trpc-experimental/server/build/trpc/routers/databases/index.js b/apps/trpc-experimental/server/build/trpc/routers/databases/index.js new file mode 100644 index 000000000..70c2fc4d2 --- /dev/null +++ b/apps/trpc-experimental/server/build/trpc/routers/databases/index.js @@ -0,0 +1,384 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var databases_exports = {}; +__export(databases_exports, { + databasesRouter: () => databasesRouter +}); +module.exports = __toCommonJS(databases_exports); +var import_zod = require("zod"); +var import_promises = __toESM(require("fs/promises")); +var import_trpc = require("../../trpc"); +var import_common = require("../../../lib/common"); +var import_prisma = require("../../../prisma"); +var import_executeCommand = require("../../../lib/executeCommand"); +var import_docker = require("../../../lib/docker"); +var import_lib = require("./lib"); +var import_js_yaml = __toESM(require("js-yaml")); +var import_lib2 = require("../services/lib"); +const databasesRouter = (0, import_trpc.router)({ + usage: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string() + }) + ).query(async ({ ctx, input }) => { + const teamId = ctx.user?.teamId; + const { id } = input; + let usage = {}; + const database = await import_prisma.prisma.database.findFirst({ + where: { id, teams: { some: { id: teamId === "0" ? void 0 : teamId } } }, + include: { destinationDocker: true, settings: true } + }); + if (database.dbUserPassword) + database.dbUserPassword = (0, import_common.decrypt)(database.dbUserPassword); + if (database.rootUserPassword) + database.rootUserPassword = (0, import_common.decrypt)(database.rootUserPassword); + if (database.destinationDockerId) { + [usage] = await Promise.all([(0, import_common.getContainerUsage)(database.destinationDocker.id, id)]); + } + return { + success: true, + data: { + usage + } + }; + }), + save: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string() + }) + ).mutation(async ({ ctx, input }) => { + const teamId = ctx.user?.teamId; + const { + id, + name, + defaultDatabase, + dbUser, + dbUserPassword, + rootUser, + rootUserPassword, + version, + isRunning + } = input; + const database = await import_prisma.prisma.database.findFirst({ + where: { id, teams: { some: { id: teamId === "0" ? void 0 : teamId } } }, + include: { destinationDocker: true, settings: true } + }); + if (database.dbUserPassword) + database.dbUserPassword = (0, import_common.decrypt)(database.dbUserPassword); + if (database.rootUserPassword) + database.rootUserPassword = (0, import_common.decrypt)(database.rootUserPassword); + if (isRunning) { + if (database.dbUserPassword !== dbUserPassword) { + await (0, import_lib.updatePasswordInDb)(database, dbUser, dbUserPassword, false); + } else if (database.rootUserPassword !== rootUserPassword) { + await (0, import_lib.updatePasswordInDb)(database, rootUser, rootUserPassword, true); + } + } + const encryptedDbUserPassword = dbUserPassword && (0, import_common.encrypt)(dbUserPassword); + const encryptedRootUserPassword = rootUserPassword && (0, import_common.encrypt)(rootUserPassword); + await import_prisma.prisma.database.update({ + where: { id }, + data: { + name, + defaultDatabase, + dbUser, + dbUserPassword: encryptedDbUserPassword, + rootUser, + rootUserPassword: encryptedRootUserPassword, + version + } + }); + }), + saveSettings: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + isPublic: import_zod.z.boolean(), + appendOnly: import_zod.z.boolean().default(true) + }) + ).mutation(async ({ ctx, input }) => { + const teamId = ctx.user?.teamId; + const { id, isPublic, appendOnly = true } = input; + let publicPort = null; + const { + destinationDocker: { remoteEngine, engine, remoteIpAddress } + } = await import_prisma.prisma.database.findUnique({ where: { id }, include: { destinationDocker: true } }); + if (isPublic) { + publicPort = await (0, import_lib2.getFreePublicPort)({ id, remoteEngine, engine, remoteIpAddress }); + } + await import_prisma.prisma.database.update({ + where: { id }, + data: { + settings: { + upsert: { update: { isPublic, appendOnly }, create: { isPublic, appendOnly } } + } + } + }); + const database = await import_prisma.prisma.database.findFirst({ + where: { id, teams: { some: { id: teamId === "0" ? void 0 : teamId } } }, + include: { destinationDocker: true, settings: true } + }); + const { arch } = await (0, import_common.listSettings)(); + if (database.dbUserPassword) + database.dbUserPassword = (0, import_common.decrypt)(database.dbUserPassword); + if (database.rootUserPassword) + database.rootUserPassword = (0, import_common.decrypt)(database.rootUserPassword); + const { destinationDockerId, destinationDocker, publicPort: oldPublicPort } = database; + const { privatePort } = (0, import_lib.generateDatabaseConfiguration)(database, arch); + if (destinationDockerId) { + if (isPublic) { + await import_prisma.prisma.database.update({ where: { id }, data: { publicPort } }); + await (0, import_common.startTraefikTCPProxy)(destinationDocker, id, publicPort, privatePort); + } else { + await import_prisma.prisma.database.update({ where: { id }, data: { publicPort: null } }); + await (0, import_docker.stopTcpHttpProxy)(id, destinationDocker, oldPublicPort); + } + } + return { publicPort }; + }), + saveSecret: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + name: import_zod.z.string(), + value: import_zod.z.string(), + isNew: import_zod.z.boolean().default(true) + }) + ).mutation(async ({ ctx, input }) => { + let { id, name, value, isNew } = input; + if (isNew) { + const found = await import_prisma.prisma.databaseSecret.findFirst({ where: { name, databaseId: id } }); + if (found) { + throw `Secret ${name} already exists.`; + } else { + value = (0, import_common.encrypt)(value.trim()); + await import_prisma.prisma.databaseSecret.create({ + data: { name, value, database: { connect: { id } } } + }); + } + } else { + value = (0, import_common.encrypt)(value.trim()); + const found = await import_prisma.prisma.databaseSecret.findFirst({ where: { databaseId: id, name } }); + if (found) { + await import_prisma.prisma.databaseSecret.updateMany({ + where: { databaseId: id, name }, + data: { value } + }); + } else { + await import_prisma.prisma.databaseSecret.create({ + data: { name, value, database: { connect: { id } } } + }); + } + } + }), + start: import_trpc.privateProcedure.input(import_zod.z.object({ id: import_zod.z.string() })).mutation(async ({ ctx, input }) => { + const { id } = input; + const teamId = ctx.user?.teamId; + const database = await import_prisma.prisma.database.findFirst({ + where: { id, teams: { some: { id: teamId === "0" ? void 0 : teamId } } }, + include: { destinationDocker: true, settings: true, databaseSecret: true } + }); + const { arch } = await (0, import_common.listSettings)(); + if (database.dbUserPassword) + database.dbUserPassword = (0, import_common.decrypt)(database.dbUserPassword); + if (database.rootUserPassword) + database.rootUserPassword = (0, import_common.decrypt)(database.rootUserPassword); + const { + type, + destinationDockerId, + destinationDocker, + publicPort, + settings: { isPublic }, + databaseSecret + } = database; + const { privatePort, command, environmentVariables, image, volume, ulimits } = (0, import_lib.generateDatabaseConfiguration)(database, arch); + const network = destinationDockerId && destinationDocker.network; + const volumeName = volume.split(":")[0]; + const labels = await (0, import_lib.makeLabelForStandaloneDatabase)({ id, image, volume }); + const { workdir } = await (0, import_common.createDirectories)({ repository: type, buildId: id }); + if (databaseSecret.length > 0) { + databaseSecret.forEach((secret) => { + environmentVariables[secret.name] = (0, import_common.decrypt)(secret.value); + }); + } + const composeFile = { + version: "3.8", + services: { + [id]: { + container_name: id, + image, + command, + environment: environmentVariables, + volumes: [volume], + ulimits, + labels, + ...(0, import_docker.defaultComposeConfiguration)(network) + } + }, + networks: { + [network]: { + external: true + } + }, + volumes: { + [volumeName]: { + name: volumeName + } + } + }; + const composeFileDestination = `${workdir}/docker-compose.yaml`; + await import_promises.default.writeFile(composeFileDestination, import_js_yaml.default.dump(composeFile)); + await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDocker.id, + command: `docker compose -f ${composeFileDestination} up -d` + }); + if (isPublic) + await (0, import_common.startTraefikTCPProxy)(destinationDocker, id, publicPort, privatePort); + }), + stop: import_trpc.privateProcedure.input(import_zod.z.object({ id: import_zod.z.string() })).mutation(async ({ ctx, input }) => { + const { id } = input; + const teamId = ctx.user?.teamId; + const database = await import_prisma.prisma.database.findFirst({ + where: { id, teams: { some: { id: teamId === "0" ? void 0 : teamId } } }, + include: { destinationDocker: true, settings: true } + }); + if (database.dbUserPassword) + database.dbUserPassword = (0, import_common.decrypt)(database.dbUserPassword); + if (database.rootUserPassword) + database.rootUserPassword = (0, import_common.decrypt)(database.rootUserPassword); + const everStarted = await (0, import_docker.stopDatabaseContainer)(database); + if (everStarted) + await (0, import_docker.stopTcpHttpProxy)(id, database.destinationDocker, database.publicPort); + await import_prisma.prisma.database.update({ + where: { id }, + data: { + settings: { upsert: { update: { isPublic: false }, create: { isPublic: false } } } + } + }); + await import_prisma.prisma.database.update({ where: { id }, data: { publicPort: null } }); + }), + getDatabaseById: import_trpc.privateProcedure.input(import_zod.z.object({ id: import_zod.z.string() })).query(async ({ ctx, input }) => { + const { id } = input; + const teamId = ctx.user?.teamId; + const database = await import_prisma.prisma.database.findFirst({ + where: { id, teams: { some: { id: teamId === "0" ? void 0 : teamId } } }, + include: { destinationDocker: true, settings: true } + }); + if (!database) { + throw { status: 404, message: "Database not found." }; + } + const settings = await (0, import_common.listSettings)(); + if (database.dbUserPassword) + database.dbUserPassword = (0, import_common.decrypt)(database.dbUserPassword); + if (database.rootUserPassword) + database.rootUserPassword = (0, import_common.decrypt)(database.rootUserPassword); + const configuration = (0, import_lib.generateDatabaseConfiguration)(database, settings.arch); + return { + success: true, + data: { + privatePort: configuration?.privatePort, + database, + versions: await (0, import_lib.getDatabaseVersions)(database.type, settings.arch), + settings + } + }; + }), + status: import_trpc.privateProcedure.input(import_zod.z.object({ id: import_zod.z.string() })).query(async ({ ctx, input }) => { + const id = input.id; + const teamId = ctx.user?.teamId; + let isRunning = false; + const database = await import_prisma.prisma.database.findFirst({ + where: { id, teams: { some: { id: teamId === "0" ? void 0 : teamId } } }, + include: { destinationDocker: true, settings: true } + }); + if (database) { + const { destinationDockerId, destinationDocker } = database; + if (destinationDockerId) { + try { + const { stdout } = await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDocker.id, + command: `docker inspect --format '{{json .State}}' ${id}` + }); + if (JSON.parse(stdout).Running) { + isRunning = true; + } + } catch (error) { + } + } + } + return { + success: true, + data: { + isRunning + } + }; + }), + cleanup: import_trpc.privateProcedure.query(async ({ ctx }) => { + const teamId = ctx.user?.teamId; + let databases = await import_prisma.prisma.database.findMany({ + where: { teams: { some: { id: teamId === "0" ? void 0 : teamId } } }, + include: { settings: true, destinationDocker: true, teams: true } + }); + for (const database of databases) { + if (!database?.version) { + const { id } = database; + if (database.destinationDockerId) { + const everStarted = await (0, import_docker.stopDatabaseContainer)(database); + if (everStarted) + await (0, import_docker.stopTcpHttpProxy)(id, database.destinationDocker, database.publicPort); + } + await import_prisma.prisma.databaseSettings.deleteMany({ where: { databaseId: id } }); + await import_prisma.prisma.databaseSecret.deleteMany({ where: { databaseId: id } }); + await import_prisma.prisma.database.delete({ where: { id } }); + } + } + return {}; + }), + delete: import_trpc.privateProcedure.input(import_zod.z.object({ id: import_zod.z.string(), force: import_zod.z.boolean().default(false) })).mutation(async ({ ctx, input }) => { + const { id, force } = input; + const teamId = ctx.user?.teamId; + const database = await import_prisma.prisma.database.findFirst({ + where: { id, teams: { some: { id: teamId === "0" ? void 0 : teamId } } }, + include: { destinationDocker: true, settings: true } + }); + if (!force) { + if (database.dbUserPassword) + database.dbUserPassword = (0, import_common.decrypt)(database.dbUserPassword); + if (database.rootUserPassword) + database.rootUserPassword = (0, import_common.decrypt)(database.rootUserPassword); + if (database.destinationDockerId) { + const everStarted = await (0, import_docker.stopDatabaseContainer)(database); + if (everStarted) + await (0, import_docker.stopTcpHttpProxy)(id, database.destinationDocker, database.publicPort); + } + } + await import_prisma.prisma.databaseSettings.deleteMany({ where: { databaseId: id } }); + await import_prisma.prisma.databaseSecret.deleteMany({ where: { databaseId: id } }); + await import_prisma.prisma.database.delete({ where: { id } }); + return {}; + }) +}); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + databasesRouter +}); diff --git a/apps/trpc-experimental/server/build/trpc/routers/databases/lib.js b/apps/trpc-experimental/server/build/trpc/routers/databases/lib.js new file mode 100644 index 000000000..2cb21ef78 --- /dev/null +++ b/apps/trpc-experimental/server/build/trpc/routers/databases/lib.js @@ -0,0 +1,316 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var lib_exports = {}; +__export(lib_exports, { + generateDatabaseConfiguration: () => generateDatabaseConfiguration, + getDatabaseImage: () => getDatabaseImage, + getDatabaseVersions: () => getDatabaseVersions, + makeLabelForStandaloneDatabase: () => makeLabelForStandaloneDatabase, + supportedDatabaseTypesAndVersions: () => supportedDatabaseTypesAndVersions, + updatePasswordInDb: () => updatePasswordInDb +}); +module.exports = __toCommonJS(lib_exports); +var import_common = require("../../../lib/common"); +var import_executeCommand = require("../../../lib/executeCommand"); +var import_prisma = require("../../../prisma"); +const supportedDatabaseTypesAndVersions = [ + { + name: "mongodb", + fancyName: "MongoDB", + baseImage: "bitnami/mongodb", + baseImageARM: "mongo", + versions: ["5.0", "4.4", "4.2"], + versionsARM: ["5.0", "4.4", "4.2"] + }, + { + name: "mysql", + fancyName: "MySQL", + baseImage: "bitnami/mysql", + baseImageARM: "mysql", + versions: ["8.0", "5.7"], + versionsARM: ["8.0", "5.7"] + }, + { + name: "mariadb", + fancyName: "MariaDB", + baseImage: "bitnami/mariadb", + baseImageARM: "mariadb", + versions: ["10.8", "10.7", "10.6", "10.5", "10.4", "10.3", "10.2"], + versionsARM: ["10.8", "10.7", "10.6", "10.5", "10.4", "10.3", "10.2"] + }, + { + name: "postgresql", + fancyName: "PostgreSQL", + baseImage: "bitnami/postgresql", + baseImageARM: "postgres", + versions: ["14.5.0", "13.8.0", "12.12.0", "11.17.0", "10.22.0"], + versionsARM: ["14.5", "13.8", "12.12", "11.17", "10.22"] + }, + { + name: "redis", + fancyName: "Redis", + baseImage: "bitnami/redis", + baseImageARM: "redis", + versions: ["7.0", "6.2", "6.0", "5.0"], + versionsARM: ["7.0", "6.2", "6.0", "5.0"] + }, + { + name: "couchdb", + fancyName: "CouchDB", + baseImage: "bitnami/couchdb", + baseImageARM: "couchdb", + versions: ["3.2.2", "3.1.2", "2.3.1"], + versionsARM: ["3.2.2", "3.1.2", "2.3.1"] + }, + { + name: "edgedb", + fancyName: "EdgeDB", + baseImage: "edgedb/edgedb", + versions: ["latest", "2.1", "2.0", "1.4"] + } +]; +function getDatabaseImage(type, arch) { + const found = supportedDatabaseTypesAndVersions.find((t) => t.name === type); + if (found) { + if ((0, import_common.isARM)(arch)) { + return found.baseImageARM || found.baseImage; + } + return found.baseImage; + } + return ""; +} +function generateDatabaseConfiguration(database, arch) { + const { id, dbUser, dbUserPassword, rootUser, rootUserPassword, defaultDatabase, version: version2, type } = database; + const baseImage = getDatabaseImage(type, arch); + if (type === "mysql") { + const configuration = { + privatePort: 3306, + environmentVariables: { + MYSQL_USER: dbUser, + MYSQL_PASSWORD: dbUserPassword, + MYSQL_ROOT_PASSWORD: rootUserPassword, + MYSQL_ROOT_USER: rootUser, + MYSQL_DATABASE: defaultDatabase + }, + image: `${baseImage}:${version2}`, + volume: `${id}-${type}-data:/bitnami/mysql/data`, + ulimits: {} + }; + if ((0, import_common.isARM)(arch)) { + configuration.volume = `${id}-${type}-data:/var/lib/mysql`; + } + return configuration; + } else if (type === "mariadb") { + const configuration = { + privatePort: 3306, + environmentVariables: { + MARIADB_ROOT_USER: rootUser, + MARIADB_ROOT_PASSWORD: rootUserPassword, + MARIADB_USER: dbUser, + MARIADB_PASSWORD: dbUserPassword, + MARIADB_DATABASE: defaultDatabase + }, + image: `${baseImage}:${version2}`, + volume: `${id}-${type}-data:/bitnami/mariadb`, + ulimits: {} + }; + if ((0, import_common.isARM)(arch)) { + configuration.volume = `${id}-${type}-data:/var/lib/mysql`; + } + return configuration; + } else if (type === "mongodb") { + const configuration = { + privatePort: 27017, + environmentVariables: { + MONGODB_ROOT_USER: rootUser, + MONGODB_ROOT_PASSWORD: rootUserPassword + }, + image: `${baseImage}:${version2}`, + volume: `${id}-${type}-data:/bitnami/mongodb`, + ulimits: {} + }; + if ((0, import_common.isARM)(arch)) { + configuration.environmentVariables = { + MONGO_INITDB_ROOT_USERNAME: rootUser, + MONGO_INITDB_ROOT_PASSWORD: rootUserPassword + }; + configuration.volume = `${id}-${type}-data:/data/db`; + } + return configuration; + } else if (type === "postgresql") { + const configuration = { + privatePort: 5432, + environmentVariables: { + POSTGRESQL_POSTGRES_PASSWORD: rootUserPassword, + POSTGRESQL_PASSWORD: dbUserPassword, + POSTGRESQL_USERNAME: dbUser, + POSTGRESQL_DATABASE: defaultDatabase + }, + image: `${baseImage}:${version2}`, + volume: `${id}-${type}-data:/bitnami/postgresql`, + ulimits: {} + }; + if ((0, import_common.isARM)(arch)) { + configuration.volume = `${id}-${type}-data:/var/lib/postgresql`; + configuration.environmentVariables = { + POSTGRES_PASSWORD: dbUserPassword, + POSTGRES_USER: dbUser, + POSTGRES_DB: defaultDatabase + }; + } + return configuration; + } else if (type === "redis") { + const { + settings: { appendOnly } + } = database; + const configuration = { + privatePort: 6379, + command: void 0, + environmentVariables: { + REDIS_PASSWORD: dbUserPassword, + REDIS_AOF_ENABLED: appendOnly ? "yes" : "no" + }, + image: `${baseImage}:${version2}`, + volume: `${id}-${type}-data:/bitnami/redis/data`, + ulimits: {} + }; + if ((0, import_common.isARM)(arch)) { + configuration.volume = `${id}-${type}-data:/data`; + configuration.command = `/usr/local/bin/redis-server --appendonly ${appendOnly ? "yes" : "no"} --requirepass ${dbUserPassword}`; + } + return configuration; + } else if (type === "couchdb") { + const configuration = { + privatePort: 5984, + environmentVariables: { + COUCHDB_PASSWORD: dbUserPassword, + COUCHDB_USER: dbUser + }, + image: `${baseImage}:${version2}`, + volume: `${id}-${type}-data:/bitnami/couchdb`, + ulimits: {} + }; + if ((0, import_common.isARM)(arch)) { + configuration.volume = `${id}-${type}-data:/opt/couchdb/data`; + } + return configuration; + } else if (type === "edgedb") { + const configuration = { + privatePort: 5656, + environmentVariables: { + EDGEDB_SERVER_PASSWORD: rootUserPassword, + EDGEDB_SERVER_USER: rootUser, + EDGEDB_SERVER_DATABASE: defaultDatabase, + EDGEDB_SERVER_TLS_CERT_MODE: "generate_self_signed" + }, + image: `${baseImage}:${version2}`, + volume: `${id}-${type}-data:/var/lib/edgedb/data`, + ulimits: {} + }; + return configuration; + } + return null; +} +function getDatabaseVersions(type, arch) { + const found = supportedDatabaseTypesAndVersions.find((t) => t.name === type); + if (found) { + if ((0, import_common.isARM)(arch)) { + return found.versionsARM || found.versions; + } + return found.versions; + } + return []; +} +async function updatePasswordInDb(database, user, newPassword, isRoot) { + const { + id, + type, + rootUser, + rootUserPassword, + dbUser, + dbUserPassword, + defaultDatabase, + destinationDockerId, + destinationDocker: { id: dockerId } + } = database; + if (destinationDockerId) { + if (type === "mysql") { + await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker exec ${id} mysql -u ${rootUser} -p${rootUserPassword} -e "ALTER USER '${user}'@'%' IDENTIFIED WITH caching_sha2_password BY '${newPassword}';"` + }); + } else if (type === "mariadb") { + await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker exec ${id} mysql -u ${rootUser} -p${rootUserPassword} -e "SET PASSWORD FOR '${user}'@'%' = PASSWORD('${newPassword}');"` + }); + } else if (type === "postgresql") { + if (isRoot) { + await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker exec ${id} psql postgresql://postgres:${rootUserPassword}@${id}:5432/${defaultDatabase} -c "ALTER role postgres WITH PASSWORD '${newPassword}'"` + }); + } else { + await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker exec ${id} psql postgresql://${dbUser}:${dbUserPassword}@${id}:5432/${defaultDatabase} -c "ALTER role ${user} WITH PASSWORD '${newPassword}'"` + }); + } + } else if (type === "mongodb") { + await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker exec ${id} mongo 'mongodb://${rootUser}:${rootUserPassword}@${id}:27017/admin?readPreference=primary&ssl=false' --eval "db.changeUserPassword('${user}','${newPassword}')"` + }); + } else if (type === "redis") { + await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker exec ${id} redis-cli -u redis://${dbUserPassword}@${id}:6379 --raw CONFIG SET requirepass ${newPassword}` + }); + } + } +} +async function makeLabelForStandaloneDatabase({ id, image, volume }) { + const database = await import_prisma.prisma.database.findFirst({ where: { id } }); + delete database.destinationDockerId; + delete database.createdAt; + delete database.updatedAt; + return [ + "coolify.managed=true", + `coolify.version=${import_common.version}`, + `coolify.type=standalone-database`, + `coolify.name=${database.name}`, + `coolify.configuration=${(0, import_common.base64Encode)( + JSON.stringify({ + version: import_common.version, + image, + volume, + ...database + }) + )}` + ]; +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + generateDatabaseConfiguration, + getDatabaseImage, + getDatabaseVersions, + makeLabelForStandaloneDatabase, + supportedDatabaseTypesAndVersions, + updatePasswordInDb +}); diff --git a/apps/trpc-experimental/server/build/trpc/routers/destinations/index.js b/apps/trpc-experimental/server/build/trpc/routers/destinations/index.js new file mode 100644 index 000000000..787431e46 --- /dev/null +++ b/apps/trpc-experimental/server/build/trpc/routers/destinations/index.js @@ -0,0 +1,220 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var destinations_exports = {}; +__export(destinations_exports, { + destinationsRouter: () => destinationsRouter +}); +module.exports = __toCommonJS(destinations_exports); +var import_zod = require("zod"); +var import_trpc = require("../../trpc"); +var import_common = require("../../../lib/common"); +var import_prisma = require("../../../prisma"); +var import_executeCommand = require("../../../lib/executeCommand"); +var import_docker = require("../../../lib/docker"); +const destinationsRouter = (0, import_trpc.router)({ + restartProxy: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string() + }) + ).mutation(async ({ input, ctx }) => { + const { id } = input; + await (0, import_common.stopTraefikProxy)(id); + await (0, import_common.startTraefikProxy)(id); + await import_prisma.prisma.destinationDocker.update({ + where: { id }, + data: { isCoolifyProxyUsed: true } + }); + }), + startProxy: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string() + }) + ).mutation(async ({ input, ctx }) => { + const { id } = input; + await (0, import_common.startTraefikProxy)(id); + }), + stopProxy: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string() + }) + ).mutation(async ({ input, ctx }) => { + const { id } = input; + await (0, import_common.stopTraefikProxy)(id); + }), + saveSettings: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + engine: import_zod.z.string(), + isCoolifyProxyUsed: import_zod.z.boolean() + }) + ).mutation(async ({ input, ctx }) => { + const { id, engine, isCoolifyProxyUsed } = input; + await import_prisma.prisma.destinationDocker.updateMany({ + where: { engine }, + data: { isCoolifyProxyUsed } + }); + }), + status: import_trpc.privateProcedure.input(import_zod.z.object({ id: import_zod.z.string() })).query(async ({ input, ctx }) => { + const { id } = input; + const destination = await import_prisma.prisma.destinationDocker.findUnique({ where: { id } }); + const { found: isRunning } = await (0, import_docker.checkContainer)({ + dockerId: destination.id, + container: "coolify-proxy", + remove: true + }); + return { + isRunning + }; + }), + save: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + name: import_zod.z.string(), + htmlUrl: import_zod.z.string(), + apiUrl: import_zod.z.string(), + customPort: import_zod.z.number(), + customUser: import_zod.z.string(), + isSystemWide: import_zod.z.boolean().default(false) + }) + ).mutation(async ({ input, ctx }) => { + const { teamId } = ctx.user; + let { + id, + name, + network, + engine, + isCoolifyProxyUsed, + remoteIpAddress, + remoteUser, + remotePort + } = input; + if (id === "new") { + if (engine) { + const { stdout } = await await (0, import_executeCommand.executeCommand)({ + command: `docker network ls --filter 'name=^${network}$' --format '{{json .}}'` + }); + if (stdout === "") { + await await (0, import_executeCommand.executeCommand)({ + command: `docker network create --attachable ${network}` + }); + } + await import_prisma.prisma.destinationDocker.create({ + data: { name, teams: { connect: { id: teamId } }, engine, network, isCoolifyProxyUsed } + }); + const destinations = await import_prisma.prisma.destinationDocker.findMany({ where: { engine } }); + const destination = destinations.find((destination2) => destination2.network === network); + if (destinations.length > 0) { + const proxyConfigured = destinations.find( + (destination2) => destination2.network !== network && destination2.isCoolifyProxyUsed === true + ); + if (proxyConfigured) { + isCoolifyProxyUsed = !!proxyConfigured.isCoolifyProxyUsed; + } + await import_prisma.prisma.destinationDocker.updateMany({ + where: { engine }, + data: { isCoolifyProxyUsed } + }); + } + if (isCoolifyProxyUsed) { + await (0, import_common.startTraefikProxy)(destination.id); + } + return { id: destination.id }; + } else { + const destination = await import_prisma.prisma.destinationDocker.create({ + data: { + name, + teams: { connect: { id: teamId } }, + engine, + network, + isCoolifyProxyUsed, + remoteEngine: true, + remoteIpAddress, + remoteUser, + remotePort: Number(remotePort) + } + }); + return { id: destination.id }; + } + } else { + await import_prisma.prisma.destinationDocker.update({ where: { id }, data: { name, engine, network } }); + return {}; + } + }), + check: import_trpc.privateProcedure.input( + import_zod.z.object({ + network: import_zod.z.string() + }) + ).query(async ({ input, ctx }) => { + const { network } = input; + const found = await import_prisma.prisma.destinationDocker.findFirst({ where: { network } }); + if (found) { + throw { + message: `Network already exists: ${network}` + }; + } + }), + delete: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string() + }) + ).mutation(async ({ input, ctx }) => { + const { id } = input; + const { network, remoteVerified, engine, isCoolifyProxyUsed } = await import_prisma.prisma.destinationDocker.findUnique({ where: { id } }); + if (isCoolifyProxyUsed) { + if (engine || remoteVerified) { + const { stdout: found } = await (0, import_executeCommand.executeCommand)({ + dockerId: id, + command: `docker ps -a --filter network=${network} --filter name=coolify-proxy --format '{{.}}'` + }); + if (found) { + await (0, import_executeCommand.executeCommand)({ + dockerId: id, + command: `docker network disconnect ${network} coolify-proxy` + }); + await (0, import_executeCommand.executeCommand)({ dockerId: id, command: `docker network rm ${network}` }); + } + } + } + await import_prisma.prisma.destinationDocker.delete({ where: { id } }); + }), + getDestinationById: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string() + }) + ).query(async ({ input, ctx }) => { + const { id } = input; + const { teamId } = ctx.user; + const destination = await import_prisma.prisma.destinationDocker.findFirst({ + where: { id, teams: { some: { id: teamId === "0" ? void 0 : teamId } } }, + include: { sshKey: true, application: true, service: true, database: true } + }); + if (!destination && id !== "new") { + throw { status: 404, message: `Destination not found.` }; + } + const settings = await (0, import_common.listSettings)(); + return { + destination, + settings + }; + }) +}); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + destinationsRouter +}); diff --git a/apps/trpc-experimental/server/build/trpc/routers/index.js b/apps/trpc-experimental/server/build/trpc/routers/index.js new file mode 100644 index 000000000..a2eb93e72 --- /dev/null +++ b/apps/trpc-experimental/server/build/trpc/routers/index.js @@ -0,0 +1,25 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default")); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var routers_exports = {}; +module.exports = __toCommonJS(routers_exports); +__reExport(routers_exports, require("./auth"), module.exports); +__reExport(routers_exports, require("./dashboard"), module.exports); +__reExport(routers_exports, require("./settings"), module.exports); +__reExport(routers_exports, require("./applications"), module.exports); +__reExport(routers_exports, require("./services"), module.exports); +__reExport(routers_exports, require("./databases"), module.exports); +__reExport(routers_exports, require("./sources"), module.exports); +__reExport(routers_exports, require("./destinations"), module.exports); diff --git a/apps/trpc-experimental/server/build/trpc/routers/services/index.js b/apps/trpc-experimental/server/build/trpc/routers/services/index.js new file mode 100644 index 000000000..369203aaa --- /dev/null +++ b/apps/trpc-experimental/server/build/trpc/routers/services/index.js @@ -0,0 +1,846 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var services_exports = {}; +__export(services_exports, { + getServiceFromDB: () => getServiceFromDB, + servicesRouter: () => servicesRouter +}); +module.exports = __toCommonJS(services_exports); +var import_zod = require("zod"); +var import_js_yaml = __toESM(require("js-yaml")); +var import_promises = __toESM(require("fs/promises")); +var import_path = __toESM(require("path")); +var import_trpc = require("../../trpc"); +var import_common = require("../../../lib/common"); +var import_prisma = require("../../../prisma"); +var import_executeCommand = require("../../../lib/executeCommand"); +var import_lib = require("./lib"); +var import_docker = require("../../../lib/docker"); +var import_cuid = __toESM(require("cuid")); +var import_dayjs = require("../../../lib/dayjs"); +const servicesRouter = (0, import_trpc.router)({ + getLogs: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + containerId: import_zod.z.string(), + since: import_zod.z.number().optional().default(0) + }) + ).query(async ({ input, ctx }) => { + let { id, containerId, since } = input; + if (since !== 0) { + since = (0, import_dayjs.day)(since).unix(); + } + const { + destinationDockerId, + destinationDocker: { id: dockerId } + } = await import_prisma.prisma.service.findUnique({ + where: { id }, + include: { destinationDocker: true } + }); + if (destinationDockerId) { + try { + const { default: ansi } = await import("strip-ansi"); + const { stdout, stderr } = await (0, import_executeCommand.executeCommand)({ + dockerId, + command: `docker logs --since ${since} --tail 5000 --timestamps ${containerId}` + }); + const stripLogsStdout = stdout.toString().split("\n").map((l) => ansi(l)).filter((a) => a); + const stripLogsStderr = stderr.toString().split("\n").map((l) => ansi(l)).filter((a) => a); + const logs = stripLogsStderr.concat(stripLogsStdout); + const sortedLogs = logs.sort( + (a, b) => (0, import_dayjs.day)(a.split(" ")[0]).isAfter((0, import_dayjs.day)(b.split(" ")[0])) ? 1 : -1 + ); + return { + data: { + logs: sortedLogs + } + }; + } catch (error) { + const { statusCode, stderr } = error; + if (stderr.startsWith("Error: No such container")) { + return { + data: { + logs: [], + noContainer: true + } + }; + } + if (statusCode === 404) { + return { + data: { + logs: [] + } + }; + } + } + } + return { + message: "No logs found." + }; + }), + deleteStorage: import_trpc.privateProcedure.input( + import_zod.z.object({ + storageId: import_zod.z.string() + }) + ).mutation(async ({ input, ctx }) => { + const { storageId } = input; + await import_prisma.prisma.servicePersistentStorage.deleteMany({ where: { id: storageId } }); + }), + saveStorage: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + path: import_zod.z.string(), + isNewStorage: import_zod.z.boolean(), + storageId: import_zod.z.string().optional().nullable(), + containerId: import_zod.z.string().optional() + }) + ).mutation(async ({ input, ctx }) => { + const { id, path: path2, isNewStorage, storageId, containerId } = input; + if (isNewStorage) { + const volumeName = `${id}-custom${path2.replace(/\//gi, "-")}`; + const found = await import_prisma.prisma.servicePersistentStorage.findFirst({ + where: { path: path2, containerId } + }); + if (found) { + throw { + status: 500, + message: "Persistent storage already exists for this container and path." + }; + } + await import_prisma.prisma.servicePersistentStorage.create({ + data: { path: path2, volumeName, containerId, service: { connect: { id } } } + }); + } else { + await import_prisma.prisma.servicePersistentStorage.update({ + where: { id: storageId }, + data: { path: path2, containerId } + }); + } + }), + getStorages: import_trpc.privateProcedure.input(import_zod.z.object({ id: import_zod.z.string() })).query(async ({ input, ctx }) => { + const { id } = input; + const persistentStorages = await import_prisma.prisma.servicePersistentStorage.findMany({ + where: { serviceId: id } + }); + return { + success: true, + data: { + persistentStorages + } + }; + }), + deleteSecret: import_trpc.privateProcedure.input(import_zod.z.object({ id: import_zod.z.string(), name: import_zod.z.string() })).mutation(async ({ input, ctx }) => { + const { id, name } = input; + await import_prisma.prisma.serviceSecret.deleteMany({ where: { serviceId: id, name } }); + }), + saveService: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + name: import_zod.z.string(), + fqdn: import_zod.z.string().optional(), + exposePort: import_zod.z.string().optional(), + type: import_zod.z.string(), + serviceSetting: import_zod.z.any(), + version: import_zod.z.string().optional() + }) + ).mutation(async ({ input, ctx }) => { + const teamId = ctx.user?.teamId; + let { id, name, fqdn, exposePort, type, serviceSetting, version } = input; + if (fqdn) + fqdn = fqdn.toLowerCase(); + if (exposePort) + exposePort = Number(exposePort); + type = (0, import_common.fixType)(type); + const data = { + fqdn, + name, + exposePort, + version + }; + const templates = await (0, import_common.getTemplates)(); + const service = await import_prisma.prisma.service.findUnique({ where: { id } }); + const foundTemplate = templates.find((t) => (0, import_common.fixType)(t.type) === (0, import_common.fixType)(service.type)); + for (const setting of serviceSetting) { + let { id: settingId, name: name2, value, changed = false, isNew = false, variableName } = setting; + if (value) { + if (changed) { + await import_prisma.prisma.serviceSetting.update({ where: { id: settingId }, data: { value } }); + } + if (isNew) { + if (!variableName) { + variableName = foundTemplate?.variables.find((v) => v.name === name2).id; + } + await import_prisma.prisma.serviceSetting.create({ + data: { name: name2, value, variableName, service: { connect: { id } } } + }); + } + } + } + await import_prisma.prisma.service.update({ + where: { id }, + data + }); + }), + createSecret: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + name: import_zod.z.string(), + value: import_zod.z.string(), + isBuildSecret: import_zod.z.boolean().optional(), + isPRMRSecret: import_zod.z.boolean().optional(), + isNew: import_zod.z.boolean().optional() + }) + ).mutation(async ({ input }) => { + let { id, name, value, isNew } = input; + if (isNew) { + const found = await import_prisma.prisma.serviceSecret.findFirst({ where: { name, serviceId: id } }); + if (found) { + throw `Secret ${name} already exists.`; + } else { + value = (0, import_common.encrypt)(value.trim()); + await import_prisma.prisma.serviceSecret.create({ + data: { name, value, service: { connect: { id } } } + }); + } + } else { + value = (0, import_common.encrypt)(value.trim()); + const found = await import_prisma.prisma.serviceSecret.findFirst({ where: { serviceId: id, name } }); + if (found) { + await import_prisma.prisma.serviceSecret.updateMany({ + where: { serviceId: id, name }, + data: { value } + }); + } else { + await import_prisma.prisma.serviceSecret.create({ + data: { name, value, service: { connect: { id } } } + }); + } + } + }), + getSecrets: import_trpc.privateProcedure.input(import_zod.z.object({ id: import_zod.z.string() })).query(async ({ input, ctx }) => { + const { id } = input; + const teamId = ctx.user?.teamId; + const service = await getServiceFromDB({ id, teamId }); + let secrets = await import_prisma.prisma.serviceSecret.findMany({ + where: { serviceId: id }, + orderBy: { createdAt: "desc" } + }); + const templates = await (0, import_common.getTemplates)(); + if (!templates) + throw new Error("No templates found. Please contact support."); + const foundTemplate = templates.find((t) => (0, import_common.fixType)(t.type) === service.type); + secrets = secrets.map((secret) => { + const foundVariable = foundTemplate?.variables?.find((v) => v.name === secret.name) || null; + if (foundVariable) { + secret.readOnly = foundVariable.readOnly; + } + secret.value = (0, import_common.decrypt)(secret.value); + return secret; + }); + return { + success: true, + data: { + secrets + } + }; + }), + wordpress: import_trpc.privateProcedure.input(import_zod.z.object({ id: import_zod.z.string(), ftpEnabled: import_zod.z.boolean() })).mutation(async ({ input, ctx }) => { + const { id } = input; + const teamId = ctx.user?.teamId; + const { + service: { + destinationDocker: { engine, remoteEngine, remoteIpAddress } + } + } = await import_prisma.prisma.wordpress.findUnique({ + where: { serviceId: id }, + include: { service: { include: { destinationDocker: true } } } + }); + const publicPort = await (0, import_lib.getFreePublicPort)({ id, remoteEngine, engine, remoteIpAddress }); + let ftpUser = (0, import_cuid.default)(); + let ftpPassword = (0, import_lib.generatePassword)({}); + const hostkeyDir = import_common.isDev ? "/tmp/hostkeys" : "/app/ssl/hostkeys"; + try { + const data = await import_prisma.prisma.wordpress.update({ + where: { serviceId: id }, + data: { ftpEnabled }, + include: { service: { include: { destinationDocker: true } } } + }); + const { + service: { destinationDockerId, destinationDocker }, + ftpPublicPort, + ftpUser: user, + ftpPassword: savedPassword, + ftpHostKey, + ftpHostKeyPrivate + } = data; + const { network, engine: engine2 } = destinationDocker; + if (ftpEnabled) { + if (user) + ftpUser = user; + if (savedPassword) + ftpPassword = (0, import_common.decrypt)(savedPassword); + const { stdout: password } = await (0, import_executeCommand.executeCommand)({ + command: `echo ${ftpPassword} | openssl passwd -1 -stdin`, + shell: true + }); + if (destinationDockerId) { + try { + await import_promises.default.stat(hostkeyDir); + } catch (error) { + await (0, import_executeCommand.executeCommand)({ command: `mkdir -p ${hostkeyDir}` }); + } + if (!ftpHostKey) { + await (0, import_executeCommand.executeCommand)({ + command: `ssh-keygen -t ed25519 -f ssh_host_ed25519_key -N "" -q -f ${hostkeyDir}/${id}.ed25519` + }); + const { stdout: ftpHostKey2 } = await (0, import_executeCommand.executeCommand)({ + command: `cat ${hostkeyDir}/${id}.ed25519` + }); + await import_prisma.prisma.wordpress.update({ + where: { serviceId: id }, + data: { ftpHostKey: (0, import_common.encrypt)(ftpHostKey2) } + }); + } else { + await (0, import_executeCommand.executeCommand)({ + command: `echo "${(0, import_common.decrypt)(ftpHostKey)}" > ${hostkeyDir}/${id}.ed25519`, + shell: true + }); + } + if (!ftpHostKeyPrivate) { + await (0, import_executeCommand.executeCommand)({ + command: `ssh-keygen -t rsa -b 4096 -N "" -f ${hostkeyDir}/${id}.rsa` + }); + const { stdout: ftpHostKeyPrivate2 } = await (0, import_executeCommand.executeCommand)({ + command: `cat ${hostkeyDir}/${id}.rsa` + }); + await import_prisma.prisma.wordpress.update({ + where: { serviceId: id }, + data: { ftpHostKeyPrivate: (0, import_common.encrypt)(ftpHostKeyPrivate2) } + }); + } else { + await (0, import_executeCommand.executeCommand)({ + command: `echo "${(0, import_common.decrypt)(ftpHostKeyPrivate)}" > ${hostkeyDir}/${id}.rsa`, + shell: true + }); + } + await import_prisma.prisma.wordpress.update({ + where: { serviceId: id }, + data: { + ftpPublicPort: publicPort, + ftpUser: user ? void 0 : ftpUser, + ftpPassword: savedPassword ? void 0 : (0, import_common.encrypt)(ftpPassword) + } + }); + try { + const { found: isRunning } = await (0, import_docker.checkContainer)({ + dockerId: destinationDocker.id, + container: `${id}-ftp` + }); + if (isRunning) { + await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDocker.id, + command: `docker stop -t 0 ${id}-ftp && docker rm ${id}-ftp`, + shell: true + }); + } + } catch (error) { + } + const volumes = [ + `${id}-wordpress-data:/home/${ftpUser}/wordpress`, + `${import_common.isDev ? hostkeyDir : "/var/lib/docker/volumes/coolify-ssl-certs/_data/hostkeys"}/${id}.ed25519:/etc/ssh/ssh_host_ed25519_key`, + `${import_common.isDev ? hostkeyDir : "/var/lib/docker/volumes/coolify-ssl-certs/_data/hostkeys"}/${id}.rsa:/etc/ssh/ssh_host_rsa_key`, + `${import_common.isDev ? hostkeyDir : "/var/lib/docker/volumes/coolify-ssl-certs/_data/hostkeys"}/${id}.sh:/etc/sftp.d/chmod.sh` + ]; + const compose = { + version: "3.8", + services: { + [`${id}-ftp`]: { + image: `atmoz/sftp:alpine`, + command: `'${ftpUser}:${password.replace("\n", "").replace(/\$/g, "$$$")}:e:33'`, + extra_hosts: ["host.docker.internal:host-gateway"], + container_name: `${id}-ftp`, + volumes, + networks: [network], + depends_on: [], + restart: "always" + } + }, + networks: { + [network]: { + external: true + } + }, + volumes: { + [`${id}-wordpress-data`]: { + external: true, + name: `${id}-wordpress-data` + } + } + }; + await import_promises.default.writeFile( + `${hostkeyDir}/${id}.sh`, + `#!/bin/bash +chmod 600 /etc/ssh/ssh_host_ed25519_key /etc/ssh/ssh_host_rsa_key +userdel -f xfs +chown -R 33:33 /home/${ftpUser}/wordpress/` + ); + await (0, import_executeCommand.executeCommand)({ command: `chmod +x ${hostkeyDir}/${id}.sh` }); + await import_promises.default.writeFile(`${hostkeyDir}/${id}-docker-compose.yml`, import_js_yaml.default.dump(compose)); + await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDocker.id, + command: `docker compose -f ${hostkeyDir}/${id}-docker-compose.yml up -d` + }); + } + return { + publicPort, + ftpUser, + ftpPassword + }; + } else { + await import_prisma.prisma.wordpress.update({ + where: { serviceId: id }, + data: { ftpPublicPort: null } + }); + try { + await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDocker.id, + command: `docker stop -t 0 ${id}-ftp && docker rm ${id}-ftp`, + shell: true + }); + } catch (error) { + } + await (0, import_docker.stopTcpHttpProxy)(id, destinationDocker, ftpPublicPort); + } + } catch ({ status, message }) { + throw message; + } finally { + try { + await (0, import_executeCommand.executeCommand)({ + command: `rm -fr ${hostkeyDir}/${id}-docker-compose.yml ${hostkeyDir}/${id}.ed25519 ${hostkeyDir}/${id}.ed25519.pub ${hostkeyDir}/${id}.rsa ${hostkeyDir}/${id}.rsa.pub ${hostkeyDir}/${id}.sh` + }); + } catch (error) { + } + } + }), + start: import_trpc.privateProcedure.input(import_zod.z.object({ id: import_zod.z.string() })).mutation(async ({ input, ctx }) => { + const { id } = input; + const teamId = ctx.user?.teamId; + const service = await getServiceFromDB({ id, teamId }); + const arm = (0, import_common.isARM)(service.arch); + const { type, destinationDockerId, destinationDocker, persistentStorage, exposePort } = service; + const { workdir } = await (0, import_common.createDirectories)({ repository: type, buildId: id }); + const template = await (0, import_lib.parseAndFindServiceTemplates)(service, workdir, true); + const network = destinationDockerId && destinationDocker.network; + const config = {}; + for (const s in template.services) { + let newEnvironments = []; + if (arm) { + if (template.services[s]?.environmentArm?.length > 0) { + for (const environment of template.services[s].environmentArm) { + let [env, ...value] = environment.split("="); + value = value.join("="); + if (!value.startsWith("$$secret") && value !== "") { + newEnvironments.push(`${env}=${value}`); + } + } + } + } else { + if (template.services[s]?.environment?.length > 0) { + for (const environment of template.services[s].environment) { + let [env, ...value] = environment.split("="); + value = value.join("="); + if (!value.startsWith("$$secret") && value !== "") { + newEnvironments.push(`${env}=${value}`); + } + } + } + } + const secrets = await (0, import_lib.verifyAndDecryptServiceSecrets)(id); + for (const secret of secrets) { + const { name, value } = secret; + if (value) { + const foundEnv = !!template.services[s].environment?.find( + (env) => env.startsWith(`${name}=`) + ); + const foundNewEnv = !!newEnvironments?.find((env) => env.startsWith(`${name}=`)); + if (foundEnv && !foundNewEnv) { + newEnvironments.push(`${name}=${value}`); + } + if (!foundEnv && !foundNewEnv && s === id) { + newEnvironments.push(`${name}=${value}`); + } + } + } + const customVolumes = await import_prisma.prisma.servicePersistentStorage.findMany({ + where: { serviceId: id } + }); + let volumes = /* @__PURE__ */ new Set(); + if (arm) { + template.services[s]?.volumesArm && template.services[s].volumesArm.length > 0 && template.services[s].volumesArm.forEach((v) => volumes.add(v)); + } else { + template.services[s]?.volumes && template.services[s].volumes.length > 0 && template.services[s].volumes.forEach((v) => volumes.add(v)); + } + if (service.type === "plausibleanalytics" && service.plausibleAnalytics?.id) { + let temp = Array.from(volumes); + temp.forEach((a) => { + const t = a.replace(service.id, service.plausibleAnalytics.id); + volumes.delete(a); + volumes.add(t); + }); + } + if (customVolumes.length > 0) { + for (const customVolume of customVolumes) { + const { volumeName, path: path2, containerId } = customVolume; + if (volumes && volumes.size > 0 && !volumes.has(`${volumeName}:${path2}`) && containerId === service) { + volumes.add(`${volumeName}:${path2}`); + } + } + } + let ports = []; + if (template.services[s].proxy?.length > 0) { + for (const proxy of template.services[s].proxy) { + if (proxy.hostPort) { + ports.push(`${proxy.hostPort}:${proxy.port}`); + } + } + } else { + if (template.services[s].ports?.length === 1) { + for (const port of template.services[s].ports) { + if (exposePort) { + ports.push(`${exposePort}:${port}`); + } + } + } + } + let image = template.services[s].image; + if (arm && template.services[s].imageArm) { + image = template.services[s].imageArm; + } + config[s] = { + container_name: s, + build: template.services[s].build || void 0, + command: template.services[s].command, + entrypoint: template.services[s]?.entrypoint, + image, + expose: template.services[s].ports, + ports: ports.length > 0 ? ports : void 0, + volumes: Array.from(volumes), + environment: newEnvironments, + depends_on: template.services[s]?.depends_on, + ulimits: template.services[s]?.ulimits, + cap_drop: template.services[s]?.cap_drop, + cap_add: template.services[s]?.cap_add, + labels: (0, import_common.makeLabelForServices)(type), + ...(0, import_docker.defaultComposeConfiguration)(network) + }; + if (template.services[s]?.files?.length > 0) { + if (!config[s].build) { + config[s].build = { + context: workdir, + dockerfile: `Dockerfile.${s}` + }; + } + let Dockerfile = ` + FROM ${template.services[s].image}`; + for (const file of template.services[s].files) { + const { location, content } = file; + const source = import_path.default.join(workdir, location); + await import_promises.default.mkdir(import_path.default.dirname(source), { recursive: true }); + await import_promises.default.writeFile(source, content); + Dockerfile += ` + COPY .${location} ${location}`; + } + await import_promises.default.writeFile(`${workdir}/Dockerfile.${s}`, Dockerfile); + } + } + const { volumeMounts } = (0, import_lib.persistentVolumes)(id, persistentStorage, config); + const composeFile = { + version: "3.8", + services: config, + networks: { + [network]: { + external: true + } + }, + volumes: volumeMounts + }; + const composeFileDestination = `${workdir}/docker-compose.yaml`; + await import_promises.default.writeFile(composeFileDestination, import_js_yaml.default.dump(composeFile)); + let fastify = null; + await (0, import_lib.startServiceContainers)(fastify, id, teamId, destinationDocker.id, composeFileDestination); + if (service.type === "minio") { + try { + const { stdout: containers } = await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDocker.id, + command: `docker container ls -a --filter 'name=${id}-' --format {{.ID}}` + }); + if (containers) { + const containerArray = containers.split("\n"); + if (containerArray.length > 0) { + for (const container of containerArray) { + await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDockerId, + command: `docker stop -t 0 ${container}` + }); + await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDockerId, + command: `docker rm --force ${container}` + }); + } + } + } + } catch (error) { + } + try { + const { stdout: containers } = await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDocker.id, + command: `docker container ls -a --filter 'name=${id}-' --format {{.ID}}` + }); + if (containers) { + const containerArray = containers.split("\n"); + if (containerArray.length > 0) { + for (const container of containerArray) { + await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDockerId, + command: `docker stop -t 0 ${container}` + }); + await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDockerId, + command: `docker rm --force ${container}` + }); + } + } + } + } catch (error) { + } + } + }), + stop: import_trpc.privateProcedure.input(import_zod.z.object({ id: import_zod.z.string() })).mutation(async ({ input, ctx }) => { + const { id } = input; + const teamId = ctx.user?.teamId; + const { destinationDockerId } = await getServiceFromDB({ id, teamId }); + if (destinationDockerId) { + const { stdout: containers } = await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDockerId, + command: `docker ps -a --filter 'label=com.docker.compose.project=${id}' --format {{.ID}}` + }); + if (containers) { + const containerArray = containers.split("\n"); + if (containerArray.length > 0) { + for (const container of containerArray) { + await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDockerId, + command: `docker stop -t 0 ${container}` + }); + await (0, import_executeCommand.executeCommand)({ + dockerId: destinationDockerId, + command: `docker rm --force ${container}` + }); + } + } + } + return {}; + } + }), + getServices: import_trpc.privateProcedure.input(import_zod.z.object({ id: import_zod.z.string() })).query(async ({ input, ctx }) => { + const { id } = input; + const teamId = ctx.user?.teamId; + const service = await getServiceFromDB({ id, teamId }); + if (!service) { + throw { status: 404, message: "Service not found." }; + } + let template = {}; + let tags = []; + if (service.type) { + template = await (0, import_lib.parseAndFindServiceTemplates)(service); + tags = await (0, import_common.getTags)(service.type); + } + return { + success: true, + data: { + settings: await (0, import_common.listSettings)(), + service, + template, + tags + } + }; + }), + status: import_trpc.privateProcedure.input(import_zod.z.object({ id: import_zod.z.string() })).query(async ({ ctx, input }) => { + const id = input.id; + const teamId = ctx.user?.teamId; + if (!teamId) { + throw { status: 400, message: "Team not found." }; + } + const service = await getServiceFromDB({ id, teamId }); + const { destinationDockerId } = service; + let payload = {}; + if (destinationDockerId) { + const { stdout: containers } = await (0, import_executeCommand.executeCommand)({ + dockerId: service.destinationDocker.id, + command: `docker ps -a --filter "label=com.docker.compose.project=${id}" --format '{{json .}}'` + }); + if (containers) { + const containersArray = containers.trim().split("\n"); + if (containersArray.length > 0 && containersArray[0] !== "") { + const templates = await (0, import_common.getTemplates)(); + let template = templates.find((t) => t.type === service.type); + const templateStr = JSON.stringify(template); + if (templateStr) { + template = JSON.parse(templateStr.replaceAll("$$id", service.id)); + } + for (const container of containersArray) { + let isRunning = false; + let isExited = false; + let isRestarting = false; + let isExcluded = false; + const containerObj = JSON.parse(container); + const exclude = template?.services[containerObj.Names]?.exclude; + if (exclude) { + payload[containerObj.Names] = { + status: { + isExcluded: true, + isRunning: false, + isExited: false, + isRestarting: false + } + }; + continue; + } + const status = containerObj.State; + if (status === "running") { + isRunning = true; + } + if (status === "exited") { + isExited = true; + } + if (status === "restarting") { + isRestarting = true; + } + payload[containerObj.Names] = { + status: { + isExcluded, + isRunning, + isExited, + isRestarting + } + }; + } + } + } + } + return payload; + }), + cleanup: import_trpc.privateProcedure.query(async ({ ctx }) => { + const teamId = ctx.user?.teamId; + let services = await import_prisma.prisma.service.findMany({ + where: { teams: { some: { id: teamId === "0" ? void 0 : teamId } } }, + include: { destinationDocker: true, teams: true } + }); + for (const service of services) { + if (!service.fqdn) { + if (service.destinationDockerId) { + const { stdout: containers } = await (0, import_executeCommand.executeCommand)({ + dockerId: service.destinationDockerId, + command: `docker ps -a --filter 'label=com.docker.compose.project=${service.id}' --format {{.ID}}` + }); + if (containers) { + const containerArray = containers.split("\n"); + if (containerArray.length > 0) { + for (const container of containerArray) { + await (0, import_executeCommand.executeCommand)({ + dockerId: service.destinationDockerId, + command: `docker stop -t 0 ${container}` + }); + await (0, import_executeCommand.executeCommand)({ + dockerId: service.destinationDockerId, + command: `docker rm --force ${container}` + }); + } + } + } + } + await (0, import_common.removeService)({ id: service.id }); + } + } + }), + delete: import_trpc.privateProcedure.input(import_zod.z.object({ force: import_zod.z.boolean(), id: import_zod.z.string() })).mutation(async ({ input }) => { + const { id } = input; + await import_prisma.prisma.serviceSecret.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.serviceSetting.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.servicePersistentStorage.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.meiliSearch.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.fider.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.ghost.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.umami.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.hasura.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.plausibleAnalytics.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.minio.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.vscodeserver.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.wordpress.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.glitchTip.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.moodle.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.appwrite.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.searxng.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.weblate.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.taiga.deleteMany({ where: { serviceId: id } }); + await import_prisma.prisma.service.delete({ where: { id } }); + return {}; + }) +}); +async function getServiceFromDB({ + id, + teamId +}) { + const settings = await import_prisma.prisma.setting.findFirst(); + const body = await import_prisma.prisma.service.findFirst({ + where: { id, teams: { some: { id: teamId === "0" ? void 0 : teamId } } }, + include: { + destinationDocker: true, + persistentStorage: true, + serviceSecret: true, + serviceSetting: true, + wordpress: true, + plausibleAnalytics: true + } + }); + if (!body) { + return null; + } + if (body?.serviceSecret.length > 0) { + body.serviceSecret = body.serviceSecret.map((s) => { + s.value = (0, import_common.decrypt)(s.value); + return s; + }); + } + if (body.wordpress) { + body.wordpress.ftpPassword = (0, import_common.decrypt)(body.wordpress.ftpPassword); + } + return { ...body, settings }; +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + getServiceFromDB, + servicesRouter +}); diff --git a/apps/trpc-experimental/server/build/trpc/routers/services/lib.js b/apps/trpc-experimental/server/build/trpc/routers/services/lib.js new file mode 100644 index 000000000..f374502d9 --- /dev/null +++ b/apps/trpc-experimental/server/build/trpc/routers/services/lib.js @@ -0,0 +1,371 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var lib_exports = {}; +__export(lib_exports, { + generatePassword: () => generatePassword, + getFreePublicPort: () => getFreePublicPort, + parseAndFindServiceTemplates: () => parseAndFindServiceTemplates, + persistentVolumes: () => persistentVolumes, + startServiceContainers: () => startServiceContainers, + verifyAndDecryptServiceSecrets: () => verifyAndDecryptServiceSecrets +}); +module.exports = __toCommonJS(lib_exports); +var import_common = require("../../../lib/common"); +var import_bcryptjs = __toESM(require("bcryptjs")); +var import_prisma = require("../../../prisma"); +var import_crypto = __toESM(require("crypto")); +var import_executeCommand = require("../../../lib/executeCommand"); +async function parseAndFindServiceTemplates(service, workdir, isDeploy = false) { + const templates = await (0, import_common.getTemplates)(); + const foundTemplate = templates.find((t) => (0, import_common.fixType)(t.type) === service.type); + let parsedTemplate = {}; + if (foundTemplate) { + if (!isDeploy) { + for (const [key, value] of Object.entries(foundTemplate.services)) { + const realKey = key.replace("$$id", service.id); + let name = value.name; + if (!name) { + if (Object.keys(foundTemplate.services).length === 1) { + name = foundTemplate.name || service.name.toLowerCase(); + } else { + if (key === "$$id") { + name = foundTemplate.name || key.replaceAll("$$id-", "") || service.name.toLowerCase(); + } else { + name = key.replaceAll("$$id-", "") || service.name.toLowerCase(); + } + } + } + parsedTemplate[realKey] = { + value, + name, + documentation: value.documentation || foundTemplate.documentation || "https://docs.coollabs.io", + image: value.image, + files: value?.files, + environment: [], + fqdns: [], + hostPorts: [], + proxy: {} + }; + if (value.environment?.length > 0) { + for (const env of value.environment) { + let [envKey, ...envValue] = env.split("="); + envValue = envValue.join("="); + let variable = null; + if (foundTemplate?.variables) { + variable = foundTemplate?.variables.find((v) => v.name === envKey) || foundTemplate?.variables.find((v) => v.id === envValue); + } + if (variable) { + const id = variable.id.replaceAll("$$", ""); + const label = variable?.label; + const description = variable?.description; + const defaultValue = variable?.defaultValue; + const main = variable?.main || "$$id"; + const type = variable?.type || "input"; + const placeholder = variable?.placeholder || ""; + const readOnly = variable?.readOnly || false; + const required = variable?.required || false; + if (envValue.startsWith("$$config") || variable?.showOnConfiguration) { + if (envValue.startsWith("$$config_coolify")) { + continue; + } + parsedTemplate[realKey].environment.push({ + id, + name: envKey, + value: envValue, + main, + label, + description, + defaultValue, + type, + placeholder, + required, + readOnly + }); + } + } + } + } + if (value?.proxy && value.proxy.length > 0) { + for (const proxyValue of value.proxy) { + if (proxyValue.domain) { + const variable = foundTemplate?.variables.find((v) => v.id === proxyValue.domain); + if (variable) { + const { id, name: name2, label, description, defaultValue, required = false } = variable; + const found = await import_prisma.prisma.serviceSetting.findFirst({ + where: { serviceId: service.id, variableName: proxyValue.domain } + }); + parsedTemplate[realKey].fqdns.push({ + id, + name: name2, + value: found?.value || "", + label, + description, + defaultValue, + required + }); + } + } + if (proxyValue.hostPort) { + const variable = foundTemplate?.variables.find((v) => v.id === proxyValue.hostPort); + if (variable) { + const { id, name: name2, label, description, defaultValue, required = false } = variable; + const found = await import_prisma.prisma.serviceSetting.findFirst({ + where: { serviceId: service.id, variableName: proxyValue.hostPort } + }); + parsedTemplate[realKey].hostPorts.push({ + id, + name: name2, + value: found?.value || "", + label, + description, + defaultValue, + required + }); + } + } + } + } + } + } else { + parsedTemplate = foundTemplate; + } + let strParsedTemplate = JSON.stringify(parsedTemplate); + strParsedTemplate = strParsedTemplate.replaceAll("$$id", service.id); + strParsedTemplate = strParsedTemplate.replaceAll( + "$$core_version", + service.version || foundTemplate.defaultVersion + ); + if (workdir) { + strParsedTemplate = strParsedTemplate.replaceAll("$$workdir", workdir); + } + if (service.serviceSetting.length > 0) { + for (const setting of service.serviceSetting) { + const { value, variableName } = setting; + const regex = new RegExp(`\\$\\$config_${variableName.replace("$$config_", "")}"`, "gi"); + if (value === "$$generate_fqdn") { + strParsedTemplate = strParsedTemplate.replaceAll(regex, service.fqdn + '"' || '"'); + } else if (value === "$$generate_fqdn_slash") { + strParsedTemplate = strParsedTemplate.replaceAll(regex, service.fqdn + '/"'); + } else if (value === "$$generate_domain") { + strParsedTemplate = strParsedTemplate.replaceAll(regex, (0, import_common.getDomain)(service.fqdn) + '"'); + } else if (service.destinationDocker?.network && value === "$$generate_network") { + strParsedTemplate = strParsedTemplate.replaceAll( + regex, + service.destinationDocker.network + '"' + ); + } else { + strParsedTemplate = strParsedTemplate.replaceAll(regex, value + '"'); + } + } + } + if (service.serviceSecret.length > 0) { + for (const secret of service.serviceSecret) { + let { name, value } = secret; + name = name.toLowerCase(); + const regexHashed = new RegExp(`\\$\\$hashed\\$\\$secret_${name}`, "gi"); + const regex = new RegExp(`\\$\\$secret_${name}`, "gi"); + if (value) { + strParsedTemplate = strParsedTemplate.replaceAll( + regexHashed, + import_bcryptjs.default.hashSync(value.replaceAll('"', '\\"'), 10) + ); + strParsedTemplate = strParsedTemplate.replaceAll(regex, value.replaceAll('"', '\\"')); + } else { + strParsedTemplate = strParsedTemplate.replaceAll(regexHashed, ""); + strParsedTemplate = strParsedTemplate.replaceAll(regex, ""); + } + } + } + parsedTemplate = JSON.parse(strParsedTemplate); + } + return parsedTemplate; +} +function generatePassword({ + length = 24, + symbols = false, + isHex = false +}) { + if (isHex) { + return import_crypto.default.randomBytes(length).toString("hex"); + } + const password = generator.generate({ + length, + numbers: true, + strict: true, + symbols + }); + return password; +} +async function getFreePublicPort({ id, remoteEngine, engine, remoteIpAddress }) { + const { default: isReachable } = await import("is-port-reachable"); + const data = await import_prisma.prisma.setting.findFirst(); + const { minPort, maxPort } = data; + if (remoteEngine) { + const dbUsed = await (await import_prisma.prisma.database.findMany({ + where: { + publicPort: { not: null }, + id: { not: id }, + destinationDocker: { remoteIpAddress } + }, + select: { publicPort: true } + })).map((a) => a.publicPort); + const wpFtpUsed = await (await import_prisma.prisma.wordpress.findMany({ + where: { + ftpPublicPort: { not: null }, + id: { not: id }, + service: { destinationDocker: { remoteIpAddress } } + }, + select: { ftpPublicPort: true } + })).map((a) => a.ftpPublicPort); + const wpUsed = await (await import_prisma.prisma.wordpress.findMany({ + where: { + mysqlPublicPort: { not: null }, + id: { not: id }, + service: { destinationDocker: { remoteIpAddress } } + }, + select: { mysqlPublicPort: true } + })).map((a) => a.mysqlPublicPort); + const minioUsed = await (await import_prisma.prisma.minio.findMany({ + where: { + publicPort: { not: null }, + id: { not: id }, + service: { destinationDocker: { remoteIpAddress } } + }, + select: { publicPort: true } + })).map((a) => a.publicPort); + const usedPorts = [...dbUsed, ...wpFtpUsed, ...wpUsed, ...minioUsed]; + const range = (0, import_common.generateRangeArray)(minPort, maxPort); + const availablePorts = range.filter((port) => !usedPorts.includes(port)); + for (const port of availablePorts) { + const found = await isReachable(port, { host: remoteIpAddress }); + if (!found) { + return port; + } + } + return false; + } else { + const dbUsed = await (await import_prisma.prisma.database.findMany({ + where: { publicPort: { not: null }, id: { not: id }, destinationDocker: { engine } }, + select: { publicPort: true } + })).map((a) => a.publicPort); + const wpFtpUsed = await (await import_prisma.prisma.wordpress.findMany({ + where: { + ftpPublicPort: { not: null }, + id: { not: id }, + service: { destinationDocker: { engine } } + }, + select: { ftpPublicPort: true } + })).map((a) => a.ftpPublicPort); + const wpUsed = await (await import_prisma.prisma.wordpress.findMany({ + where: { + mysqlPublicPort: { not: null }, + id: { not: id }, + service: { destinationDocker: { engine } } + }, + select: { mysqlPublicPort: true } + })).map((a) => a.mysqlPublicPort); + const minioUsed = await (await import_prisma.prisma.minio.findMany({ + where: { + publicPort: { not: null }, + id: { not: id }, + service: { destinationDocker: { engine } } + }, + select: { publicPort: true } + })).map((a) => a.publicPort); + const usedPorts = [...dbUsed, ...wpFtpUsed, ...wpUsed, ...minioUsed]; + const range = (0, import_common.generateRangeArray)(minPort, maxPort); + const availablePorts = range.filter((port) => !usedPorts.includes(port)); + for (const port of availablePorts) { + const found = await isReachable(port, { host: "localhost" }); + if (!found) { + return port; + } + } + return false; + } +} +async function verifyAndDecryptServiceSecrets(id) { + const secrets = await import_prisma.prisma.serviceSecret.findMany({ where: { serviceId: id } }); + let decryptedSecrets = secrets.map((secret) => { + const { name, value } = secret; + if (value) { + let rawValue = (0, import_common.decrypt)(value); + rawValue = rawValue.replaceAll(/\$/gi, "$$$"); + return { name, value: rawValue }; + } + return { name, value }; + }); + return decryptedSecrets; +} +function persistentVolumes(id, persistentStorage, config) { + let volumeSet = /* @__PURE__ */ new Set(); + if (Object.keys(config).length > 0) { + for (const [key, value] of Object.entries(config)) { + if (value.volumes) { + for (const volume of value.volumes) { + if (!volume.startsWith("/")) { + volumeSet.add(volume); + } + } + } + } + } + const volumesArray = Array.from(volumeSet); + const persistentVolume = persistentStorage?.map((storage) => { + return `${id}${storage.path.replace(/\//gi, "-")}:${storage.path}`; + }) || []; + let volumes = [...persistentVolume]; + if (volumesArray) + volumes = [...volumesArray, ...volumes]; + const composeVolumes = volumes.length > 0 && volumes.map((volume) => { + return { + [`${volume.split(":")[0]}`]: { + name: volume.split(":")[0] + } + }; + }) || []; + const volumeMounts = Object.assign({}, ...composeVolumes) || {}; + return { volumeMounts }; +} +async function startServiceContainers(fastify, id, teamId, dockerId, composeFileDestination) { + try { + await (0, import_executeCommand.executeCommand)({ dockerId, command: `docker compose -f ${composeFileDestination} pull` }); + } catch (error) { + } + await (0, import_executeCommand.executeCommand)({ dockerId, command: `docker compose -f ${composeFileDestination} build --no-cache` }); + await (0, import_executeCommand.executeCommand)({ dockerId, command: `docker compose -f ${composeFileDestination} create` }); + await (0, import_executeCommand.executeCommand)({ dockerId, command: `docker compose -f ${composeFileDestination} start` }); + await (0, import_common.asyncSleep)(1e3); + await (0, import_executeCommand.executeCommand)({ dockerId, command: `docker compose -f ${composeFileDestination} up -d` }); +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + generatePassword, + getFreePublicPort, + parseAndFindServiceTemplates, + persistentVolumes, + startServiceContainers, + verifyAndDecryptServiceSecrets +}); diff --git a/apps/trpc-experimental/server/build/trpc/routers/settings.js b/apps/trpc-experimental/server/build/trpc/routers/settings.js new file mode 100644 index 000000000..425a0d819 --- /dev/null +++ b/apps/trpc-experimental/server/build/trpc/routers/settings.js @@ -0,0 +1,108 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var settings_exports = {}; +__export(settings_exports, { + settingsRouter: () => settingsRouter +}); +module.exports = __toCommonJS(settings_exports); +var import_trpc = require("../trpc"); +var import_server = require("@trpc/server"); +var import_common = require("../../lib/common"); +var import_env = require("../../env"); +var import_jsonwebtoken = __toESM(require("jsonwebtoken")); +const settingsRouter = (0, import_trpc.router)({ + getBaseSettings: import_trpc.publicProcedure.query(async () => { + const settings = await (0, import_common.listSettings)(); + return { + success: true, + data: { + isRegistrationEnabled: settings?.isRegistrationEnabled + } + }; + }), + getInstanceSettings: import_trpc.privateProcedure.query(async ({ ctx }) => { + try { + const settings = await (0, import_common.listSettings)(); + let isAdmin = false; + let permission = null; + let token = null; + let pendingInvitations = []; + if (!settings) { + throw new import_server.TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "An unexpected error occurred, please try again later." + }); + } + if (ctx.user) { + const currentUser = await (0, import_common.getCurrentUser)(ctx.user.userId); + if (currentUser) { + const foundPermission = currentUser.permission.find( + (p) => p.teamId === ctx.user?.teamId + )?.permission; + if (foundPermission) { + permission = foundPermission; + isAdmin = foundPermission === "owner" || foundPermission === "admin"; + } + const payload = { + userId: ctx.user?.userId, + teamId: ctx.user?.teamId, + permission, + isAdmin, + iat: Math.floor(Date.now() / 1e3) + }; + token = import_jsonwebtoken.default.sign(payload, import_env.env.COOLIFY_SECRET_KEY); + } + pendingInvitations = await (0, import_common.getTeamInvitation)(ctx.user.userId); + } + return { + success: true, + data: { + token, + userId: ctx.user?.userId, + teamId: ctx.user?.teamId, + permission, + isAdmin, + ipv4: ctx.user?.teamId ? settings.ipv4 : null, + ipv6: ctx.user?.teamId ? settings.ipv6 : null, + version: import_common.version, + whiteLabeled: import_env.env.COOLIFY_WHITE_LABELED === "true", + whiteLabeledIcon: import_env.env.COOLIFY_WHITE_LABELED_ICON, + isRegistrationEnabled: settings.isRegistrationEnabled, + pendingInvitations + } + }; + } catch (error) { + throw new import_server.TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "An unexpected error occurred, please try again later.", + cause: error + }); + } + }) +}); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + settingsRouter +}); diff --git a/apps/trpc-experimental/server/build/trpc/routers/sources/index.js b/apps/trpc-experimental/server/build/trpc/routers/sources/index.js new file mode 100644 index 000000000..08f10e593 --- /dev/null +++ b/apps/trpc-experimental/server/build/trpc/routers/sources/index.js @@ -0,0 +1,241 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var sources_exports = {}; +__export(sources_exports, { + sourcesRouter: () => sourcesRouter +}); +module.exports = __toCommonJS(sources_exports); +var import_zod = require("zod"); +var import_trpc = require("../../trpc"); +var import_common = require("../../../lib/common"); +var import_prisma = require("../../../prisma"); +var import_cuid = __toESM(require("cuid")); +const sourcesRouter = (0, import_trpc.router)({ + save: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + name: import_zod.z.string(), + htmlUrl: import_zod.z.string(), + apiUrl: import_zod.z.string(), + customPort: import_zod.z.number(), + customUser: import_zod.z.string(), + isSystemWide: import_zod.z.boolean().default(false) + }) + ).mutation(async ({ input, ctx }) => { + let { id, name, htmlUrl, apiUrl, customPort, customUser, isSystemWide } = input; + if (customPort) + customPort = Number(customPort); + await import_prisma.prisma.gitSource.update({ + where: { id }, + data: { name, htmlUrl, apiUrl, customPort, customUser, isSystemWide } + }); + }), + newGitHubApp: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + name: import_zod.z.string(), + htmlUrl: import_zod.z.string(), + apiUrl: import_zod.z.string(), + organization: import_zod.z.string(), + customPort: import_zod.z.number(), + isSystemWide: import_zod.z.boolean().default(false) + }) + ).mutation(async ({ ctx, input }) => { + const { teamId } = ctx.user; + let { id, name, htmlUrl, apiUrl, organization, customPort, isSystemWide } = input; + if (customPort) + customPort = Number(customPort); + if (id === "new") { + const newId = (0, import_cuid.default)(); + await import_prisma.prisma.gitSource.create({ + data: { + id: newId, + name, + htmlUrl, + apiUrl, + organization, + customPort, + isSystemWide, + type: "github", + teams: { connect: { id: teamId } } + } + }); + return { + id: newId + }; + } + return null; + }), + newGitLabApp: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string(), + type: import_zod.z.string(), + name: import_zod.z.string(), + htmlUrl: import_zod.z.string(), + apiUrl: import_zod.z.string(), + oauthId: import_zod.z.number(), + appId: import_zod.z.string(), + appSecret: import_zod.z.string(), + groupName: import_zod.z.string().optional().nullable(), + customPort: import_zod.z.number().optional().nullable(), + customUser: import_zod.z.string().optional().nullable() + }) + ).mutation(async ({ input, ctx }) => { + const { teamId } = ctx.user; + let { + id, + type, + name, + htmlUrl, + apiUrl, + oauthId, + appId, + appSecret, + groupName, + customPort, + customUser + } = input; + if (oauthId) + oauthId = Number(oauthId); + if (customPort) + customPort = Number(customPort); + const encryptedAppSecret = (0, import_common.encrypt)(appSecret); + if (id === "new") { + const newId = (0, import_cuid.default)(); + await import_prisma.prisma.gitSource.create({ + data: { + id: newId, + type, + apiUrl, + htmlUrl, + name, + customPort, + customUser, + teams: { connect: { id: teamId } } + } + }); + await import_prisma.prisma.gitlabApp.create({ + data: { + teams: { connect: { id: teamId } }, + appId, + oauthId, + groupName, + appSecret: encryptedAppSecret, + gitSource: { connect: { id: newId } } + } + }); + return { + status: 201, + id: newId + }; + } else { + await import_prisma.prisma.gitSource.update({ + where: { id }, + data: { type, apiUrl, htmlUrl, name, customPort, customUser } + }); + await import_prisma.prisma.gitlabApp.update({ + where: { id }, + data: { + appId, + oauthId, + groupName, + appSecret: encryptedAppSecret + } + }); + } + }), + delete: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string() + }) + ).mutation(async ({ input, ctx }) => { + const { id } = input; + const source = await import_prisma.prisma.gitSource.delete({ + where: { id }, + include: { githubApp: true, gitlabApp: true } + }); + if (source.githubAppId) { + await import_prisma.prisma.githubApp.delete({ where: { id: source.githubAppId } }); + } + if (source.gitlabAppId) { + await import_prisma.prisma.gitlabApp.delete({ where: { id: source.gitlabAppId } }); + } + }), + getSourceById: import_trpc.privateProcedure.input( + import_zod.z.object({ + id: import_zod.z.string() + }) + ).query(async ({ input, ctx }) => { + const { id } = input; + const { teamId } = ctx.user; + const settings = await import_prisma.prisma.setting.findFirst({}); + if (id === "new") { + return { + source: { + name: null, + type: null, + htmlUrl: null, + apiUrl: null, + organization: null, + customPort: 22, + customUser: "git" + }, + settings + }; + } + const source = await import_prisma.prisma.gitSource.findFirst({ + where: { + id, + OR: [ + { teams: { some: { id: teamId === "0" ? void 0 : teamId } } }, + { isSystemWide: true } + ] + }, + include: { githubApp: true, gitlabApp: true } + }); + if (!source) { + throw { status: 404, message: "Source not found." }; + } + if (source?.githubApp?.clientSecret) + source.githubApp.clientSecret = (0, import_common.decrypt)(source.githubApp.clientSecret); + if (source?.githubApp?.webhookSecret) + source.githubApp.webhookSecret = (0, import_common.decrypt)(source.githubApp.webhookSecret); + if (source?.githubApp?.privateKey) + source.githubApp.privateKey = (0, import_common.decrypt)(source.githubApp.privateKey); + if (source?.gitlabApp?.appSecret) + source.gitlabApp.appSecret = (0, import_common.decrypt)(source.gitlabApp.appSecret); + return { + success: true, + data: { + source, + settings + } + }; + }) +}); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + sourcesRouter +}); diff --git a/apps/trpc-experimental/server/build/trpc/trpc.js b/apps/trpc-experimental/server/build/trpc/trpc.js new file mode 100644 index 000000000..1b7ee2c0f --- /dev/null +++ b/apps/trpc-experimental/server/build/trpc/trpc.js @@ -0,0 +1,65 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var trpc_exports = {}; +__export(trpc_exports, { + privateProcedure: () => privateProcedure, + publicProcedure: () => publicProcedure, + router: () => router +}); +module.exports = __toCommonJS(trpc_exports); +var import_server = require("@trpc/server"); +var import_superjson = __toESM(require("superjson")); +const t = import_server.initTRPC.context().create({ + transformer: import_superjson.default, + errorFormatter({ shape }) { + return shape; + } +}); +const logger = t.middleware(async ({ path, type, next }) => { + const start = Date.now(); + const result = await next(); + const durationMs = Date.now() - start; + result.ok ? console.log("OK request timing:", { path, type, durationMs }) : console.log("Non-OK request timing", { path, type, durationMs }); + return result; +}); +const isAdmin = t.middleware(async ({ ctx, next }) => { + if (!ctx.user) { + throw new import_server.TRPCError({ code: "UNAUTHORIZED" }); + } + return next({ + ctx: { + user: ctx.user + } + }); +}); +const router = t.router; +const privateProcedure = t.procedure.use(isAdmin); +const publicProcedure = t.procedure; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + privateProcedure, + publicProcedure, + router +}); diff --git a/apps/server/db/.gitkeep b/apps/trpc-experimental/server/db/.gitkeep similarity index 100% rename from apps/server/db/.gitkeep rename to apps/trpc-experimental/server/db/.gitkeep diff --git a/apps/trpc-experimental/server/db/dev.db b/apps/trpc-experimental/server/db/dev.db new file mode 100644 index 0000000000000000000000000000000000000000..3aba23ddd8cf0d00f38e179b533c6e419b495502 GIT binary patch literal 1970176 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�qZl+SjL7BX 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

G=4I>!ML- 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 ^6j~xn!r0O~kQRFj;uIS<04(M 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

6nXRq9sebIFXUV8b9 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

ERv5j!UmR~7cH6D;>`#64j2X(h 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

  • q)1HDP+2TK0MWM&b2UwOBqUufF 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 Jy?3+a{{g#AS2X|t literal 0 HcmV?d00001 diff --git a/apps/trpc-experimental/server/db/migration.db-journal b/apps/trpc-experimental/server/db/migration.db-journal new file mode 100644 index 0000000000000000000000000000000000000000..3deb841d82287a109b715e4da5c19b8d4ae29c8f GIT binary patch literal 29240 zcmeHPO>ZPe8J<8ed+qE%I0?yIauN2Uu-R$I4512>TiI!}_nNX5rw=^c|I&7fGo=z(5e`>@A#IZz z)N^fv$v_xPC>uapN;r<|QS3pZ9&)8(1PeuMD=?+BEX-URo1Su9i~zdCrjh{)a`sPaJ6wnHQ#UI6fs1I=TP+Za(nTt)(uaR=B8Fy|mw%chQ` z7N`>E#3r_6ENS-TR|i0e2UwA5`&Xpw_>Hz;jiK06HApeO{9^z7Qz^zv2}Vl+9iTl1 zGXu+@(lZU$Gd)9^lG@z!gaU4X$dpzPAcaP`$1Ef%BGl!c62ild@|df*Ff9+6(jo{r z^q{{OF@}Q_^r~#q@a6#Z1 zuIosHQ)VMXltdP#&-tq&yD< zkT(0|5FB!`YZ70D*FXmq>owv5X`kikU@T4WBK>`~aQ~)Gbn!<31asiYp zndM2< zR0$O*%asnYlm!Ot08o>pCcFRBFhtzJNDx)6IW8;tbcwz#g%G5D30R^Y#Isy zIPl8U;Gi=G0vF*p*pw!f95G@tP;kb&R@WJ7gVKiJq73RC=PF?U*R2J+kD}4>0gEU(mP4Dw@d#i{j>C8 z=^v%Pm;PG%bLo$z-<5t_dbjke(mTapPJfRs8E2q+-^}7OX0Z^q0(mWZt^oq{Subv< zzx_(5(+CBN!**+1#&Ou%jeI;I^D{TZ{OsaG4;5dTj~Q>su_|M?=T>UfO1)aHR~}!l zmY2p#mdX#$mEl+lgQar4`mK6-V-wDu_4V>rZS7K}_DuPk)n~pssMBIid8k%aqMi#{ zgOV(xD?9Bd1UJ2x%N`7fPqOH8E}M5*OB~ATg^gef%rIB6(`|oGig*pcu5Hw-7pt|b zy-vFuAI=L~QOp{Rm3FhqT3Pq9>O6V-qyl)N8&4|WERw4s4CzPu)amg?7+s!RD7uox zGN=H!Rgge^?NW8b@M`sm%FcSdys}fPRX6H>Qo3EQT-wS|_Bz4ThqEeyj6gY3Jy}g> zYzZ}q9JBJ>Fy3zWx$M7Sn9~Lr#E!hqS63tm@rlh^b?xFtq7CJTmnPI( zS}xbBPgJ2JE7k4t((2(ifu#kGfS!dP=gT6)PnJG;2NT-<*oHO{(Z&9&CmFiz!_ z|8;NPMDv9wveF)~oHyl67i5!#jmbrEf^5oTN!i9!%kRi;GmIkeQ(7_?^2QE7kKw=Wp%5IH8+_cV&`^-_#{XuUg zddsY%c`5Ed?F=FR{lxX1RGE@aC+AFFfif;`ex7ukquuLFnL>3~6g}VW=7;ZF=3v0$W{$JC zq|ZK1(%F|T-aWhc;Dg0|nUa)EN3+YRJXKlli45(?+%b%5gQ!zFOjcXTycTGAd~PNs{11~SE=zGG z>Vb9Uj!8tSum#g%8Tbq)zoTO~4bJF3=#4)ZU9*alUf5{wM&oZ9tD3#6+irlW_#BoE zT6d!AkJ0my-0&{tJ-4-fu$sN+05Yh3oxqK>Gc@2WhweFr>Q>6)qIMdlix= zIV5Bik_R4vR-h}f1H4gBmjspOTpYoyO0Hf8ajsxg8fQ|!< zhw74<@F--E8@+Qwl{QT zKFz>bHuL=W*pZF{O!}-cTKoGt4v>81(Q$wz&XpTVGZWKsfbluS!5VhRj*bJ|hH(HR z{_&q+d3szN;0-8G;sDuE#Bg)c{Qz(1IKYsGy|Fe&46Y=GoTsJ3}^;41Db(5n1R=vSD%LNozroEJ6OoNYnlPgfM!55 zpc&8%Xa+O`ngPv#W UGy|Fe&46Y=GjNA8ki-H03zp4MG5`Po literal 0 HcmV?d00001 diff --git a/apps/server/devTags.json b/apps/trpc-experimental/server/devTags.json similarity index 100% rename from apps/server/devTags.json rename to apps/trpc-experimental/server/devTags.json diff --git a/apps/server/devTemplates.yaml b/apps/trpc-experimental/server/devTemplates.yaml similarity index 100% rename from apps/server/devTemplates.yaml rename to apps/trpc-experimental/server/devTemplates.yaml diff --git a/apps/server/nodemon.json b/apps/trpc-experimental/server/nodemon.json similarity index 100% rename from apps/server/nodemon.json rename to apps/trpc-experimental/server/nodemon.json diff --git a/apps/server/package.json b/apps/trpc-experimental/server/package.json similarity index 100% rename from apps/server/package.json rename to apps/trpc-experimental/server/package.json diff --git a/apps/server/prisma/migrations/20220131142425_init/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220131142425_init/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220131142425_init/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220131142425_init/migration.sql diff --git a/apps/server/prisma/migrations/20220210104005_redis_aol/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220210104005_redis_aol/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220210104005_redis_aol/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220210104005_redis_aol/migration.sql diff --git a/apps/server/prisma/migrations/20220212142309_unique_secret_by_application/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220212142309_unique_secret_by_application/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220212142309_unique_secret_by_application/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220212142309_unique_secret_by_application/migration.sql diff --git a/apps/server/prisma/migrations/20220217211304_dualcerts/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220217211304_dualcerts/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220217211304_dualcerts/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220217211304_dualcerts/migration.sql diff --git a/apps/server/prisma/migrations/20220219231255_prmr_secrets/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220219231255_prmr_secrets/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220219231255_prmr_secrets/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220219231255_prmr_secrets/migration.sql diff --git a/apps/server/prisma/migrations/20220220141136_public_portrange/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220220141136_public_portrange/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220220141136_public_portrange/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220220141136_public_portrange/migration.sql diff --git a/apps/server/prisma/migrations/20220301101928_proxyhash/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220301101928_proxyhash/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220301101928_proxyhash/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220301101928_proxyhash/migration.sql diff --git a/apps/server/prisma/migrations/20220304141408_service_secrets/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220304141408_service_secrets/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220304141408_service_secrets/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220304141408_service_secrets/migration.sql diff --git a/apps/server/prisma/migrations/20220311213422_autodeploy/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220311213422_autodeploy/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220311213422_autodeploy/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220311213422_autodeploy/migration.sql diff --git a/apps/server/prisma/migrations/20220320141424_phpmodules/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220320141424_phpmodules/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220320141424_phpmodules/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220320141424_phpmodules/migration.sql diff --git a/apps/server/prisma/migrations/20220322135800_persistent_storage/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220322135800_persistent_storage/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220322135800_persistent_storage/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220322135800_persistent_storage/migration.sql diff --git a/apps/server/prisma/migrations/20220327180323_ghost/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220327180323_ghost/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220327180323_ghost/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220327180323_ghost/migration.sql diff --git a/apps/server/prisma/migrations/20220402135305_python/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220402135305_python/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220402135305_python/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220402135305_python/migration.sql diff --git a/apps/server/prisma/migrations/20220402210645_meilisearch/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220402210645_meilisearch/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220402210645_meilisearch/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220402210645_meilisearch/migration.sql diff --git a/apps/server/prisma/migrations/20220405151428_wordpress_sftp/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220405151428_wordpress_sftp/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220405151428_wordpress_sftp/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220405151428_wordpress_sftp/migration.sql diff --git a/apps/server/prisma/migrations/20220407220809_unique_storage_fix/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220407220809_unique_storage_fix/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220407220809_unique_storage_fix/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220407220809_unique_storage_fix/migration.sql diff --git a/apps/server/prisma/migrations/20220408070805_added_expose_port/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220408070805_added_expose_port/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220408070805_added_expose_port/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220408070805_added_expose_port/migration.sql diff --git a/apps/server/prisma/migrations/20220418214843_persistent_storage_services/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220418214843_persistent_storage_services/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220418214843_persistent_storage_services/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220418214843_persistent_storage_services/migration.sql diff --git a/apps/server/prisma/migrations/20220419203408_multiply_dockerfile_locations/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220419203408_multiply_dockerfile_locations/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220419203408_multiply_dockerfile_locations/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220419203408_multiply_dockerfile_locations/migration.sql diff --git a/apps/server/prisma/migrations/20220420202031_deno_configurations/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220420202031_deno_configurations/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220420202031_deno_configurations/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220420202031_deno_configurations/migration.sql diff --git a/apps/server/prisma/migrations/20220420210057_branch_for_builds/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220420210057_branch_for_builds/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220420210057_branch_for_builds/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220420210057_branch_for_builds/migration.sql diff --git a/apps/server/prisma/migrations/20220425071132_umami/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220425071132_umami/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220425071132_umami/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220425071132_umami/migration.sql diff --git a/apps/server/prisma/migrations/20220425075326_auto_update_coolify/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220425075326_auto_update_coolify/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220425075326_auto_update_coolify/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220425075326_auto_update_coolify/migration.sql diff --git a/apps/server/prisma/migrations/20220426125053_select_base_image/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220426125053_select_base_image/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220426125053_select_base_image/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220426125053_select_base_image/migration.sql diff --git a/apps/server/prisma/migrations/20220427133656_hasura/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220427133656_hasura/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220427133656_hasura/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220427133656_hasura/migration.sql diff --git a/apps/server/prisma/migrations/20220429202516_fider/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220429202516_fider/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220429202516_fider/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220429202516_fider/migration.sql diff --git a/apps/server/prisma/migrations/20220429214112_fider_correction/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220429214112_fider_correction/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220429214112_fider_correction/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220429214112_fider_correction/migration.sql diff --git a/apps/server/prisma/migrations/20220430111953_ssl_dns_check_settings/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220430111953_ssl_dns_check_settings/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220430111953_ssl_dns_check_settings/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220430111953_ssl_dns_check_settings/migration.sql diff --git a/apps/server/prisma/migrations/20220430124553_expose_port_for_services/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220430124553_expose_port_for_services/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220430124553_expose_port_for_services/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220430124553_expose_port_for_services/migration.sql diff --git a/apps/server/prisma/migrations/20220509130501_custom_plausible_script/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220509130501_custom_plausible_script/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220509130501_custom_plausible_script/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220509130501_custom_plausible_script/migration.sql diff --git a/apps/server/prisma/migrations/20220510081125_custom_wordpress_db/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220510081125_custom_wordpress_db/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220510081125_custom_wordpress_db/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220510081125_custom_wordpress_db/migration.sql diff --git a/apps/server/prisma/migrations/20220517081328_traefik/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220517081328_traefik/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220517081328_traefik/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220517081328_traefik/migration.sql diff --git a/apps/server/prisma/migrations/20220519095648_minio_apifqdn/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220519095648_minio_apifqdn/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220519095648_minio_apifqdn/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220519095648_minio_apifqdn/migration.sql diff --git a/apps/server/prisma/migrations/20220708132655_deployment_type_for_applications/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220708132655_deployment_type_for_applications/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220708132655_deployment_type_for_applications/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220708132655_deployment_type_for_applications/migration.sql diff --git a/apps/server/prisma/migrations/20220712083523_custom_port_git_sources/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220712083523_custom_port_git_sources/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220712083523_custom_port_git_sources/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220712083523_custom_port_git_sources/migration.sql diff --git a/apps/server/prisma/migrations/20220718083646_moodle/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220718083646_moodle/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220718083646_moodle/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220718083646_moodle/migration.sql diff --git a/apps/server/prisma/migrations/20220718114551_remote_docker_engine/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220718114551_remote_docker_engine/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220718114551_remote_docker_engine/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220718114551_remote_docker_engine/migration.sql diff --git a/apps/server/prisma/migrations/20220721084020_ssh_key/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220721084020_ssh_key/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220721084020_ssh_key/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220721084020_ssh_key/migration.sql diff --git a/apps/server/prisma/migrations/20220722203927_ipaddress/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220722203927_ipaddress/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220722203927_ipaddress/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220722203927_ipaddress/migration.sql diff --git a/apps/server/prisma/migrations/20220725191205_architecture/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220725191205_architecture/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220725191205_architecture/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220725191205_architecture/migration.sql diff --git a/apps/server/prisma/migrations/20220726121333_fix_ssh_key/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220726121333_fix_ssh_key/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220726121333_fix_ssh_key/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220726121333_fix_ssh_key/migration.sql diff --git a/apps/server/prisma/migrations/20220806090621_fqdn_not_unique_anymore/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220806090621_fqdn_not_unique_anymore/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220806090621_fqdn_not_unique_anymore/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220806090621_fqdn_not_unique_anymore/migration.sql diff --git a/apps/server/prisma/migrations/20220806102340_rde_ssh_local_port/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220806102340_rde_ssh_local_port/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220806102340_rde_ssh_local_port/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220806102340_rde_ssh_local_port/migration.sql diff --git a/apps/server/prisma/migrations/20220815092230_glitchtip/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220815092230_glitchtip/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220815092230_glitchtip/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220815092230_glitchtip/migration.sql diff --git a/apps/server/prisma/migrations/20220815133844_appwrite/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220815133844_appwrite/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220815133844_appwrite/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220815133844_appwrite/migration.sql diff --git a/apps/server/prisma/migrations/20220816133447_bot_deployments/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220816133447_bot_deployments/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220816133447_bot_deployments/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220816133447_bot_deployments/migration.sql diff --git a/apps/server/prisma/migrations/20220817082342_custom_dns_servers/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220817082342_custom_dns_servers/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220817082342_custom_dns_servers/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220817082342_custom_dns_servers/migration.sql diff --git a/apps/server/prisma/migrations/20220818093615_public_repositories/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220818093615_public_repositories/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220818093615_public_repositories/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220818093615_public_repositories/migration.sql diff --git a/apps/server/prisma/migrations/20220823070532_service_searxng/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220823070532_service_searxng/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220823070532_service_searxng/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220823070532_service_searxng/migration.sql diff --git a/apps/server/prisma/migrations/20220825064811_concurrent_build_settings/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220825064811_concurrent_build_settings/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220825064811_concurrent_build_settings/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220825064811_concurrent_build_settings/migration.sql diff --git a/apps/server/prisma/migrations/20220825072007_build_queue_improvements/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220825072007_build_queue_improvements/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220825072007_build_queue_improvements/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220825072007_build_queue_improvements/migration.sql diff --git a/apps/server/prisma/migrations/20220831095714_service_weblate/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220831095714_service_weblate/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220831095714_service_weblate/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220831095714_service_weblate/migration.sql diff --git a/apps/server/prisma/migrations/20220902115640_service_taiga/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220902115640_service_taiga/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220902115640_service_taiga/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220902115640_service_taiga/migration.sql diff --git a/apps/server/prisma/migrations/20220905062318_database_branching/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220905062318_database_branching/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220905062318_database_branching/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220905062318_database_branching/migration.sql diff --git a/apps/server/prisma/migrations/20220905113241_prisma_migration/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220905113241_prisma_migration/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220905113241_prisma_migration/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220905113241_prisma_migration/migration.sql diff --git a/apps/server/prisma/migrations/20220905115321_application_connected_database/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220905115321_application_connected_database/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220905115321_application_connected_database/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220905115321_application_connected_database/migration.sql diff --git a/apps/server/prisma/migrations/20220906120112_enable_api_debug_logging/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220906120112_enable_api_debug_logging/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220906120112_enable_api_debug_logging/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220906120112_enable_api_debug_logging/migration.sql diff --git a/apps/server/prisma/migrations/20220907092244_database_secrets/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220907092244_database_secrets/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220907092244_database_secrets/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220907092244_database_secrets/migration.sql diff --git a/apps/server/prisma/migrations/20220913092100_preview_applications/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220913092100_preview_applications/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220913092100_preview_applications/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220913092100_preview_applications/migration.sql diff --git a/apps/server/prisma/migrations/20220922064605_custom_certificates/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220922064605_custom_certificates/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220922064605_custom_certificates/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220922064605_custom_certificates/migration.sql diff --git a/apps/server/prisma/migrations/20220923122227_custom_ssl_for_applications/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220923122227_custom_ssl_for_applications/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220923122227_custom_ssl_for_applications/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220923122227_custom_ssl_for_applications/migration.sql diff --git a/apps/server/prisma/migrations/20220928083348_system_wide_git_sources/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220928083348_system_wide_git_sources/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20220928083348_system_wide_git_sources/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20220928083348_system_wide_git_sources/migration.sql diff --git a/apps/server/prisma/migrations/20221002084246_no_unique_appid_on_previews/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221002084246_no_unique_appid_on_previews/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221002084246_no_unique_appid_on_previews/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221002084246_no_unique_appid_on_previews/migration.sql diff --git a/apps/server/prisma/migrations/20221002091630_forked_previews/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221002091630_forked_previews/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221002091630_forked_previews/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221002091630_forked_previews/migration.sql diff --git a/apps/server/prisma/migrations/20221005120323_initial_docker_compose/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221005120323_initial_docker_compose/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221005120323_initial_docker_compose/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221005120323_initial_docker_compose/migration.sql diff --git a/apps/server/prisma/migrations/20221005132352_docker_compose_configuration/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221005132352_docker_compose_configuration/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221005132352_docker_compose_configuration/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221005132352_docker_compose_configuration/migration.sql diff --git a/apps/server/prisma/migrations/20221017134342_standardized_service_configs/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221017134342_standardized_service_configs/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221017134342_standardized_service_configs/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221017134342_standardized_service_configs/migration.sql diff --git a/apps/server/prisma/migrations/20221018090939_service_peristent_volumes_predefined/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221018090939_service_peristent_volumes_predefined/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221018090939_service_peristent_volumes_predefined/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221018090939_service_peristent_volumes_predefined/migration.sql diff --git a/apps/server/prisma/migrations/20221021112429_serivce_settings_extended/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221021112429_serivce_settings_extended/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221021112429_serivce_settings_extended/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221021112429_serivce_settings_extended/migration.sql diff --git a/apps/server/prisma/migrations/20221021185630_service_template_version/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221021185630_service_template_version/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221021185630_service_template_version/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221021185630_service_template_version/migration.sql diff --git a/apps/server/prisma/migrations/20221026115123_service_persistent_unique/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221026115123_service_persistent_unique/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221026115123_service_persistent_unique/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221026115123_service_persistent_unique/migration.sql diff --git a/apps/server/prisma/migrations/20221028074301_wordpress_optional_fields/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221028074301_wordpress_optional_fields/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221028074301_wordpress_optional_fields/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221028074301_wordpress_optional_fields/migration.sql diff --git a/apps/server/prisma/migrations/20221104092223_default_redirect_proxy/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221104092223_default_redirect_proxy/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221104092223_default_redirect_proxy/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221104092223_default_redirect_proxy/migration.sql diff --git a/apps/server/prisma/migrations/20221114093217_application_storage_path_migration/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221114093217_application_storage_path_migration/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221114093217_application_storage_path_migration/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221114093217_application_storage_path_migration/migration.sql diff --git a/apps/server/prisma/migrations/20221123122143_remote_haproxy_from_db/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221123122143_remote_haproxy_from_db/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221123122143_remote_haproxy_from_db/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221123122143_remote_haproxy_from_db/migration.sql diff --git a/apps/server/prisma/migrations/20221123133429_docker_registries/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221123133429_docker_registries/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221123133429_docker_registries/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221123133429_docker_registries/migration.sql diff --git a/apps/server/prisma/migrations/20221128104158_do_not_track/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221128104158_do_not_track/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221128104158_do_not_track/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221128104158_do_not_track/migration.sql diff --git a/apps/server/prisma/migrations/20221128104718_fix_defaults/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221128104718_fix_defaults/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221128104718_fix_defaults/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221128104718_fix_defaults/migration.sql diff --git a/apps/server/prisma/migrations/20221128105615_custom_sentry/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221128105615_custom_sentry/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221128105615_custom_sentry/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221128105615_custom_sentry/migration.sql diff --git a/apps/server/prisma/migrations/20221129081832_fix_defaults/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221129081832_fix_defaults/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221129081832_fix_defaults/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221129081832_fix_defaults/migration.sql diff --git a/apps/server/prisma/migrations/20221129121702_preview_separator/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221129121702_preview_separator/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221129121702_preview_separator/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221129121702_preview_separator/migration.sql diff --git a/apps/server/prisma/migrations/20221129130036_keep_local_docker_images/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221129130036_keep_local_docker_images/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221129130036_keep_local_docker_images/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221129130036_keep_local_docker_images/migration.sql diff --git a/apps/server/prisma/migrations/20221130142058_reconfigure_docker_registries/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221130142058_reconfigure_docker_registries/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221130142058_reconfigure_docker_registries/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221130142058_reconfigure_docker_registries/migration.sql diff --git a/apps/server/prisma/migrations/20221201115801_simple_dockerfile_deployment/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221201115801_simple_dockerfile_deployment/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221201115801_simple_dockerfile_deployment/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221201115801_simple_dockerfile_deployment/migration.sql diff --git a/apps/server/prisma/migrations/20221201133847_push_image_to_docker_registry/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221201133847_push_image_to_docker_registry/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20221201133847_push_image_to_docker_registry/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20221201133847_push_image_to_docker_registry/migration.sql diff --git a/apps/server/prisma/migrations/20230117092356_http2_protocol/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20230117092356_http2_protocol/migration.sql similarity index 100% rename from apps/server/prisma/migrations/20230117092356_http2_protocol/migration.sql rename to apps/trpc-experimental/server/prisma/migrations/20230117092356_http2_protocol/migration.sql diff --git a/apps/server/prisma/migrations/migration_lock.toml b/apps/trpc-experimental/server/prisma/migrations/migration_lock.toml similarity index 100% rename from apps/server/prisma/migrations/migration_lock.toml rename to apps/trpc-experimental/server/prisma/migrations/migration_lock.toml diff --git a/apps/server/prisma/schema.prisma b/apps/trpc-experimental/server/prisma/schema.prisma similarity index 100% rename from apps/server/prisma/schema.prisma rename to apps/trpc-experimental/server/prisma/schema.prisma diff --git a/apps/server/prisma/seed.js b/apps/trpc-experimental/server/prisma/seed.js similarity index 100% rename from apps/server/prisma/seed.js rename to apps/trpc-experimental/server/prisma/seed.js diff --git a/apps/server/src/api/index.ts b/apps/trpc-experimental/server/src/api/index.ts similarity index 100% rename from apps/server/src/api/index.ts rename to apps/trpc-experimental/server/src/api/index.ts diff --git a/apps/server/src/config.ts b/apps/trpc-experimental/server/src/config.ts similarity index 100% rename from apps/server/src/config.ts rename to apps/trpc-experimental/server/src/config.ts diff --git a/apps/server/src/env.js b/apps/trpc-experimental/server/src/env.js similarity index 100% rename from apps/server/src/env.js rename to apps/trpc-experimental/server/src/env.js diff --git a/apps/server/src/index.ts b/apps/trpc-experimental/server/src/index.ts similarity index 100% rename from apps/server/src/index.ts rename to apps/trpc-experimental/server/src/index.ts diff --git a/apps/server/src/jobs/applicationBuildQueue.ts b/apps/trpc-experimental/server/src/jobs/applicationBuildQueue.ts similarity index 100% rename from apps/server/src/jobs/applicationBuildQueue.ts rename to apps/trpc-experimental/server/src/jobs/applicationBuildQueue.ts diff --git a/apps/server/src/lib/buildPacks/common.ts b/apps/trpc-experimental/server/src/lib/buildPacks/common.ts similarity index 100% rename from apps/server/src/lib/buildPacks/common.ts rename to apps/trpc-experimental/server/src/lib/buildPacks/common.ts diff --git a/apps/server/src/lib/buildPacks/compose.ts b/apps/trpc-experimental/server/src/lib/buildPacks/compose.ts similarity index 100% rename from apps/server/src/lib/buildPacks/compose.ts rename to apps/trpc-experimental/server/src/lib/buildPacks/compose.ts diff --git a/apps/server/src/lib/buildPacks/deno.ts b/apps/trpc-experimental/server/src/lib/buildPacks/deno.ts similarity index 100% rename from apps/server/src/lib/buildPacks/deno.ts rename to apps/trpc-experimental/server/src/lib/buildPacks/deno.ts diff --git a/apps/server/src/lib/buildPacks/docker.ts b/apps/trpc-experimental/server/src/lib/buildPacks/docker.ts similarity index 100% rename from apps/server/src/lib/buildPacks/docker.ts rename to apps/trpc-experimental/server/src/lib/buildPacks/docker.ts diff --git a/apps/server/src/lib/buildPacks/gatsby.ts b/apps/trpc-experimental/server/src/lib/buildPacks/gatsby.ts similarity index 100% rename from apps/server/src/lib/buildPacks/gatsby.ts rename to apps/trpc-experimental/server/src/lib/buildPacks/gatsby.ts diff --git a/apps/server/src/lib/buildPacks/heroku.ts b/apps/trpc-experimental/server/src/lib/buildPacks/heroku.ts similarity index 100% rename from apps/server/src/lib/buildPacks/heroku.ts rename to apps/trpc-experimental/server/src/lib/buildPacks/heroku.ts diff --git a/apps/server/src/lib/buildPacks/index.ts b/apps/trpc-experimental/server/src/lib/buildPacks/index.ts similarity index 100% rename from apps/server/src/lib/buildPacks/index.ts rename to apps/trpc-experimental/server/src/lib/buildPacks/index.ts diff --git a/apps/server/src/lib/buildPacks/laravel.ts b/apps/trpc-experimental/server/src/lib/buildPacks/laravel.ts similarity index 100% rename from apps/server/src/lib/buildPacks/laravel.ts rename to apps/trpc-experimental/server/src/lib/buildPacks/laravel.ts diff --git a/apps/server/src/lib/buildPacks/nestjs.ts b/apps/trpc-experimental/server/src/lib/buildPacks/nestjs.ts similarity index 100% rename from apps/server/src/lib/buildPacks/nestjs.ts rename to apps/trpc-experimental/server/src/lib/buildPacks/nestjs.ts diff --git a/apps/server/src/lib/buildPacks/nextjs.ts b/apps/trpc-experimental/server/src/lib/buildPacks/nextjs.ts similarity index 100% rename from apps/server/src/lib/buildPacks/nextjs.ts rename to apps/trpc-experimental/server/src/lib/buildPacks/nextjs.ts diff --git a/apps/server/src/lib/buildPacks/node.ts b/apps/trpc-experimental/server/src/lib/buildPacks/node.ts similarity index 100% rename from apps/server/src/lib/buildPacks/node.ts rename to apps/trpc-experimental/server/src/lib/buildPacks/node.ts diff --git a/apps/server/src/lib/buildPacks/nuxtjs.ts b/apps/trpc-experimental/server/src/lib/buildPacks/nuxtjs.ts similarity index 100% rename from apps/server/src/lib/buildPacks/nuxtjs.ts rename to apps/trpc-experimental/server/src/lib/buildPacks/nuxtjs.ts diff --git a/apps/server/src/lib/buildPacks/php.ts b/apps/trpc-experimental/server/src/lib/buildPacks/php.ts similarity index 100% rename from apps/server/src/lib/buildPacks/php.ts rename to apps/trpc-experimental/server/src/lib/buildPacks/php.ts diff --git a/apps/server/src/lib/buildPacks/python.ts b/apps/trpc-experimental/server/src/lib/buildPacks/python.ts similarity index 100% rename from apps/server/src/lib/buildPacks/python.ts rename to apps/trpc-experimental/server/src/lib/buildPacks/python.ts diff --git a/apps/server/src/lib/buildPacks/react.ts b/apps/trpc-experimental/server/src/lib/buildPacks/react.ts similarity index 100% rename from apps/server/src/lib/buildPacks/react.ts rename to apps/trpc-experimental/server/src/lib/buildPacks/react.ts diff --git a/apps/server/src/lib/buildPacks/rust.ts b/apps/trpc-experimental/server/src/lib/buildPacks/rust.ts similarity index 100% rename from apps/server/src/lib/buildPacks/rust.ts rename to apps/trpc-experimental/server/src/lib/buildPacks/rust.ts diff --git a/apps/server/src/lib/buildPacks/static.ts b/apps/trpc-experimental/server/src/lib/buildPacks/static.ts similarity index 100% rename from apps/server/src/lib/buildPacks/static.ts rename to apps/trpc-experimental/server/src/lib/buildPacks/static.ts diff --git a/apps/server/src/lib/buildPacks/svelte.ts b/apps/trpc-experimental/server/src/lib/buildPacks/svelte.ts similarity index 100% rename from apps/server/src/lib/buildPacks/svelte.ts rename to apps/trpc-experimental/server/src/lib/buildPacks/svelte.ts diff --git a/apps/server/src/lib/buildPacks/vuejs.ts b/apps/trpc-experimental/server/src/lib/buildPacks/vuejs.ts similarity index 100% rename from apps/server/src/lib/buildPacks/vuejs.ts rename to apps/trpc-experimental/server/src/lib/buildPacks/vuejs.ts diff --git a/apps/server/src/lib/common.ts b/apps/trpc-experimental/server/src/lib/common.ts similarity index 100% rename from apps/server/src/lib/common.ts rename to apps/trpc-experimental/server/src/lib/common.ts diff --git a/apps/server/src/lib/dayjs.ts b/apps/trpc-experimental/server/src/lib/dayjs.ts similarity index 100% rename from apps/server/src/lib/dayjs.ts rename to apps/trpc-experimental/server/src/lib/dayjs.ts diff --git a/apps/server/src/lib/docker.ts b/apps/trpc-experimental/server/src/lib/docker.ts similarity index 100% rename from apps/server/src/lib/docker.ts rename to apps/trpc-experimental/server/src/lib/docker.ts diff --git a/apps/server/src/lib/executeCommand.ts b/apps/trpc-experimental/server/src/lib/executeCommand.ts similarity index 100% rename from apps/server/src/lib/executeCommand.ts rename to apps/trpc-experimental/server/src/lib/executeCommand.ts diff --git a/apps/server/src/lib/importers/github.ts b/apps/trpc-experimental/server/src/lib/importers/github.ts similarity index 100% rename from apps/server/src/lib/importers/github.ts rename to apps/trpc-experimental/server/src/lib/importers/github.ts diff --git a/apps/server/src/lib/importers/gitlab.ts b/apps/trpc-experimental/server/src/lib/importers/gitlab.ts similarity index 100% rename from apps/server/src/lib/importers/gitlab.ts rename to apps/trpc-experimental/server/src/lib/importers/gitlab.ts diff --git a/apps/server/src/lib/importers/index.ts b/apps/trpc-experimental/server/src/lib/importers/index.ts similarity index 100% rename from apps/server/src/lib/importers/index.ts rename to apps/trpc-experimental/server/src/lib/importers/index.ts diff --git a/apps/server/src/lib/logging.ts b/apps/trpc-experimental/server/src/lib/logging.ts similarity index 100% rename from apps/server/src/lib/logging.ts rename to apps/trpc-experimental/server/src/lib/logging.ts diff --git a/apps/server/src/lib/ssh.ts b/apps/trpc-experimental/server/src/lib/ssh.ts similarity index 100% rename from apps/server/src/lib/ssh.ts rename to apps/trpc-experimental/server/src/lib/ssh.ts diff --git a/apps/server/src/prisma.ts b/apps/trpc-experimental/server/src/prisma.ts similarity index 100% rename from apps/server/src/prisma.ts rename to apps/trpc-experimental/server/src/prisma.ts diff --git a/apps/server/src/scheduler.ts b/apps/trpc-experimental/server/src/scheduler.ts similarity index 100% rename from apps/server/src/scheduler.ts rename to apps/trpc-experimental/server/src/scheduler.ts diff --git a/apps/server/src/server.ts b/apps/trpc-experimental/server/src/server.ts similarity index 100% rename from apps/server/src/server.ts rename to apps/trpc-experimental/server/src/server.ts diff --git a/apps/server/src/tags.json b/apps/trpc-experimental/server/src/tags.json similarity index 100% rename from apps/server/src/tags.json rename to apps/trpc-experimental/server/src/tags.json diff --git a/apps/server/src/templates.json b/apps/trpc-experimental/server/src/templates.json similarity index 100% rename from apps/server/src/templates.json rename to apps/trpc-experimental/server/src/templates.json diff --git a/apps/server/src/trpc/context.ts b/apps/trpc-experimental/server/src/trpc/context.ts similarity index 100% rename from apps/server/src/trpc/context.ts rename to apps/trpc-experimental/server/src/trpc/context.ts diff --git a/apps/server/src/trpc/index.ts b/apps/trpc-experimental/server/src/trpc/index.ts similarity index 100% rename from apps/server/src/trpc/index.ts rename to apps/trpc-experimental/server/src/trpc/index.ts diff --git a/apps/server/src/trpc/routers/applications/index.ts b/apps/trpc-experimental/server/src/trpc/routers/applications/index.ts similarity index 100% rename from apps/server/src/trpc/routers/applications/index.ts rename to apps/trpc-experimental/server/src/trpc/routers/applications/index.ts diff --git a/apps/server/src/trpc/routers/applications/lib.ts b/apps/trpc-experimental/server/src/trpc/routers/applications/lib.ts similarity index 100% rename from apps/server/src/trpc/routers/applications/lib.ts rename to apps/trpc-experimental/server/src/trpc/routers/applications/lib.ts diff --git a/apps/server/src/trpc/routers/auth.ts b/apps/trpc-experimental/server/src/trpc/routers/auth.ts similarity index 100% rename from apps/server/src/trpc/routers/auth.ts rename to apps/trpc-experimental/server/src/trpc/routers/auth.ts diff --git a/apps/server/src/trpc/routers/dashboard.ts b/apps/trpc-experimental/server/src/trpc/routers/dashboard.ts similarity index 100% rename from apps/server/src/trpc/routers/dashboard.ts rename to apps/trpc-experimental/server/src/trpc/routers/dashboard.ts diff --git a/apps/server/src/trpc/routers/databases/index.ts b/apps/trpc-experimental/server/src/trpc/routers/databases/index.ts similarity index 100% rename from apps/server/src/trpc/routers/databases/index.ts rename to apps/trpc-experimental/server/src/trpc/routers/databases/index.ts diff --git a/apps/server/src/trpc/routers/databases/lib.ts b/apps/trpc-experimental/server/src/trpc/routers/databases/lib.ts similarity index 100% rename from apps/server/src/trpc/routers/databases/lib.ts rename to apps/trpc-experimental/server/src/trpc/routers/databases/lib.ts diff --git a/apps/server/src/trpc/routers/destinations/index.ts b/apps/trpc-experimental/server/src/trpc/routers/destinations/index.ts similarity index 100% rename from apps/server/src/trpc/routers/destinations/index.ts rename to apps/trpc-experimental/server/src/trpc/routers/destinations/index.ts diff --git a/apps/server/src/trpc/routers/index.ts b/apps/trpc-experimental/server/src/trpc/routers/index.ts similarity index 100% rename from apps/server/src/trpc/routers/index.ts rename to apps/trpc-experimental/server/src/trpc/routers/index.ts diff --git a/apps/server/src/trpc/routers/services/index.ts b/apps/trpc-experimental/server/src/trpc/routers/services/index.ts similarity index 100% rename from apps/server/src/trpc/routers/services/index.ts rename to apps/trpc-experimental/server/src/trpc/routers/services/index.ts diff --git a/apps/server/src/trpc/routers/services/lib.ts b/apps/trpc-experimental/server/src/trpc/routers/services/lib.ts similarity index 100% rename from apps/server/src/trpc/routers/services/lib.ts rename to apps/trpc-experimental/server/src/trpc/routers/services/lib.ts diff --git a/apps/server/src/trpc/routers/settings.ts b/apps/trpc-experimental/server/src/trpc/routers/settings.ts similarity index 100% rename from apps/server/src/trpc/routers/settings.ts rename to apps/trpc-experimental/server/src/trpc/routers/settings.ts diff --git a/apps/server/src/trpc/routers/sources/index.ts b/apps/trpc-experimental/server/src/trpc/routers/sources/index.ts similarity index 100% rename from apps/server/src/trpc/routers/sources/index.ts rename to apps/trpc-experimental/server/src/trpc/routers/sources/index.ts diff --git a/apps/server/src/trpc/trpc.ts b/apps/trpc-experimental/server/src/trpc/trpc.ts similarity index 100% rename from apps/server/src/trpc/trpc.ts rename to apps/trpc-experimental/server/src/trpc/trpc.ts diff --git a/apps/server/tags.json b/apps/trpc-experimental/server/tags.json similarity index 100% rename from apps/server/tags.json rename to apps/trpc-experimental/server/tags.json diff --git a/apps/server/templates.json b/apps/trpc-experimental/server/templates.json similarity index 100% rename from apps/server/templates.json rename to apps/trpc-experimental/server/templates.json diff --git a/apps/server/tsconfig.json b/apps/trpc-experimental/server/tsconfig.json similarity index 100% rename from apps/server/tsconfig.json rename to apps/trpc-experimental/server/tsconfig.json