= writable({
- application: {
- statuses: [],
- overallStatus: 'stopped',
- loading: false,
- restarting: false,
- initialLoading: true
- },
- service: {
- statuses: [],
- overallStatus: 'stopped',
- loading: false,
- startup: {},
- initialLoading: true
- },
- database: {
- isRunning: false,
- isExited: false,
- loading: false,
- initialLoading: true,
- isPublic: false
- }
-});
-
-export function checkIfDeploymentEnabledApplications(isAdmin: boolean, application: any) {
- return !!(
- (isAdmin && application.buildPack === 'compose') ||
- ((application.fqdn || application.settings.isBot) &&
- ((application.gitSource && application.repository && application.buildPack) ||
- application.simpleDockerfile) &&
- application.destinationDocker)
- );
-}
-export const setLocation = (resource: any, settings?: any) => {
- if (resource.settings.isBot && resource.exposePort) {
- disabledButton.set(false);
- return location.set(`http://${dev ? 'localhost' : settings.ipv4}:${resource.exposePort}`);
- }
- if (GITPOD_WORKSPACE_URL && resource.exposePort) {
- const { href } = new URL(GITPOD_WORKSPACE_URL);
- const newURL = href.replace('https://', `https://${resource.exposePort}-`).replace(/\/$/, '');
- return location.set(newURL);
- } else if (CODESANDBOX_HOST) {
- const newURL = `https://${CODESANDBOX_HOST.replace(/\$PORT/, resource.exposePort)}`;
- return location.set(newURL);
- }
- if (resource.fqdn) {
- return location.set(resource.fqdn);
- } else {
- location.set(null);
- disabledButton.set(false);
- }
-};
-export const selectedBuildId: any = writable(null)
-export function checkIfDeploymentEnabledServices( service: any) {
- return (
- service.fqdn &&
- service.destinationDocker &&
- service.version &&
- service.type
- );
-}
\ No newline at end of file
diff --git a/apps/trpc-experimental/client/src/routes/+error.svelte b/apps/trpc-experimental/client/src/routes/+error.svelte
deleted file mode 100644
index eef31e906..000000000
--- a/apps/trpc-experimental/client/src/routes/+error.svelte
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
Ooops, are you lost?
-
Go back
- {#if $page.error.message !== 'Not Found'}
-
-
{$page
- .error.message}
-
- {/if}
-
diff --git a/apps/trpc-experimental/client/src/routes/+layout.svelte b/apps/trpc-experimental/client/src/routes/+layout.svelte
deleted file mode 100644
index cd5ab4cd1..000000000
--- a/apps/trpc-experimental/client/src/routes/+layout.svelte
+++ /dev/null
@@ -1,417 +0,0 @@
-
-
-
- {#if !$appSession.whiteLabeled}
- Coolify
-
- {:else if $appSession.whiteLabeledDetails.icon}
- Coolify
-
- {/if}
-
-
-
-
-
- {#if $appSession.userId}
-
IAM
-
Settings
-
Documentation
-
Logout
-
-
- {#if !$appSession.whiteLabeled}
-
-
-
- {:else if $appSession.whiteLabeledDetails.icon}
-
-
-
- {/if}
-
-
Dashboard
-
Servers
-
-
-
-
-
-
-
- {#if $appSession.whiteLabeled}
-
Powered by Coolify
- {/if}
- {/if}
-
-
-
-
-
-
-
-
- {#if !$appSession.whiteLabeled}
-
Coolify
- {/if}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/+layout.ts b/apps/trpc-experimental/client/src/routes/+layout.ts
deleted file mode 100644
index 6a2608cac..000000000
--- a/apps/trpc-experimental/client/src/routes/+layout.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { error } from '@sveltejs/kit';
-import { trpc } from '$lib/store';
-import type { LayoutLoad } from './$types';
-import { redirect } from '@sveltejs/kit';
-import Cookies from 'js-cookie';
-export const ssr = false;
-
-export const load: LayoutLoad = async ({ url }) => {
- const { pathname } = new URL(url);
-
- try {
- if (pathname === '/login' || pathname === '/register') {
- const baseSettings = await trpc.settings.getBaseSettings.query();
- return {
- settings: {
- ...baseSettings
- }
- };
- }
- const settings = await trpc.settings.getInstanceSettings.query();
- if (settings.data.token) {
- Cookies.set('token', settings.data.token);
- }
- return {
- settings: {
- ...settings
- }
- };
- } catch (err) {
- if (err?.data?.httpStatus == 401) {
- throw redirect(307, '/login');
- }
- if (err instanceof Error) {
- throw error(500, {
- message: 'An unexpected error occurred, please try again later.' + ' ' + err.message
- });
- }
-
- throw error(500, {
- message: 'An unexpected error occurred, please try again later.'
- });
- }
-};
diff --git a/apps/trpc-experimental/client/src/routes/+page.svelte b/apps/trpc-experimental/client/src/routes/+page.svelte
deleted file mode 100644
index bee821f5b..000000000
--- a/apps/trpc-experimental/client/src/routes/+page.svelte
+++ /dev/null
@@ -1,1652 +0,0 @@
-
-
-
-
- {#if applications.length !== 0 || destinations.length !== 0 || databases.length !== 0 || services.length !== 0 || gitSources.length !== 0 || destinations.length !== 0}
-
-
doSearch('!app')}
- >
-
-
-
-
-
-
-
- Applications
-
doSearch('!service')}
- >
-
-
- Services
-
doSearch('!db')}
- >
-
-
-
-
-
- Databases
-
doSearch('!git')}
- >
-
-
-
-
-
-
-
-
- Git Sources
-
doSearch('!destination')}
- >
-
-
-
-
-
-
-
-
-
-
-
- Destinations
-
-
- {/if}
- {#if (filtered.applications.length > 0 && applications.length > 0) || filtered.otherApplications.length > 0}
-
-
Applications
- {noInitialStatus.applications ? 'Load Status' : 'Refresh Status'}
- {#if foundUnconfiguredApplication}
- Cleanup Unconfigured Resources
- {/if}
-
- {/if}
- {#if filtered.applications.length > 0 && applications.length > 0}
-
-
- {/if}
- {#if filtered.otherApplications.length > 0}
- {#if filtered.applications.length > 0}
-
- {/if}
- {/if}
- {#if filtered.otherApplications.length > 0}
-
- {/if}
- {#if (filtered.services.length > 0 && services.length > 0) || filtered.otherServices.length > 0}
-
-
Services
- {noInitialStatus.services ? 'Load Status' : 'Refresh Status'}
- {#if foundUnconfiguredService}
- Cleanup Unconfigured Resources
- {/if}
-
- {/if}
- {#if filtered.services.length > 0 && services.length > 0}
-
-
- {/if}
- {#if filtered.otherServices.length > 0}
- {#if filtered.services.length > 0}
-
- {/if}
- {/if}
- {#if filtered.otherServices.length > 0}
-
- {/if}
- {#if (filtered.databases.length > 0 && databases.length > 0) || filtered.otherDatabases.length > 0}
-
-
Databases
- {noInitialStatus.databases ? 'Load Status' : 'Refresh Status'}
- {#if foundUnconfiguredDatabase}
- Cleanup Unconfigured Resources
- {/if}
-
- {/if}
- {#if filtered.databases.length > 0 && databases.length > 0}
-
-
- {/if}
- {#if filtered.otherDatabases.length > 0}
- {#if filtered.databases.length > 0}
-
- {/if}
- {/if}
- {#if filtered.otherDatabases.length > 0}
-
- {/if}
- {#if (filtered.gitSources.length > 0 && gitSources.length > 0) || filtered.otherGitSources.length > 0}
-
-
Git Sources
-
- {/if}
- {#if filtered.gitSources.length > 0 && gitSources.length > 0}
-
-
- {/if}
- {#if filtered.otherGitSources.length > 0}
- {#if filtered.gitSources.length > 0}
-
- {/if}
- {/if}
- {#if filtered.otherGitSources.length > 0}
-
- {/if}
- {#if (filtered.destinations.length > 0 && destinations.length > 0) || filtered.otherDestinations.length > 0}
-
-
Destinations
-
- {/if}
- {#if filtered.destinations.length > 0 && destinations.length > 0}
-
-
- {/if}
- {#if filtered.otherDestinations.length > 0}
- {#if filtered.destinations.length > 0}
-
- {/if}
- {/if}
- {#if filtered.otherDestinations.length > 0}
-
- {/if}
-
- {#if filtered.applications.length === 0 && filtered.destinations.length === 0 && filtered.databases.length === 0 && filtered.services.length === 0 && filtered.gitSources.length === 0 && filtered.destinations.length === 0 && $search}
-
-
- Nothing found with {$search} .
-
-
- {/if}
- {#if applications.length === 0 && destinations.length === 0 && databases.length === 0 && services.length === 0 && gitSources.length === 0 && destinations.length === 0}
-
-
-
-
- Hey
-
-
It looks like you did not configure anything yet.
-
Let's Get Started
-
-
-
- {/if}
-
-
diff --git a/apps/trpc-experimental/client/src/routes/+page.ts b/apps/trpc-experimental/client/src/routes/+page.ts
deleted file mode 100644
index 3465b727e..000000000
--- a/apps/trpc-experimental/client/src/routes/+page.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { error } from '@sveltejs/kit';
-import { trpc } from '$lib/store';
-export const ssr = false;
-
-export const load = async () => {
- try {
- return await trpc.dashboard.resources.query();
- } catch (err) {
- throw error(500, {
- message: 'An unexpected error occurred, please try again later.'
- });
- }
-};
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/+layout.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/+layout.svelte
deleted file mode 100644
index 8edaae1b8..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/+layout.svelte
+++ /dev/null
@@ -1,114 +0,0 @@
-
-
-
-
-
- {#if $status.application.initialLoading}
-
- {:else if $status.application.overallStatus === 'degraded'}
- (stopping = true)}
- on:stopped={() => (stopping = false)}
- />
- {:else if $status.application.overallStatus === 'healthy'}
-
- {:else if $status.application.overallStatus === 'stopped'}
-
- {/if}
-
-
-
- {#if !isConfigurationView}
-
- {/if}
-
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/+layout.ts b/apps/trpc-experimental/client/src/routes/applications/[id]/+layout.ts
deleted file mode 100644
index 3bbc66f62..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/+layout.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import { error } from '@sveltejs/kit';
-import { trpc } from '$lib/store';
-import type { LayoutLoad } from './$types';
-import { redirect } from '@sveltejs/kit';
-
-function checkConfiguration(application: any): string | null {
- let configurationPhase = null;
- if (!application.gitSourceId && !application.simpleDockerfile) {
- return (configurationPhase = 'source');
- }
- if (application.simpleDockerfile) {
- if (!application.destinationDockerId) {
- configurationPhase = 'destination';
- }
- return configurationPhase;
- } else if (!application.repository && !application.branch) {
- configurationPhase = 'repository';
- } else if (!application.destinationDockerId) {
- configurationPhase = 'destination';
- } else if (!application.buildPack) {
- configurationPhase = 'buildpack';
- }
- return configurationPhase;
-}
-
-export const load: LayoutLoad = async ({ params, url }) => {
- const { pathname } = new URL(url);
- const { id } = params;
- try {
- const application = await trpc.applications.getApplicationById.query({ id });
- if (!application) {
- throw redirect(307, '/applications');
- }
- const configurationPhase = checkConfiguration(application);
- console.log({ configurationPhase });
- // if (
- // configurationPhase &&
- // pathname !== `/applications/${params.id}/configuration/${configurationPhase}`
- // ) {
- // throw redirect(302, `/applications/${params.id}/configuration/${configurationPhase}`);
- // }
- return {
- application
- };
- } catch (err) {
- if (err instanceof Error) {
- throw error(500, {
- message: 'An unexpected error occurred, please try again later.' + ' ' + err.message
- });
- }
-
- throw error(500, {
- message: 'An unexpected error occurred, please try again later.'
- });
- }
-};
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/+page.svelte
deleted file mode 100644
index 7f3326de7..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/+page.svelte
+++ /dev/null
@@ -1,1257 +0,0 @@
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/builds/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/builds/+page.svelte
deleted file mode 100644
index 8df74e4ac..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/builds/+page.svelte
+++ /dev/null
@@ -1,204 +0,0 @@
-
-
-
-
-
-
Build Logs
-
Reset Build Queue
-
-
-
-
- Enable Debug Logs
- changeSettings('debug')}
- />
-
-
-
-
-
-
- {#if $selectedBuildId}
- {#key $selectedBuildId}
-
- {/key}
- {:else if buildCount === 0}
- Not build logs found.
- {:else}
- Select a build to see the logs.
- {/if}
-
-
-
-
- Load more
-
- {#each builds as build, index (build.id)}
-
-
loadBuild(build.id)}
- class:rounded-tr={index === 0}
- class:rounded-br={index === builds.length - 1}
- class="flex cursor-pointer items-center justify-center py-4 no-underline transition-all duration-150 hover:bg-coolgray-300 hover:shadow-xl"
- class:bg-coolgray-200={$selectedBuildId === build.id}
- >
-
-
- {build.branch || application.branch}
-
-
- {build.type}
-
-
- {build.status}
-
-
-
-
- {#if build.status === 'running'}
-
- {build.elapsed}s
-
- {:else if build.status !== 'queued'}
-
{day(build.updatedAt).utc().fromNow()}
-
- Finished in
- {day(build.updatedAt).utc().diff(day(build.createdAt)) / 1000}s
-
- {/if}
-
-
-
{new Intl.DateTimeFormat('default', dateOptions).format(new Date(build.createdAt)) +
- `\n`}
- {/each}
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/builds/+page.ts b/apps/trpc-experimental/client/src/routes/applications/[id]/builds/+page.ts
deleted file mode 100644
index f6d6570b8..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/builds/+page.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { error } from '@sveltejs/kit';
-import { trpc } from '$lib/store';
-import type { PageLoad } from './$types';
-export const ssr = false;
-
-export const load: PageLoad = async ({ params }) => {
- try {
- const { id } = params;
- const data = await trpc.applications.getBuilds.query({ id, skip: 0 });
- return data;
- } catch (err) {
- throw error(500, {
- message: 'An unexpected error occurred, please try again later.'
- });
- }
-};
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/builds/BuildLog.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/builds/BuildLog.svelte
deleted file mode 100644
index 81e515e25..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/builds/BuildLog.svelte
+++ /dev/null
@@ -1,215 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- {followingLogs ? 'Following Logs...' : 'Follow Logs'}
-
-
-
-
-
-
-
-
- {cancelInprogress ? 'Cancelling...' : 'Cancel Build'}
-
- {#if currentStatus === 'running'}
-
-
Streaming logs
- {/if}
-
-{#if currentStatus === 'queued'}
-
- Queued and waiting for execution.
-
-{:else if logs.length > 0}
-
- {#each logs as log}
- {#if fromDb}
- {log.line + '\n'}
- {:else}
- [{day.unix(log.time).format('HH:mm:ss.SSS')}] {log.line + '\n'}
- {/if}
- {/each}
-
-{:else}
-
- {loading
- ? 'Loading logs...'
- : dev
- ? 'In development, logs are shown in the console.'
- : 'No logs found yet.'}
-
-{/if}
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Delete.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Delete.svelte
deleted file mode 100644
index 182419e03..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Delete.svelte
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
- {force ? 'Force' : ''} Delete Application
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Deploy.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Deploy.svelte
deleted file mode 100644
index 0a934440f..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Deploy.svelte
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
- Deploy
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/ForceDeploy.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/ForceDeploy.svelte
deleted file mode 100644
index 53a08a0e8..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/ForceDeploy.svelte
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
-
-
- Force re-Deploy
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Loading.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Loading.svelte
deleted file mode 100644
index 30336d843..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Loading.svelte
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- Loading...
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Restart.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Restart.svelte
deleted file mode 100644
index d9f416745..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Restart.svelte
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
- Restart
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Stop.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Stop.svelte
deleted file mode 100644
index e9925d08e..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/Stop.svelte
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
- Stop
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/index.ts b/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/index.ts
deleted file mode 100644
index 8e6e8a7f0..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/components/Buttons/index.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export { default as Delete } from './Delete.svelte';
-export { default as Stop } from './Stop.svelte';
-export { default as Restart } from './Restart.svelte';
-export { default as Deploy } from './Deploy.svelte';
-export { default as ForceDeploy } from './ForceDeploy.svelte';
-export { default as Loading } from './Loading.svelte';
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/components/Menu.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/Menu.svelte
deleted file mode 100644
index c8e9c9cf4..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/components/Menu.svelte
+++ /dev/null
@@ -1,278 +0,0 @@
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Degraded.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Degraded.svelte
deleted file mode 100644
index 6f0a1ff06..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Degraded.svelte
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
- Application Error (check logs)
-
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Healthy.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Healthy.svelte
deleted file mode 100644
index 3b1cf1cf1..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Healthy.svelte
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-{#if !isComposeBuildPack}
-
-{/if}
-
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Loading.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Loading.svelte
deleted file mode 100644
index bc77579c5..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Loading.svelte
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Stopped.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Stopped.svelte
deleted file mode 100644
index e5817b490..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/Stopped.svelte
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/index.ts b/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/index.ts
deleted file mode 100644
index a374936d0..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/components/States/index.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export { default as Loading } from './Loading.svelte';
-export { default as Degraded } from './Degraded.svelte';
-export { default as Healthy } from './Healthy.svelte';
-export { default as Stopped } from './Stopped.svelte';
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/danger/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/danger/+page.svelte
deleted file mode 100644
index 4fede0195..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/danger/+page.svelte
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
-
- {#if forceDelete}
-
deleteApplication(application.name, true)}
- type="submit"
- disabled={!$appSession.isAdmin}
- class:bg-red-600={$appSession.isAdmin}
- class:hover:bg-red-500={$appSession.isAdmin}
- class="btn btn-lg btn-error hover:bg-red-700 text-sm w-64"
- >
- Force Delete Application
-
- {:else}
-
deleteApplication(application.name, false)}
- type="submit"
- disabled={!$appSession.isAdmin}
- class="btn btn-lg btn-error hover:bg-red-700 text-sm w-64"
- >
- Delete Application
-
- {/if}
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/features/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/features/+page.svelte
deleted file mode 100644
index 3017e12c8..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/features/+page.svelte
+++ /dev/null
@@ -1,118 +0,0 @@
-
-
-
-
-
-
- {#if !application.settings.isPublicRepository}
-
- changeSettings('autodeploy')}
- title="Enable Automatic Deployment"
- description="Enable automatic deployment through webhooks."
- />
-
- {#if !application.settings.isBot && !application.simpleDockerfile}
-
- changeSettings('previews')}
- title="Enable MR/PR Previews"
- description="Enable preview deployments from pull or merge requests."
- />
-
- {/if}
- {:else}
- No features available for this application
- {/if}
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/logs/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/logs/+page.svelte
deleted file mode 100644
index 2448ab296..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/logs/+page.svelte
+++ /dev/null
@@ -1,176 +0,0 @@
-
-
-
-
- {#each services as service}
- selectService(service, true)}
- class:bg-primary={selectedService ===
- `${application.id}${service.name ? `-${service.name}` : ''}`}
- class:bg-coolgray-200={selectedService !==
- `${application.id}${service.name ? `-${service.name}` : ''}`}
- class="w-full rounded p-5 hover:bg-primary font-bold"
- >
- {application.id}{service.name ? `-${service.name}` : ''}
- {/each}
-
-
-{#if selectedService}
-
- {#if logs.length === 0}
- {#if noContainer}
-
Container not found / exited.
- {/if}
- {:else}
-
-
-
-
-
-
-
-
-
-
- {followingLogs ? 'Following Logs...' : 'Follow Logs'}
-
- {#if loadLogsInterval}
-
Streaming logs
- {/if}
-
-
-
- {/if}
-
-{/if}
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/previews/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/previews/+page.svelte
deleted file mode 100644
index a4095f8b1..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/previews/+page.svelte
+++ /dev/null
@@ -1,323 +0,0 @@
-
-
-
-
-
-
Preview Deployments
-
- Load Previews
-
-
-
-
-
-{#if loading.init}
-
-{:else if application.previewApplication.length > 0}
-
- {#each application.previewApplication as preview}
-
-
- {#await getStatus(preview)}
-
- {:then}
- {#if status[preview.id] === 'running'}
-
- {:else}
-
- {/if}
- {/await}
-
-
-
- PR #{preview.pullmergeRequestId}
- {#if status[preview.id] === 'building'}
-
- BUILDING
-
- {/if}
-
-
-
{preview.customDomain.replace('https://', '').replace('http://', '')}
-
-
-
- {#if preview.customDomain}
-
-
-
-
-
-
-
-
- {/if}
-
Open Preview
- {#if loading.restart}
-
-
-
-
-
-
-
-
-
-
-
- {:else}
-
restartPreview(preview)}
- type="submit"
- class="icons bg-transparent text-sm flex items-center space-x-2"
- >
-
-
-
-
-
-
- {/if}
-
-
Restart (useful to change secrets)
-
redeploy(preview)}
- >
-
-
-
-
-
Force redeploy (without cache)
-
removeApplication(preview)}
- >
-
-
Delete Preview
-
-
-
-
-
- {/each}
-
-{:else}
- No previews found.
-{/if}
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/revert/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/revert/+page.svelte
deleted file mode 100644
index 80013e0f0..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/revert/+page.svelte
+++ /dev/null
@@ -1,151 +0,0 @@
-
-
-
-
-
-
- If you do not want the next commit to overwrite the reverted application, temporary disable
Automatic Deployment
- feature
here .
-
- {#if imagesAvailables.length > 0}
-
Local Images
-
- {#each imagesAvailables as image}
-
-
-
- {image.tag}
-
-
-
-
- Check Commit
-
-
-
-
- {#if image.repository + ':' + image.tag !== runningImage}
-
revertToLocal(image)}>Revert Now
- {:else}
-
Currently Used
- {/if}
-
-
-
- {/each}
-
- {:else}
-
-
No Local images available
-
- {/if}
-
- Remote Images (Docker Registry)
-
-
-
- Revert Now
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/revert/+page.ts b/apps/trpc-experimental/client/src/routes/applications/[id]/revert/+page.ts
deleted file mode 100644
index 2fc882718..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/revert/+page.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { error } from '@sveltejs/kit';
-import { trpc } from '$lib/store';
-import type { PageLoad } from './$types';
-export const ssr = false;
-
-export const load: PageLoad = async ({ params }) => {
- try {
- const { id } = params;
- const { data } = await trpc.applications.getLocalImages.query({ id });
- return data;
- } catch (err) {
- throw error(500, {
- message: 'An unexpected error occurred, please try again later.'
- });
- }
-};
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/secrets/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/secrets/+page.svelte
deleted file mode 100644
index e0a4544a9..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/secrets/+page.svelte
+++ /dev/null
@@ -1,138 +0,0 @@
-
-
-
-
- {#each secrets as secret, index}
- {#key secret.id}
-
- {/key}
- {/each}
-
-
-
- {#if !application.settings.isBot && !application.simpleDockerfile}
-
- {#if previewSecrets.length !== 0}
- {#each previewSecrets as secret, index}
- {#key index}
-
- {/key}
- {/each}
- {:else}
- Add secrets first to see Preview Secrets.
- {/if}
- {/if}
-
-
-
-
-
Paste .env
file
-
Add Secrets in Batch
-
-
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/secrets/+page.ts b/apps/trpc-experimental/client/src/routes/applications/[id]/secrets/+page.ts
deleted file mode 100644
index 8e36aea0b..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/secrets/+page.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { error } from '@sveltejs/kit';
-import { trpc } from '$lib/store';
-import type { PageLoad } from './$types';
-export const ssr = false;
-
-export const load: PageLoad = async ({ params }) => {
- try {
- const { id } = params;
- const { data } = await trpc.applications.getSecrets.query({ id });
- return data;
- } catch (err) {
- throw error(500, {
- message: 'An unexpected error occurred, please try again later.'
- });
- }
-};
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/secrets/components/PreviewSecret.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/secrets/components/PreviewSecret.svelte
deleted file mode 100644
index df2589feb..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/secrets/components/PreviewSecret.svelte
+++ /dev/null
@@ -1,131 +0,0 @@
-
-
-
-
- {#if index === 0 || length === 0}
- name
- {/if}
-
-
-
-
- {#if index === 0 || length === 0}
- value
- {/if}
-
-
-
-
- {#if index === 0 || length === 0}
-
Need during buildtime?
- {/if}
-
Need during buildtime?
-
-
-
- Is build secret?
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {#if index === 0 || length === 0}
-
- {/if}
-
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/secrets/components/Secret.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/secrets/components/Secret.svelte
deleted file mode 100644
index de3f97bbf..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/secrets/components/Secret.svelte
+++ /dev/null
@@ -1,193 +0,0 @@
-
-
-
-
- {#if (index === 0 && !isNewSecret) || length === 0}
- name
- {/if}
-
-
-
-
- {#if (index === 0 && !isNewSecret) || length === 0}
- value
- {/if}
-
-
-
-
- {#if (index === 0 && !isNewSecret) || length === 0}
-
Need during buildtime?
- {/if}
-
Need during buildtime?
-
-
-
updateSecret({ changeIsBuildSecret: true })}
- aria-pressed="false"
- class="relative inline-flex h-6 w-11 flex-shrink-0 rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out "
- class:bg-green-600={isBuildSecret}
- class:bg-stone-700={!isBuildSecret}
- >
- Is build secret?
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {#if (index === 0 && !isNewSecret) || length === 0}
-
- {/if}
-
-
- {#if isNewSecret}
-
- Add
-
- {:else}
-
-
- updateSecret()}>Set
-
-
- Remove
-
-
- {/if}
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/storages/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/storages/+page.svelte
deleted file mode 100644
index c117b6952..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/storages/+page.svelte
+++ /dev/null
@@ -1,78 +0,0 @@
-
-
-
-
-
- {#if predefinedVolumes.length > 0}
-
Predefined Volumes
-
-
-
Volume Id
-
Mount Dir
-
-
-
-
- {#each predefinedVolumes as storage}
- {#key storage.id}
-
- {/key}
- {/each}
-
- {/if}
- {#if persistentStorages.length > 0}
-
0}>Custom Volumes
- {/if}
- {#each persistentStorages as storage}
- {#key storage.id}
-
- {/key}
- {/each}
-
0}>
- Add New Volume
-
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/storages/+page.ts b/apps/trpc-experimental/client/src/routes/applications/[id]/storages/+page.ts
deleted file mode 100644
index 7c5f226ff..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/storages/+page.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { error } from '@sveltejs/kit';
-import { trpc } from '$lib/store';
-import type { PageLoad } from './$types';
-export const ssr = false;
-
-export const load: PageLoad = async ({ params }) => {
- try {
- const { id } = params;
- const { data } = await trpc.applications.getStorages.query({ id });
- return data;
- } catch (err) {
- throw error(500, {
- message: 'An unexpected error occurred, please try again later.'
- });
- }
-};
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/storages/components/Storage.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/storages/components/Storage.svelte
deleted file mode 100644
index 918992784..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/storages/components/Storage.svelte
+++ /dev/null
@@ -1,114 +0,0 @@
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/usage/+page.svelte b/apps/trpc-experimental/client/src/routes/applications/[id]/usage/+page.svelte
deleted file mode 100644
index 446f5abf5..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/usage/+page.svelte
+++ /dev/null
@@ -1,116 +0,0 @@
-
-
-
-
- {#each services as service}
- selectService(service, true)}
- class:bg-primary={selectedService ===
- `${application.id}${service.name ? `-${service.name}` : ''}`}
- class:bg-coolgray-200={selectedService !==
- `${application.id}${service.name ? `-${service.name}` : ''}`}
- class="w-full rounded p-5 hover:bg-primary font-bold"
- >
- {application.id}{service.name ? `-${service.name}` : ''}
- {/each}
-
-{#if selectedService}
-
- {#if usageLoading}
-
-
Streaming logs
- {/if}
-
-
-
Used Memory / Memory Limit
-
{usage?.MemUsage}
-
-
-
-
Used CPU
-
{usage?.CPUPerc}
-
-
-
-
Network IO
-
{usage?.NetIO}
-
-
-
-{/if}
diff --git a/apps/trpc-experimental/client/src/routes/applications/[id]/utils.ts b/apps/trpc-experimental/client/src/routes/applications/[id]/utils.ts
deleted file mode 100644
index 42c6889d8..000000000
--- a/apps/trpc-experimental/client/src/routes/applications/[id]/utils.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import { goto } from '$app/navigation';
-import { errorNotification } from '$lib/common';
-import { trpc } from '$lib/store';
-
-export async function saveForm(id, application, baseDatabaseBranch, dockerComposeConfiguration) {
- let {
- name,
- buildPack,
- fqdn,
- port,
- exposePort,
- installCommand,
- buildCommand,
- startCommand,
- baseDirectory,
- publishDirectory,
- pythonWSGI,
- pythonModule,
- pythonVariable,
- dockerFileLocation,
- denoMainFile,
- denoOptions,
- gitCommitHash,
- baseImage,
- baseBuildImage,
- deploymentType,
- dockerComposeFile,
- dockerComposeFileLocation,
- simpleDockerfile,
- dockerRegistryImageName
- } = application;
- return await trpc.applications.save.mutate({
- id,
- name,
- buildPack,
- fqdn,
- port,
- exposePort,
- installCommand,
- buildCommand,
- startCommand,
- baseDirectory,
- publishDirectory,
- pythonWSGI,
- pythonModule,
- pythonVariable,
- dockerFileLocation,
- denoMainFile,
- denoOptions,
- gitCommitHash,
- baseImage,
- baseBuildImage,
- deploymentType,
- dockerComposeFile,
- dockerComposeFileLocation,
- simpleDockerfile,
- dockerRegistryImageName,
- baseDatabaseBranch,
- dockerComposeConfiguration: JSON.stringify(dockerComposeConfiguration)
- });
-}
diff --git a/apps/trpc-experimental/client/src/routes/components/NewResource.svelte b/apps/trpc-experimental/client/src/routes/components/NewResource.svelte
deleted file mode 100644
index b540f3d12..000000000
--- a/apps/trpc-experimental/client/src/routes/components/NewResource.svelte
+++ /dev/null
@@ -1,155 +0,0 @@
-
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/databases/[id]/+layout.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/+layout.svelte
deleted file mode 100644
index 666317092..000000000
--- a/apps/trpc-experimental/client/src/routes/databases/[id]/+layout.svelte
+++ /dev/null
@@ -1,305 +0,0 @@
-
-
-{#if id !== 'new'}
-
-{/if}
-
diff --git a/apps/trpc-experimental/client/src/routes/databases/[id]/+layout.ts b/apps/trpc-experimental/client/src/routes/databases/[id]/+layout.ts
deleted file mode 100644
index 5dff433c0..000000000
--- a/apps/trpc-experimental/client/src/routes/databases/[id]/+layout.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { error } from '@sveltejs/kit';
-import { trpc } from '$lib/store';
-import type { LayoutLoad } from './$types';
-import { redirect } from '@sveltejs/kit';
-
-function checkConfiguration(database: any): string | null {
- let configurationPhase = null;
- if (!database.type) {
- configurationPhase = 'type';
- } else if (!database.version) {
- configurationPhase = 'version';
- } else if (!database.destinationDockerId) {
- configurationPhase = 'destination';
- }
- return configurationPhase;
-}
-
-export const load: LayoutLoad = async ({ params, url }) => {
- const { pathname } = new URL(url);
- const { id } = params;
- try {
- const database = await trpc.databases.getDatabaseById.query({ id });
- if (!database) {
- throw redirect(307, '/databases');
- }
- const configurationPhase = checkConfiguration(database);
- console.log({ configurationPhase });
- // if (
- // configurationPhase &&
- // pathname !== `/applications/${params.id}/configuration/${configurationPhase}`
- // ) {
- // throw redirect(302, `/applications/${params.id}/configuration/${configurationPhase}`);
- // }
- return {
- database
- };
- } catch (err) {
- if (err instanceof Error) {
- throw error(500, {
- message: 'An unexpected error occurred, please try again later.' + ' ' + err.message
- });
- }
-
- throw error(500, {
- message: 'An unexpected error occurred, please try again later.'
- });
- }
-};
diff --git a/apps/trpc-experimental/client/src/routes/databases/[id]/+page.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/+page.svelte
deleted file mode 100644
index 1a8e76a21..000000000
--- a/apps/trpc-experimental/client/src/routes/databases/[id]/+page.svelte
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
-
-
-
Used Memory / Memory Limit
-
{usage?.MemUsage}
-
-
-
-
Used CPU
-
{usage?.CPUPerc}
-
-
-
-
Network IO
-
{usage?.NetIO}
-
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/databases/[id]/components/DatabaseLinks.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/components/DatabaseLinks.svelte
deleted file mode 100644
index a3053a174..000000000
--- a/apps/trpc-experimental/client/src/routes/databases/[id]/components/DatabaseLinks.svelte
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
- {#if database.type === 'clickhouse'}
-
- {:else if database.type === 'couchdb'}
-
- {:else if database.type === 'mongodb'}
-
- {:else if database.type === 'mysql'}
-
- {:else if database.type === 'mariadb'}
-
- {:else if database.type === 'postgresql'}
-
- {:else if database.type === 'redis'}
-
- {:else if database.type === 'edgedb'}
-
- {/if}
-
diff --git a/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/CouchDb.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/CouchDb.svelte
deleted file mode 100644
index e6f9acb28..000000000
--- a/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/CouchDb.svelte
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
CouchDB
-
-
-
- Default Database
-
-
-
- User
-
-
-
- Password
-
-
-
- Root User
-
-
-
- Root Password
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/Databases.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/Databases.svelte
deleted file mode 100644
index 25ccd352b..000000000
--- a/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/Databases.svelte
+++ /dev/null
@@ -1,281 +0,0 @@
-
-
-
-
-
-
General
- {#if $appSession.isAdmin}
- Save
- {/if}
-
-
-
Name
-
-
Destination
- {#if database.destinationDockerId}
-
-
-
- {/if}
-
Version / Tag
-
-
-
Host
-
-
Port
-
-
- {#if database.type === 'mysql'}
-
- {:else if database.type === 'postgresql'}
-
- {:else if database.type === 'mongodb'}
-
- {:else if database.type === 'mariadb'}
-
- {:else if database.type === 'redis'}
-
- {:else if database.type === 'couchdb'}
-
- {:else if database.type === 'edgedb'}
-
- {/if}
-
-
- Connection String
- {#if !$status.database.isPublic && database.destinationDocker.remoteEngine}
-
- {/if}
- Show Connection String
-
-
- {#if publicUrl}
-
- {/if}
-
-
-
-
-
Features
-
-
- changeSettings('isPublic')}
- title="Set it Public"
- description="Your database will be reachable over the internet. Take security seriously in this case!"
- disabled={!$status.database.isRunning}
- />
- {#if database.type === 'redis'}
- changeSettings('appendOnly')}
- title="Change append only mode"
- description="Useful if you would like to restore redis data from a backup.Database restart is required. "
- />
- {/if}
-
-
diff --git a/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/EdgeDB.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/EdgeDB.svelte
deleted file mode 100644
index ec04aa03d..000000000
--- a/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/EdgeDB.svelte
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
-
- Default Database
-
-
-
- Root User
-
-
-
- Root Password
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/MariaDB.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/MariaDB.svelte
deleted file mode 100644
index 1831a6401..000000000
--- a/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/MariaDB.svelte
+++ /dev/null
@@ -1,78 +0,0 @@
-
-
-
-
MariaDB
-
-
-
- Default Database
-
-
-
- User
-
-
-
- Password
-
-
-
-
- Root User
-
-
-
- Root Password
-
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/MongoDB.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/MongoDB.svelte
deleted file mode 100644
index 7f110703e..000000000
--- a/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/MongoDB.svelte
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
MongoDB
-
-
-
- Root User
-
-
-
- Root Password
-
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/MySQL.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/MySQL.svelte
deleted file mode 100644
index db8df91cd..000000000
--- a/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/MySQL.svelte
+++ /dev/null
@@ -1,76 +0,0 @@
-
-
-
-
MySQL
-
-
-
- Default Database
-
-
-
- User
-
-
-
- Password
-
-
-
-
- Root User
-
-
-
- Password
-
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/PostgreSQL.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/PostgreSQL.svelte
deleted file mode 100644
index 8b4589e0d..000000000
--- a/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/PostgreSQL.svelte
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
PostgreSQL
-
-
-
- Default Database
-
-
- {#if !$appSession.isARM}
-
- Postgres User Password
-
-
- {/if}
-
- User
-
-
-
- Password
-
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/Redis.svelte b/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/Redis.svelte
deleted file mode 100644
index 50049d52c..000000000
--- a/apps/trpc-experimental/client/src/routes/databases/[id]/components/Databases/Redis.svelte
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
Redis
-
-
diff --git a/apps/trpc-experimental/client/src/routes/databases/[id]/utils.ts b/apps/trpc-experimental/client/src/routes/databases/[id]/utils.ts
deleted file mode 100644
index 2ed88f33d..000000000
--- a/apps/trpc-experimental/client/src/routes/databases/[id]/utils.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { errorNotification } from '$lib/common';
-import { trpc } from '$lib/store';
-
-type Props = {
- isNew: boolean;
- name: string;
- value: string;
- isBuildSecret?: boolean;
- isPRMRSecret?: boolean;
- isNewSecret?: boolean;
- databaseId: string;
-};
-
-export async function saveSecret({
- isNew,
- name,
- value,
- isNewSecret,
- databaseId
-}: Props): Promise {
- if (!name) return errorNotification('Name is required');
- if (!value) return errorNotification('Value is required');
- try {
- await trpc.databases.saveSecret.mutate({
- name,
- value,
- isNew: isNew || false
- });
-
- if (isNewSecret) {
- name = '';
- value = '';
- }
- } catch (error) {
- throw error;
- }
-}
diff --git a/apps/trpc-experimental/client/src/routes/destinations/[id]/+layout.svelte b/apps/trpc-experimental/client/src/routes/destinations/[id]/+layout.svelte
deleted file mode 100644
index 3f6cfa737..000000000
--- a/apps/trpc-experimental/client/src/routes/destinations/[id]/+layout.svelte
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-{#if $page.params.id !== 'new'}
-
-{/if}
-
diff --git a/apps/trpc-experimental/client/src/routes/destinations/[id]/+layout.ts b/apps/trpc-experimental/client/src/routes/destinations/[id]/+layout.ts
deleted file mode 100644
index e9cc53efe..000000000
--- a/apps/trpc-experimental/client/src/routes/destinations/[id]/+layout.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { error } from '@sveltejs/kit';
-import { trpc } from '$lib/store';
-import type { LayoutLoad } from './$types';
-import { redirect } from '@sveltejs/kit';
-
-function checkConfiguration(destination: any): string | null {
- let configurationPhase = null;
- if (!destination?.remoteEngine) return configurationPhase;
- if (!destination?.sshKey) {
- configurationPhase = 'sshkey';
- }
- return configurationPhase;
-}
-
-export const load: LayoutLoad = async ({ params, url }) => {
- const { pathname } = new URL(url);
- const { id } = params;
- try {
- const destination = await trpc.destinations.getDestinationById.query({ id });
- if (!destination) {
- throw redirect(307, '/destinations');
- }
- const configurationPhase = checkConfiguration(destination);
- console.log({ configurationPhase });
- // if (
- // configurationPhase &&
- // pathname !== `/applications/${params.id}/configuration/${configurationPhase}`
- // ) {
- // throw redirect(302, `/applications/${params.id}/configuration/${configurationPhase}`);
- // }
- return {
- destination
- };
- } catch (err) {
- if (err instanceof Error) {
- throw error(500, {
- message: 'An unexpected error occurred, please try again later.' + ' ' + err.message
- });
- }
-
- throw error(500, {
- message: 'An unexpected error occurred, please try again later.'
- });
- }
-};
diff --git a/apps/trpc-experimental/client/src/routes/destinations/[id]/+page.svelte b/apps/trpc-experimental/client/src/routes/destinations/[id]/+page.svelte
deleted file mode 100644
index 6b6716f52..000000000
--- a/apps/trpc-experimental/client/src/routes/destinations/[id]/+page.svelte
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-{#if id === 'new'}
-
-{:else}
-
-{/if}
diff --git a/apps/trpc-experimental/client/src/routes/destinations/[id]/components/Destination.svelte b/apps/trpc-experimental/client/src/routes/destinations/[id]/components/Destination.svelte
deleted file mode 100644
index 11135717d..000000000
--- a/apps/trpc-experimental/client/src/routes/destinations/[id]/components/Destination.svelte
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
- {#if destination.remoteEngine}
-
- {:else}
-
- {/if}
-
diff --git a/apps/trpc-experimental/client/src/routes/destinations/[id]/components/LocalDocker.svelte b/apps/trpc-experimental/client/src/routes/destinations/[id]/components/LocalDocker.svelte
deleted file mode 100644
index 237688577..000000000
--- a/apps/trpc-experimental/client/src/routes/destinations/[id]/components/LocalDocker.svelte
+++ /dev/null
@@ -1,212 +0,0 @@
-
-
-
-
- Save
-
- Force restart proxy
-
-
- Name
-
- Engine
-
- Netwokr
-
- {#if $appSession.teamId === '0'}
- You cannot disable this proxy as FQDN is configured for Coolify.'
- : ''
- }`}
- />
- {/if}
-
-
diff --git a/apps/trpc-experimental/client/src/routes/destinations/[id]/components/New.svelte b/apps/trpc-experimental/client/src/routes/destinations/[id]/components/New.svelte
deleted file mode 100644
index 321ee7c70..000000000
--- a/apps/trpc-experimental/client/src/routes/destinations/[id]/components/New.svelte
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
Predefined destinations
-
- setPredefined('localDocker')}>Local Docker
- setPredefined('remoteDocker')}>Remote Docker
-
-
-
-{#if selected === 'localDocker'}
-
-{:else if selected === 'remoteDocker'}
-
-{:else}
- Not implemented yet
-{/if}
diff --git a/apps/trpc-experimental/client/src/routes/destinations/[id]/components/NewLocalDocker.svelte b/apps/trpc-experimental/client/src/routes/destinations/[id]/components/NewLocalDocker.svelte
deleted file mode 100644
index 81eb9c0f8..000000000
--- a/apps/trpc-experimental/client/src/routes/destinations/[id]/components/NewLocalDocker.svelte
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
-
-
Configuration
-
{loading ? (payload.isCoolifyProxyUsed ? 'Saving...' : 'Saving...') : 'Save'}
-
-
- Name
-
-
-
-
- Engine
-
-
-
- Network
-
-
- {#if $appSession.teamId === '0'}
-
- (payload.isCoolifyProxyUsed = !payload.isCoolifyProxyUsed)}
- title="Use Coolify Proxy?"
- description={'This will install a proxy on the destination to allow you to access your applications and services without any manual configuration.'}
- />
-
- {/if}
-
-
diff --git a/apps/trpc-experimental/client/src/routes/destinations/[id]/components/NewRemoteDocker.svelte b/apps/trpc-experimental/client/src/routes/destinations/[id]/components/NewRemoteDocker.svelte
deleted file mode 100644
index 5fed699d5..000000000
--- a/apps/trpc-experimental/client/src/routes/destinations/[id]/components/NewRemoteDocker.svelte
+++ /dev/null
@@ -1,104 +0,0 @@
-
-
-
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/destinations/[id]/components/RemoteDocker.svelte b/apps/trpc-experimental/client/src/routes/destinations/[id]/components/RemoteDocker.svelte
deleted file mode 100644
index f67fab14e..000000000
--- a/apps/trpc-experimental/client/src/routes/destinations/[id]/components/RemoteDocker.svelte
+++ /dev/null
@@ -1,279 +0,0 @@
-
-
-
-
- {#if $appSession.isAdmin}
- {$t('forms.save')}
-
- {!destination.remoteVerified
- ? 'Verify Remote Docker Engine'
- : 'Check Remote Docker Engine'}
- {#if destination.remoteVerified}
- {$t('destination.force_restart_proxy')}
- {/if}
- {/if}
-
-
- {$t('forms.name')}
-
-
-
- {$t('forms.network')}
-
-
-
- IP Address
-
-
-
- User
-
-
-
- Port
-
-
-
-
- You cannot disable this proxy as FQDN is configured for Coolify.'
- : ''
- }`}
- />
-
-
diff --git a/apps/trpc-experimental/client/src/routes/login/+page.svelte b/apps/trpc-experimental/client/src/routes/login/+page.svelte
deleted file mode 100644
index 07cbd17d6..000000000
--- a/apps/trpc-experimental/client/src/routes/login/+page.svelte
+++ /dev/null
@@ -1,123 +0,0 @@
-
-
-
- Login
-
-
-
-
-
Coolify
- Made self-hosting simple.
-
-
-
- {#if $appSession.whiteLabeledDetails.icon}
-
-
-
- {:else}
-
-
-
-
-
-
-
Coolify
-
- {/if}
-
-
-
-
Welcome back
- Please login to continue.
-
-
-
-
-
-
-
{loading ? 'Authenticating' : 'Login'}
- {#if $appSession.isRegistrationEnabled}
-
Register
- {:else}
-
- Registration is disabled. Please ask an admin to activate it.
-
- {/if}
-
-
- {#if browser && window.location.host === 'demo.coolify.io'}
-
- Registration is open , just fill in an email (does not
- need to be live email address for the demo instance) and a password.
-
-
- All users gets an own namespace , so you won't be able
- to access other users data.
-
- {/if}
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/register/+page.svelte b/apps/trpc-experimental/client/src/routes/register/+page.svelte
deleted file mode 100644
index 37603dc1d..000000000
--- a/apps/trpc-experimental/client/src/routes/register/+page.svelte
+++ /dev/null
@@ -1,146 +0,0 @@
-
-
-
-
-
Coolify
- Made self-hosting simple.
-
-
-
-
-
goto('/')}>
-
-
-
-
-
-
-
-
- {#if $appSession.whiteLabeledDetails.icon}
-
-
-
- {:else}
-
-
-
-
-
-
-
Coolify
-
- {/if}
-
-
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/services/[id]/+layout.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/+layout.svelte
deleted file mode 100644
index f218a664c..000000000
--- a/apps/trpc-experimental/client/src/routes/services/[id]/+layout.svelte
+++ /dev/null
@@ -1,366 +0,0 @@
-
-
-
-
-
- {#if $status.service.initialLoading}
-
-
-
-
-
-
-
-
-
-
- {$status.service.startup[id] || 'Loading...'}
-
- {:else if $status.service.overallStatus === 'healthy'}
-
restartService()}
- >
-
-
-
-
-
- Force Redeploy
-
-
stopService(false)}
- type="submit"
- disabled={!$isDeploymentEnabled || !$appSession.isAdmin}
- class="btn btn-sm gap-2"
- >
-
-
-
-
-
- Stop
-
- {:else if $status.service.overallStatus === 'degraded'}
-
stopService()}
- type="submit"
- disabled={!$isDeploymentEnabled || !$appSession.isAdmin}
- class="btn btn-sm gap-2"
- >
-
-
-
-
- Stop
-
- {:else if $status.service.overallStatus === 'stopped'}
- {#if $status.service.overallStatus === 'degraded'}
-
restartService()}
- >
-
-
-
-
- {$status.application.statuses.length === 1 ? 'Force Redeploy' : 'Redeploy Stack'}
-
- {:else if $status.service.overallStatus === 'stopped'}
-
startService()}
- >
-
-
-
-
- Deploy
-
- {/if}
- {/if}
-
-
-
-
- {#if !$page.url.pathname.startsWith(`/services/${id}/configuration/`)}
-
- {/if}
-
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/services/[id]/+layout.ts b/apps/trpc-experimental/client/src/routes/services/[id]/+layout.ts
deleted file mode 100644
index 9027326c5..000000000
--- a/apps/trpc-experimental/client/src/routes/services/[id]/+layout.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { error } from '@sveltejs/kit';
-import { trpc } from '$lib/store';
-import type { LayoutLoad } from './$types';
-import { redirect } from '@sveltejs/kit';
-
-function checkConfiguration(service: any): string | null {
- let configurationPhase = null;
- if (!service.type) {
- configurationPhase = 'type';
- } else if (!service.destinationDockerId) {
- configurationPhase = 'destination';
- }
- return configurationPhase;
-}
-
-export const load: LayoutLoad = async ({ params, url }) => {
- const { pathname } = new URL(url);
- const { id } = params;
- try {
- const service = await trpc.services.getServices.query({ id });
- if (!service) {
- throw redirect(307, '/services');
- }
- const configurationPhase = checkConfiguration(service);
- console.log({ configurationPhase });
- // if (
- // configurationPhase &&
- // pathname !== `/applications/${params.id}/configuration/${configurationPhase}`
- // ) {
- // throw redirect(302, `/applications/${params.id}/configuration/${configurationPhase}`);
- // }
- return {
- ...service.data
- };
- } catch (err) {
- if (err instanceof Error) {
- throw error(500, {
- message: 'An unexpected error occurred, please try again later.' + ' ' + err.message
- });
- }
-
- throw error(500, {
- message: 'An unexpected error occurred, please try again later.'
- });
- }
-};
diff --git a/apps/trpc-experimental/client/src/routes/services/[id]/+page.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/+page.svelte
deleted file mode 100644
index 2dd38eadb..000000000
--- a/apps/trpc-experimental/client/src/routes/services/[id]/+page.svelte
+++ /dev/null
@@ -1,562 +0,0 @@
-
-
-
-
-
-
-
General
- {#if $appSession.isAdmin}
-
{loading.save ? 'Saving...' : forceSave ? 'Continue' : 'Force Save'}
- {/if}
- {#if service.type === 'plausibleanalytics' && $status.service.overallStatus === 'healthy'}
-
{loading.verification ? 'Verifying...' : 'Verify without SMTP'}
-
Cleanup Unnecessary Database Logs
- {/if}
- {#if service.type === 'appwrite' && $status.service.overallStatus === 'healthy'}
-
{loading.verification
- ? 'Migrating... it may take a while...'
- : "Migrate Appwrite's Database"}
-
-
-
- {/if}
-
-
-
-
-
- Name
-
-
-
-
Version / Tag
- {#if tags.tags?.length > 0}
-
-
-
- {:else}
-
- {/if}
-
-
-
-
Destination
-
- {#if service.destinationDockerId}
-
-
-
- {/if}
-
-
-
-
- FQDN
- https, the application will be accessible only over https. SSL certificate will be generated for you. If you specify www , the application will be redirected (302) from non-www and vice versa. To modify the domain, you must first stop the application.You must set your DNS to point to the server IP in advance. "}
- />
-
-
-
- {#each Object.keys(template) as oneService}
- {#each template[oneService].fqdns as fqdn}
-
- {fqdn.label || fqdn.name}
-
-
- {/each}
- {/each}
-
- {#if forceSave}
-
- {#if isNonWWWDomainOK}
- isDNSValid(getDomain(nonWWWDomain), false)}
- >DNS settings for {nonWWWDomain} is OK, click to recheck.
- {:else}
- isDNSValid(getDomain(nonWWWDomain), false)}
- >DNS settings for {nonWWWDomain} is invalid, click to recheck.
- {/if}
- {#if dualCerts}
- {#if isWWWDomainOK}
- isDNSValid(getDomain(`www.${nonWWWDomain}`), true)}
- >DNS settings for www.{nonWWWDomain} is OK, click to recheck.
- {:else}
- isDNSValid(getDomain(`www.${nonWWWDomain}`), true)}
- >DNS settings for www.{nonWWWDomain} is invalid, click to recheck.
- {/if}
- {/if}
-
- {/if}
-
-
-
- You need to have both DNS entries set in advance. Service needs to be restarted."}
- on:click={() => !$status.service.isRunning && changeSettings('dualCerts')}
- />
-
- {#if hostPorts.length === 0}
-
- Exposed Port Useful if you would like to use your own reverse proxy or tunnel and also in development mode. Otherwise leave empty.'}
- />
-
-
- {/if}
-
-
- {#each Object.keys(template) as oneService}
-
0 &&
- template[oneService].environment.find((env) => env.main === oneService)}
- class:border-b={template[oneService].environment.length > 0 &&
- template[oneService].environment.find((env) => env.main === oneService)}
- class:border-coolgray-500={template[oneService].environment.length > 0 &&
- template[oneService].environment.find((env) => env.main === oneService)}
- >
-
- {template[oneService].name ||
- oneService.replace(`${id}-`, '').replace(id, service.type)}
-
-
-
-
- {#if template[oneService].environment.length > 0}
- {#each template[oneService].environment as variable}
- {#if variable.main === oneService}
-
- {variable.label || variable.name}
- {#if variable.description}
-
- {/if}
- {#if variable.defaultValue === '$$generate_fqdn'}
-
- {:else if variable.defaultValue === '$$generate_fqdn_slash'}
-
- {:else if variable.defaultValue === '$$generate_domain'}
-
- {:else if variable.defaultValue === '$$generate_network'}
-
- {:else if variable.defaultValue === 'true' || variable.defaultValue === 'false'}
- {#if variable.value === 'true' || variable.value === 'false' || variable.value === 'invite_only'}
-
- enabled
- disabled
- {#if service.type.startsWith('plausibleanalytics') && variable.id == 'config_disable_registration'}
- invite_only
- {/if}
-
- {:else}
-
- true
- false
-
- {/if}
- {:else if variable.defaultValue === '$$generate_password'}
-
- {:else if variable.type === 'textarea'}
-
- {:else}
-
- {/if}
-
- {/if}
- {/each}
- {#if template[oneService].name.toLowerCase() === 'wordpress' && service.type.startsWith('wordpress')}
-
- {/if}
- {/if}
-
- {/each}
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/services/[id]/components/Menu.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/components/Menu.svelte
deleted file mode 100644
index bfc3a577a..000000000
--- a/apps/trpc-experimental/client/src/routes/services/[id]/components/Menu.svelte
+++ /dev/null
@@ -1,138 +0,0 @@
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/services/[id]/components/ServiceLinks.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/components/ServiceLinks.svelte
deleted file mode 100644
index c4a23e5b7..000000000
--- a/apps/trpc-experimental/client/src/routes/services/[id]/components/ServiceLinks.svelte
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-{#if linkToDocs}
-
-{:else}
-
-{/if}
diff --git a/apps/trpc-experimental/client/src/routes/services/[id]/components/ServiceStatus.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/components/ServiceStatus.svelte
deleted file mode 100644
index f6cb092f5..000000000
--- a/apps/trpc-experimental/client/src/routes/services/[id]/components/ServiceStatus.svelte
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-{#if serviceStatus.isExcluded}
- Excluded
-{:else if serviceStatus.isRunning}
- Running
-{:else if serviceStatus.isStopped || serviceStatus.isExited}
- Stopped
-{:else if serviceStatus.isRestarting}
- Restarting
-{/if}
diff --git a/apps/trpc-experimental/client/src/routes/services/[id]/components/Wordpress.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/components/Wordpress.svelte
deleted file mode 100644
index 7d5c2234a..000000000
--- a/apps/trpc-experimental/client/src/routes/services/[id]/components/Wordpress.svelte
+++ /dev/null
@@ -1,85 +0,0 @@
-
-
-
- changeSettings('ftpEnabled')}
- title="Enable sFTP connection to WordPress data"
- description="Enables an on-demand sFTP connection to the WordPress data directory. This is useful if you want to use sFTP to upload files."
- />
-
-{#if service.wordpress?.ftpEnabled}
-
- sFTP Connection URI
-
-
-
- User
-
-
-
- Password
-
-
-{/if}
diff --git a/apps/trpc-experimental/client/src/routes/services/[id]/danger/+page.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/danger/+page.svelte
deleted file mode 100644
index dc064d129..000000000
--- a/apps/trpc-experimental/client/src/routes/services/[id]/danger/+page.svelte
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
deleteService()}
- type="submit"
- disabled={!$appSession.isAdmin}
- class:bg-red-600={$appSession.isAdmin}
- class:hover:bg-red-500={$appSession.isAdmin}
- class="btn btn-lg btn-error text-sm"
- >
- Delete Service
-
-
diff --git a/apps/trpc-experimental/client/src/routes/services/[id]/logs/+page.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/logs/+page.svelte
deleted file mode 100644
index 87bc77010..000000000
--- a/apps/trpc-experimental/client/src/routes/services/[id]/logs/+page.svelte
+++ /dev/null
@@ -1,173 +0,0 @@
-
-
-
-
-{#if template}
-
- {#each Object.keys(template) as service}
- selectService(service, true)}
- class:bg-primary={selectedService === service}
- class:bg-coolgray-200={selectedService !== service}
- class="w-full rounded p-5 hover:bg-primary font-bold"
- >
- {#if template[service].name}
- {template[service].name || ''} ({service})
- {:else}
- {service}
- {/if}
-
- {/each}
-
-{:else}
- Loading components...
-{/if}
-
-{#if selectedService}
-
- {#if logs.length === 0}
- {#if noContainer}
-
Container not found / exited.
- {/if}
- {:else}
-
-
-
-
-
-
-
-
-
-
- {followingLogs ? 'Following Logs...' : 'Follow Logs'}
-
- {#if loadLogsInterval}
-
Streaming logs
- {/if}
-
-
-
- {/if}
-
-{/if}
diff --git a/apps/trpc-experimental/client/src/routes/services/[id]/secrets/+page.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/secrets/+page.svelte
deleted file mode 100644
index 2005404f7..000000000
--- a/apps/trpc-experimental/client/src/routes/services/[id]/secrets/+page.svelte
+++ /dev/null
@@ -1,98 +0,0 @@
-
-
-
-
-
-
-
-
- Name
- Value
- Action
-
-
-
- {#each secrets as secret}
- {#key secret.id}
-
-
-
- {/key}
- {/each}
-
-
-
-
-
-
- {#if $appSession.isAdmin}
-
-
-
-
Paste .env
file
-
Add Secrets in Batch
-
-
-
-
-
- {/if}
-
diff --git a/apps/trpc-experimental/client/src/routes/services/[id]/secrets/+page.ts b/apps/trpc-experimental/client/src/routes/services/[id]/secrets/+page.ts
deleted file mode 100644
index ee881f4e7..000000000
--- a/apps/trpc-experimental/client/src/routes/services/[id]/secrets/+page.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { error } from '@sveltejs/kit';
-import { trpc } from '$lib/store';
-import type { PageLoad } from './$types';
-export const ssr = false;
-
-export const load: PageLoad = async ({ params }) => {
- try {
- const { id } = params;
- const { data } = await trpc.services.getSecrets.query({ id });
- return data;
- } catch (err) {
- throw error(500, {
- message: 'An unexpected error occurred, please try again later.'
- });
- }
-};
diff --git a/apps/trpc-experimental/client/src/routes/services/[id]/secrets/components/Secret.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/secrets/components/Secret.svelte
deleted file mode 100644
index 1ad678005..000000000
--- a/apps/trpc-experimental/client/src/routes/services/[id]/secrets/components/Secret.svelte
+++ /dev/null
@@ -1,101 +0,0 @@
-
-
-
-
-
-
-
-
-
-{#if $appSession.isAdmin}
-
- {#if isNewSecret}
-
- saveSecret(true)}>Add
-
- {:else if !readonly}
-
-
- saveSecret(false)}>Set
-
-
- Remove
-
-
- {/if}
-
-{/if}
diff --git a/apps/trpc-experimental/client/src/routes/services/[id]/secrets/utils.ts b/apps/trpc-experimental/client/src/routes/services/[id]/secrets/utils.ts
deleted file mode 100644
index d2cabd386..000000000
--- a/apps/trpc-experimental/client/src/routes/services/[id]/secrets/utils.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-import { errorNotification } from '$lib/common';
-import { trpc } from '$lib/store';
-
-type Props = {
- isNew: boolean;
- name: string;
- value: string;
- isBuildSecret?: boolean;
- isPRMRSecret?: boolean;
- isNewSecret?: boolean;
- serviceId: string;
-};
-
-export async function saveSecret({
- isNew,
- name,
- value,
- isBuildSecret,
- isNewSecret
-}: Props): Promise {
- if (!name) return errorNotification('Name is required');
- if (!value) return errorNotification('Value is required');
- try {
- await trpc.services.createSecret.mutate({
- name,
- value,
- isBuildSecret,
- isNew: isNew || false
- });
-
- if (isNewSecret) {
- name = '';
- value = '';
- isBuildSecret = false;
- }
- } catch (error) {
- throw error;
- }
-}
-
-export async function saveForm(formData: any, service: any) {
- const settings = service.serviceSetting.map((setting: { name: string }) => setting.name);
- const secrets = service.serviceSecret.map((secret: { name: string }) => secret.name);
- const baseCoolifySetting = ['name', 'fqdn', 'exposePort', 'version'];
- for (let field of formData) {
- const [key, value] = field;
- if (secrets.includes(key) && value) {
- await trpc.services.createSecret.mutate({
- name: key,
- value
- });
- } else {
- service.serviceSetting = service.serviceSetting.map((setting: any) => {
- if (setting.name === key) {
- setting.changed = true;
- setting.value = value;
- }
- return setting;
- });
- if (!settings.includes(key) && !baseCoolifySetting.includes(key)) {
- service.serviceSetting.push({
- id: service.id,
- name: key,
- value: value,
- isNew: true
- });
- }
- if (baseCoolifySetting.includes(key)) {
- service[key] = value;
- }
- }
- }
- await trpc.services.saveService.mutate(service);
- const {
- data: { service: reloadedService }
- } = await trpc.services.getServices.query({ id: service.id });
- return reloadedService;
-}
diff --git a/apps/trpc-experimental/client/src/routes/services/[id]/storages/+page.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/storages/+page.svelte
deleted file mode 100644
index 7b0fa33df..000000000
--- a/apps/trpc-experimental/client/src/routes/services/[id]/storages/+page.svelte
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
-
-
- Persistent Volumes
-
-
- {#if persistentStorages.filter((s) => s.predefined).length > 0}
-
Predefined Volumes
-
-
-
Container
-
Volume ID : Mount Dir
-
-
-
- {#each persistentStorages.filter((s) => s.predefined) as storage}
- {#key storage.id}
-
- {/key}
- {/each}
- {/if}
-
- {#if persistentStorages.filter((s) => !s.predefined).length > 0}
-
s.predefined).length > 0}>
- Custom Volumes
-
-
- {#each persistentStorages.filter((s) => !s.predefined) as storage}
- {#key storage.id}
-
- {/key}
- {/each}
- {/if}
- {#if $appSession.isAdmin}
-
s.predefined).length > 0}>
- Add New Volume
-
-
- {/if}
-
-
diff --git a/apps/trpc-experimental/client/src/routes/services/[id]/storages/+page.ts b/apps/trpc-experimental/client/src/routes/services/[id]/storages/+page.ts
deleted file mode 100644
index 5c21ebee9..000000000
--- a/apps/trpc-experimental/client/src/routes/services/[id]/storages/+page.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { error } from '@sveltejs/kit';
-import { trpc } from '$lib/store';
-import type { PageLoad } from './$types';
-export const ssr = false;
-
-export const load: PageLoad = async ({ params }) => {
- try {
- const { id } = params;
- const { data } = await trpc.services.getStorages.query({ id });
- return data;
- } catch (err) {
- throw error(500, {
- message: 'An unexpected error occurred, please try again later.'
- });
- }
-};
diff --git a/apps/trpc-experimental/client/src/routes/services/[id]/storages/components/Storage.svelte b/apps/trpc-experimental/client/src/routes/services/[id]/storages/components/Storage.svelte
deleted file mode 100644
index cb4f0fafd..000000000
--- a/apps/trpc-experimental/client/src/routes/services/[id]/storages/components/Storage.svelte
+++ /dev/null
@@ -1,167 +0,0 @@
-
-
-
- {#if storage.predefined}
-
- {:else if isNew}
-
-
-
-
- Container
-
- {#if services.length === 1}
- {#if services[0].name}
- {services[0].name}
- {:else}
- {services[0]}
- {/if}
- {:else}
- {#each services as service}
- {#if service.name}
- {service.name}
- {:else}
- {service}
- {/if}
- {/each}
- {/if}
-
-
-
- Path
-
-
-
-
- Add
-
-
-
- {:else}
-
- s.id === storage.containerId).name || storage.containerId}`}
- />
-
- removeStorage(storage)}>Remove
-
- {/if}
-
diff --git a/apps/trpc-experimental/client/src/routes/services/[id]/utils.ts b/apps/trpc-experimental/client/src/routes/services/[id]/utils.ts
deleted file mode 100644
index e2aeac4b2..000000000
--- a/apps/trpc-experimental/client/src/routes/services/[id]/utils.ts
+++ /dev/null
@@ -1,79 +0,0 @@
-import { errorNotification } from '$lib/common';
-
-type Props = {
- isNew: boolean;
- name: string;
- value: string;
- isBuildSecret?: boolean;
- isPRMRSecret?: boolean;
- isNewSecret?: boolean;
- serviceId: string;
-};
-
-export async function saveSecret({
- isNew,
- name,
- value,
- isBuildSecret,
- isPRMRSecret,
- isNewSecret,
- serviceId
-}: Props): Promise {
- if (!name) return errorNotification('Name is required');
- if (!value) return errorNotification('Value is required');
- try {
- // await post(`/services/${serviceId}/secrets`, {
- // name,
- // value,
- // isBuildSecret,
- // isPRMRSecret,
- // isNew: isNew || false
- // });
- if (isNewSecret) {
- name = '';
- value = '';
- isBuildSecret = false;
- }
- } catch (error) {
- throw error
- }
-}
-
-export async function saveForm(formData: any, service: any) {
- const settings = service.serviceSetting.map((setting: { name: string }) => setting.name);
- const secrets = service.serviceSecret.map((secret: { name: string }) => secret.name);
- const baseCoolifySetting = ['name', 'fqdn', 'exposePort', 'version'];
- for (let field of formData) {
- const [key, value] = field;
- if (secrets.includes(key) && value) {
- // await post(`/services/${service.id}/secrets`, {
- // name: key,
- // value,
- // });
- } else {
- service.serviceSetting = service.serviceSetting.map((setting: any) => {
- if (setting.name === key) {
- setting.changed = true;
- setting.value = value;
- }
- return setting;
- });
- if (!settings.includes(key) && !baseCoolifySetting.includes(key)) {
- service.serviceSetting.push({
- id: service.id,
- name: key,
- value: value,
- isNew: true
- });
- }
- if (baseCoolifySetting.includes(key)) {
- service[key] = value;
- }
- }
-
- }
- // await post(`/services/${service.id}`, { ...service });
- // const { service: reloadedService } = await get(`/services/${service.id}`);
- // return reloadedService;
-
-}
diff --git a/apps/trpc-experimental/client/src/routes/sources/[id]/+layout.svelte b/apps/trpc-experimental/client/src/routes/sources/[id]/+layout.svelte
deleted file mode 100644
index 4b83d0ab4..000000000
--- a/apps/trpc-experimental/client/src/routes/sources/[id]/+layout.svelte
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-{#if id !== 'new' && $appSession.teamId === '0'}
-
- deleteSource(source.name)}
- type="submit"
- disabled={!$appSession.isAdmin}
- class:hover:text-red-500={$appSession.isAdmin}
- class="icons bg-transparent text-sm">
-
- Delete
-{/if}
-
diff --git a/apps/trpc-experimental/client/src/routes/sources/[id]/+layout.ts b/apps/trpc-experimental/client/src/routes/sources/[id]/+layout.ts
deleted file mode 100644
index 34c9d07e9..000000000
--- a/apps/trpc-experimental/client/src/routes/sources/[id]/+layout.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { error } from '@sveltejs/kit';
-import { trpc } from '$lib/store';
-import type { LayoutLoad } from './$types';
-import { redirect } from '@sveltejs/kit';
-
-export const load: LayoutLoad = async ({ params, url }) => {
- const { pathname } = new URL(url);
- const { id } = params;
- try {
- const source = await trpc.sources.getSourceById.query({ id });
- if (!source) {
- throw redirect(307, '/sources');
- }
-
- // if (
- // configurationPhase &&
- // pathname !== `/applications/${params.id}/configuration/${configurationPhase}`
- // ) {
- // throw redirect(302, `/applications/${params.id}/configuration/${configurationPhase}`);
- // }
- return {
- source
- };
- } catch (err) {
- if (err instanceof Error) {
- throw error(500, {
- message: 'An unexpected error occurred, please try again later.' + ' ' + err.message
- });
- }
-
- throw error(500, {
- message: 'An unexpected error occurred, please try again later.'
- });
- }
-};
diff --git a/apps/trpc-experimental/client/src/routes/sources/[id]/+page.svelte b/apps/trpc-experimental/client/src/routes/sources/[id]/+page.svelte
deleted file mode 100644
index 1f86f37e7..000000000
--- a/apps/trpc-experimental/client/src/routes/sources/[id]/+page.svelte
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-{#if id === 'new'}
-
-{:else}
-
-{/if}
diff --git a/apps/trpc-experimental/client/src/routes/sources/[id]/components/Github.svelte b/apps/trpc-experimental/client/src/routes/sources/[id]/components/Github.svelte
deleted file mode 100644
index 4fa2253e3..000000000
--- a/apps/trpc-experimental/client/src/routes/sources/[id]/components/Github.svelte
+++ /dev/null
@@ -1,264 +0,0 @@
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/sources/[id]/components/Gitlab.svelte b/apps/trpc-experimental/client/src/routes/sources/[id]/components/Gitlab.svelte
deleted file mode 100644
index 1c6ced26a..000000000
--- a/apps/trpc-experimental/client/src/routes/sources/[id]/components/Gitlab.svelte
+++ /dev/null
@@ -1,333 +0,0 @@
-
-
-
-
-
-
General
-
- {#if $appSession.isAdmin}
- {loading ? 'Saving...' : 'Save'}
- {#if source.gitlabAppId}
- Change GitLab App Settings
- {:else}
- Create new GitLab App manually
- {/if}
- {/if}
-
-
-
- {#if !source.gitlabAppId}
-
Documentation and detailed instructions.
-
- Application Type
-
- User owned application
- Group owned application
- {#if source.htmlUrl !== 'https://gitlab.com'}
- Instance-wide application (self-hosted)
- {/if}
-
-
-
- {#if applicationType === 'group'}
-
- Group Name
-
-
- {/if}
- {/if}
-
-
- {#if source.gitlabApp.groupName}
-
- Group Name
-
-
- {/if}
-
- HTML URL
-
-
-
- API URL
-
-
- {#if selfHosted}
-
- Custom SSH User
-
-
-
- Custom SSH Port
-
-
- {/if}
-
-
- OAuth ID
- {#if !source.gitlabAppId}
-
- {/if}
-
-
-
-
-
- Application ID
-
-
-
- Secret
-
-
-
-
-
diff --git a/apps/trpc-experimental/client/src/routes/sources/[id]/components/New.svelte b/apps/trpc-experimental/client/src/routes/sources/[id]/components/New.svelte
deleted file mode 100644
index 113f6d0e3..000000000
--- a/apps/trpc-experimental/client/src/routes/sources/[id]/components/New.svelte
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
-
-
-
Select a git type
-
- setPredefined('github')}>GitHub
- setPredefined('gitlab')}>GitLab
-
-
- {#if source?.type}
-
- {#if source.type === 'github'}
-
- {:else if source.type === 'gitlab'}
-
- {/if}
-
- {/if}
-
diff --git a/apps/trpc-experimental/client/src/routes/sources/[id]/components/Source.svelte b/apps/trpc-experimental/client/src/routes/sources/[id]/components/Source.svelte
deleted file mode 100644
index 4097720c5..000000000
--- a/apps/trpc-experimental/client/src/routes/sources/[id]/components/Source.svelte
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-
-
-
- Configuration
-
-
{source.name}
-
- {#if source?.type === 'gitlab'}
-
-
-
- {:else if source?.type === 'github'}
-
-
-
- {/if}
-
-
- {#if source.type === 'github'}
-
- {:else if source.type === 'gitlab'}
-
- {/if}
-
diff --git a/apps/trpc-experimental/client/static/favicon.png b/apps/trpc-experimental/client/static/favicon.png
deleted file mode 100644
index 2c4482801..000000000
Binary files a/apps/trpc-experimental/client/static/favicon.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/appsmith.png b/apps/trpc-experimental/client/static/icons/appsmith.png
deleted file mode 100644
index 314ad9053..000000000
Binary files a/apps/trpc-experimental/client/static/icons/appsmith.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/appwrite.png b/apps/trpc-experimental/client/static/icons/appwrite.png
deleted file mode 100644
index 2aaa3e1ab..000000000
Binary files a/apps/trpc-experimental/client/static/icons/appwrite.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/compose.png b/apps/trpc-experimental/client/static/icons/compose.png
deleted file mode 100644
index b9cfb40e1..000000000
Binary files a/apps/trpc-experimental/client/static/icons/compose.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/default.png b/apps/trpc-experimental/client/static/icons/default.png
deleted file mode 100644
index 2c4482801..000000000
Binary files a/apps/trpc-experimental/client/static/icons/default.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/directus.svg b/apps/trpc-experimental/client/static/icons/directus.svg
deleted file mode 100644
index e530a836b..000000000
--- a/apps/trpc-experimental/client/static/icons/directus.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/apps/trpc-experimental/client/static/icons/fider.png b/apps/trpc-experimental/client/static/icons/fider.png
deleted file mode 100644
index 6e34acafe..000000000
Binary files a/apps/trpc-experimental/client/static/icons/fider.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/ghost.png b/apps/trpc-experimental/client/static/icons/ghost.png
deleted file mode 100644
index f4e300654..000000000
Binary files a/apps/trpc-experimental/client/static/icons/ghost.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/gitea.svg b/apps/trpc-experimental/client/static/icons/gitea.svg
deleted file mode 100644
index 87c7c82db..000000000
--- a/apps/trpc-experimental/client/static/icons/gitea.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/trpc-experimental/client/static/icons/glitchtip.svg b/apps/trpc-experimental/client/static/icons/glitchtip.svg
deleted file mode 100644
index 2ae389aae..000000000
--- a/apps/trpc-experimental/client/static/icons/glitchtip.svg
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/apps/trpc-experimental/client/static/icons/grafana.png b/apps/trpc-experimental/client/static/icons/grafana.png
deleted file mode 100644
index c8659494f..000000000
Binary files a/apps/trpc-experimental/client/static/icons/grafana.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/hasura.png b/apps/trpc-experimental/client/static/icons/hasura.png
deleted file mode 100644
index 30490401e..000000000
Binary files a/apps/trpc-experimental/client/static/icons/hasura.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/keycloak.png b/apps/trpc-experimental/client/static/icons/keycloak.png
deleted file mode 100644
index 8f29f7af7..000000000
Binary files a/apps/trpc-experimental/client/static/icons/keycloak.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/languagetool.svg b/apps/trpc-experimental/client/static/icons/languagetool.svg
deleted file mode 100644
index fc8cab02f..000000000
--- a/apps/trpc-experimental/client/static/icons/languagetool.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
\ No newline at end of file
diff --git a/apps/trpc-experimental/client/static/icons/lavalink.png b/apps/trpc-experimental/client/static/icons/lavalink.png
deleted file mode 100644
index 114458bf2..000000000
Binary files a/apps/trpc-experimental/client/static/icons/lavalink.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/libretranslate.png b/apps/trpc-experimental/client/static/icons/libretranslate.png
deleted file mode 100644
index b22316b68..000000000
Binary files a/apps/trpc-experimental/client/static/icons/libretranslate.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/meilisearch.svg b/apps/trpc-experimental/client/static/icons/meilisearch.svg
deleted file mode 100644
index 72a8f30e1..000000000
--- a/apps/trpc-experimental/client/static/icons/meilisearch.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-
diff --git a/apps/trpc-experimental/client/static/icons/minio.png b/apps/trpc-experimental/client/static/icons/minio.png
deleted file mode 100644
index d1b32be9e..000000000
Binary files a/apps/trpc-experimental/client/static/icons/minio.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/moodle.png b/apps/trpc-experimental/client/static/icons/moodle.png
deleted file mode 100644
index a5cec5be7..000000000
Binary files a/apps/trpc-experimental/client/static/icons/moodle.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/n8n.svg b/apps/trpc-experimental/client/static/icons/n8n.svg
deleted file mode 100644
index 262a6e7a6..000000000
--- a/apps/trpc-experimental/client/static/icons/n8n.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/apps/trpc-experimental/client/static/icons/nocodb.png b/apps/trpc-experimental/client/static/icons/nocodb.png
deleted file mode 100644
index dec31a6dd..000000000
Binary files a/apps/trpc-experimental/client/static/icons/nocodb.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/openblocks.png b/apps/trpc-experimental/client/static/icons/openblocks.png
deleted file mode 100644
index b64d1bab3..000000000
Binary files a/apps/trpc-experimental/client/static/icons/openblocks.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/plausibleanalytics.png b/apps/trpc-experimental/client/static/icons/plausibleanalytics.png
deleted file mode 100644
index c02e68d63..000000000
Binary files a/apps/trpc-experimental/client/static/icons/plausibleanalytics.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/pocketbase.svg b/apps/trpc-experimental/client/static/icons/pocketbase.svg
deleted file mode 100644
index 5b5de956b..000000000
--- a/apps/trpc-experimental/client/static/icons/pocketbase.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/apps/trpc-experimental/client/static/icons/searxng.svg b/apps/trpc-experimental/client/static/icons/searxng.svg
deleted file mode 100644
index c0dd11b43..000000000
--- a/apps/trpc-experimental/client/static/icons/searxng.svg
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/trpc-experimental/client/static/icons/trilium.png b/apps/trpc-experimental/client/static/icons/trilium.png
deleted file mode 100644
index 249aceef3..000000000
Binary files a/apps/trpc-experimental/client/static/icons/trilium.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/umami.svg b/apps/trpc-experimental/client/static/icons/umami.svg
deleted file mode 100644
index b9d1abca3..000000000
--- a/apps/trpc-experimental/client/static/icons/umami.svg
+++ /dev/null
@@ -1,78 +0,0 @@
-
- Created by potrace 1.11, written by Peter Selinger 2001-2013
-
-
-
-
diff --git a/apps/trpc-experimental/client/static/icons/uptimekuma.svg b/apps/trpc-experimental/client/static/icons/uptimekuma.svg
deleted file mode 100644
index e67bc836a..000000000
--- a/apps/trpc-experimental/client/static/icons/uptimekuma.svg
+++ /dev/null
@@ -1,154 +0,0 @@
-
diff --git a/apps/trpc-experimental/client/static/icons/vaultwarden.svg b/apps/trpc-experimental/client/static/icons/vaultwarden.svg
deleted file mode 100644
index 15433d8ed..000000000
--- a/apps/trpc-experimental/client/static/icons/vaultwarden.svg
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
diff --git a/apps/trpc-experimental/client/static/icons/vscodeserver.png b/apps/trpc-experimental/client/static/icons/vscodeserver.png
deleted file mode 100644
index 37a084767..000000000
Binary files a/apps/trpc-experimental/client/static/icons/vscodeserver.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/weblate.svg b/apps/trpc-experimental/client/static/icons/weblate.svg
deleted file mode 100644
index 99c6ac483..000000000
--- a/apps/trpc-experimental/client/static/icons/weblate.svg
+++ /dev/null
@@ -1,56 +0,0 @@
-
diff --git a/apps/trpc-experimental/client/static/icons/whoogle.png b/apps/trpc-experimental/client/static/icons/whoogle.png
deleted file mode 100644
index 590875748..000000000
Binary files a/apps/trpc-experimental/client/static/icons/whoogle.png and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/icons/wordpress.svg b/apps/trpc-experimental/client/static/icons/wordpress.svg
deleted file mode 100644
index 31149e2ba..000000000
--- a/apps/trpc-experimental/client/static/icons/wordpress.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff b/apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff
deleted file mode 100644
index d5e713b46..000000000
Binary files a/apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff2 b/apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff2
deleted file mode 100644
index 6e1053fbc..000000000
Binary files a/apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-500.woff2 and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff b/apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff
deleted file mode 100644
index ccce523fe..000000000
Binary files a/apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff and /dev/null differ
diff --git a/apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff2 b/apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff2
deleted file mode 100644
index 7457692a2..000000000
Binary files a/apps/trpc-experimental/client/static/poppins-v19-latin-ext_latin_devanagari-regular.woff2 and /dev/null differ
diff --git a/apps/trpc-experimental/client/svelte.config.js b/apps/trpc-experimental/client/svelte.config.js
deleted file mode 100644
index b7195b469..000000000
--- a/apps/trpc-experimental/client/svelte.config.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import adapter from '@sveltejs/adapter-static';
-import preprocess from 'svelte-preprocess';
-
-/** @type {import('@sveltejs/kit').Config} */
-const config = {
- preprocess: [
- preprocess({
- postcss: true
- })
- ],
- kit: {
- adapter: adapter({
- pages: 'build',
- assets: 'build',
- fallback: 'index.html',
- precompress: true
- })
- }
-};
-
-export default config;
diff --git a/apps/trpc-experimental/client/tailwind.config.cjs b/apps/trpc-experimental/client/tailwind.config.cjs
deleted file mode 100644
index cab4ddbb7..000000000
--- a/apps/trpc-experimental/client/tailwind.config.cjs
+++ /dev/null
@@ -1,76 +0,0 @@
-const defaultTheme = require('tailwindcss/defaultTheme');
-
-module.exports = {
- content: [
- './**/*.html',
- './src/**/*.{js,jsx,ts,tsx,svelte}',
- './node_modules/flowbite-svelte/**/*.{html,js,svelte,ts}'
- ],
- important: true,
- daisyui: {
- themes: [
- {
- coollabs: {
- 'base-100': '#323232',
- 'base-200': '#242424',
- 'base-300': '#181818',
- primary: '#6B16ED',
- 'primary-content': '#fff',
- secondary: '#343232',
- accent: '#343232',
- neutral: '#272626',
- info: '#0284c7',
- success: '#16A34A',
- warning: '#FFFF00',
- error: '#DC2626',
- '--rounded-btn': '0.3rem',
- '--btn-text-case': 'normal'
- }
- }
- ]
- },
- theme: {
- extend: {
- keyframes: {
- wiggle: {
- '0%, 100%': { transform: 'rotate(-3deg)' },
- '50%': { transform: 'rotate(3deg)' }
- }
- },
- animation: {
- wiggle: 'wiggle 0.5s ease-in-out infinite'
- },
- fontFamily: {
- sans: ['Poppins', ...defaultTheme.fontFamily.sans]
- },
- colors: {
- applications: '#16A34A',
- databases: '#9333EA',
- 'databases-100': '#9b46ea',
- destinations: '#0284C7',
- sources: '#EA580C',
- services: '#DB2777',
- settings: '#FEE440',
- iam: '#C026D3',
- coollabs: '#6B16ED',
- 'coollabs-100': '#7317FF',
- coolblack: '#141414',
- 'coolgray-100': '#181818',
- 'coolgray-200': '#202020',
- 'coolgray-300': '#242424',
- 'coolgray-400': '#282828',
- 'coolgray-500': '#323232'
- }
- }
- },
- variants: {
- scrollbar: ['dark'],
- extend: {}
- },
- darkMode: 'class',
- plugins: [
- require('tailwindcss-scrollbar'),
- require('daisyui'),
- require('@tailwindcss/typography')
- ]
-};
diff --git a/apps/trpc-experimental/client/tests/test.ts b/apps/trpc-experimental/client/tests/test.ts
deleted file mode 100644
index 4e579377e..000000000
--- a/apps/trpc-experimental/client/tests/test.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { expect, test } from '@playwright/test';
-
-test('index page has expected h1', async ({ page }) => {
- await page.goto('/');
- expect(await page.textContent('h1')).toBe('Welcome to SvelteKit');
-});
diff --git a/apps/trpc-experimental/client/tsconfig.json b/apps/trpc-experimental/client/tsconfig.json
deleted file mode 100644
index dc270e7f0..000000000
--- a/apps/trpc-experimental/client/tsconfig.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "extends": "./.svelte-kit/tsconfig.json",
- "exclude": ["node_modules/*", ".svelte-kit/*", "public/*"],
- "compilerOptions": {
- "allowJs": true,
- "checkJs": true,
- "esModuleInterop": true,
- "forceConsistentCasingInFileNames": true,
- "resolveJsonModule": true,
- "skipLibCheck": true,
- "sourceMap": true,
- "strict": false,
- "paths": {
- "$lib": ["src/lib"],
- "$lib/*": ["src/lib/*"]
- }
- }
-}
diff --git a/apps/trpc-experimental/client/vite.config.ts b/apps/trpc-experimental/client/vite.config.ts
deleted file mode 100644
index 8eed3af0d..000000000
--- a/apps/trpc-experimental/client/vite.config.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { sveltekit } from '@sveltejs/kit/vite';
-import type { UserConfig } from 'vite';
-
-const config: UserConfig = {
- server: {
- host: '0.0.0.0'
- },
- plugins: [sveltekit()],
- define: {
- GITPOD_WORKSPACE_URL: JSON.stringify(process.env.GITPOD_WORKSPACE_URL),
- CODESANDBOX_HOST: JSON.stringify(process.env.CODESANDBOX_HOST)
- }
-};
-
-export default config;
diff --git a/apps/trpc-experimental/server/.env-template b/apps/trpc-experimental/server/.env-template
deleted file mode 100644
index d038e068c..000000000
--- a/apps/trpc-experimental/server/.env-template
+++ /dev/null
@@ -1,4 +0,0 @@
-NODE_ENV="development"
-
-COOLIFY_DATABASE_URL="file:../db/dev.db"
-COOLIFY_SECRET_KEY="32-character-long-secret-key"
\ No newline at end of file
diff --git a/apps/trpc-experimental/server/.prettierrc b/apps/trpc-experimental/server/.prettierrc
deleted file mode 100644
index a77fddea9..000000000
--- a/apps/trpc-experimental/server/.prettierrc
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "useTabs": true,
- "singleQuote": true,
- "trailingComma": "none",
- "printWidth": 100,
- "plugins": ["prettier-plugin-svelte"],
- "pluginSearchDirs": ["."],
- "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }]
-}
diff --git a/apps/trpc-experimental/server/build/api/index.js b/apps/trpc-experimental/server/build/api/index.js
deleted file mode 100644
index 2a6289ae9..000000000
--- a/apps/trpc-experimental/server/build/api/index.js
+++ /dev/null
@@ -1,31 +0,0 @@
-"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
deleted file mode 100644
index 9186a9097..000000000
--- a/apps/trpc-experimental/server/build/config.js
+++ /dev/null
@@ -1,32 +0,0 @@
-"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
deleted file mode 100644
index 455559525..000000000
--- a/apps/trpc-experimental/server/build/env.js
+++ /dev/null
@@ -1,18 +0,0 @@
-"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
deleted file mode 100644
index 5d36a4041..000000000
--- a/apps/trpc-experimental/server/build/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-"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
deleted file mode 100644
index 0c00297a6..000000000
--- a/apps/trpc-experimental/server/build/jobs/applicationBuildQueue.js
+++ /dev/null
@@ -1,813 +0,0 @@
-"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
deleted file mode 100644
index 063f4920f..000000000
--- a/apps/trpc-experimental/server/build/lib/buildPacks/common.js
+++ /dev/null
@@ -1,842 +0,0 @@
-"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
deleted file mode 100644
index 073711e91..000000000
--- a/apps/trpc-experimental/server/build/lib/buildPacks/compose.js
+++ /dev/null
@@ -1,137 +0,0 @@
-"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
deleted file mode 100644
index 2c03960c7..000000000
--- a/apps/trpc-experimental/server/build/lib/buildPacks/deno.js
+++ /dev/null
@@ -1,74 +0,0 @@
-"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
deleted file mode 100644
index 02cde82c2..000000000
--- a/apps/trpc-experimental/server/build/lib/buildPacks/docker.js
+++ /dev/null
@@ -1,51 +0,0 @@
-"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
deleted file mode 100644
index b71e587ab..000000000
--- a/apps/trpc-experimental/server/build/lib/buildPacks/gatsby.js
+++ /dev/null
@@ -1,50 +0,0 @@
-"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
deleted file mode 100644
index 6b5627a51..000000000
--- a/apps/trpc-experimental/server/build/lib/buildPacks/heroku.js
+++ /dev/null
@@ -1,41 +0,0 @@
-"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
deleted file mode 100644
index 5f4590110..000000000
--- a/apps/trpc-experimental/server/build/lib/buildPacks/index.js
+++ /dev/null
@@ -1,88 +0,0 @@
-"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
deleted file mode 100644
index 6bd5237a1..000000000
--- a/apps/trpc-experimental/server/build/lib/buildPacks/laravel.js
+++ /dev/null
@@ -1,68 +0,0 @@
-"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
deleted file mode 100644
index 945a0f960..000000000
--- a/apps/trpc-experimental/server/build/lib/buildPacks/nestjs.js
+++ /dev/null
@@ -1,52 +0,0 @@
-"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
deleted file mode 100644
index 57a9aced1..000000000
--- a/apps/trpc-experimental/server/build/lib/buildPacks/nextjs.js
+++ /dev/null
@@ -1,89 +0,0 @@
-"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
deleted file mode 100644
index e1d246e22..000000000
--- a/apps/trpc-experimental/server/build/lib/buildPacks/node.js
+++ /dev/null
@@ -1,71 +0,0 @@
-"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
deleted file mode 100644
index edc953bf2..000000000
--- a/apps/trpc-experimental/server/build/lib/buildPacks/nuxtjs.js
+++ /dev/null
@@ -1,89 +0,0 @@
-"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
deleted file mode 100644
index e68b46cd0..000000000
--- a/apps/trpc-experimental/server/build/lib/buildPacks/php.js
+++ /dev/null
@@ -1,71 +0,0 @@
-"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
deleted file mode 100644
index 9221d5d66..000000000
--- a/apps/trpc-experimental/server/build/lib/buildPacks/python.js
+++ /dev/null
@@ -1,86 +0,0 @@
-"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
deleted file mode 100644
index dc97fc657..000000000
--- a/apps/trpc-experimental/server/build/lib/buildPacks/react.js
+++ /dev/null
@@ -1,50 +0,0 @@
-"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
deleted file mode 100644
index 5fbb0af0d..000000000
--- a/apps/trpc-experimental/server/build/lib/buildPacks/rust.js
+++ /dev/null
@@ -1,69 +0,0 @@
-"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
deleted file mode 100644
index 38e193cef..000000000
--- a/apps/trpc-experimental/server/build/lib/buildPacks/static.js
+++ /dev/null
@@ -1,77 +0,0 @@
-"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
deleted file mode 100644
index e1af2492b..000000000
--- a/apps/trpc-experimental/server/build/lib/buildPacks/svelte.js
+++ /dev/null
@@ -1,50 +0,0 @@
-"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
deleted file mode 100644
index bc787e644..000000000
--- a/apps/trpc-experimental/server/build/lib/buildPacks/vuejs.js
+++ /dev/null
@@ -1,50 +0,0 @@
-"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
deleted file mode 100644
index a501790b7..000000000
--- a/apps/trpc-experimental/server/build/lib/common.js
+++ /dev/null
@@ -1,952 +0,0 @@
-"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
deleted file mode 100644
index bc709ce17..000000000
--- a/apps/trpc-experimental/server/build/lib/dayjs.js
+++ /dev/null
@@ -1,38 +0,0 @@
-"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
deleted file mode 100644
index 58fd81f5d..000000000
--- a/apps/trpc-experimental/server/build/lib/docker.js
+++ /dev/null
@@ -1,168 +0,0 @@
-"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
deleted file mode 100644
index b1a12607b..000000000
--- a/apps/trpc-experimental/server/build/lib/executeCommand.js
+++ /dev/null
@@ -1,207 +0,0 @@
-"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
deleted file mode 100644
index c03410e05..000000000
--- a/apps/trpc-experimental/server/build/lib/importers/github.js
+++ /dev/null
@@ -1,108 +0,0 @@
-"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
deleted file mode 100644
index d34c5bb7b..000000000
--- a/apps/trpc-experimental/server/build/lib/importers/gitlab.js
+++ /dev/null
@@ -1,76 +0,0 @@
-"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
deleted file mode 100644
index c6d1a4b55..000000000
--- a/apps/trpc-experimental/server/build/lib/importers/index.js
+++ /dev/null
@@ -1,37 +0,0 @@
-"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
deleted file mode 100644
index e820a7925..000000000
--- a/apps/trpc-experimental/server/build/lib/logging.js
+++ /dev/null
@@ -1,75 +0,0 @@
-"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
deleted file mode 100644
index 508741eeb..000000000
--- a/apps/trpc-experimental/server/build/lib/ssh.js
+++ /dev/null
@@ -1,76 +0,0 @@
-"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
deleted file mode 100644
index ec44b3000..000000000
--- a/apps/trpc-experimental/server/build/prisma.js
+++ /dev/null
@@ -1,36 +0,0 @@
-"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
deleted file mode 100644
index 2a9b35e73..000000000
--- a/apps/trpc-experimental/server/build/scheduler.js
+++ /dev/null
@@ -1,48 +0,0 @@
-"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
deleted file mode 100644
index f821124ac..000000000
--- a/apps/trpc-experimental/server/build/server.js
+++ /dev/null
@@ -1,99 +0,0 @@
-"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
deleted file mode 100644
index 953bece68..000000000
--- a/apps/trpc-experimental/server/build/trpc/context.js
+++ /dev/null
@@ -1,43 +0,0 @@
-"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
deleted file mode 100644
index a325a5955..000000000
--- a/apps/trpc-experimental/server/build/trpc/index.js
+++ /dev/null
@@ -1,39 +0,0 @@
-"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
deleted file mode 100644
index b34785834..000000000
--- a/apps/trpc-experimental/server/build/trpc/routers/applications/index.js
+++ /dev/null
@@ -1,1277 +0,0 @@
-"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
deleted file mode 100644
index 95a6d7b1d..000000000
--- a/apps/trpc-experimental/server/build/trpc/routers/applications/lib.js
+++ /dev/null
@@ -1,526 +0,0 @@
-"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
deleted file mode 100644
index 5f41172d4..000000000
--- a/apps/trpc-experimental/server/build/trpc/routers/auth.js
+++ /dev/null
@@ -1,201 +0,0 @@
-"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
deleted file mode 100644
index cd1519b5d..000000000
--- a/apps/trpc-experimental/server/build/trpc/routers/dashboard.js
+++ /dev/null
@@ -1,87 +0,0 @@
-"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
deleted file mode 100644
index 70c2fc4d2..000000000
--- a/apps/trpc-experimental/server/build/trpc/routers/databases/index.js
+++ /dev/null
@@ -1,384 +0,0 @@
-"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
deleted file mode 100644
index 2cb21ef78..000000000
--- a/apps/trpc-experimental/server/build/trpc/routers/databases/lib.js
+++ /dev/null
@@ -1,316 +0,0 @@
-"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
deleted file mode 100644
index 787431e46..000000000
--- a/apps/trpc-experimental/server/build/trpc/routers/destinations/index.js
+++ /dev/null
@@ -1,220 +0,0 @@
-"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
deleted file mode 100644
index a2eb93e72..000000000
--- a/apps/trpc-experimental/server/build/trpc/routers/index.js
+++ /dev/null
@@ -1,25 +0,0 @@
-"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
deleted file mode 100644
index 369203aaa..000000000
--- a/apps/trpc-experimental/server/build/trpc/routers/services/index.js
+++ /dev/null
@@ -1,846 +0,0 @@
-"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
deleted file mode 100644
index f374502d9..000000000
--- a/apps/trpc-experimental/server/build/trpc/routers/services/lib.js
+++ /dev/null
@@ -1,371 +0,0 @@
-"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
deleted file mode 100644
index 425a0d819..000000000
--- a/apps/trpc-experimental/server/build/trpc/routers/settings.js
+++ /dev/null
@@ -1,108 +0,0 @@
-"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
deleted file mode 100644
index 08f10e593..000000000
--- a/apps/trpc-experimental/server/build/trpc/routers/sources/index.js
+++ /dev/null
@@ -1,241 +0,0 @@
-"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
deleted file mode 100644
index 1b7ee2c0f..000000000
--- a/apps/trpc-experimental/server/build/trpc/trpc.js
+++ /dev/null
@@ -1,65 +0,0 @@
-"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/trpc-experimental/server/db/.gitkeep b/apps/trpc-experimental/server/db/.gitkeep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/apps/trpc-experimental/server/db/dev.db b/apps/trpc-experimental/server/db/dev.db
deleted file mode 100644
index 3aba23ddd..000000000
Binary files a/apps/trpc-experimental/server/db/dev.db and /dev/null differ
diff --git a/apps/trpc-experimental/server/db/migration.db b/apps/trpc-experimental/server/db/migration.db
deleted file mode 100644
index d555f31d5..000000000
Binary files a/apps/trpc-experimental/server/db/migration.db and /dev/null differ
diff --git a/apps/trpc-experimental/server/db/migration.db-journal b/apps/trpc-experimental/server/db/migration.db-journal
deleted file mode 100644
index 3deb841d8..000000000
Binary files a/apps/trpc-experimental/server/db/migration.db-journal and /dev/null differ
diff --git a/apps/trpc-experimental/server/devTags.json b/apps/trpc-experimental/server/devTags.json
deleted file mode 100644
index 5d4ef05cd..000000000
--- a/apps/trpc-experimental/server/devTags.json
+++ /dev/null
@@ -1,1013 +0,0 @@
-[
- { "name": "directus-postgresql", "image": "directus/directus", "tags": ["9.22"] },
- { "name": "whoogle", "image": "benbusby/whoogle-search", "tags": ["0.8.1"] },
- { "name": "libretranslate", "image": "libretranslate/libretranslate", "tags": ["v1.3.8"] },
- {
- "name": "appsmith",
- "image": "appsmith/appsmith-ce",
- "tags": [
- "v1.9.1",
- "v1.8.15",
- "v1.8.12",
- "v1.8.10",
- "v1.8.9",
- "v1.8.7",
- "v1.8.5",
- "v1.8.3",
- "v1.8.0",
- "v1.7.13",
- "v1.7.11",
- "v1.7.8",
- "v1.7.6",
- "v1.7.4",
- "v1.7.2",
- "v1.7.1",
- "v1.6.22",
- "v1.6.20",
- "v1.6.19",
- "v1.6.17",
- "v1.6.15",
- "v1.6.13",
- "v1.6.11",
- "v1.6.9",
- "v1.6.7",
- "v1.6.5",
- "v1.6.3",
- "v1.6.1",
- "v1.5.30",
- "v1.5.28"
- ]
- },
- {
- "name": "appwrite",
- "image": "appwrite/appwrite",
- "tags": [
- "1.2.0",
- "1.1.2",
- "1.1.0",
- "1.0.3",
- "1.0.1",
- "1.0.0",
- "0.15.2",
- "0.15.0",
- "0.14.2",
- "0.14.0",
- "0.13.4",
- "0.13.2",
- "0.13.0",
- "0.12.3",
- "0.12.1",
- "0.12.0",
- "0.11.2",
- "0.11.0",
- "0.10.4",
- "0.10.2",
- "0.10.0",
- "0.9.3",
- "0.9.1",
- "0.8.0",
- "0.7.1",
- "0.6.2",
- "0.6.0",
- "0.5.2",
- "0.5.0",
- "0.3.1"
- ]
- },
- {
- "name": "fider",
- "image": "getfider/fider",
- "tags": [
- "stable",
- "master",
- "main",
- "dev",
- "SHA_ee6e83cfaadadaa56ab76e089e01f5631af3506f",
- "SHA_deb4f9b4f561d890d8a80e6872fea9a98a265cc6",
- "SHA_d5cc307909d43447200483d76b5db74d8ed8349e",
- "SHA_d1674476577a7fd3c88fc29f91c3f35f5bd6a260",
- "SHA_d107cbb157abca6576110080736213efe0955cff",
- "SHA_c9c55b2f5b33a76015241b97e03cfac1254b42a7",
- "SHA_bcf451a3cb02d5c8a489fd30309249296057b084",
- "SHA_bbfe419639514f949a042807addf0fde7d4de225",
- "SHA_adc3afc4c7bcf96931a5f90cab65c282d860dbfd",
- "SHA_ab5283ae95334f10b5041402dce79e333c472015",
- "SHA_a3f4cb5ed0a4ee2d726705fc426636364aac17a1",
- "SHA_a18224142bf51bc6463c3d22f45f62287902e9a6",
- "SHA_8e5cff30d95963eaee2587488d351e0d658c8195",
- "SHA_8cabe2817ce7ccaf2f0a9fdbb1b5d3411de87f81",
- "SHA_7851f9da566132d87fa2a63004e78c3bc9c09c6c",
- "SHA_6c0f2bed1754e9d579eb9575129a6e3dbc529c32",
- "SHA_603508c8790d6a6fb1e852df1a58ead8e5b3ea6c",
- "SHA_55efacf164a4749b50ee68ae8925e7dc9dfa3a0c",
- "SHA_4bdd291ce61e5f5dfc063fa1b2d9be8c9ff1d4c4",
- "SHA_3fba9cb6a9ceab0c78c6cff3220610f591f657cb",
- "SHA_3d635b57606a9885babe91fe975b11429e0f2c38",
- "SHA_3b794edbd9789a8aa38ecd3714bc536a675d3058",
- "SHA_3570c454ad3252b690608f7bf8051737d8519f8a",
- "SHA_263e2709fd145f3ea511e5557e170102899995b0",
- "SHA_255c30ed012fc4c39ffc97efc1d3b00425b17c72",
- "SHA_17f92b16ef790003338f0926fc8d791a9a61333c"
- ]
- },
- {
- "name": "ghost-mariadb",
- "image": "bitnami/ghost",
- "tags": [
- "5.28.0",
- "5.27.0",
- "5.26.4",
- "5.26.3",
- "5.26.2",
- "5.26.1",
- "5.26.0",
- "5.25.5",
- "5.25.4",
- "5.25.3",
- "5.25.2",
- "5.25.1",
- "5.25.0",
- "5.24.2",
- "5.24.1",
- "5.24.0",
- "5.23.0",
- "5.22.11",
- "5.22.10",
- "5.22.9",
- "5.22.8",
- "5.22.7",
- "5.22.6",
- "5.22.5",
- "5.22.4",
- "5.22.3",
- "5.22.2",
- "5.22.1",
- "5.22.0",
- "5.21.0",
- "4.48.8"
- ]
- },
- {
- "name": "ghost-mysql",
- "image": "library/ghost",
- "tags": [
- "5.28.0",
- "5.27.0",
- "5.26.4",
- "5.26.3",
- "5.26.2",
- "5.26.1",
- "5.25.5",
- "5.25.3",
- "5.25.2",
- "5.25.1",
- "5.25.0",
- "5.24.2",
- "5.24.1",
- "5.23.0",
- "5.22.11",
- "5.22.10",
- "5.22.9",
- "5.22.8",
- "5.22.4",
- "5.22.1",
- "5.20.0",
- "5.19.3",
- "5.19.0",
- "5.18.0",
- "5.17.2",
- "5.17.1",
- "5.17.0",
- "5.16.2",
- "5.14.2",
- "5.14.1"
- ]
- },
- {
- "name": "ghost-only",
- "image": "library/ghost",
- "tags": [
- "5.28.0",
- "5.27.0",
- "5.26.4",
- "5.26.3",
- "5.26.2",
- "5.26.1",
- "5.25.5",
- "5.25.3",
- "5.25.2",
- "5.25.1",
- "5.25.0",
- "5.24.2",
- "5.24.1",
- "5.23.0",
- "5.22.11",
- "5.22.10",
- "5.22.9",
- "5.22.8",
- "5.22.4",
- "5.22.1",
- "5.20.0",
- "5.19.3",
- "5.19.0",
- "5.18.0",
- "5.17.2",
- "5.17.1",
- "5.17.0",
- "5.16.2",
- "5.14.2",
- "5.14.1"
- ]
- },
- {
- "name": "gitea",
- "image": "gitea/gitea",
- "tags": [
- "1.18.0",
- "1.17.4",
- "1.17.3",
- "1.17.2",
- "1.17.1",
- "1.17.0",
- "1.16.9",
- "1.16.8",
- "1.16.7",
- "1.16.6",
- "1.16.5",
- "1.16.4",
- "1.16.3",
- "1.16.2",
- "1.16.1",
- "1.16.0",
- "1.15.11",
- "1.15.10",
- "1.15.9",
- "1.15.8",
- "1.15.7",
- "1.15.6",
- "1.15.5",
- "1.15.4",
- "1.15.3",
- "1.15.2",
- "1.15.1",
- "1.15.0",
- "1.14.7",
- "1.14.6"
- ]
- },
- {
- "name": "glitchtip",
- "image": "glitchtip/glitchtip",
- "tags": [
- "v3.0.2",
- "v3.0.0",
- "v2.0.7",
- "v2.0.5",
- "v2.0.2",
- "v2.0.0",
- "v1.12.4",
- "v1.12.2",
- "v1.12.0",
- "v1.10.3",
- "v1.10.1",
- "v1.9.2",
- "v1.9.0",
- "v1.8.4",
- "v1.8.2",
- "v1.8.0",
- "v1.7.1",
- "v1.6.4",
- "v1.6.2",
- "v1.6.0",
- "v1.5.3",
- "v1.5.1",
- "v1.4.1",
- "v1.3.3",
- "v1.3.1",
- "v1.2.6",
- "v1.2.4",
- "v1.2.2",
- "v1.2.0",
- "v1.1.2"
- ]
- },
- {
- "name": "grafana",
- "image": "grafana/grafana",
- "tags": [
- "9.3.2",
- "9.3.1",
- "9.3.0",
- "9.2.8",
- "9.2.7",
- "9.2.6",
- "9.2.5",
- "9.2.4",
- "9.2.3",
- "9.2.2",
- "9.2.1",
- "9.2.0",
- "9.1.8",
- "9.1.7",
- "9.1.6",
- "9.1.5",
- "9.1.4",
- "9.1.3",
- "9.1.2",
- "9.1.1",
- "9.1.0",
- "9.0.9",
- "9.0.8",
- "9.0.7",
- "9.0.6",
- "9.0.5",
- "9.0.4",
- "9.0.3",
- "9.0.2",
- "9.0.1"
- ]
- },
- {
- "name": "hasura",
- "image": "hasura/graphql-engine",
- "tags": [
- "v2.16.1",
- "v2.16.0",
- "v2.15.2",
- "v2.14.1",
- "v2.13.2",
- "v2.12.1",
- "v2.11.3",
- "v2.10.2",
- "v2.9.0",
- "v2.8.4",
- "v2.8.3",
- "v2.8.2",
- "v2.8.1",
- "v2.8.0",
- "v2.7.0",
- "v2.6.2",
- "v2.6.1",
- "v2.6.0",
- "v2.5.2",
- "v2.5.1",
- "v2.5.0",
- "v2.4.0",
- "v2.3.1",
- "v2.3.0",
- "v2.2.2",
- "v2.2.1",
- "v2.2.0",
- "v2.1.1",
- "v2.1.0",
- "v2.0.10"
- ]
- },
- {
- "name": "keycloak",
- "image": "quay.io/keycloak/keycloak",
- "tags": [
- "9.0.3",
- "9.0.0",
- "8.0.1",
- "7.0.0",
- "6.0.1",
- "6.0.0",
- "20.0.2",
- "20.0.1",
- "20.0.0",
- "19.0.3",
- "19.0.1",
- "19.0.0",
- "18.0.1",
- "18.0.0",
- "17.0.1",
- "17.0.0",
- "16.1.0",
- "15.1.1",
- "15.0.2",
- "15.0.0",
- "13.0.1",
- "12.0.4",
- "12.0.2",
- "12.0.0",
- "11.0.2",
- "11.0.0",
- "10.0.1"
- ]
- },
- {
- "name": "languagetool",
- "image": "silviof/docker-languagetool",
- "tags": ["latest", "6.0", "5.8", "5.7", "5.6", "5.5", "5.4", "5.3"]
- },
- {
- "name": "lavalink",
- "image": "fredboat/lavalink",
- "tags": [
- "v3.7",
- "v3.6",
- "v3-vda0b3a4b3916a7b1a2b79702de1143c3a6939810-SNAPSHOT",
- "v3-vc92690c425390bd20f6c51643c67ba79ab85b7e0-SNAPSHOT",
- "v3-vab81dcd46adf3e8a961dd57eacd2a1bde1233e6c-SNAPSHOT",
- "v3-v9c9432704d6a4badfcbd06a57597c54bed8f4326-SNAPSHOT",
- "v3-v3.0",
- "v3-v3",
- "v3-v124f8fae7dab299f9cdf1cb4c1715be455497286-SNAPSHOT",
- "v3-",
- "v3",
- "v2.0.1",
- "v2.0",
- "v2",
- "update-udpqueue-vb4a439d6147dbd8641ea4f265e8efc9f1e16e2d3-SNAPSHOT",
- "update-udpqueue-",
- "update-udpqueue",
- "revert-713-fix-error-for-loading-jda-nas",
- "refactor-github-actions",
- "patch-update-lp",
- "patch-update-github-actions",
- "patch-more-configurable-github-actions",
- "patch-lavaplayer-update",
- "patch-lavaplayer-bump",
- "patch-build-number",
- "next-api-vd4db194cac7a839a3899857f1f6d7b910369309d-SNAPSHOT",
- "next-api-vc2e018d5ffef54b2d17244b3d213e31723a084d6-SNAPSHOT",
- "next-api-v42cb5f7c58e98d1911e87bffb35aee0a235b85f8-SNAPSHOT",
- "next-api-v31a243bda80badbd7d643f68fc1f87e99639060f-SNAPSHOT",
- "next-api-v17f6884434c2d70d1704b2322a951d9f07af8865-SNAPSHOT"
- ]
- },
- {
- "name": "meilisearch",
- "image": "getmeili/meilisearch",
- "tags": [
- "v0.30.5",
- "v0.30.3",
- "v0.30.1",
- "v0.30.0",
- "v0.29.3",
- "v0.29.1",
- "v0.29.0",
- "v0.28.1",
- "v0.28.0",
- "v0.27.1",
- "v0.27.0",
- "v0.26.1",
- "v0.26.0",
- "v0.25.1",
- "v0.25.0",
- "v0.23.1",
- "v0.23.0",
- "v0.21.1",
- "v0.21.0",
- "v0.20.0",
- "v0.19.0",
- "v0.18.1",
- "v0.18.0",
- "v0.17.0",
- "v0.16.0",
- "0.14.1",
- "v0.14.1",
- "v0.14.0",
- "v0.12.0",
- "v0.11.0"
- ]
- },
- {
- "name": "minio",
- "image": "minio/minio",
- "tags": [
- "RELEASE.2023-01-06T18-11-18Z",
- "RELEASE.2023-01-02T09-40-09Z",
- "RELEASE.2022-12-12T19-27-27Z",
- "RELEASE.2022-12-07T00-56-37Z",
- "RELEASE.2022-12-02T19-19-22Z",
- "RELEASE.2022-11-29T23-40-49Z",
- "RELEASE.2022-11-26T22-43-32Z",
- "RELEASE.2022-11-17T23-20-09Z",
- "RELEASE.2022-11-11T03-44-20Z",
- "RELEASE.2022-11-10T18-20-21Z",
- "RELEASE.2022-11-08T05-27-07Z",
- "RELEASE.2022-10-29T06-21-33Z",
- "RELEASE.2022-10-24T18-35-07Z.hotfix.7906ac5be",
- "RELEASE.2022-10-24T18-35-07Z",
- "RELEASE.2022-10-21T22-37-48Z",
- "RELEASE.2022-10-20T00-55-09Z",
- "RELEASE.2022-10-15T19-57-03Z",
- "RELEASE.2022-10-08T20-11-00Z",
- "RELEASE.2022-10-05T14-58-27Z",
- "RELEASE.2022-10-02T19-29-29Z",
- "RELEASE.2022-09-25T15-44-53Z",
- "RELEASE.2022-09-22T18-57-27Z",
- "RELEASE.2022-09-17T00-09-45Z.hotfix.f76e5da9f",
- "RELEASE.2022-09-17T00-09-45Z.fips",
- "RELEASE.2022-09-07T22-25-02Z.fips",
- "RELEASE.2022-09-01T23-53-36Z.fips",
- "RELEASE.2022-08-26T19-53-15Z.fips",
- "RELEASE.2022-08-25T07-17-05Z.fips",
- "RELEASE.2022-08-22T23-53-06Z.hotfix.5fa3967bb",
- "RELEASE.2022-08-22T23-53-06Z"
- ]
- },
- {
- "name": "n8n",
- "image": "n8nio/n8n",
- "tags": [
- "0.210.1",
- "0.210.0",
- "0.209.4",
- "0.209.3",
- "0.209.2",
- "0.209.1",
- "0.209.0",
- "0.208.1",
- "0.208.0",
- "0.207.1",
- "0.207.0",
- "0.206.1",
- "0.205.0",
- "0.204.0",
- "0.203.1",
- "0.202.1",
- "0.202.0",
- "0.201.0",
- "0.200.1",
- "0.199.0",
- "0.198.1",
- "0.198.0",
- "0.197.1",
- "0.197.0",
- "0.196.0",
- "0.195.5",
- "0.195.4",
- "0.195.3",
- "0.195.2",
- "0.195.1"
- ]
- },
- {
- "name": "nocodb",
- "image": "nocodb/nocodb",
- "tags": [
- "0.100.1",
- "0.99.1",
- "0.98.4",
- "0.98.2",
- "0.98.0",
- "0.96.4",
- "0.96.2",
- "0.96.0",
- "0.92.3",
- "0.91.10",
- "0.91.9",
- "0.91.7",
- "0.91.0",
- "0.90.10",
- "0.90.7",
- "0.90.4",
- "0.90.2",
- "0.90.0",
- "0.84.15",
- "0.84.12",
- "0.84.8",
- "0.84.6",
- "0.84.2",
- "0.84.1",
- "0.83.6",
- "0.83.3",
- "0.83.1",
- "0.82.0",
- "0.81.0",
- "0.11.46"
- ]
- },
- {
- "name": "openblocks",
- "image": "openblocksdev/openblocks-ce",
- "tags": ["latest", "heroku", "beta", "1.1.3", "1.1.2", "1.1.1", "1.1.0", "1.0.21"]
- },
- {
- "name": "plausibleanalytics-arm",
- "image": "plausible/analytics",
- "tags": [
- "v1.5.1",
- "v1.5.0-rc.2",
- "v1.5.0-rc.1",
- "v1.5.0",
- "v1.5",
- "v1.4.4",
- "v1.4.3",
- "v1.4.2",
- "v1.4.1",
- "v1.4.0.rc.0",
- "v1.4.0-rc.0",
- "v1.4.0",
- "v1.4",
- "v1.3.0-rc.1",
- "v1.3.0-rc.0",
- "v1.3.0",
- "v1.3",
- "v1.2.1",
- "v1.2.0",
- "v1.2-rc.1",
- "v1.2-rc.0",
- "v1.2",
- "v1.1.1",
- "v1.1.0",
- "v1.1",
- "v1.0.0",
- "v1.0",
- "v1",
- "stable",
- "master"
- ]
- },
- {
- "name": "plausibleanalytics",
- "image": "plausible/analytics",
- "tags": [
- "v1.5.1",
- "v1.5.0-rc.2",
- "v1.5.0-rc.1",
- "v1.5.0",
- "v1.5",
- "v1.4.4",
- "v1.4.3",
- "v1.4.2",
- "v1.4.1",
- "v1.4.0.rc.0",
- "v1.4.0-rc.0",
- "v1.4.0",
- "v1.4",
- "v1.3.0-rc.1",
- "v1.3.0-rc.0",
- "v1.3.0",
- "v1.3",
- "v1.2.1",
- "v1.2.0",
- "v1.2-rc.1",
- "v1.2-rc.0",
- "v1.2",
- "v1.1.1",
- "v1.1.0",
- "v1.1",
- "v1.0.0",
- "v1.0",
- "v1",
- "stable",
- "master"
- ]
- },
- {
- "name": "pocketbase",
- "image": "coollabsio/pocketbase",
- "tags": [
- "0.8.0-arm64",
- "0.8.0-amd64",
- "0.8.0-aarch64",
- "0.8.0",
- "0.10.2-arm64",
- "0.10.2-amd64",
- "0.10.2-aarch64",
- "0.10.2"
- ]
- },
- {
- "name": "searxng",
- "image": "searxng/searxng",
- "tags": [
- "2023.01.09-afd71a6c",
- "2023.01.09-a90ed481",
- "2023.01.08-54e63839",
- "2023.01.08-4e735b28",
- "2023.01.08-217395b8",
- "2023.01.08-0c429d70",
- "2023.01.07-cb7b0916",
- "2023.01.07-a98c5156",
- "2023.01.07-633ba8b1",
- "2023.01.07-4e355564",
- "2023.01.06-b241015e",
- "2023.01.06-269a72ee",
- "2023.01.05-aba969cc",
- "2022.12.30-b6d98be7",
- "2022.12.30-647a0aa9",
- "2022.12.30-17516290",
- "2022.12.29-d531f893",
- "2022.12.29-9b31976c",
- "2022.12.29-76cd808a",
- "2022.12.29-3ec58b06",
- "2022.12.29-174e6851",
- "2022.12.26-0d489617",
- "2022.12.23-e8f72d70",
- "2022.12.23-a2d506d4",
- "2022.12.22-d75ae7c8",
- "2022.12.16-f5bd73d9",
- "2022.12.16-b9274821",
- "2022.12.16-42ca37a6",
- "2022.12.16-2a51c856",
- "2022.12.16-0dac581c"
- ]
- },
- {
- "name": "trilium",
- "image": "zadam/trilium",
- "tags": [
- "0.57.4",
- "0.57.2",
- "0.56.1",
- "0.55.1",
- "0.54.2",
- "0.53.2",
- "0.52.4",
- "0.52.2",
- "0.51.2",
- "0.50.3",
- "0.50.1",
- "0.49.5",
- "0.49.3",
- "0.48.9",
- "0.48.7",
- "0.48.4",
- "0.48.2",
- "0.47.8",
- "0.47.6",
- "0.47.4",
- "0.47.2",
- "0.46.7",
- "0.46.5",
- "0.45.10",
- "0.45.9",
- "0.45.7",
- "0.45.5",
- "0.45.3",
- "0.44.8",
- "0.44.6"
- ]
- },
- {
- "name": "umami-postgresql",
- "image": "ghcr.io/umami-software/umami",
- "tags": [
- "postgresql-v1.39.5",
- "postgresql-v1.39.4",
- "postgresql-v1.39.3",
- "postgresql-v1.39.2",
- "postgresql-v1.39.1",
- "postgresql-v1.39.0",
- "postgresql-v1.38.0",
- "postgresql-v1.37.0",
- "postgresql-v1.36.1",
- "postgresql-v1.36.0",
- "postgresql-v1.35.0",
- "postgresql-v1.34.0",
- "postgresql-v1.33.3",
- "postgresql-latest",
- "mysql-v1.39.5",
- "mysql-v1.39.4",
- "mysql-v1.39.3",
- "mysql-v1.39.2",
- "mysql-v1.39.1",
- "mysql-v1.39.0",
- "mysql-v1.38.0",
- "mysql-v1.37.0",
- "mysql-v1.36.1",
- "mysql-v1.36.0",
- "mysql-v1.35.0",
- "mysql-v1.34.0",
- "mysql-v1.33.3",
- "mysql-latest"
- ]
- },
- {
- "name": "umami",
- "image": "ghcr.io/umami-software/umami",
- "tags": [
- "postgresql-v1.39.5",
- "postgresql-v1.39.4",
- "postgresql-v1.39.3",
- "postgresql-v1.39.2",
- "postgresql-v1.39.1",
- "postgresql-v1.39.0",
- "postgresql-v1.38.0",
- "postgresql-v1.37.0",
- "postgresql-v1.36.1",
- "postgresql-v1.36.0",
- "postgresql-v1.35.0",
- "postgresql-v1.34.0",
- "postgresql-v1.33.3",
- "postgresql-latest",
- "mysql-v1.39.5",
- "mysql-v1.39.4",
- "mysql-v1.39.3",
- "mysql-v1.39.2",
- "mysql-v1.39.1",
- "mysql-v1.39.0",
- "mysql-v1.38.0",
- "mysql-v1.37.0",
- "mysql-v1.36.1",
- "mysql-v1.36.0",
- "mysql-v1.35.0",
- "mysql-v1.34.0",
- "mysql-v1.33.3",
- "mysql-latest"
- ]
- },
- {
- "name": "uptimekuma",
- "image": "louislam/uptime-kuma",
- "tags": [
- "1.19.4",
- "1.19.3",
- "1.19.2",
- "1.19.1",
- "1.19.0",
- "1.18.5",
- "1.18.4",
- "1.18.3",
- "1.18.2",
- "1.18.1",
- "1.18.0",
- "1.17.1",
- "1.17.0",
- "1.16.1",
- "1.16.0",
- "1.15.1",
- "1.15.0",
- "1.14.1",
- "1.14.0",
- "1.13.2",
- "1.13.1",
- "1.13.0",
- "1.12.1",
- "1.11.4",
- "1.11.3",
- "1.11.2",
- "1.11.1",
- "1.11.0",
- "1.10.2",
- "1.10.1"
- ]
- },
- {
- "name": "vaultwarden",
- "image": "vaultwarden/server",
- "tags": [
- "1.27.0",
- "1.26.0",
- "1.25.2",
- "1.25.1",
- "1.25.0",
- "1.24.0",
- "1.23.1",
- "1.23.0",
- "1.22.2",
- "1.22.1",
- "1.22.0",
- "1.21.0"
- ]
- },
- {
- "name": "vscodeserver",
- "image": "codercom/code-server",
- "tags": [
- "4.9.1",
- "4.9.0",
- "4.8.3",
- "4.8.2",
- "4.8.1",
- "4.8.0",
- "4.7.0",
- "4.6.0",
- "4.5.1",
- "4.4.0",
- "4.2.0",
- "4.0.2",
- "3.11.1",
- "3.10.2",
- "3.10.0",
- "3.9.3",
- "3.9.1",
- "3.8.1",
- "3.7.4",
- "3.7.2",
- "3.7.0",
- "3.6.1",
- "3.5.0",
- "3.4.0",
- "3.3.0",
- "3.2.0",
- "3.1.1",
- "3.1.0",
- "3.0.2",
- "3.0.0"
- ]
- },
- {
- "name": "weblate",
- "image": "weblate/weblate",
- "tags": [
- "latest",
- "edge-2023-01-10-1df5c9dd96a6d8650f6881942fecbe33e1884295",
- "edge-2023-01-09-7029b7b6c630be7cdac07d1629573dd2b81bc05f",
- "edge-2023-01-09-4b05a878aa25b2c544a4e77027769b5934ec561f",
- "edge-2023-01-07-df50259ff209720b0fd3c983bd7a5d01b564149c",
- "edge-2023-01-07-719b3034de0ed369cd63554ea652f11142b9a540",
- "edge-2023-01-07-14d4aec6cd8e1e6e0b7c1dc3a9cf4a74ccfc5e37",
- "edge-2023-01-07-00f2d980c4388d799ba0df3a27c10bf941b7edd3",
- "edge-2023-01-04-e92fe933b22e36e92f6de57a0ecb16752852d815",
- "edge-2023-01-04-4c413c6ba33c39a6b7f3238f255bc09c69e96345",
- "edge-2023-01-02-fd57652cce9dd2a12c7ff1dc644f5a969e57ea76",
- "edge-2023-01-02-738d270784bca0cfaaef59e6cfb8c307f68a9939",
- "edge-2023-01-02-3f6a7a183bbda4dc2e8d7e468370adc6f9e50527",
- "edge-2023-01-01-5580a7a4755bf71403c85999fb4dff2078293403",
- "edge-2022-12-29-8f422f23930880809a26d1207f9e43315ef54ad2",
- "edge-2022-12-28-375fd99195711641246ccd09e3ce394d6928eaef",
- "edge-2022-12-25-358c8ce6071f2781ae027bbc3a46d906ce08d9e7",
- "edge-2022-12-24-3e1503494ce06ad6ff32f02db1a7d59224e5c860",
- "edge-2022-12-21-cac4b09f943fe97700e3a33b7caf23277d2fcc11",
- "edge-2022-12-21-3a8dd1bf66a7295f3512346bc1c97d55c5649dcf",
- "edge-2022-12-16-e93caa3b014543b716b946f2c7fbf4a8f9be6099",
- "edge-2022-12-16-318a467d2e529a081e9ea9dbad993c1736ff1a00",
- "edge-2022-12-16-1af41ec4bd3838f967d88b68dec8195419e01e6f",
- "edge-2022-12-16-02e9d020b01d004655c3af20c68a30f6c4645c1a",
- "edge-2022-12-15-a6af1384a0831b17c43da7262f80d0cfbc766835",
- "edge-2022-12-15-a1c9f77b301a9e23fc05ef2adc4694cceb632c25",
- "edge-2022-12-15-1305f7115ef79b75e638b097772680d9cadbd4d0",
- "edge-2022-12-14-b400145f05687e647bd4c8192be99f7f04373fb5",
- "edge-2022-12-12-c0db193a3baacd107c5f2c28c6e0af89c3d5afa3",
- "edge-2022-12-09-647d40c67cf405870ba71a01584a42cfaec5915f"
- ]
- },
- {
- "name": "wordpress-only",
- "image": "library/wordpress",
- "tags": [
- "php8.2-fpm-alpine",
- "php8.2-fpm",
- "php8.2-apache",
- "php8.2",
- "php8.1-fpm-alpine",
- "php8.1-fpm",
- "php8.1-apache",
- "php8.1",
- "php8.0-fpm-alpine",
- "php8.0-fpm",
- "php8.0-apache",
- "php8.0",
- "php7.4-fpm-alpine",
- "php7.4-fpm",
- "php7.4-apache",
- "php7.4",
- "php7.3-fpm-alpine",
- "php7.3-fpm",
- "php7.3-apache",
- "php7.3",
- "php7.2-fpm-alpine",
- "php7.2-fpm",
- "php7.2-apache",
- "php7.2",
- "php7.1-fpm-alpine",
- "php7.1-fpm",
- "php7.1-apache",
- "php7.1",
- "php7.0-fpm-alpine",
- "php7.0-fpm"
- ]
- },
- {
- "name": "wordpress",
- "image": "library/wordpress",
- "tags": [
- "php8.2-fpm-alpine",
- "php8.2-fpm",
- "php8.2-apache",
- "php8.2",
- "php8.1-fpm-alpine",
- "php8.1-fpm",
- "php8.1-apache",
- "php8.1",
- "php8.0-fpm-alpine",
- "php8.0-fpm",
- "php8.0-apache",
- "php8.0",
- "php7.4-fpm-alpine",
- "php7.4-fpm",
- "php7.4-apache",
- "php7.4",
- "php7.3-fpm-alpine",
- "php7.3-fpm",
- "php7.3-apache",
- "php7.3",
- "php7.2-fpm-alpine",
- "php7.2-fpm",
- "php7.2-apache",
- "php7.2",
- "php7.1-fpm-alpine",
- "php7.1-fpm",
- "php7.1-apache",
- "php7.1",
- "php7.0-fpm-alpine",
- "php7.0-fpm"
- ]
- }
-]
diff --git a/apps/trpc-experimental/server/devTemplates.yaml b/apps/trpc-experimental/server/devTemplates.yaml
deleted file mode 100644
index 4cff705db..000000000
--- a/apps/trpc-experimental/server/devTemplates.yaml
+++ /dev/null
@@ -1,3582 +0,0 @@
-- templateVersion: 1.0.0
- defaultVersion: "9.22"
- documentation: https://docs.directus.io/getting-started/introduction.html
- type: directus-postgresql
- name: Directus
- subname: (PostgreSQL)
- description: >-
- Directus is a free and open-source headless CMS framework for managing custom SQL-based databases.
- labels:
- - CMS
- - headless
- services:
- $$id:
- name: Directus
- depends_on:
- - $$id-postgresql
- - $$id-redis
- image: directus/directus:$$core_version
- volumes:
- - $$id-uploads:/directus/uploads
- - $$id-database:/directus/database
- - $$id-extensions:/directus/extensions
- environment:
- - KEY=$$secret_key
- - SECRET=$$secret_secret
- - DB_CLIENT=pg
- - DB_CONNECTION_STRING=$$secret_db_connection_string
- - CACHE_ENABLED=true
- - CACHE_STORE=redis
- - CACHE_REDIS=$$secret_cache_redis
- - ADMIN_EMAIL=$$config_admin_email
- - ADMIN_PASSWORD=$$secret_admin_password
- - CACHE_AUTO_PURGE=true
- - PUBLIC_URL=$$config_public_url
- ports:
- - "8055"
- $$id-postgresql:
- name: Directus PostgreSQL
- depends_on: []
- image: postgres:14-alpine
- volumes:
- - $$id-postgresql-data:/var/lib/postgresql/data
- environment:
- - POSTGRES_USER=$$config_postgres_user
- - POSTGRES_PASSWORD=$$secret_postgres_password
- - POSTGRES_DB=$$config_postgres_db
- ports: []
- $$id-redis:
- name: Directus Redis
- depends_on: []
- image: redis:7.0.4-alpine
- command: "--maxmemory 512mb --maxmemory-policy allkeys-lru --maxmemory-samples 5"
- volumes:
- - "$$id-redis:/data"
- environment: []
- variables:
- - id: $$config_public_url
- name: PUBLIC_URL
- label: Public URL
- defaultValue: $$generate_fqdn
- description: ""
- - id: $$secret_db_connection_string
- name: DB_CONNECTION_STRING
- label: Directus Database Url
- defaultValue: postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db
- description: ""
- - id: $$config_postgres_db
- main: $$id-postgresql
- name: POSTGRES_DB
- label: Database
- defaultValue: directus
- description: ""
- - id: $$config_postgres_user
- main: $$id-postgresql
- name: POSTGRES_USER
- label: User
- defaultValue: $$generate_username
- description: ""
- - id: $$secret_postgres_password
- main: $$id-postgresql
- name: POSTGRES_PASSWORD
- label: Password
- defaultValue: $$generate_password
- description: ""
- showOnConfiguration: true
- - id: $$secret_cache_redis
- name: CACHE_REDIS
- label: Redis Url
- defaultValue: redis://$$id-redis:6379
- description: ""
- - id: $$config_admin_email
- name: ADMIN_EMAIL
- label: Initial Admin Email
- defaultValue: "admin@example.com"
- description: "The email address of the first user that is automatically created. You can change it later in Directus."
- - id: $$secret_admin_password
- name: ADMIN_PASSWORD
- label: Initial Admin Password
- defaultValue: $$generate_password
- description: "The password of the first user that is automatically created."
- showOnConfiguration: true
- - id: $$secret_key
- name: KEY
- label: Key
- defaultValue: $$generate_password
- description: "Unique identifier for the project."
- showOnConfiguration: true
- - id: $$secret_secret
- name: SECRET
- label: Secret
- defaultValue: $$generate_password
- description: "Secret string for the project."
- showOnConfiguration: true
-
-- templateVersion: 1.0.0
- defaultVersion: v1.3.8
- documentation: https://github.com/LibreTranslate/LibreTranslate
- description: Free and Open Source Machine Translation API. 100% self-hosted, offline capable and easy to setup.
- type: libretranslate
- name: Libretranslate
- labels:
- - translator
- - argos
- - python
- - libretranslate
- services:
- $$id:
- name: Libretranslate
- image: libretranslate/libretranslate:$$core_version
- environment:
- - LT_HOST=0.0.0.0
- - LT_SUGGESTIONS=true
- - LT_CHAR_LIMIT=$$config_lt_char_limit
- - LT_REQ_LIMIT=$$config_lt_req_limit
- - LT_BATCH_LIMIT=$$config_lt_batch_limit
- - LT_GA_ID=$$config_lt_ga_id
- - LT_DISABLE_WEB_UI=$$config_lt_web_ui
- volumes:
- - $$id-libretranslate:/libretranslate
- ports:
- - "5000"
- variables:
- - id: $$config_lt_char_limit
- name: LT_CHAR_LIMIT
- label: Char limit
- defaultValue: "5000"
- description: "Set character limit."
- - id: $$config_lt_req_limit
- name: LT_REQ_LIMIT
- label: Request limit
- defaultValue: "5000"
- description: "Set maximum number of requests per minute per client."
- - id: $$config_lt_batch_limit
- name: LT_BATCH_LIMIT
- label: Batch Limit
- defaultValue: "5000"
- description: "Set maximum number of texts to translate in a batch request."
- - id: $$config_lt_ga_id
- name: LT_GA_ID
- label: Google Analytics ID
- defaultValue: ""
- description: "Enable Google Analytics on the API client page by providing an ID"
- - id: $$config_lt_web_ui
- name: LT_DISABLE_WEB_UI
- label: Web UI
- defaultValue: "false"
- description: "Disable or enable web ui. True or false."
-- templateVersion: 1.0.0
- defaultVersion: 0.8.1
- documentation: https://github.com/benbusby/whoogle-search
- type: whoogle
- name: Whoogle Search
- description: A self-hosted, ad-free, privacy-respecting metasearch engine
- labels:
- - search
- - google
- services:
- $$id:
- name: Whoogle Search
- documentation: https://github.com/benbusby/whoogle-search
- depends_on: []
- image: benbusby/whoogle-search:$$core_version
- cap_drop:
- - ALL
- environment:
- - WHOOGLE_USER=$$config_whoogle_username
- - WHOOGLE_PASS=$$secret_whoogle_password
- - WHOOGLE_CONFIG_PREFERENCES_KEY=$$secret_whoogle_preferences_key
- ulimits:
- nofile:
- soft: 262144
- hard: 262144
- ports:
- - "5000"
- variables:
- - id: $$config_whoogle_username
- name: WHOOGLE_USER
- label: Whoogle User
- defaultValue: $$generate_username
- description: "Username to log into Whoogle"
- - id: $$secret_whoogle_password
- name: WHOOGLE_PASSWORD
- label: Whoogle Password
- defaultValue: $$generate_password
- description: "Password to log into Whoogle"
- showOnConfiguration: true
- - id: $$secret_whoogle_preferences_key
- name: WHOOGLE_CONFIG_PREFERENCES_KEY
- label: Whoogle preferences key
- defaultValue: $$generate_password
- description: "password to encrypt preferences"
-- templateVersion: 1.0.0
- defaultVersion: 1.1.3
- documentation: https://docs.openblocks.dev/
- type: openblocks
- name: Openblocks
- description: The Open Source Retool Alternative
- services:
- $$id:
- image: openblocksdev/openblocks-ce:$$core_version
- volumes:
- - $$id-stacks-data:/openblocks-stacks
- ports:
- - "3000"
-- templateVersion: 1.0.0
- defaultVersion: "0.10.2"
- documentation: https://pocketbase.io/docs/
- type: pocketbase
- name: Pocketbase
- description: "Open Source realtime backend in 1 file"
- services:
- $$id:
- image: coollabsio/pocketbase:$$core_version
- volumes:
- - $$id-data:/app/pb_data
- ports:
- - "8080"
-- templateVersion: 1.0.0
- defaultVersion: v1.5.1
- documentation: https://plausible.io/doc/
- type: plausibleanalytics-arm
- name: Plausible Analytics (ARM)
- description: A lightweight and open-source website analytics tool.
- labels:
- - analytics
- - statistics
- - plausible
- - gdpr
- - no-cookie
- - google analytics
- services:
- $$id:
- name: Plausible Analytics
- command: >-
- sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate
- && /entrypoint.sh db init-admin && /entrypoint.sh run"
- depends_on:
- - $$id-postgresql
- - $$id-clickhouse
- image: plausible/analytics:$$core_version
- environment:
- - ADMIN_USER_EMAIL=$$config_admin_user_email
- - ADMIN_USER_NAME=$$config_admin_user_name
- - ADMIN_USER_PWD=$$secret_admin_user_pwd
- - BASE_URL=$$config_base_url
- - SECRET_KEY_BASE=$$secret_secret_key_base
- - DISABLE_AUTH=$$config_disable_auth
- - DISABLE_REGISTRATION=$$config_disable_registration
- - DATABASE_URL=$$secret_database_url
- - CLICKHOUSE_DATABASE_URL=$$secret_clickhouse_database_url
- ports:
- - "8000"
- $$id-postgresql:
- name: PostgreSQL
- image: postgres:14-alpine
- volumes:
- - $$id-postgresql-data:/var/lib/postgresql/data
- environment:
- - POSTGRES_PASSWORD=$$secret_postgres_password
- - POSTGRES_USER=$$config_postgres_user
- - POSTGRES_DB=$$config_postgres_db
- $$id-clickhouse:
- name: Clickhouse
- volumes:
- - $$id-clickhouse-data:/var/lib/clickhouse
- image: clickhouse/clickhouse-server:22.6-alpine
- ulimits:
- nofile:
- soft: 262144
- hard: 262144
- files:
- - location: /etc/clickhouse-server/users.d/logging.xml
- content: >-
- warning true
- - location: /etc/clickhouse-server/config.d/logging.xml
- content: >-
- 0 0
- - location: /docker-entrypoint-initdb.d/init.query
- content: CREATE DATABASE IF NOT EXISTS plausible;
- - location: /docker-entrypoint-initdb.d/init-db.sh
- content: >-
- clickhouse client --queries-file
- /docker-entrypoint-initdb.d/init.query
- variables:
- - id: $$config_base_url
- name: BASE_URL
- label: Base URL
- defaultValue: $$generate_fqdn
- description: >-
- You must set this to the FQDN of the Plausible Analytics instance. This is
- used to generate the links to the Plausible Analytics instance.
- - id: $$secret_database_url
- name: DATABASE_URL
- label: Database URL for PostgreSQL
- defaultValue: >-
- postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db
- description: ""
- - id: $$secret_clickhouse_database_url
- name: CLICKHOUSE_DATABASE_URL
- label: Database URL for Clickhouse
- defaultValue: http://$$id-clickhouse:8123/plausible
- description: ""
- - id: $$config_admin_user_email
- name: ADMIN_USER_EMAIL
- label: Admin Email Address
- defaultValue: admin@example.com
- description: This is the admin email. Please change it.
- - id: $$config_admin_user_name
- name: ADMIN_USER_NAME
- label: Admin User Name
- defaultValue: $$generate_username
- description: This is the admin username. Please change it.
- - id: $$secret_admin_user_pwd
- name: ADMIN_USER_PWD
- label: Admin User Password
- defaultValue: $$generate_password
- description: This is the admin password. Please change it.
- showOnConfiguration: true
- - id: $$secret_secret_key_base
- name: SECRET_KEY_BASE
- label: Secret Key Base
- defaultValue: $$generate_hex(64)
- description: ""
- - id: $$config_disable_auth
- name: DISABLE_AUTH
- label: Authentication
- defaultValue: "false"
- description: ""
- - id: $$config_disable_registration
- name: DISABLE_REGISTRATION
- label: Registration
- defaultValue: "true"
- description: ""
- - id: $$config_postgres_user
- main: $$id-postgresql
- name: POSTGRES_USER
- label: PostgreSQL Username
- defaultValue: postgresql
- description: ""
- - id: $$secret_postgres_password
- main: $$id-postgresql
- name: POSTGRES_PASSWORD
- label: PostgreSQL Password
- defaultValue: $$generate_password
- description: ""
- showOnConfiguration: true
- - id: $$config_postgres_db
- main: $$id-postgresql
- name: POSTGRES_DB
- label: PostgreSQL Database
- defaultValue: plausible
- description: ""
- - id: $$config_scriptName
- name: SCRIPT_NAME
- label: Custom Script Name
- defaultValue: plausible.js
- description: This is the default script name.
-- templateVersion: 1.0.0
- defaultVersion: "1.17"
- documentation: https://docs.gitea.io
- type: gitea
- name: Gitea
- description: Gitea is a community managed lightweight code hosting solution written in Go.
- labels:
- - storage
- - git
- services:
- $$id:
- name: Gitea
- documentation: https://docs.gitea.io
- image: gitea/gitea:$$core_version
- volumes:
- - $$id-data:/data
- - /etc/timezone:/etc/timezone:ro
- - /etc/localtime:/etc/localtime:ro
- environment:
- - USER_UID=1000
- - USER_GID=1000
- - DOMAIN=$$config_domain
- - SSH_DOMAIN=$$config_ssh_domain
- - ROOT_URL=$$config_root_url
- - SECRET_KEY=$$secret_secret_key
- - INTERNAL_TOKEN=$$secret_internal_token
- - SSH_PORT=22
- - START_SSH_SERVER=$$config_start_ssh_server
- ports:
- - "3000"
- - "22"
- proxy:
- - port: "22"
- hostPort: $$config_hostport_ssh
- variables:
- - id: $$config_hostport_ssh
- name: SSH_PORT
- label: SSH Port
- defaultValue: "8022"
- description: ""
- required: true
- - id: $$config_domain
- name: DOMAIN
- label: Domain
- defaultValue: $$generate_domain
- description: ""
- - id: $$config_ssh_domain
- name: SSH_DOMAIN
- label: SSH Domain
- defaultValue: $$generate_domain
- description: ""
- - id: $$config_start_ssh_server
- name: START_SSH_SERVER
- label: Start SSH Server
- defaultValue: "true"
- description: ""
- - id: $$config_root_url
- name: ROOT_URL
- label: Root URL of Gitea
- defaultValue: $$generate_fqdn_slash
- description: ""
- - id: $$secret_secret_key
- name: SECRET_KEY
- label: Secret Key
- defaultValue: $$generate_hex(32)
- description: ""
- - id: $$secret_internal_token
- name: INTERNAL_TOKEN
- label: Internal JWT Token
- defaultValue: $$generate_token
- description: ""
-- templateVersion: 1.0.0
- defaultVersion: "20.0"
- documentation: https://www.keycloak.org/documentation
- type: keycloak
- name: Keycloak
- description: "Keycloak provides user federation, strong authentication, user management, fine-grained authorization, and more."
- labels:
- - authentication
- - authorization
- - oidconnect
- - saml2
- services:
- $$id:
- name: Keycloak
- command: start --db=postgres --features=token-exchange --import-realm
- depends_on:
- - $$id-postgresql
- image: "quay.io/keycloak/keycloak:$$core_version"
- volumes:
- - $$id-import:/opt/keycloak/data/import
- environment:
- - KC_HEALTH_ENABLED=true
- - KC_PROXY=edge
- - KC_DB=postgres
- - KC_HOSTNAME=$$config_keycloak_domain
- - KEYCLOAK_ADMIN=$$config_admin_user
- - KEYCLOAK_ADMIN_PASSWORD=$$secret_keycloak_admin_password
- - KC_DB_PASSWORD=$$secret_postgres_password
- - KC_DB_USERNAME=$$config_postgres_user
- - KC_DB_URL=$$secret_keycloak_database_url
- ports:
- - "8080"
- $$id-postgresql:
- name: PostgreSQL
- depends_on: []
- image: "postgres:14-alpine"
- volumes:
- - "$$id-postgresql-data:/var/lib/postgresql/data"
- environment:
- - POSTGRES_USER=$$config_postgres_user
- - POSTGRES_PASSWORD=$$secret_postgres_password
- - POSTGRES_DB=$$config_postgres_db
- ports: []
- variables:
- - id: $$config_keycloak_domain
- name: KEYCLOAK_DOMAIN
- label: Keycloak Domain
- defaultValue: $$generate_domain
- description: ""
- - id: $$secret_keycloak_database_url
- name: KEYCLOAK_DATABASE_URL
- label: Keycloak Database Url
- defaultValue: >-
- jdbc:postgresql://$$id-postgresql:5432/$$config_postgres_db
- description: ""
- - id: $$config_admin_user
- name: KEYCLOAK_ADMIN
- label: Keycloak Admin User
- defaultValue: $$generate_username
- description: ""
- - id: $$secret_keycloak_admin_password
- name: KEYCLOAK_ADMIN_PASSWORD
- label: Keycloak Admin Password
- defaultValue: $$generate_password
- description: ""
- showOnConfiguration: true
- - id: $$config_postgres_user
- main: $$id-postgresql
- name: POSTGRES_USER
- label: PostgreSQL User
- defaultValue: $$generate_username
- description: ""
- - id: $$secret_postgres_password
- main: $$id-postgresql
- name: POSTGRES_PASSWORD
- label: PostgreSQL Password
- defaultValue: $$generate_password
- description: ""
- showOnConfiguration: true
- - id: $$config_postgres_db
- main: $$id-postgresql
- name: POSTGRES_DB
- label: PostgreSQL Database
- defaultValue: keycloak
- description: ""
-- templateVersion: 1.0.0
- defaultVersion: v3.7
- documentation: https://github.com/freyacodes/Lavalink
- description: Standalone audio sending node based on Lavaplayer.
- type: lavalink
- name: Lavalink
- labels:
- - discord
- - discord bot
- - audio
- - lavalink
- - jda
- services:
- $$id:
- name: Lavalink
- image: fredboat/lavalink:$$core_version
- environment: []
- volumes:
- - $$id-lavalink:/lavalink
- ports:
- - $$config_port
- files:
- - location: /opt/Lavalink/application.yml
- content: >-
- server:
- port: 2333
- address: 0.0.0.0
- lavalink:
- server:
- password: "$$secret_password"
- sources:
- youtube: true
- bandcamp: true
- soundcloud: true
- twitch: true
- vimeo: true
- http: true
- local: false
-
- logging:
- file:
- path: ./logs/
-
- level:
- root: INFO
- lavalink: INFO
-
- logback:
- rollingpolicy:
- max-file-size: 1GB
- max-history: 30
- variables:
- - id: $$secret_password
- name: PASSWORD
- label: Password
- defaultValue: $$generate_password
- required: true
-- templateVersion: 1.0.0
- defaultVersion: v1.8.9
- documentation: https://docs.appsmith.com/getting-started/setup/instance-configuration/
- type: appsmith
- name: Appsmith
- description: "Fastest way to build internal apps over any database or API."
- services:
- $$id:
- image: appsmith/appsmith-ce:$$core_version
- environment:
- - APPSMITH_MAIL_ENABLED=$$config_appsmith_mail_enabled
- - APPSMITH_DISABLE_TELEMETRY=$$config_appsmith_disable_telemetry
- - APPSMITH_DISABLE_INTERCOM=$$config_appsmith_disable_intercom
- volumes:
- - $$id-stacks-data:/appsmith-stacks
- ports:
- - "80"
- variables:
- - id: $$config_appsmith_mail_enabled
- name: APPSMITH_MAIL_ENABLED
- label: Enable Mail
- defaultValue: "false"
- description: ""
- - id: $$config_appsmith_disable_telemetry
- name: APPSMITH_DISABLE_TELEMETRY
- label: Disable Telemetry
- defaultValue: "true"
- description: ""
- - id: $$config_appsmith_disable_intercom
- name: APPSMITH_DISABLE_INTERCOM
- label: Disable Intercom
- defaultValue: "true"
- description: ""
-- templateVersion: 1.0.0
- defaultVersion: 0.57.4
- documentation: https://hub.docker.com/r/zadam/trilium
- description: "A hierarchical note taking application with focus on building large personal knowledge bases."
- labels:
- - personal
- - knowledge
- - notes
- - wiki
- type: trilium
- name: Trilium Notes
- services:
- $$id:
- image: zadam/trilium:$$core_version
- environment: []
- volumes:
- - $$id-trilium:/home/node/trilium-data
- ports:
- - "8080"
- variables: []
-- templateVersion: 1.0.0
- defaultVersion: 1.18.5
- documentation: https://hub.docker.com/r/louislam/uptime-kuma
- description: A free & fancy self-hosted monitoring tool.
- labels:
- - uptime
- type: uptimekuma
- name: UptimeKuma
- services:
- $$id:
- image: louislam/uptime-kuma:$$core_version
- environment: []
- volumes:
- - $$id-uptimekuma:/app/data
- ports:
- - "3001"
- variables: []
-- templateVersion: 1.0.0
- defaultVersion: "5.8"
- documentation: https://hub.docker.com/r/silviof/docker-languagetool
- description: "A multilingual grammar, style and spell checker."
- type: languagetool
- name: LanguageTool
- services:
- $$id:
- image: silviof/docker-languagetool:$$core_version
- environment: []
- volumes:
- - $$id-ngrams:/ngrams
- ports:
- - "8010"
- variables: []
-- templateVersion: 1.0.0
- defaultVersion: 1.26.0
- documentation: https://hub.docker.com/r/vaultwarden/server
- description: "Bitwarden compatible server written in Rust."
- type: vaultwarden
- name: VaultWarden
- labels:
- - bitwarden
- - password manager
- services:
- $$id:
- image: vaultwarden/server:$$core_version
- environment: []
- volumes:
- - $$id-data:/data
- ports:
- - "80"
- variables: []
-- templateVersion: 1.0.0
- defaultVersion: 9.3.1
- documentation: https://hub.docker.com/r/grafana/grafana
- type: grafana
- name: Grafana
- description: >-
- Grafana allows you to query, visualize, alert on and understand your metrics.
- labels:
- - monitoring
- - metrics
- - dashboard
- services:
- $$id:
- image: grafana/grafana:$$core_version
- environment: []
- volumes:
- - $$id-config:/etc/grafana
- - $$id-grafana:/var/lib/grafana
- ports:
- - "3000"
- variables: []
-- templateVersion: 1.0.0
- defaultVersion: 1.1.2
- documentation: https://appwrite.io/docs
- type: appwrite
- name: Appwrite
- description: Secure Backend Server for Web, Mobile & Flutter Developers.
- labels:
- - serverless
- - backend
- - storage
- - api
- services:
- "$$id":
- image: appwrite/appwrite:$$core_version
- environment:
- - _APP_ENV=$$config__app_env
- - _APP_WORKER_PER_CORE=$$config__app_worker_per_core
- - _APP_LOCALE=$$config__app_locale
- - _APP_CONSOLE_WHITELIST_ROOT=$$config__app_console_whitelist_root
- - _APP_CONSOLE_WHITELIST_EMAILS=$$config__app_console_whitelist_emails
- - _APP_CONSOLE_WHITELIST_IPS=$$config__app_console_whitelist_ips
- - _APP_SYSTEM_EMAIL_NAME=$$config__app_system_email_name
- - _APP_SYSTEM_EMAIL_ADDRESS=$$config__app_system_email_address
- - _APP_SYSTEM_SECURITY_EMAIL_ADDRESS=$$config__app_system_security_email_address
- - _APP_SYSTEM_RESPONSE_FORMAT=$$config__app_system_response_format
- - _APP_OPTIONS_ABUSE=$$config__app_options_abuse
- - _APP_OPTIONS_FORCE_HTTPS=$$config__app_options_force_https
- - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1
- - _APP_DOMAIN=$$config__app_domain
- - _APP_DOMAIN_TARGET=$$config__app_domain_target
- - _APP_REDIS_HOST=$$config__app_redis_host
- - _APP_REDIS_PORT=$$config__app_redis_port
- - _APP_REDIS_USER=$$config__app_redis_user
- - _APP_REDIS_PASS=$$secret__app_redis_pass
- - _APP_DB_HOST=$$config__app_db_host
- - _APP_DB_PORT=$$config__app_db_port
- - _APP_DB_SCHEMA=$$config__app_db_schema
- - _APP_DB_USER=$$config__app_db_user
- - _APP_DB_PASS=$$secret__app_db_pass
- - _APP_SMTP_HOST=$$config__app_smtp_host
- - _APP_SMTP_PORT=$$config__app_smtp_port
- - _APP_SMTP_SECURE=$$config__app_smtp_secure
- - _APP_SMTP_USERNAME=$$config__app_smtp_username
- - _APP_SMTP_PASSWORD=$$secret__app_smtp_password
- - _APP_USAGE_STATS=$$config__app_usage_stats
- - _APP_INFLUXDB_HOST=$$config__app_influxdb_host
- - _APP_INFLUXDB_PORT=$$config__app_influxdb_port
- - _APP_STORAGE_LIMIT=$$config__app_storage_limit
- - _APP_STORAGE_PREVIEW_LIMIT=$$config__app_storage_preview_limit
- - _APP_STORAGE_ANTIVIRUS=$$config__app_storage_antivirus_enabled
- - _APP_STORAGE_ANTIVIRUS_HOST=$$config__app_storage_antivirus_host
- - _APP_STORAGE_ANTIVIRUS_PORT=$$config__app_storage_antivirus_port
- - _APP_STORAGE_DEVICE=$$config__app_storage_device
- - _APP_STORAGE_S3_ACCESS_KEY=$$secret__app_storage_s3_access_key
- - _APP_STORAGE_S3_SECRET=$$secret__app_storage_s3_secret
- - _APP_STORAGE_S3_REGION=$$config__app_storage_s3_region
- - _APP_STORAGE_S3_BUCKET=$$config__app_storage_s3_bucket
- - _APP_STORAGE_DO_SPACES_ACCESS_KEY=$$secret__app_storage_do_spaces_access_key
- - _APP_STORAGE_DO_SPACES_SECRET=$$secret__app_storage_do_spaces_secret
- - _APP_STORAGE_DO_SPACES_REGION=$$config__app_storage_do_spaces_region
- - _APP_STORAGE_DO_SPACES_BUCKET=$$config__app_storage_do_spaces_bucket
- - _APP_STORAGE_BACKBLAZE_ACCESS_KEY=$$secret__app_storage_backblaze_access_key
- - _APP_STORAGE_BACKBLAZE_SECRET=$$secret__app_storage_backblaze_secret
- - _APP_STORAGE_BACKBLAZE_REGION=$$config__app_storage_backblaze_region
- - _APP_STORAGE_BACKBLAZE_BUCKET=$$config__app_storage_backblaze_bucket
- - _APP_STORAGE_LINODE_ACCESS_KEY=$$secret__app_storage_linode_access_key
- - _APP_STORAGE_LINODE_SECRET=$$secret__app_storage_linode_secret
- - _APP_STORAGE_LINODE_REGION=$$config__app_storage_linode_region
- - _APP_STORAGE_LINODE_BUCKET=$$config__app_storage_linode_bucket
- - _APP_STORAGE_WASABI_ACCESS_KEY=$$secret__app_storage_wasabi_access_key
- - _APP_STORAGE_WASABI_SECRET=$$secret__app_storage_wasabi_secret
- - _APP_STORAGE_WASABI_REGION=$$config__app_storage_wasabi_region
- - _APP_STORAGE_WASABI_BUCKET=$$config__app_storage_wasabi_bucket
- - _APP_FUNCTIONS_SIZE_LIMIT=$$config__app_functions_size_limit
- - _APP_FUNCTIONS_TIMEOUT=$$config__app_functions_timeout
- - _APP_FUNCTIONS_BUILD_TIMEOUT=$$config__app_functions_build_timeout
- - _APP_FUNCTIONS_CONTAINERS=$$config__app_functions_containers
- - _APP_FUNCTIONS_CPUS=$$config__app_functions_cpus
- - _APP_FUNCTIONS_MEMORY=$$config__app_functions_memory_allocated
- - _APP_FUNCTIONS_MEMORY_SWAP=$$config__app_functions_memory_swap
- - _APP_FUNCTIONS_RUNTIMES=$$config__app_functions_runtimes
- - _APP_EXECUTOR_SECRET=$$secret__app_executor_secret
- - _APP_EXECUTOR_HOST=$$config__app_executor_host
- - _APP_LOGGING_PROVIDER=$$config__app_logging_provider
- - _APP_LOGGING_CONFIG=$$config__app_logging_config
- - _APP_STATSD_HOST=$$config__app_statsd_host
- - _APP_STATSD_PORT=$$config__app_statsd_port
- - _APP_MAINTENANCE_INTERVAL=$$config__app_maintenance_interval
- - _APP_MAINTENANCE_RETENTION_EXECUTION=$$config__app_maintenance_retention_execution
- - _APP_MAINTENANCE_RETENTION_CACHE=$$config__app_maintenance_retention_cache
- - _APP_MAINTENANCE_RETENTION_ABUSE=$$config__app_maintenance_retention_abuse
- - _APP_MAINTENANCE_RETENTION_AUDIT=$$config__app_maintenance_retention_audit
- - _APP_SMS_PROVIDER=$$config__app_sms_provider
- - _APP_SMS_FROM=$$config__app_sms_from
- - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network
- volumes:
- - "$$id-uploads:/storage/uploads"
- - "$$id-cache:/storage/cache"
- - "$$id-config:/storage/config"
- - "$$id-certificates:/storage/certificates"
- - "$$id-functions:/storage/functions"
- ports:
- - "80"
- proxy:
- - port: "80"
- "$$id-executor":
- image: appwrite/appwrite:$$core_version
- environment:
- - _APP_ENV=$$config__app_env
- - _APP_FUNCTIONS_TIMEOUT=$$config__app_functions_timeout
- - _APP_FUNCTIONS_BUILD_TIMEOUT=$$config__app_functions_build_timeout
- - _APP_FUNCTIONS_CONTAINERS=$$config__app_functions_containers
- - _APP_FUNCTIONS_RUNTIMES=$$config__app_functions_runtimes
- - _APP_FUNCTIONS_CPUS=$$config__app_functions_cpus
- - _APP_FUNCTIONS_MEMORY=$$config__app_functions_memory_allocated
- - _APP_FUNCTIONS_MEMORY_SWAP=$$config__app_functions_memory_swap
- - _APP_FUNCTIONS_INACTIVE_THRESHOLD=$$config__app_functions_inactive_threshold
- - _APP_EXECUTOR_SECRET=$$secret__app_executor_secret
- - _APP_LOGGING_PROVIDER=$$config__app_logging_provider
- - _APP_LOGGING_CONFIG=$$config__app_logging_config
- - _APP_STORAGE_DEVICE=$$config__app_storage_device
- - _APP_STORAGE_S3_ACCESS_KEY=$$secret__app_storage_s3_access_key
- - _APP_STORAGE_S3_SECRET=$$secret__app_storage_s3_secret
- - _APP_STORAGE_S3_REGION=$$config__app_storage_s3_region
- - _APP_STORAGE_S3_BUCKET=$$config__app_storage_s3_bucket
- - _APP_STORAGE_DO_SPACES_ACCESS_KEY=$$secret__app_storage_do_spaces_access_key
- - _APP_STORAGE_DO_SPACES_SECRET=$$secret__app_storage_do_spaces_secret
- - _APP_STORAGE_DO_SPACES_REGION=$$config__app_storage_do_spaces_region
- - _APP_STORAGE_DO_SPACES_BUCKET=$$config__app_storage_do_spaces_bucket
- - _APP_STORAGE_BACKBLAZE_ACCESS_KEY=$$secret__app_storage_backblaze_access_key
- - _APP_STORAGE_BACKBLAZE_SECRET=$$secret__app_storage_backblaze_secret
- - _APP_STORAGE_BACKBLAZE_REGION=$$config__app_storage_backblaze_region
- - _APP_STORAGE_BACKBLAZE_BUCKET=$$config__app_storage_backblaze_bucket
- - _APP_STORAGE_LINODE_ACCESS_KEY=$$secret__app_storage_linode_access_key
- - _APP_STORAGE_LINODE_SECRET=$$secret__app_storage_linode_secret
- - _APP_STORAGE_LINODE_REGION=$$config__app_storage_linode_region
- - _APP_STORAGE_LINODE_BUCKET=$$config__app_storage_linode_bucket
- - _APP_STORAGE_WASABI_ACCESS_KEY=$$secret__app_storage_wasabi_access_key
- - _APP_STORAGE_WASABI_SECRET=$$secret__app_storage_wasabi_secret
- - _APP_STORAGE_WASABI_REGION=$$config__app_storage_wasabi_region
- - _APP_STORAGE_WASABI_BUCKET=$$config__app_storage_wasabi_bucket
- - DOCKERHUB_PULL_USERNAME=$$config_dockerhub_pull_username
- - DOCKERHUB_PULL_PASSWORD=$$secret_dockerhub_pull_password
- - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network
- volumes:
- - "$$id-functions:/storage/functions"
- - "$$id-builds:/storage/builds"
- - "/var/run/docker.sock:/var/run/docker.sock"
- - "/tmp:/tmp:rw"
- entrypoint: executor
- "$$id-influxdb":
- image: appwrite/influxdb:1.5.0
- environment: []
- volumes:
- - "$$id-influxdb:/var/lib/influxdb"
- "$$id-maintenance":
- image: appwrite/appwrite:$$core_version
- environment:
- - _APP_ENV=$$config__app_env
- - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1
- - _APP_DOMAIN=$$config__app_domain
- - _APP_DOMAIN_TARGET=$$config__app_domain_target
- - _APP_REDIS_HOST=$$config__app_redis_host
- - _APP_REDIS_PORT=$$config__app_redis_port
- - _APP_REDIS_USER=$$config__app_redis_user
- - _APP_REDIS_PASS=$$secret__app_redis_pass
- - _APP_DB_HOST=$$config__app_db_host
- - _APP_DB_PORT=$$config__app_db_port
- - _APP_DB_SCHEMA=$$config__app_db_schema
- - _APP_DB_USER=$$config__app_db_user
- - _APP_DB_PASS=$$secret__app_db_pass
- - _APP_MAINTENANCE_INTERVAL=$$config__app_maintenance_interval
- - _APP_MAINTENANCE_RETENTION_EXECUTION=$$config__app_maintenance_retention_execution
- - _APP_MAINTENANCE_RETENTION_CACHE=$$config__app_maintenance_retention_cache
- - _APP_MAINTENANCE_RETENTION_ABUSE=$$config__app_maintenance_retention_abuse
- - _APP_MAINTENANCE_RETENTION_AUDIT=$$config__app_maintenance_retention_audit
- - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network
- volumes: []
- entrypoint: maintenance
- "$$id-mariadb":
- image: mariadb:10.7
- command: "--innodb-flush-method fsync"
- environment:
- - MARIADB_ROOT_PASSWORD=$$secret__app_db_root_pass
- - MARIADB_DATABASE=$$config__app_db_schema
- - MARIADB_USER=$$config__app_db_user
- - MARIADB_PASSWORD=$$secret__app_db_pass
- - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network
- volumes:
- - "$$id-mariadb:/var/lib/mysql"
- "$$id-realtime":
- image: appwrite/appwrite:$$core_version
- environment:
- - _APP_ENV=$$config__app_env
- - _APP_WORKER_PER_CORE=$$config__app_worker_per_core
- - _APP_OPTIONS_ABUSE=$$config__app_options_abuse
- - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1
- - _APP_REDIS_HOST=$$config__app_redis_host
- - _APP_REDIS_PORT=$$config__app_redis_port
- - _APP_DB_HOST=$$config__app_db_host
- - _APP_DB_PORT=$$config__app_db_port
- - _APP_DB_SCHEMA=$$config__app_db_schema
- - _APP_DB_USER=$$config__app_db_user
- - _APP_DB_PASS=$$secret__app_db_pass
- - _APP_USAGE_STATS=$$config__app_usage_stats
- - _APP_LOGGING_PROVIDER=$$config__app_logging_provider
- - _APP_LOGGING_CONFIG=$$config__app_logging_config
- - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network
- volumes: []
- entrypoint: realtime
- proxy:
- - port: "80"
- pathPrefix: "/v1/realtime"
- "$$id-redis":
- image: redis:7.0.4-alpine
- command:
- "--maxmemory 512mb --maxmemory-policy allkeys-lru --maxmemory-samples
- 5"
- environment: []
- volumes:
- - "$$id-redis:/data"
- "$$id-schedule":
- image: appwrite/appwrite:$$core_version
- environment:
- - _APP_ENV=$$config__app_env
- - _APP_REDIS_HOST=$$config__app_redis_host
- - _APP_REDIS_PORT=$$config__app_redis_port
- - _APP_REDIS_USER=$$config__app_redis_user
- - _APP_REDIS_PASS=$$secret__app_redis_pass
- - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network
- volumes: []
- entrypoint: schedule
- "$$id-telegraf":
- image: appwrite/telegraf:1.4.0
- environment:
- - _APP_INFLUXDB_HOST=$$config__app_influxdb_host
- - _APP_INFLUXDB_PORT=$$config__app_influxdb_port
- - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network
- volumes:
- - "$$id-influxdb:/var/lib/influxdb"
- "$$id-usage-database":
- image: appwrite/appwrite:$$core_version
- environment:
- - _APP_ENV=$$config__app_env
- - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1
- - _APP_DB_HOST=$$config__app_db_host
- - _APP_DB_PORT=$$config__app_db_port
- - _APP_DB_SCHEMA=$$config__app_db_schema
- - _APP_DB_USER=$$config__app_db_user
- - _APP_DB_PASS=$$secret__app_db_pass
- - _APP_INFLUXDB_HOST=$$config__app_influxdb_host
- - _APP_INFLUXDB_PORT=$$config__app_influxdb_port
- - _APP_USAGE_TIMESERIES_INTERVAL=$$config__app_usage_timeseries_interval
- - _APP_USAGE_DATABASE_INTERVAL=$$config__app_usage_database_interval
- - _APP_REDIS_HOST=$$config__app_redis_host
- - _APP_REDIS_PORT=$$config__app_redis_port
- - _APP_REDIS_USER=$$config__app_redis_user
- - _APP_REDIS_PASS=$$secret__app_redis_pass
- - _APP_LOGGING_PROVIDER=$$config__app_logging_provider
- - _APP_LOGGING_CONFIG=$$config__app_logging_config
- - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network
- volumes: []
- entrypoint: usage --type database
- "$$id-usage":
- image: appwrite/appwrite:$$core_version
- environment:
- - _APP_ENV=$$config__app_env
- - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1
- - _APP_DB_HOST=$$config__app_db_host
- - _APP_DB_PORT=$$config__app_db_port
- - _APP_DB_SCHEMA=$$config__app_db_schema
- - _APP_DB_USER=$$config__app_db_user
- - _APP_DB_PASS=$$secret__app_db_pass
- - _APP_INFLUXDB_HOST=$$config__app_influxdb_host
- - _APP_INFLUXDB_PORT=$$config__app_influxdb_port
- - _APP_USAGE_TIMESERIES_INTERVAL=$$config__app_usage_timeseries_interval
- - _APP_USAGE_DATABASE_INTERVAL=$$config__app_usage_database_interval
- - _APP_REDIS_HOST=$$config__app_redis_host
- - _APP_REDIS_PORT=$$config__app_redis_port
- - _APP_REDIS_USER=$$config__app_redis_user
- - _APP_REDIS_PASS=$$secret__app_redis_pass
- - _APP_LOGGING_PROVIDER=$$config__app_logging_provider
- - _APP_LOGGING_CONFIG=$$config__app_logging_config
- - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network
- volumes: []
- entrypoint: usage --type timeseries
- "$$id-worker-audits":
- image: appwrite/appwrite:$$core_version
- environment:
- - _APP_ENV=$$config__app_env
- - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1
- - _APP_REDIS_HOST=$$config__app_redis_host
- - _APP_REDIS_PORT=$$config__app_redis_port
- - _APP_REDIS_USER=$$config__app_redis_user
- - _APP_REDIS_PASS=$$secret__app_redis_pass
- - _APP_DB_HOST=$$config__app_db_host
- - _APP_DB_PORT=$$config__app_db_port
- - _APP_DB_SCHEMA=$$config__app_db_schema
- - _APP_DB_USER=$$config__app_db_user
- - _APP_DB_PASS=$$secret__app_db_pass
- - _APP_LOGGING_PROVIDER=$$config__app_logging_provider
- - _APP_LOGGING_CONFIG=$$config__app_logging_config
- - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network
- volumes: []
- entrypoint: worker-audits
- "$$id-worker-builds":
- image: appwrite/appwrite:$$core_version
- environment:
- - _APP_ENV=$$config__app_env
- - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1
- - _APP_EXECUTOR_SECRET=$$secret__app_executor_secret
- - _APP_EXECUTOR_HOST=$$config__app_executor_host
- - _APP_REDIS_HOST=$$config__app_redis_host
- - _APP_REDIS_PORT=$$config__app_redis_port
- - _APP_REDIS_USER=$$config__app_redis_user
- - _APP_REDIS_PASS=$$secret__app_redis_pass
- - _APP_DB_HOST=$$config__app_db_host
- - _APP_DB_PORT=$$config__app_db_port
- - _APP_DB_SCHEMA=$$config__app_db_schema
- - _APP_DB_USER=$$config__app_db_user
- - _APP_DB_PASS=$$secret__app_db_pass
- - _APP_LOGGING_PROVIDER=$$config__app_logging_provider
- - _APP_LOGGING_CONFIG=$$config__app_logging_config
- - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network
- volumes: []
- entrypoint: worker-builds
- "$$id-worker-certificates":
- image: appwrite/appwrite:$$core_version
- environment:
- - _APP_ENV=$$config__app_env
- - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1
- - _APP_DOMAIN=$$config__app_domain
- - _APP_DOMAIN_TARGET=$$config__app_domain_target
- - _APP_SYSTEM_SECURITY_EMAIL_ADDRESS=$$config__app_system_security_email_address
- - _APP_REDIS_HOST=$$config__app_redis_host
- - _APP_REDIS_PORT=$$config__app_redis_port
- - _APP_REDIS_USER=$$config__app_redis_user
- - _APP_REDIS_PASS=$$secret__app_redis_pass
- - _APP_DB_HOST=$$config__app_db_host
- - _APP_DB_PORT=$$config__app_db_port
- - _APP_DB_SCHEMA=$$config__app_db_schema
- - _APP_DB_USER=$$config__app_db_user
- - _APP_DB_PASS=$$secret__app_db_pass
- - _APP_LOGGING_PROVIDER=$$config__app_logging_provider
- - _APP_LOGGING_CONFIG=$$config__app_logging_config
- - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network
- volumes:
- - "$$id-config:/storage/config"
- - "$$id-certificates:/storage/certificates"
- entrypoint: worker-certificates
- "$$id-worker-databases":
- image: appwrite/appwrite:$$core_version
- environment:
- - _APP_ENV=$$config__app_env
- - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1
- - _APP_REDIS_HOST=$$config__app_redis_host
- - _APP_REDIS_PORT=$$config__app_redis_port
- - _APP_REDIS_USER=$$config__app_redis_user
- - _APP_REDIS_PASS=$$secret__app_redis_pass
- - _APP_DB_HOST=$$config__app_db_host
- - _APP_DB_PORT=$$config__app_db_port
- - _APP_DB_SCHEMA=$$config__app_db_schema
- - _APP_DB_USER=$$config__app_db_user
- - _APP_DB_PASS=$$secret__app_db_pass
- - _APP_LOGGING_PROVIDER=$$config__app_logging_provider
- - _APP_LOGGING_CONFIG=$$config__app_logging_config
- - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network
- volumes: []
- entrypoint: worker-databases
- "$$id-worker-deletes":
- image: appwrite/appwrite:$$core_version
- environment:
- - _APP_ENV=$$config__app_env
- - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1
- - _APP_REDIS_HOST=$$config__app_redis_host
- - _APP_REDIS_PORT=$$config__app_redis_port
- - _APP_REDIS_USER=$$config__app_redis_user
- - _APP_REDIS_PASS=$$secret__app_redis_pass
- - _APP_DB_HOST=$$config__app_db_host
- - _APP_DB_PORT=$$config__app_db_port
- - _APP_DB_SCHEMA=$$config__app_db_schema
- - _APP_DB_USER=$$config__app_db_user
- - _APP_DB_PASS=$$secret__app_db_pass
- - _APP_STORAGE_DEVICE=$$config__app_storage_device
- - _APP_STORAGE_S3_ACCESS_KEY=$$secret__app_storage_s3_access_key
- - _APP_STORAGE_S3_SECRET=$$secret__app_storage_s3_secret
- - _APP_STORAGE_S3_REGION=$$config__app_storage_s3_region
- - _APP_STORAGE_S3_BUCKET=$$config__app_storage_s3_bucket
- - _APP_STORAGE_DO_SPACES_ACCESS_KEY=$$secret__app_storage_do_spaces_access_key
- - _APP_STORAGE_DO_SPACES_SECRET=$$secret__app_storage_do_spaces_secret
- - _APP_STORAGE_DO_SPACES_REGION=$$config__app_storage_do_spaces_region
- - _APP_STORAGE_DO_SPACES_BUCKET=$$config__app_storage_do_spaces_bucket
- - _APP_STORAGE_BACKBLAZE_ACCESS_KEY=$$secret__app_storage_backblaze_access_key
- - _APP_STORAGE_BACKBLAZE_SECRET=$$secret__app_storage_backblaze_secret
- - _APP_STORAGE_BACKBLAZE_REGION=$$config__app_storage_backblaze_region
- - _APP_STORAGE_BACKBLAZE_BUCKET=$$config__app_storage_backblaze_bucket
- - _APP_STORAGE_LINODE_ACCESS_KEY=$$secret__app_storage_linode_access_key
- - _APP_STORAGE_LINODE_SECRET=$$secret__app_storage_linode_secret
- - _APP_STORAGE_LINODE_REGION=$$config__app_storage_linode_region
- - _APP_STORAGE_LINODE_BUCKET=$$config__app_storage_linode_bucket
- - _APP_STORAGE_WASABI_ACCESS_KEY=$$secret__app_storage_wasabi_access_key
- - _APP_STORAGE_WASABI_SECRET=$$secret__app_storage_wasabi_secret
- - _APP_STORAGE_WASABI_REGION=$$config__app_storage_wasabi_region
- - _APP_STORAGE_WASABI_BUCKET=$$config__app_storage_wasabi_bucket
- - _APP_LOGGING_PROVIDER=$$config__app_logging_provider
- - _APP_LOGGING_CONFIG=$$config__app_logging_config
- - _APP_EXECUTOR_SECRET=$$secret__app_executor_secret
- - _APP_EXECUTOR_HOST=$$config__app_executor_host
- - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network
- volumes:
- - "$$id-uploads:/storage/uploads"
- - "$$id-cache:/storage/cache"
- - "$$id-functions:/storage/functions"
- - "$$id-builds:/storage/builds"
- - "$$id-certificates:/storage/certificates"
- entrypoint: worker-deletes
- "$$id-worker-functions":
- image: appwrite/appwrite:$$core_version
- environment:
- - _APP_ENV=$$config__app_env
- - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1
- - _APP_REDIS_HOST=$$config__app_redis_host
- - _APP_REDIS_PORT=$$config__app_redis_port
- - _APP_REDIS_USER=$$config__app_redis_user
- - _APP_REDIS_PASS=$$secret__app_redis_pass
- - _APP_DB_HOST=$$config__app_db_host
- - _APP_DB_PORT=$$config__app_db_port
- - _APP_DB_SCHEMA=$$config__app_db_schema
- - _APP_DB_USER=$$config__app_db_user
- - _APP_DB_PASS=$$secret__app_db_pass
- - _APP_FUNCTIONS_TIMEOUT=$$config__app_functions_timeout
- - _APP_EXECUTOR_SECRET=$$secret__app_executor_secret
- - _APP_EXECUTOR_HOST=$$config__app_executor_host
- - _APP_USAGE_STATS=$$config__app_usage_stats
- - DOCKERHUB_PULL_USERNAME=$$config_dockerhub_pull_username
- - DOCKERHUB_PULL_PASSWORD=$$secret_dockerhub_pull_password
- - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network
- volumes: []
- entrypoint: worker-functions
- "$$id-worker-mails":
- image: appwrite/appwrite:$$core_version
- environment:
- - _APP_ENV=$$config__app_env
- - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1
- - _APP_SYSTEM_EMAIL_NAME=$$config__app_system_email_name
- - _APP_SYSTEM_EMAIL_ADDRESS=$$config__app_system_email_address
- - _APP_REDIS_HOST=$$config__app_redis_host
- - _APP_REDIS_PORT=$$config__app_redis_port
- - _APP_REDIS_USER=$$config__app_redis_user
- - _APP_REDIS_PASS=$$secret__app_redis_pass
- - _APP_SMTP_HOST=$$config__app_smtp_host
- - _APP_SMTP_PORT=$$config__app_smtp_port
- - _APP_SMTP_SECURE=$$config__app_smtp_secure
- - _APP_SMTP_USERNAME=$$config__app_smtp_username
- - _APP_SMTP_PASSWORD=$$secret__app_smtp_password
- - _APP_LOGGING_PROVIDER=$$config__app_logging_provider
- - _APP_LOGGING_CONFIG=$$config__app_logging_config
- - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network
- volumes: []
- entrypoint: worker-mails
- "$$id-worker-messaging":
- image: appwrite/appwrite:$$core_version
- environment:
- - _APP_ENV=$$config__app_env
- - _APP_REDIS_HOST=$$config__app_redis_host
- - _APP_REDIS_PORT=$$config__app_redis_port
- - _APP_REDIS_USER=$$config__app_redis_user
- - _APP_REDIS_PASS=$$secret__app_redis_pass
- - _APP_SMS_PROVIDER=$$config__app_sms_provider
- - _APP_SMS_FROM=$$config__app_sms_from
- - _APP_LOGGING_PROVIDER=$$config__app_logging_provider
- - _APP_LOGGING_CONFIG=$$config__app_logging_config
- - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network
- volumes: []
- entrypoint: worker-messaging
- "$$id-worker-webhooks":
- image: appwrite/appwrite:$$core_version
- environment:
- - _APP_ENV=$$config__app_env
- - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1
- - _APP_SYSTEM_SECURITY_EMAIL_ADDRESS=$$config__app_system_security_email_address
- - _APP_REDIS_HOST=$$config__app_redis_host
- - _APP_REDIS_PORT=$$config__app_redis_port
- - _APP_REDIS_USER=$$config__app_redis_user
- - _APP_REDIS_PASS=$$secret__app_redis_pass
- - _APP_LOGGING_PROVIDER=$$config__app_logging_provider
- - _APP_LOGGING_CONFIG=$$config__app_logging_config
- - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network
- volumes: []
- entrypoint: worker-webhooks
- variables:
- - id: "$$config__app_influxdb_host"
- name: _APP_INFLUXDB_HOST
- label: InfluxDB | _APP_INFLUXDB_HOST
- defaultValue: "$$id-influxdb"
- description: ""
- - id: "$$config__app_influxdb_port"
- name: _APP_INFLUXDB_PORT
- label: InfluxDB | _APP_INFLUXDB_PORT
- defaultValue: "8086"
- description: InfluxDB server TCP port.
- - id: "$$config__app_env"
- name: _APP_ENV
- label: General | _APP_ENV
- defaultValue: production
- description: Set your server running environment.
- - id: "$$config__app_worker_per_core"
- name: _APP_WORKER_PER_CORE
- label: General | _APP_WORKER_PER_CORE
- defaultValue: "6"
- description:
- Internal Worker per core for the API, Realtime and Executor containers.
- Can be configured to optimize performance.
- - id: "$$config__app_locale"
- name: _APP_LOCALE
- label: General | _APP_LOCALE
- defaultValue: en
- description: Set your Appwrite's locale. By default, the locale is set to 'en'.
- - id: "$$config__app_console_whitelist_root"
- name: _APP_CONSOLE_WHITELIST_ROOT
- label: General | _APP_CONSOLE_WHITELIST_ROOT
- defaultValue: enabled
- description:
- This option allows you to disable the creation of new users on the
- Appwrite console. When enabled only 1 user will be able to use the registration
- form. New users can be added by inviting them to your project. By default this
- option is enabled.
- - id: "$$config__app_console_whitelist_emails"
- name: _APP_CONSOLE_WHITELIST_EMAILS
- label: General | _APP_CONSOLE_WHITELIST_EMAILS
- defaultValue: ""
- description:
- This option allows you to limit creation of new users on the Appwrite
- console. This option is very useful for small teams or sole developers. To enable
- it, pass a list of allowed email addresses separated by a comma.
- - id: "$$config__app_console_whitelist_ips"
- name: _APP_CONSOLE_WHITELIST_IPS
- label: General | _APP_CONSOLE_WHITELIST_IPS
- defaultValue: ""
- description:
- This last option allows you to limit creation of users in Appwrite
- console for users sharing the same set of IP addresses. This option is very
- useful for team working with a VPN service or a company IP.\n\nTo enable/activate
- this option, pass a list of allowed IP addresses separated by a comma.
- - id: "$$config__app_system_email_name"
- name: _APP_SYSTEM_EMAIL_NAME
- label: General | _APP_SYSTEM_EMAIL_NAME
- defaultValue: Appwrite
- description:
- This is the sender name value that will appear on email messages
- sent to developers from the Appwrite console. You can use url encoded strings
- for spaces and special chars.
- - id: "$$config__app_system_email_address"
- name: _APP_SYSTEM_EMAIL_ADDRESS
- label: General | _APP_SYSTEM_EMAIL_ADDRESS
- defaultValue: team@appwrite.io
- description:
- This is the sender email address that will appear on email messages
- sent to developers from the Appwrite console. You should choose an email address
- that is allowed to be used from your SMTP server to avoid the server email ending
- in the users' SPAM folders.
- - id: "$$config__app_system_security_email_address"
- name: _APP_SYSTEM_SECURITY_EMAIL_ADDRESS
- label: General | _APP_SYSTEM_SECURITY_EMAIL_ADDRESS
- defaultValue: certs@appwrite.io
- description:
- This is the email address used to issue SSL certificates for custom
- domains or the user agent in your webhooks payload.
- - id: "$$config__app_system_response_format"
- name: _APP_SYSTEM_RESPONSE_FORMAT
- label: General | _APP_SYSTEM_RESPONSE_FORMAT
- defaultValue: ""
- description:
- Use this environment variable to set the default Appwrite HTTP response
- format to support an older version of Appwrite. This option is useful to overcome
- breaking changes between versions. You can also use the X-Appwrite-Response-Format
- HTTP request header to overwrite the response for a specific request. This variable
- accepts any valid Appwrite version. To use the current version format, leave
- the value of the variable empty.
- - id: "$$config__app_options_abuse"
- name: _APP_OPTIONS_ABUSE
- label: General | _APP_OPTIONS_ABUSE
- defaultValue: enabled
- description:
- Allows you to disable abuse checks and API rate limiting. By default,
- set to 'enabled'. To cancel the abuse checking, set to 'disabled'. It is not
- recommended to disable this check-in a production environment.
- - id: "$$config__app_options_force_https"
- name: _APP_OPTIONS_FORCE_HTTPS
- label: General | _APP_OPTIONS_FORCE_HTTPS
- defaultValue: disabled
- description:
- Allows you to force HTTPS connection to your API. This feature redirects
- any HTTP call to HTTPS and adds the 'Strict-Transport-Security' header to all
- HTTP responses.
- - id: "$$secret__app_openssl_key_v1"
- name: _APP_OPENSSL_KEY_V1
- label: General | _APP_OPENSSL_KEY_V1
- defaultValue: "$$generate_hex(256)"
- description:
- This is your server private secret key that is used to encrypt all
- sensitive data on your server. Appwrite server encrypts all secret data on your
- server like webhooks, HTTP passwords, user sessions, and storage files. Keep
- it a secret and have a backup for it.
- - id: "$$config__app_domain"
- name: _APP_DOMAIN
- label: General | _APP_DOMAIN
- defaultValue: $$generate_domain
- description:
- Your Appwrite domain address. When setting a public suffix domain,
- Appwrite will attempt to issue a valid SSL certificate automatically. When used
- with a dev domain, Appwrite will assign a self-signed SSL certificate. The default
- value is 'localhost'.
- - id: "$$config__app_domain_target"
- name: _APP_DOMAIN_TARGET
- label: General | _APP_DOMAIN_TARGET
- defaultValue: $$generate_fqdn
- description:
- A DNS A record hostname to serve as a CNAME target for your Appwrite
- custom domains. You can use the same value as used for the Appwrite '_APP_DOMAIN'
- variable. The default value is 'localhost'.
- - id: "$$config__app_redis_host"
- name: _APP_REDIS_HOST
- label: Redis | _APP_REDIS_HOST
- defaultValue: "$$id-redis"
- description: ""
- - id: "$$config__app_redis_port"
- name: _APP_REDIS_PORT
- label: Redis | _APP_REDIS_PORT
- defaultValue: "6379"
- description: Redis server TCP port.
- - id: "$$config__app_redis_user"
- name: _APP_REDIS_USER
- label: Redis | _APP_REDIS_USER
- defaultValue: ""
- description:
- Redis server user. This is an optional variable. Default value is
- an empty string.
- - id: "$$secret__app_redis_pass"
- name: _APP_REDIS_PASS
- label: Redis | _APP_REDIS_PASS
- defaultValue: ""
- description:
- Redis server password. This is an optional variable. Default value
- is an empty string.
- - id: "$$config__app_db_host"
- name: _APP_DB_HOST
- label: MariaDB | _APP_DB_HOST
- defaultValue: "$$id-mariadb"
- description: ""
- - id: "$$config__app_db_port"
- name: _APP_DB_PORT
- label: MariaDB | _APP_DB_PORT
- defaultValue: "3306"
- description: MariaDB server TCP port.
- - id: "$$config__app_db_schema"
- name: _APP_DB_SCHEMA
- label: MariaDB | _APP_DB_SCHEMA
- defaultValue: appwrite
- description: MariaDB server database schema.
- - id: "$$config__app_db_user"
- name: _APP_DB_USER
- label: MariaDB | _APP_DB_USER
- defaultValue: user
- description: MariaDB server user name.
- - id: "$$secret__app_db_root_pass"
- name: MARIADB_ROOT_PASSWORD
- label: MariaDB | MARIADB_ROOT_PASSWORD
- defaultValue: "$$generate_hex(16)"
- description: MariaDB server root user password.
- - id: "$$secret__app_db_pass"
- name: _APP_DB_PASS
- label: MariaDB | _APP_DB_PASS
- defaultValue: "$$generate_hex(16)"
- description: MariaDB server user password.
- - id: "$$config__app_smtp_host"
- name: _APP_SMTP_HOST
- label: SMTP | _APP_SMTP_HOST
- defaultValue: ""
- description:
- SMTP server host name address. Use an empty string to disable all
- mail sending from the server. The default value for this variable is an empty
- string.
- - id: "$$config__app_smtp_port"
- name: _APP_SMTP_PORT
- label: SMTP | _APP_SMTP_PORT
- defaultValue: ""
- description: SMTP server TCP port. Empty by default.
- - id: "$$config__app_smtp_secure"
- name: _APP_SMTP_SECURE
- label: SMTP | _APP_SMTP_SECURE
- defaultValue: ""
- description:
- SMTP secure connection protocol. Empty by default, change to 'tls'
- if running on a secure connection.
- - id: "$$config__app_smtp_username"
- name: _APP_SMTP_USERNAME
- label: SMTP | _APP_SMTP_USERNAME
- defaultValue: ""
- description: SMTP server user name. Empty by default.
- - id: "$$secret__app_smtp_password"
- name: _APP_SMTP_PASSWORD
- label: SMTP | _APP_SMTP_PASSWORD
- defaultValue: ""
- description: SMTP server user password. Empty by default.
- - id: "$$config__app_usage_stats"
- name: _APP_USAGE_STATS
- label: General | _APP_USAGE_STATS
- defaultValue: enabled
- description:
- This variable allows you to disable the collection and displaying
- of usage stats. This value is set to 'enabled' by default, to disable the usage
- stats set the value to 'disabled'. When disabled, it's recommended to turn off
- the Worker Usage, Influxdb and Telegraf containers for better resource usage.
- - id: "$$config__app_storage_limit"
- name: _APP_STORAGE_LIMIT
- label: Storage | _APP_STORAGE_LIMIT
- defaultValue: "30000000"
- description:
- Maximum file size allowed for file upload. The default value is 30MB.
- You should pass your size limit value in bytes.
- - id: "$$config__app_storage_preview_limit"
- name: _APP_STORAGE_PREVIEW_LIMIT
- label: Storage | _APP_STORAGE_PREVIEW_LIMIT
- defaultValue: "20000000"
- description:
- Maximum file size allowed for file image preview. The default value
- is 20MB. You should pass your size limit value in bytes.
- - id: "$$config__app_storage_antivirus_enabled"
- name: _APP_STORAGE_ANTIVIRUS
- label: Storage | _APP_STORAGE_ANTIVIRUS
- defaultValue: disabled
- description:
- This variable allows you to disable the internal anti-virus scans.
- This value is set to 'disabled' by default, to enable the scans set the value
- to 'enabled'. Before enabling, you must add the ClamAV service and depend on
- it on main Appwrite service.
- - id: "$$config__app_storage_antivirus_host"
- name: _APP_STORAGE_ANTIVIRUS_HOST
- label: Storage | _APP_STORAGE_ANTIVIRUS_HOST
- defaultValue: clamav
- description: ClamAV server host name address.
- - id: "$$config__app_storage_antivirus_port"
- name: _APP_STORAGE_ANTIVIRUS_PORT
- label: Storage | _APP_STORAGE_ANTIVIRUS_PORT
- defaultValue: "3310"
- description: ClamAV server TCP port.
- - id: "$$config__app_storage_device"
- name: _APP_STORAGE_DEVICE
- label: Storage | _APP_STORAGE_DEVICE
- defaultValue: Local
- description:
- Select default storage device. The default value is 'Local'. List
- of supported adapters are 'Local', 'S3', 'DOSpaces', 'Backblaze', 'Linode' and
- 'Wasabi'.
- - id: "$$secret__app_storage_s3_access_key"
- name: _APP_STORAGE_S3_ACCESS_KEY
- label: Storage | _APP_STORAGE_S3_ACCESS_KEY
- defaultValue: ""
- description:
- AWS S3 storage access key. Required when the storage adapter is set
- to S3. You can get your access key from your AWS console.
- - id: "$$secret__app_storage_s3_secret"
- name: _APP_STORAGE_S3_SECRET
- label: Storage | _APP_STORAGE_S3_SECRET
- defaultValue: ""
- description:
- AWS S3 storage secret key. Required when the storage adapter is set
- to S3. You can get your secret key from your AWS console.
- - id: "$$config__app_storage_s3_region"
- name: _APP_STORAGE_S3_REGION
- label: Storage | _APP_STORAGE_S3_REGION
- defaultValue: us-east-1
- description:
- AWS S3 storage region. Required when storage adapter is set to S3.
- You can find your region info for your bucket from AWS console.
- - id: "$$config__app_storage_s3_bucket"
- name: _APP_STORAGE_S3_BUCKET
- label: Storage | _APP_STORAGE_S3_BUCKET
- defaultValue: ""
- description:
- AWS S3 storage bucket. Required when storage adapter is set to S3.
- You can create buckets in your AWS console.
- - id: "$$secret__app_storage_do_spaces_access_key"
- name: _APP_STORAGE_DO_SPACES_ACCESS_KEY
- label: Storage | _APP_STORAGE_DO_SPACES_ACCESS_KEY
- defaultValue: ""
- description:
- DigitalOcean spaces access key. Required when the storage adapter
- is set to DOSpaces. You can get your access key from your DigitalOcean console.
- - id: "$$secret__app_storage_do_spaces_secret"
- name: _APP_STORAGE_DO_SPACES_SECRET
- label: Storage | _APP_STORAGE_DO_SPACES_SECRET
- defaultValue: ""
- description:
- DigitalOcean spaces secret key. Required when the storage adapter
- is set to DOSpaces. You can get your secret key from your DigitalOcean console.
- - id: "$$config__app_storage_do_spaces_region"
- name: _APP_STORAGE_DO_SPACES_REGION
- label: Storage | _APP_STORAGE_DO_SPACES_REGION
- defaultValue: us-east-1
- description:
- DigitalOcean spaces region. Required when storage adapter is set
- to DOSpaces. You can find your region info for your space from DigitalOcean
- console.
- - id: "$$config__app_storage_do_spaces_bucket"
- name: _APP_STORAGE_DO_SPACES_BUCKET
- label: Storage | _APP_STORAGE_DO_SPACES_BUCKET
- defaultValue: ""
- description:
- DigitalOcean spaces bucket. Required when storage adapter is set
- to DOSpaces. You can create spaces in your DigitalOcean console.
- - id: "$$secret__app_storage_backblaze_access_key"
- name: _APP_STORAGE_BACKBLAZE_ACCESS_KEY
- label: Storage | _APP_STORAGE_BACKBLAZE_ACCESS_KEY
- defaultValue: ""
- description:
- Backblaze access key. Required when the storage adapter is set to
- Backblaze. Your Backblaze keyID will be your access key. You can get your keyID
- from your Backblaze console.
- - id: "$$secret__app_storage_backblaze_secret"
- name: _APP_STORAGE_BACKBLAZE_SECRET
- label: Storage | _APP_STORAGE_BACKBLAZE_SECRET
- defaultValue: ""
- description:
- Backblaze secret key. Required when the storage adapter is set to
- Backblaze. Your Backblaze applicationKey will be your secret key. You can get
- your applicationKey from your Backblaze console.
- - id: "$$config__app_storage_backblaze_region"
- name: _APP_STORAGE_BACKBLAZE_REGION
- label: Storage | _APP_STORAGE_BACKBLAZE_REGION
- defaultValue: us-west-004
- description:
- Backblaze region. Required when storage adapter is set to Backblaze.
- You can find your region info from your Backblaze console.
- - id: "$$config__app_storage_backblaze_bucket"
- name: _APP_STORAGE_BACKBLAZE_BUCKET
- label: Storage | _APP_STORAGE_BACKBLAZE_BUCKET
- defaultValue: ""
- description:
- Backblaze bucket. Required when storage adapter is set to Backblaze.
- You can create your bucket from your Backblaze console.
- - id: "$$secret__app_storage_linode_access_key"
- name: _APP_STORAGE_LINODE_ACCESS_KEY
- label: Storage | _APP_STORAGE_LINODE_ACCESS_KEY
- defaultValue: ""
- description:
- Linode object storage access key. Required when the storage adapter
- is set to Linode. You can get your access key from your Linode console.
- - id: "$$secret__app_storage_linode_secret"
- name: _APP_STORAGE_LINODE_SECRET
- label: Storage | _APP_STORAGE_LINODE_SECRET
- defaultValue: ""
- description:
- Linode object storage secret key. Required when the storage adapter
- is set to Linode. You can get your secret key from your Linode console.
- - id: "$$config__app_storage_linode_region"
- name: _APP_STORAGE_LINODE_REGION
- label: Storage | _APP_STORAGE_LINODE_REGION
- defaultValue: eu-central-1
- description:
- Linode object storage region. Required when storage adapter is set
- to Linode. You can find your region info from your Linode console.
- - id: "$$config__app_storage_linode_bucket"
- name: _APP_STORAGE_LINODE_BUCKET
- label: Storage | _APP_STORAGE_LINODE_BUCKET
- defaultValue: ""
- description:
- Linode object storage bucket. Required when storage adapter is set
- to Linode. You can create buckets in your Linode console.
- - id: "$$secret__app_storage_wasabi_access_key"
- name: _APP_STORAGE_WASABI_ACCESS_KEY
- label: Storage | _APP_STORAGE_WASABI_ACCESS_KEY
- defaultValue: ""
- description:
- Wasabi access key. Required when the storage adapter is set to Wasabi.
- You can get your access key from your Wasabi console.
- - id: "$$secret__app_storage_wasabi_secret"
- name: _APP_STORAGE_WASABI_SECRET
- label: Storage | _APP_STORAGE_WASABI_SECRET
- defaultValue: ""
- description:
- Wasabi secret key. Required when the storage adapter is set to Wasabi.
- You can get your secret key from your Wasabi console.
- - id: "$$config__app_storage_wasabi_region"
- name: _APP_STORAGE_WASABI_REGION
- label: Storage | _APP_STORAGE_WASABI_REGION
- defaultValue: eu-central-1
- description:
- Wasabi region. Required when storage adapter is set to Wasabi. You
- can find your region info from your Wasabi console.
- - id: "$$config__app_storage_wasabi_bucket"
- name: _APP_STORAGE_WASABI_BUCKET
- label: Storage | _APP_STORAGE_WASABI_BUCKET
- defaultValue: ""
- description:
- Wasabi bucket. Required when storage adapter is set to Wasabi. You
- can create buckets in your Wasabi console.
- - id: "$$config__app_functions_size_limit"
- name: _APP_FUNCTIONS_SIZE_LIMIT
- label: Functions | _APP_FUNCTIONS_SIZE_LIMIT
- defaultValue: "30000000"
- description: The maximum size deployment in bytes. The default value is 30MB.
- - id: "$$config__app_functions_timeout"
- name: _APP_FUNCTIONS_TIMEOUT
- label: Functions | _APP_FUNCTIONS_TIMEOUT
- defaultValue: "900"
- description:
- The maximum number of seconds allowed as a timeout value when creating
- a new function. The default value is 900 seconds.
- - id: "$$config__app_functions_build_timeout"
- name: _APP_FUNCTIONS_BUILD_TIMEOUT
- label: Functions | _APP_FUNCTIONS_BUILD_TIMEOUT
- defaultValue: "900"
- description:
- The maximum number of seconds allowed as a timeout value when building
- a new function. The default value is 900 seconds.
- - id: "$$config__app_functions_containers"
- name: _APP_FUNCTIONS_CONTAINERS
- label: Functions | _APP_FUNCTIONS_CONTAINERS
- defaultValue: "10"
- description:
- The maximum number of containers Appwrite is allowed to keep alive
- in the background for function environments. Running containers allow faster
- execution time as there is no need to recreate each container every time a function
- gets executed. The default value is 10.
- - id: "$$config__app_functions_cpus"
- name: _APP_FUNCTIONS_CPUS
- label: Functions | _APP_FUNCTIONS_CPUS
- defaultValue: ""
- description:
- The maximum number of CPU core a single cloud function is allowed
- to use. Please note that setting a value higher than available cores will result
- in a function error, which might result in an error. The default value is empty.
- When it's empty, CPU limit will be disabled.
- - id: "$$config__app_functions_memory_allocated"
- name: _APP_FUNCTIONS_MEMORY
- label: Functions | _APP_FUNCTIONS_MEMORY
- defaultValue: ""
- description:
- The maximum amount of memory a single cloud function is allowed to
- use in megabytes. The default value is empty. When it's empty, memory limit
- will be disabled.
- - id: "$$config__app_functions_memory_swap"
- name: _APP_FUNCTIONS_MEMORY_SWAP
- label: Functions | _APP_FUNCTIONS_MEMORY_SWAP
- defaultValue: ""
- description:
- The maximum amount of swap memory a single cloud function is allowed
- to use in megabytes. The default value is empty. When it's empty, swap memory
- limit will be disabled.
- - id: "$$config__app_functions_runtimes"
- name: _APP_FUNCTIONS_RUNTIMES
- label: Functions | _APP_FUNCTIONS_RUNTIMES
- defaultValue: node-18.0
- description: |-
- This option allows you to limit the available environments for cloud functions. This option is very useful for low-cost servers to safe disk space.
- To enable/activate this option, pass a list of allowed environments separated by a comma.
- Currently, supported environments are: node-14.5, node-16.0, node-18.0, php-8.0, php-8.1, ruby-3.0, ruby-3.1, python-3.8, python-3.9, python-3.10, deno-1.21, deno-1.24, dart-2.15, dart-2.16, dart-2.17, dotnet-3.1, dotnet-6.0, java-8.0, java-11.0, java-17.0, java-18.0, swift-5.5, kotlin-1.6, cpp-17.0
- - id: "$$secret__app_executor_secret"
- name: _APP_EXECUTOR_SECRET
- label: Functions | _APP_EXECUTOR_SECRET
- defaultValue: "$$generate_hex(16)"
- description:
- The secret key used by Appwrite to communicate with the function
- executor.
- - id: "$$config__app_executor_host"
- name: _APP_EXECUTOR_HOST
- label: ""
- defaultValue: http://$$id-executor/v1
- description: ""
- - id: "$$config__app_logging_provider"
- name: _APP_LOGGING_PROVIDER
- label: General | _APP_LOGGING_PROVIDER
- defaultValue: ""
- description:
- This variable allows you to enable logging errors to 3rd party providers.
- This value is empty by default, to enable the logger set the value to one of
- 'sentry', 'raygun', 'appsignal', 'logowl'
- - id: "$$config__app_logging_config"
- name: _APP_LOGGING_CONFIG
- label: General | _APP_LOGGING_CONFIG
- defaultValue: ""
- description:
- This variable configures authentication to 3rd party error logging
- providers. If using Sentry, this should be 'SENTRY_API_KEY;SENTRY_APP_ID'. If
- using Raygun, this should be Raygun API key. If using AppSignal, this should
- be AppSignal API key. If using LogOwl, this should be LogOwl Service Ticket.
- - id: "$$config__app_statsd_host"
- name: _APP_STATSD_HOST
- label: ""
- defaultValue: "$$id-telegraf"
- description: ""
- - id: "$$config__app_statsd_port"
- name: _APP_STATSD_PORT
- label: StatsD | _APP_STATSD_PORT
- defaultValue: "8125"
- description: StatsD server TCP port.
- - id: "$$config__app_maintenance_interval"
- name: _APP_MAINTENANCE_INTERVAL
- label: Functions | _APP_MAINTENANCE_INTERVAL
- defaultValue: "86400"
- description:
- Interval value containing the number of seconds that the Appwrite
- maintenance process should wait before executing system cleanups and optimizations.
- The default value is 86400 seconds (1 day).
- - id: "$$config__app_maintenance_retention_execution"
- name: _APP_MAINTENANCE_RETENTION_EXECUTION
- label: Functions | _APP_MAINTENANCE_RETENTION_EXECUTION
- defaultValue: "1209600"
- description:
- The maximum duration (in seconds) upto which to retain execution
- logs. The default value is 1209600 seconds (14 days).
- - id: "$$config__app_maintenance_retention_cache"
- name: _APP_MAINTENANCE_RETENTION_CACHE
- label: Functions | _APP_MAINTENANCE_RETENTION_CACHE
- defaultValue: "2592000"
- description:
- The maximum duration (in seconds) upto which to retain cached files.
- The default value is 2592000 seconds (30 days).
- - id: "$$config__app_maintenance_retention_abuse"
- name: _APP_MAINTENANCE_RETENTION_ABUSE
- label: Functions | _APP_MAINTENANCE_RETENTION_ABUSE
- defaultValue: "86400"
- description:
- The maximum duration (in seconds) upto which to retain abuse logs.
- The default value is 86400 seconds (1 day).
- - id: "$$config__app_maintenance_retention_audit"
- name: _APP_MAINTENANCE_RETENTION_AUDIT
- label: Functions | _APP_MAINTENANCE_RETENTION_AUDIT
- defaultValue: "1209600"
- description:
- The maximum duration (in seconds) upto which to retain audit logs.
- The default value is 1209600 seconds (14 days).
- - id: "$$config__app_sms_provider"
- name: _APP_SMS_PROVIDER
- label: Phone | _APP_SMS_PROVIDER
- defaultValue: ""
- description:
- "Provider used for delivering SMS for Phone authentication. Use the
- following format: 'sms://[USER]:[SECRET]@[PROVIDER]'. Available providers
- are twilio, text-magic, telesign, msg91, and vonage."
- - id: "$$config__app_sms_from"
- name: _APP_SMS_FROM
- label: Phone | _APP_SMS_FROM
- defaultValue: ""
- description:
- Phone number used for sending out messages. Must start with a leading
- '+' and maximum of 15 digits without spaces (+123456789).
- - id: "$$config__app_functions_inactive_threshold"
- name: _APP_FUNCTIONS_INACTIVE_THRESHOLD
- label: Functions | _APP_FUNCTIONS_INACTIVE_THRESHOLD
- defaultValue: "60"
- description:
- The minimum time a function can be inactive before it's container
- is shutdown and put to sleep. The default value is 60 seconds
- - id: "$$config_open_runtimes_network"
- name: OPEN_RUNTIMES_NETWORK
- label: ""
- defaultValue: "$$generate_network"
- description: ""
- - id: "$$config_dockerhub_pull_username"
- name: DOCKERHUB_PULL_USERNAME
- label: Functions | DOCKERHUB_PULL_USERNAME
- defaultValue: ""
- description:
- The username for hub.docker.com. This variable is used to pull images
- from hub.docker.com.
- - id: "$$secret_dockerhub_pull_password"
- name: DOCKERHUB_PULL_PASSWORD
- label: Functions | DOCKERHUB_PULL_PASSWORD
- defaultValue: ""
- description:
- The password for hub.docker.com. This variable is used to pull images
- from hub.docker.com.
- - id: "$$config__app_usage_timeseries_interval"
- name: _APP_USAGE_TIMESERIES_INTERVAL
- label: General | _APP_USAGE_TIMESERIES_INTERVAL
- defaultValue: "30"
- description:
- Interval value containing the number of seconds that the Appwrite
- usage process should wait before aggregating stats and syncing it to mariadb
- from InfluxDB. The default value is 30 seconds.
- - id: "$$config__app_usage_database_interval"
- name: _APP_USAGE_DATABASE_INTERVAL
- label: General | _APP_USAGE_DATABASE_INTERVAL
- defaultValue: "900"
- description:
- Interval value containing the number of seconds that the Appwrite
- usage process should wait before aggregating stats from data in Appwrite Database.
- The default value is 15 minutes.
-- templateVersion: 1.0.0
- defaultVersion: latest
- documentation: https://docs.weblate.org/en/latest/admin/install/docker.html
- description: "A copylefted libre software web-based continuous localization system."
- type: weblate
- name: Weblate
- labels:
- - translate
- - localization
- services:
- $$id:
- name: Weblate
- depends_on:
- - $$id-postgresql
- - $$id-redis
- image: "weblate/weblate:$$core_version"
- volumes:
- - "$$id-data:/app/data"
- environment:
- - WEBLATE_SITE_DOMAIN=$$config_weblate_site_domain
- - WEBLATE_ADMIN_PASSWORD=$$secret_weblate_admin_password
- - POSTGRES_PASSWORD=$$secret_postgres_password
- - POSTGRES_USER=$$config_postgres_user
- - POSTGRES_DATABASE=$$config_postgres_db
- - POSTGRES_HOST=$$id-postgresql
- - POSTGRES_PORT=5432
- - REDIS_HOST=$$id-redis
- ports:
- - "8080"
- $$id-postgresql:
- name: PostgreSQL
- depends_on: []
- image: "postgres:14-alpine"
- volumes:
- - "$$id-postgresql-data:/var/lib/postgresql/data"
- environment:
- - POSTGRES_USER=$$config_postgres_user
- - POSTGRES_PASSWORD=$$secret_postgres_password
- - POSTGRES_DB=$$config_postgres_db
- ports: []
- $$id-redis:
- name: Redis
- depends_on: []
- image: "redis:7-alpine"
- volumes:
- - "$$id-redis-data:/data"
- environment: []
- ports: []
- variables:
- - id: $$config_weblate_site_domain
- name: WEBLATE_SITE_DOMAIN
- label: Weblate Domain
- defaultValue: $$generate_domain
- description: ""
- - id: $$secret_weblate_admin_password
- name: WEBLATE_ADMIN_PASSWORD
- label: Weblate Admin Password
- defaultValue: $$generate_password
- description: ""
- showOnConfiguration: true
- - id: $$config_postgres_user
- main: $$id-postgresql
- name: POSTGRES_USER
- label: PostgreSQL User
- defaultValue: $$generate_username
- description: ""
- - id: $$secret_postgres_password
- main: $$id-postgresql
- name: POSTGRES_PASSWORD
- label: PostgreSQL Password
- defaultValue: $$generate_password
- description: ""
- showOnConfiguration: true
- - id: $$config_postgres_db
- main: $$id-postgresql
- name: POSTGRES_DB
- label: PostgreSQL Database
- defaultValue: weblate
- description: ""
-- templateVersion: 1.0.0
- defaultVersion: 2022.12.12-966e9c3c
- documentation: https://docs.searxng.org/
- type: searxng
- name: SearXNG
- description: "Free internet metasearch engine which aggregates results from more than 70 search services."
- services:
- $$id:
- name: SearXNG
- depends_on:
- - $$id-redis
- image: "searxng/searxng:$$core_version"
- volumes:
- - "$$id-searxng:/etc/searxng"
- environment:
- - SEARXNG_BASE_URL=$$config_searxng_base_url
- ports:
- - "8080"
- cap_drop:
- - ALL
- cap_add:
- - CHOWN
- - SETGID
- - SETUID
- - DAC_OVERRIDE
- files:
- - location: /etc/searxng/settings.yml
- content: |2-
-
- # see https://docs.searxng.org/admin/engines/settings.html#use-default-settings
- use_default_settings: true
- server:
- secret_key: $$secret_secret_key
- limiter: true
- image_proxy: true
- ui:
- static_use_hash: true
- redis:
- url: redis://:$$secret_redis_password@$$id-redis:6379/0
- $$id-redis:
- name: Redis
- command: >-
- redis-server --requirepass $$secret_redis_password --save ""
- --appendonly "no"
- depends_on: []
- image: "redis:7-alpine"
- volumes:
- - "$$id-redis-data:/data"
- environment:
- - REDIS_PASSWORD=$$secret_redis_password
- ports: []
- cap_drop:
- - ALL
- cap_add:
- - SETGID
- - SETUID
- - DAC_OVERRIDE
- variables:
- - id: $$config_searxng_base_url
- name: SEARXNG_BASE_URL
- label: SearXNG Base URL
- defaultValue: $$generate_fqdn
- description: ""
- - id: $$secret_secret_key
- name: SECRET_KEY
- label: Secret Key
- defaultValue: $$generate_hex(64)
- description: ""
- - id: $$secret_redis_password
- name: REDIS_PASSWORD
- label: Redis Password
- defaultValue: $$generate_password
- description: ""
-- templateVersion: 1.0.0
- defaultVersion: v3.0.0
- documentation: https://glitchtip.com/documentation
- type: glitchtip
- name: GlitchTip
- description: "Simple, open source error tracking."
- labels:
- - sentry
- - bugsnag
- services:
- $$id:
- name: GlitchTip
- depends_on:
- - $$id-postgresql
- - $$id-redis
- image: "glitchtip/glitchtip:$$core_version"
- volumes: []
- environment:
- - PORT=$$config_port
- - GLITCHTIP_DOMAIN=$$config_glitchtip_domain
- - SECRET_KEY=$$secret_secret_key
- - DATABASE_URL=$$secret_database_url
- - REDIS_URL=$$secret_redis_url
- - DEFAULT_FROM_EMAIL=$$config_default_from_email
- - EMAIL_URL=$$secret_email_url
- - EMAIL_HOST=$$config_email_host
- - EMAIL_PORT=$$config_email_port
- - EMAIL_HOST_USER=$$config_email_host_user
- - EMAIL_HOST_PASSWORD=$$secret_email_host_password
- - EMAIL_USE_TLS=$$config_email_use_tls
- - EMAIL_USE_SSL=$$config_email_use_ssl
- - EMAIL_BACKEND=$$config_email_backend
- - MAILGUN_API_KEY=$$secret_mailgun_api_key
- - SENDGRID_API_KEY=$$secret_sendgrid_api_key
- - ENABLE_OPEN_USER_REGISTRATION=$$config_enable_open_user_registration
- - DJANGO_SUPERUSER_EMAIL=$$config_django_superuser_email
- - DJANGO_SUPERUSER_PASSWORD=$$secret_django_superuser_password
- - DJANGO_SUPERUSER_USERNAME=$$config_django_superuser_username
- - CELERY_WORKER_CONCURRENCY=$$config_celery_worker_concurrency
- ports:
- - "8000"
- $$id-worker:
- name: Celery Worker
- command: ./bin/run-celery-with-beat.sh
- depends_on:
- - $$id-postgresql
- - $$id-redis
- image: "glitchtip/glitchtip:$$core_version"
- environment:
- - GLITCHTIP_DOMAIN=$$config_glitchtip_domain
- - SECRET_KEY=$$secret_secret_key
- - DATABASE_URL=$$secret_database_url
- - REDIS_URL=$$secret_redis_url
- - DEFAULT_FROM_EMAIL=$$config_default_from_email
- - EMAIL_URL=$$secret_email_url
- - CELERY_WORKER_CONCURRENCY=$$config_celery_worker_concurrency
- ports: []
- $$id-migrate:
- exclude: true
- name: Migrate
- command: ./manage.py migrate
- depends_on:
- - $$id-postgresql
- - $$id-redis
- image: "glitchtip/glitchtip:$$core_version"
- environment:
- - GLITCHTIP_DOMAIN=$$config_glitchtip_domain
- - SECRET_KEY=$$secret_secret_key
- - DATABASE_URL=$$secret_database_url
- - REDIS_URL=$$secret_redis_url
- - DEFAULT_FROM_EMAIL=$$config_default_from_email
- - EMAIL_URL=$$secret_email_url
- ports: []
- $$id-postgresql:
- name: PostgreSQL
- depends_on: []
- image: "postgres:14-alpine"
- volumes:
- - "$$id-postgresql-data:/var/lib/postgresql/data"
- environment:
- - POSTGRES_USER=$$config_postgres_user
- - POSTGRES_PASSWORD=$$secret_postgres_password
- - POSTGRES_DB=$$config_postgres_db
- ports: []
- $$id-redis:
- name: Redis
- depends_on: []
- image: "redis:7-alpine"
- volumes:
- - "$$id-postgresql-redis-data:/data"
- environment: []
- ports: []
- variables:
- - id: $$config_django_superuser_username
- name: DJANGO_SUPERUSER_USERNAME
- label: Django Superuser Username
- defaultValue: $$generate_username
- description: ""
- - id: $$secret_django_superuser_password
- name: DJANGO_SUPERUSER_PASSWORD
- label: Django Superuser Password
- defaultValue: $$generate_password
- description: ""
- showOnConfiguration: true
- - id: $$config_port
- name: PORT
- label: GlitchTip Port
- defaultValue: "8000"
- description: ""
- - id: $$config_celery_worker_concurrency
- main: $$id-worker
- name: CELERY_WORKER_CONCURRENCY
- label: Celery Worker Concurrency
- defaultValue: "2"
- description: ""
- - id: $$config_glitchtip_domain
- name: GLITCHTIP_DOMAIN
- label: GlitchTip Domain
- defaultValue: $$generate_fqdn
- description: ""
- - id: $$secret_email_url
- name: EMAIL_URL
- label: SMTP Email URL
- defaultValue: >-
- smtp://$$config_email_host_user:$$secret_email_host_password@$$config_email_host:$$config_email_port
- description: ""
- - id: $$secret_database_url
- name: DATABASE_URL
- label: Database URL for PostgreSQL
- defaultValue: >-
- postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db
- description: ""
- - id: $$secret_redis_url
- name: REDIS_URL
- label: Redis URL
- defaultValue: "redis://$$id-redis:6379/0"
- description: ""
- - id: $$config_default_from_email
- name: DEFAULT_FROM_EMAIL
- label: Default Email Address
- defaultValue: noreply@example.com
- description: ""
- - id: $$config_email_host
- name: EMAIL_HOST
- label: Email SMTP Host
- defaultValue: ""
- description: ""
- - id: $$config_email_port
- name: EMAIL_PORT
- label: Email SMTP Port
- defaultValue: "25"
- description: ""
- - id: $$config_email_host_user
- name: EMAIL_HOST_USER
- label: Email SMTP User
- defaultValue: ""
- description: ""
- - id: $$secret_email_host_password
- name: EMAIL_HOST_PASSWORD
- label: Email SMTP Password
- defaultValue: ""
- description: ""
- - id: $$config_email_use_tls
- name: EMAIL_USE_TLS
- label: Email Use TLS
- defaultValue: "false"
- description: ""
- - id: $$config_email_use_ssl
- name: EMAIL_USE_SSL
- label: Email Use SSL
- defaultValue: "false"
- description: ""
- - id: $$secret_email_smtp_password
- name: EMAIL_SMTP_PASSWORD
- label: SMTP Password
- defaultValue: ""
- description: ""
- - id: $$config_email_backend
- name: EMAIL_BACKEND
- label: Email Backend
- defaultValue: ""
- description: ""
- - id: $$secret_mailgun_api_key
- name: MAILGUN_API_KEY
- label: Mailgun API Key
- defaultValue: ""
- description: ""
- showOnConfiguration: true
- - id: $$secret_sendgrid_api_key
- name: SENDGRID_API_KEY
- label: Sendgrid API Key
- defaultValue: ""
- description: ""
- showOnConfiguration: true
- - id: $$config_enable_open_user_registration
- name: ENABLE_OPEN_USER_REGISTRATION
- label: Enable Open User Registration
- defaultValue: "true"
- description: ""
- - id: $$config_django_superuser_email
- name: DJANGO_SUPERUSER_EMAIL
- label: Django Superuser Email
- defaultValue: noreply@example.com
- description: ""
- - id: $$config_postgres_user
- main: $$id-postgresql
- name: POSTGRES_USER
- label: PostgreSQL User
- defaultValue: $$generate_username
- description: ""
- - id: $$secret_postgres_password
- main: $$id-postgresql
- name: POSTGRES_PASSWORD
- label: PostgreSQL Password
- defaultValue: $$generate_password
- description: ""
- - id: $$config_postgres_db
- main: $$id-postgresql
- name: POSTGRES_DB
- label: PostgreSQL Database
- defaultValue: glitchtip
- description: ""
-- templateVersion: 1.0.0
- defaultVersion: v2.16.0
- documentation: https://hasura.io/docs/latest/index/
- type: hasura
- name: Hasura
- description: "Instant realtime GraphQL APIs on any Postgres application, existing or new."
- labels:
- - graphql
- - database
- services:
- $$id:
- name: Hasura
- depends_on:
- - $$id-postgresql
- image: "hasura/graphql-engine:$$core_version"
- volumes: []
- environment:
- - HASURA_GRAPHQL_ENABLE_CONSOLE=$$config_hasura_graphql_enable_console
- - >-
- HASURA_GRAPHQL_METADATA_DATABASE_URL=$$secret_hasura_graphql_metadata_database_url
- - HASURA_GRAPHQL_ADMIN_SECRET=$$secret_hasura_graphql_admin_secret
- ports:
- - "8080"
- $$id-postgresql:
- name: PostgreSQL
- depends_on: []
- image: "postgres:12-alpine"
- volumes:
- - "$$id-postgresql-data:/var/lib/postgresql/data"
- environment:
- - POSTGRES_USER=$$config_postgres_user
- - POSTGRES_PASSWORD=$$secret_postgres_password
- - POSTGRES_DB=$$config_postgres_db
- ports: []
- variables:
- - id: $$config_hasura_graphql_enable_console
- name: HASURA_GRAPHQL_ENABLE_CONSOLE
- label: Enable Hasura Console
- defaultValue: "true"
- description: ""
- - id: $$secret_hasura_graphql_metadata_database_url
- name: HASURA_GRAPHQL_METADATA_DATABASE_URL
- label: Hasura Metadata Database URL
- defaultValue: >-
- postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db
- description: ""
- - id: $$secret_hasura_graphql_admin_secret
- name: HASURA_GRAPHQL_ADMIN_SECRET
- label: Hasura Admin Password
- defaultValue: $$generate_password
- description: ""
- showOnConfiguration: true
- - id: $$config_postgres_user
- name: POSTGRES_USER
- label: PostgreSQL User
- defaultValue: $$generate_username
- description: ""
- - id: $$secret_postgres_password
- name: POSTGRES_PASSWORD
- label: PostgreSQL Password
- defaultValue: $$generate_password
- description: ""
- - id: $$config_postgres_db
- name: POSTGRES_DB
- label: PostgreSQL Database
- defaultValue: hasura
- description: ""
-- templateVersion: 1.0.0
- defaultVersion: postgresql-v1.39.5
- documentation: https://umami.is/docs/getting-started
- type: umami-postgresql
- name: Umami
- subname: (PostgreSQL)
- description: >-
- A simple, easy to use, self-hosted web analytics solution.
- services:
- $$id:
- name: Umami
- depends_on:
- - $$id-postgresql
- image: "ghcr.io/umami-software/umami:$$core_version"
- volumes: []
- environment:
- - ADMIN_PASSWORD=$$secret_admin_password
- - DATABASE_URL=$$secret_database_url
- - DATABASE_TYPE=$$config_database_type
- - HASH_SALT=$$secret_hash_salt
- ports:
- - "3000"
- $$id-postgresql:
- name: PostgreSQL
- depends_on: []
- image: "postgres:12-alpine"
- volumes:
- - "$$id-postgresql-data:/var/lib/postgresql/data"
- environment:
- - POSTGRES_USER=$$config_postgres_user
- - POSTGRES_PASSWORD=$$secret_postgres_password
- - POSTGRES_DB=$$config_postgres_db
- ports: []
- files:
- - location: /docker-entrypoint-initdb.d/schema.postgresql.sql
- content: |2-
-
- -- CreateTable
- CREATE TABLE "account" (
- "user_id" SERIAL NOT NULL,
- "username" VARCHAR(255) NOT NULL,
- "password" VARCHAR(60) NOT NULL,
- "is_admin" BOOLEAN NOT NULL DEFAULT false,
- "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
- "updated_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
-
- PRIMARY KEY ("user_id")
- );
-
- -- CreateTable
- CREATE TABLE "event" (
- "event_id" SERIAL NOT NULL,
- "website_id" INTEGER NOT NULL,
- "session_id" INTEGER NOT NULL,
- "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
- "url" VARCHAR(500) NOT NULL,
- "event_type" VARCHAR(50) NOT NULL,
- "event_value" VARCHAR(50) NOT NULL,
-
- PRIMARY KEY ("event_id")
- );
-
- -- CreateTable
- CREATE TABLE "pageview" (
- "view_id" SERIAL NOT NULL,
- "website_id" INTEGER NOT NULL,
- "session_id" INTEGER NOT NULL,
- "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
- "url" VARCHAR(500) NOT NULL,
- "referrer" VARCHAR(500),
-
- PRIMARY KEY ("view_id")
- );
-
- -- CreateTable
- CREATE TABLE "session" (
- "session_id" SERIAL NOT NULL,
- "session_uuid" UUID NOT NULL,
- "website_id" INTEGER NOT NULL,
- "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
- "hostname" VARCHAR(100),
- "browser" VARCHAR(20),
- "os" VARCHAR(20),
- "device" VARCHAR(20),
- "screen" VARCHAR(11),
- "language" VARCHAR(35),
- "country" CHAR(2),
-
- PRIMARY KEY ("session_id")
- );
-
- -- CreateTable
- CREATE TABLE "website" (
- "website_id" SERIAL NOT NULL,
- "website_uuid" UUID NOT NULL,
- "user_id" INTEGER NOT NULL,
- "name" VARCHAR(100) NOT NULL,
- "domain" VARCHAR(500),
- "share_id" VARCHAR(64),
- "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
-
- PRIMARY KEY ("website_id")
- );
-
- -- CreateIndex
- CREATE UNIQUE INDEX "account.username_unique" ON "account"("username");
-
- -- CreateIndex
- CREATE INDEX "event_created_at_idx" ON "event"("created_at");
-
- -- CreateIndex
- CREATE INDEX "event_session_id_idx" ON "event"("session_id");
-
- -- CreateIndex
- CREATE INDEX "event_website_id_idx" ON "event"("website_id");
-
- -- CreateIndex
- CREATE INDEX "pageview_created_at_idx" ON "pageview"("created_at");
-
- -- CreateIndex
- CREATE INDEX "pageview_session_id_idx" ON "pageview"("session_id");
-
- -- CreateIndex
- CREATE INDEX "pageview_website_id_created_at_idx" ON "pageview"("website_id", "created_at");
-
- -- CreateIndex
- CREATE INDEX "pageview_website_id_idx" ON "pageview"("website_id");
-
- -- CreateIndex
- CREATE INDEX "pageview_website_id_session_id_created_at_idx" ON "pageview"("website_id", "session_id", "created_at");
-
- -- CreateIndex
- CREATE UNIQUE INDEX "session.session_uuid_unique" ON "session"("session_uuid");
-
- -- CreateIndex
- CREATE INDEX "session_created_at_idx" ON "session"("created_at");
-
- -- CreateIndex
- CREATE INDEX "session_website_id_idx" ON "session"("website_id");
-
- -- CreateIndex
- CREATE UNIQUE INDEX "website.website_uuid_unique" ON "website"("website_uuid");
-
- -- CreateIndex
- CREATE UNIQUE INDEX "website.share_id_unique" ON "website"("share_id");
-
- -- CreateIndex
- CREATE INDEX "website_user_id_idx" ON "website"("user_id");
-
- -- AddForeignKey
- ALTER TABLE "event" ADD FOREIGN KEY ("session_id") REFERENCES "session"("session_id") ON DELETE CASCADE ON UPDATE CASCADE;
-
- -- AddForeignKey
- ALTER TABLE "event" ADD FOREIGN KEY ("website_id") REFERENCES "website"("website_id") ON DELETE CASCADE ON UPDATE CASCADE;
-
- -- AddForeignKey
- ALTER TABLE "pageview" ADD FOREIGN KEY ("session_id") REFERENCES "session"("session_id") ON DELETE CASCADE ON UPDATE CASCADE;
-
- -- AddForeignKey
- ALTER TABLE "pageview" ADD FOREIGN KEY ("website_id") REFERENCES "website"("website_id") ON DELETE CASCADE ON UPDATE CASCADE;
-
- -- AddForeignKey
- ALTER TABLE "session" ADD FOREIGN KEY ("website_id") REFERENCES "website"("website_id") ON DELETE CASCADE ON UPDATE CASCADE;
-
- -- AddForeignKey
- ALTER TABLE "website" ADD FOREIGN KEY ("user_id") REFERENCES "account"("user_id") ON DELETE CASCADE ON UPDATE CASCADE;
-
- insert into account (username, password, is_admin) values ('admin', '$$hashed$$secret_admin_password', true);
- variables:
- - id: $$secret_database_url
- name: DATABASE_URL
- label: Database URL for PostgreSQL
- defaultValue: >-
- postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db
- description: ""
- - id: $$secret_hash_salt
- name: HASH_SALT
- label: Hash Salt
- defaultValue: $$generate_hex(64)
- description: ""
- - id: $$config_database_type
- name: DATABASE_TYPE
- label: Database Type
- defaultValue: "postgresql"
- description: ""
- - id: $$config_postgres_user
- name: POSTGRES_USER
- label: PostgreSQL User
- defaultValue: $$generate_username
- description: ""
- - id: $$secret_postgres_password
- name: POSTGRES_PASSWORD
- label: PostgreSQL Password
- defaultValue: $$generate_password
- description: ""
- - id: $$config_postgres_db
- name: POSTGRES_DB
- label: PostgreSQL Database
- defaultValue: umami
- description: ""
- - id: $$secret_admin_password
- name: ADMIN_PASSWORD
- label: Initial Admin Password
- defaultValue: $$generate_password
- description: ""
- showOnConfiguration: true
-- templateVersion: 1.0.0
- ignore: true
- defaultVersion: postgresql-v1.39.5
- documentation: https://umami.is/docs/getting-started
- type: umami
- name: Umami
- subname: (PostgreSQL)
- description: >-
- A simple, easy to use, self-hosted web analytics solution.
- services:
- $$id:
- name: Umami
- depends_on:
- - $$id-postgresql
- image: "ghcr.io/umami-software/umami:$$core_version"
- volumes: []
- environment:
- - ADMIN_PASSWORD=$$secret_admin_password
- - DATABASE_URL=$$secret_database_url
- - DATABASE_TYPE=$$config_database_type
- - HASH_SALT=$$secret_hash_salt
- ports:
- - "3000"
- $$id-postgresql:
- name: PostgreSQL
- depends_on: []
- image: "postgres:12-alpine"
- volumes:
- - "$$id-postgresql-data:/var/lib/postgresql/data"
- environment:
- - POSTGRES_USER=$$config_postgres_user
- - POSTGRES_PASSWORD=$$secret_postgres_password
- - POSTGRES_DB=$$config_postgres_db
- ports: []
- files:
- - location: /docker-entrypoint-initdb.d/schema.postgresql.sql
- content: |2-
-
- -- CreateTable
- CREATE TABLE "account" (
- "user_id" SERIAL NOT NULL,
- "username" VARCHAR(255) NOT NULL,
- "password" VARCHAR(60) NOT NULL,
- "is_admin" BOOLEAN NOT NULL DEFAULT false,
- "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
- "updated_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
-
- PRIMARY KEY ("user_id")
- );
-
- -- CreateTable
- CREATE TABLE "event" (
- "event_id" SERIAL NOT NULL,
- "website_id" INTEGER NOT NULL,
- "session_id" INTEGER NOT NULL,
- "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
- "url" VARCHAR(500) NOT NULL,
- "event_type" VARCHAR(50) NOT NULL,
- "event_value" VARCHAR(50) NOT NULL,
-
- PRIMARY KEY ("event_id")
- );
-
- -- CreateTable
- CREATE TABLE "pageview" (
- "view_id" SERIAL NOT NULL,
- "website_id" INTEGER NOT NULL,
- "session_id" INTEGER NOT NULL,
- "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
- "url" VARCHAR(500) NOT NULL,
- "referrer" VARCHAR(500),
-
- PRIMARY KEY ("view_id")
- );
-
- -- CreateTable
- CREATE TABLE "session" (
- "session_id" SERIAL NOT NULL,
- "session_uuid" UUID NOT NULL,
- "website_id" INTEGER NOT NULL,
- "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
- "hostname" VARCHAR(100),
- "browser" VARCHAR(20),
- "os" VARCHAR(20),
- "device" VARCHAR(20),
- "screen" VARCHAR(11),
- "language" VARCHAR(35),
- "country" CHAR(2),
-
- PRIMARY KEY ("session_id")
- );
-
- -- CreateTable
- CREATE TABLE "website" (
- "website_id" SERIAL NOT NULL,
- "website_uuid" UUID NOT NULL,
- "user_id" INTEGER NOT NULL,
- "name" VARCHAR(100) NOT NULL,
- "domain" VARCHAR(500),
- "share_id" VARCHAR(64),
- "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
-
- PRIMARY KEY ("website_id")
- );
-
- -- CreateIndex
- CREATE UNIQUE INDEX "account.username_unique" ON "account"("username");
-
- -- CreateIndex
- CREATE INDEX "event_created_at_idx" ON "event"("created_at");
-
- -- CreateIndex
- CREATE INDEX "event_session_id_idx" ON "event"("session_id");
-
- -- CreateIndex
- CREATE INDEX "event_website_id_idx" ON "event"("website_id");
-
- -- CreateIndex
- CREATE INDEX "pageview_created_at_idx" ON "pageview"("created_at");
-
- -- CreateIndex
- CREATE INDEX "pageview_session_id_idx" ON "pageview"("session_id");
-
- -- CreateIndex
- CREATE INDEX "pageview_website_id_created_at_idx" ON "pageview"("website_id", "created_at");
-
- -- CreateIndex
- CREATE INDEX "pageview_website_id_idx" ON "pageview"("website_id");
-
- -- CreateIndex
- CREATE INDEX "pageview_website_id_session_id_created_at_idx" ON "pageview"("website_id", "session_id", "created_at");
-
- -- CreateIndex
- CREATE UNIQUE INDEX "session.session_uuid_unique" ON "session"("session_uuid");
-
- -- CreateIndex
- CREATE INDEX "session_created_at_idx" ON "session"("created_at");
-
- -- CreateIndex
- CREATE INDEX "session_website_id_idx" ON "session"("website_id");
-
- -- CreateIndex
- CREATE UNIQUE INDEX "website.website_uuid_unique" ON "website"("website_uuid");
-
- -- CreateIndex
- CREATE UNIQUE INDEX "website.share_id_unique" ON "website"("share_id");
-
- -- CreateIndex
- CREATE INDEX "website_user_id_idx" ON "website"("user_id");
-
- -- AddForeignKey
- ALTER TABLE "event" ADD FOREIGN KEY ("session_id") REFERENCES "session"("session_id") ON DELETE CASCADE ON UPDATE CASCADE;
-
- -- AddForeignKey
- ALTER TABLE "event" ADD FOREIGN KEY ("website_id") REFERENCES "website"("website_id") ON DELETE CASCADE ON UPDATE CASCADE;
-
- -- AddForeignKey
- ALTER TABLE "pageview" ADD FOREIGN KEY ("session_id") REFERENCES "session"("session_id") ON DELETE CASCADE ON UPDATE CASCADE;
-
- -- AddForeignKey
- ALTER TABLE "pageview" ADD FOREIGN KEY ("website_id") REFERENCES "website"("website_id") ON DELETE CASCADE ON UPDATE CASCADE;
-
- -- AddForeignKey
- ALTER TABLE "session" ADD FOREIGN KEY ("website_id") REFERENCES "website"("website_id") ON DELETE CASCADE ON UPDATE CASCADE;
-
- -- AddForeignKey
- ALTER TABLE "website" ADD FOREIGN KEY ("user_id") REFERENCES "account"("user_id") ON DELETE CASCADE ON UPDATE CASCADE;
-
- insert into account (username, password, is_admin) values ('admin', '$$hashed$$secret_admin_password', true);
- variables:
- - id: $$secret_database_url
- name: DATABASE_URL
- label: Database URL for PostgreSQL
- defaultValue: >-
- postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db
- description: ""
- - id: $$secret_hash_salt
- name: HASH_SALT
- label: Hash Salt
- defaultValue: $$generate_hex(64)
- description: ""
- - id: $$config_database_type
- name: DATABASE_TYPE
- label: Database Type
- defaultValue: "postgresql"
- description: ""
- - id: $$config_postgres_user
- name: POSTGRES_USER
- label: PostgreSQL User
- defaultValue: $$generate_username
- description: ""
- - id: $$secret_postgres_password
- name: POSTGRES_PASSWORD
- label: PostgreSQL Password
- defaultValue: $$generate_password
- description: ""
- - id: $$config_postgres_db
- name: POSTGRES_DB
- label: PostgreSQL Database
- defaultValue: umami
- description: ""
- - id: $$secret_admin_password
- name: ADMIN_PASSWORD
- label: Initial Admin Password
- defaultValue: $$generate_password
- description: ""
- showOnConfiguration: true
-- templateVersion: 1.0.0
- defaultVersion: v0.30.1
- documentation: https://docs.meilisearch.com/learn/getting_started/quick_start.html
- type: meilisearch
- name: MeiliSearch
- description: >-
- A lightning Fast, Ultra Relevant, and Typo-Tolerant Search Engine.
- services:
- $$id:
- name: MeiliSearch
- documentation: https://docs.meilisearch.com/
- depends_on: []
- image: "getmeili/meilisearch:$$core_version"
- volumes:
- - "$$id-datams:/meili_data/data.ms"
- - "$$id-data:/meili_data"
- - "$$id-snapshot:/snapshot"
- - "$$id-dump:/dumps"
- environment:
- - MEILI_MASTER_KEY=$$secret_meili_master_key
- ports:
- - "7700"
- variables:
- - id: $$secret_meili_master_key
- name: MEILI_MASTER_KEY
- label: Master Key
- defaultValue: $$generate_hex(64)
- description: ""
- showOnConfiguration: true
-- templateVersion: 1.0.0
- ignore: true
- defaultVersion: latest
- documentation: https://docs.ghost.org
- arch: amd64
- type: ghost-mariadb
- name: Ghost
- subname: (MariaDB)
- description: >-
- Free and open source blogging platform.
- labels:
- - cms
- - blog
- services:
- $$id:
- name: Ghost
- depends_on:
- - $$id-mariadb
- image: "bitnami/ghost:$$core_version"
- volumes:
- - "$$id-ghost:/bitnami/ghost"
- environment:
- - url=$$config_url
- - GHOST_HOST=$$config_ghost_host
- - GHOST_ENABLE_HTTPS=$$config_ghost_enable_https
- - GHOST_EMAIL=$$config_ghost_email
- - GHOST_PASSWORD=$$secret_ghost_password
- - GHOST_DATABASE_HOST=$$config_ghost_database_host
- - GHOST_DATABASE_USER=$$config_mariadb_user
- - GHOST_DATABASE_PASSWORD=$$secret_ghost_database_password
- - GHOST_DATABASE_NAME=$$config_mariadb_database
- - GHOST_DATABASE_PORT_NUMBER=3306
- ports:
- - "2368"
- $$id-mariadb:
- name: MariaDB
- depends_on: []
- image: "bitnami/mariadb:latest"
- volumes:
- - "$$id-mariadb:/bitnami/mariadb"
- environment:
- - MARIADB_USER=$$config_mariadb_user
- - MARIADB_PASSWORD=$$secret_mariadb_password
- - MARIADB_DATABASE=$$config_mariadb_database
- - MARIADB_ROOT_USER=$$config_mariadb_root_user
- - MARIADB_ROOT_PASSWORD=$$secret_mariadb_root_password
- ports: []
- variables:
- - id: $$config_url
- name: url
- label: URL
- defaultValue: $$generate_fqdn
- description: ""
- - id: $$config_ghost_host
- name: GHOST_HOST
- label: Ghost Host
- defaultValue: $$generate_domain
- description: ""
- - id: $$config_ghost_enable_https
- name: GHOST_ENABLE_HTTPS
- label: Ghost Enable HTTPS
- defaultValue: "no"
- description: ""
- - id: $$config_ghost_email
- name: GHOST_EMAIL
- label: Ghost Default Email
- defaultValue: admin@example.com
- description: ""
- - id: $$secret_ghost_password
- name: GHOST_PASSWORD
- label: Ghost Default Password
- defaultValue: $$generate_password
- description: ""
- showOnConfiguration: true
- - id: $$config_ghost_database_host
- name: GHOST_DATABASE_HOST
- label: Ghost Database Host
- defaultValue: $$id-mariadb
- description: ""
- - id: $$config_ghost_database_user
- name: GHOST_DATABASE_USER
- label: MariaDB User
- defaultValue: $$config_mariadb_user
- description: ""
- - id: $$secret_ghost_database_password
- name: GHOST_DATABASE_PASSWORD
- label: MariaDB Password
- defaultValue: $$secret_mariadb_password
- description: ""
- - id: $$config_ghost_database_name
- name: GHOST_DATABASE_NAME
- label: MariaDB Database
- defaultValue: $$config_mariadb_database
- description: ""
- - id: $$config_mariadb_user
- name: MARIADB_USER
- label: MariaDB User
- defaultValue: $$generate_username
- description: ""
- - id: $$secret_mariadb_password
- name: MARIADB_PASSWORD
- label: MariaDB Password
- defaultValue: $$generate_password
- description: ""
- - id: $$config_mariadb_database
- name: MARIADB_DATABASE
- label: MariaDB Database
- defaultValue: ghost
- description: ""
- - id: $$config_mariadb_root_user
- name: MARIADB_ROOT_USER
- label: MariaDB Root User
- defaultValue: $$generate_username
- description: ""
- - id: $$secret_mariadb_root_password
- name: MARIADB_ROOT_PASSWORD
- label: MariaDB Root Password
- defaultValue: $$generate_password
- description: ""
-- templateVersion: 1.0.0
- defaultVersion: "5.25.3"
- documentation: https://docs.ghost.org
- type: ghost-only
- name: Ghost
- subname: (without Database)
- description: >-
- Free and open source blogging platform.
- services:
- $$id:
- name: Ghost
- image: "ghost:$$core_version"
- volumes:
- - "$$id-ghost:/var/lib/ghost/content"
- environment:
- - url=$$config_url
- - database__client=$$config_database__client
- - database__connection__host=$$config_database__connection__host
- - database__connection__user=$$config_database__connection__user
- - database__connection__password=$$secret_database__connection__password
- - database__connection__database=$$config_database__connection__database
- ports:
- - "2368"
- variables:
- - id: $$config_url
- name: url
- label: URL
- defaultValue: $$generate_fqdn
- description: ""
- - id: $$config_database__client
- name: database__client
- label: Database Client
- defaultValue: mysql
- description: ""
- required: true
- - id: $$config_database__connection__host
- name: database__connection__host
- label: Database Host
- defaultValue: ""
- description: ""
- required: true
- placeholder: "db.coolify.io"
- - id: $$config_database__connection__user
- name: database__connection__user
- label: Database User
- defaultValue: ""
- description: ""
- placeholder: "ghost"
- required: true
- - id: $$secret_database__connection__password
- name: database__connection__password
- label: Database Password
- defaultValue: ""
- description: ""
- placeholder: "superSecretP4ssword"
- showOnConfiguration: true
- required: true
- - id: $$config_database__connection__database
- name: database__connection__database
- label: Database Name
- defaultValue: ""
- description: ""
- placeholder: "ghost_db"
- required: true
-- templateVersion: 1.0.0
- defaultVersion: "5.25.3"
- documentation: https://docs.ghost.org
- type: ghost-mysql
- name: Ghost
- subname: (MySQL)
- description: >-
- Ghost is a free and open source blogging platform.
- services:
- $$id:
- name: Ghost
- depends_on:
- - $$id-mysql
- image: "ghost:$$core_version"
- volumes:
- - "$$id-ghost:/var/lib/ghost/content"
- environment:
- - url=$$config_url
- - database__client=$$config_database__client
- - database__connection__host=$$config_database__connection__host
- - database__connection__user=$$config_mysql_user
- - database__connection__password=$$secret_mysql_password
- - database__connection__database=$$config_mysql_database
- ports:
- - "2368"
- $$id-mysql:
- name: MySQL
- depends_on: []
- image: "mysql:8.0"
- volumes:
- - "$$id-mysql:/var/lib/mysql"
- environment:
- - MYSQL_USER=$$config_mysql_user
- - MYSQL_PASSWORD=$$secret_mysql_password
- - MYSQL_DATABASE=$$config_mysql_database
- - MYSQL_ROOT_PASSWORD=$$secret_mysql_root_password
- ports: []
- variables:
- - id: $$config_url
- name: url
- label: URL
- defaultValue: $$generate_fqdn
- description: ""
- - id: $$config_database__client
- name: database__client
- label: Database Client
- defaultValue: mysql
- description: ""
- readOnly: true
- - id: $$config_database__connection__host
- name: database__connection__host
- label: Database Host
- defaultValue: $$id-mysql
- description: ""
- - id: $$config_mysql_user
- main: $$id-mysql
- name: MYSQL_USER
- label: MySQL User
- defaultValue: $$generate_username
- description: ""
- - id: $$secret_mysql_password
- main: $$id-mysql
- name: MYSQL_PASSWORD
- label: MySQL Password
- defaultValue: $$generate_password
- description: ""
- - id: $$config_mysql_database
- main: $$id-mysql
- name: MYSQL_DATABASE
- label: MySQL Database
- defaultValue: ghost
- description: ""
- - id: $$secret_mysql_root_password
- name: MYSQL_ROOT_PASSWORD
- label: MySQL Root Password
- defaultValue: $$generate_password
- description: ""
-- templateVersion: 1.0.0
- defaultVersion: php8.1
- documentation: https://wordpress.org/
- type: wordpress
- name: WordPress
- subname: (MySQL)
- description: A content management system based on PHP.
- labels:
- - "wordpress"
- - "php"
- - "cms"
- services:
- $$id:
- name: WordPress
- depends_on:
- - $$id-mysql
- image: "wordpress:$$core_version"
- volumes:
- - "$$id-wordpress-data:/var/www/html"
- environment:
- - WORDPRESS_DB_HOST=$$config_wordpress_db_host
- - WORDPRESS_DB_USER=$$config_mysql_user
- - WORDPRESS_DB_PASSWORD=$$secret_mysql_password
- - WORDPRESS_DB_NAME=$$config_mysql_database
- - WORDPRESS_CONFIG_EXTRA=$$config_wordpress_config_extra
- ports:
- - "80"
- $$id-mysql:
- name: MySQL
- depends_on: []
- image: "bitnami/mysql:5.7"
- imageArm: "mysql:8.0"
- volumes:
- - "$$id-mysql-data:/bitnami/mysql/data"
- volumesArm:
- - "$$id-mysql-data:/var/lib/mysql"
- environment:
- - MYSQL_ROOT_PASSWORD=$$secret_mysql_root_password
- - MYSQL_ROOT_USER=$$config_mysql_root_user
- - MYSQL_DATABASE=$$config_mysql_database
- - MYSQL_USER=$$config_mysql_user
- - MYSQL_PASSWORD=$$secret_mysql_password
- variables:
- - id: $$config_wordpress_db_host
- name: WORDPRESS_DB_HOST
- label: Database Host
- defaultValue: $$id-mysql
- description: ""
- readOnly: true
- - id: $$config_wordpress_config_extra
- name: WORDPRESS_CONFIG_EXTRA
- label: WordPress Config Extra
- defaultValue: ""
- description: ""
- type: "textarea"
- placeholder: |
- define('WP_DEBUG', true);
- define('WP_DEBUG_LOG', true);
- define('WP_DEBUG_DISPLAY', false);
- @ini_set('display_errors', 0);
- - id: $$secret_mysql_root_password
- name: MYSQL_ROOT_PASSWORD
- label: MySQL Root Password
- defaultValue: $$generate_password
- description: ""
- readOnly: true
- - id: $$config_mysql_root_user
- name: MYSQL_ROOT_USER
- label: MySQL Root User
- defaultValue: $$generate_username
- description: ""
- readOnly: true
- - id: $$config_mysql_database
- name: MYSQL_DATABASE
- label: MySQL Database
- defaultValue: wordpress
- description: ""
- readOnly: true
- - id: $$config_mysql_user
- name: MYSQL_USER
- label: MySQL User
- defaultValue: $$generate_username
- description: ""
- readOnly: true
- - id: $$secret_mysql_password
- name: MYSQL_PASSWORD
- label: MySQL Password
- defaultValue: $$generate_password
- description: ""
- readOnly: true
-- templateVersion: 1.0.0
- defaultVersion: php8.1
- documentation: https://wordpress.org/
- type: wordpress-only
- name: WordPress
- subname: (without DB)
- description: A content management system based on PHP.
- labels:
- - "wordpress"
- - "php"
- - "cms"
- services:
- $$id:
- name: WordPress
- image: "wordpress:$$core_version"
- volumes:
- - "$$id-wordpress-data:/var/www/html"
- environment:
- - WORDPRESS_DB_HOST=$$config_wordpress_db_host
- - WORDPRESS_DB_PORT=$$config_wordpress_db_port
- - WORDPRESS_DB_USER=$$config_wordpress_db_user
- - WORDPRESS_DB_PASSWORD=$$secret_wordpress_db_password
- - WORDPRESS_DB_NAME=$$config_wordpress_db_name
- - WORDPRESS_CONFIG_EXTRA=$$config_wordpress_config_extra
- ports:
- - "80"
- variables:
- - id: $$config_wordpress_db_host
- name: WORDPRESS_DB_HOST
- label: Database Host
- defaultValue: ""
- description: ""
- placeholder: "db.coollabs.io"
- required: true
- - id: $$config_wordpress_db_port
- name: WORDPRESS_DB_PORT
- label: Database Port
- defaultValue: ""
- description: ""
- placeholder: "3306"
- required: true
- - id: $$config_wordpress_db_user
- name: WORDPRESS_DB_USER
- label: Database User
- defaultValue: ""
- description: ""
- placeholder: "wordpress"
- required: true
- - id: $$secret_wordpress_db_password
- name: WORDPRESS_DB_PASSWORD
- label: Database Password
- defaultValue: ""
- description: ""
- placeholder: "supers3cr3tpassw0rd!"
- required: true
- showOnConfiguration: true
- - id: $$config_wordpress_db_name
- name: WORDPRESS_DB_NAME
- label: Database Name
- defaultValue: ""
- description: ""
- placeholder: "wordpress"
- required: true
- - id: $$config_wordpress_config_extra
- name: WORDPRESS_CONFIG_EXTRA
- label: Extra Config
- defaultValue: ""
- description: ""
- type: "textarea"
- placeholder: |
- define('WP_DEBUG', true);
- define('WP_DEBUG_LOG', true);
- define('WP_DEBUG_DISPLAY', false);
- @ini_set('display_errors', 0);
-- templateVersion: 1.0.0
- defaultVersion: 4.9.0
- documentation: https://coder.com/docs/coder-oss/latest
- type: vscodeserver
- name: VSCode Server
- description: >-
- Visual Studio Code on a remote server, accessible through the browser.
- labels:
- - vscode
- - ide
- services:
- $$id:
- name: VSCode Server
- depends_on: []
- image: "codercom/code-server:$$core_version"
- volumes:
- - "$$id-config-data:/home/coder/.local/share/code-server"
- - "$$id-vscodeserver-data:/home/coder"
- - "$$id-keys-directory:/root/.ssh"
- - "$$id-theme-and-plugin-directory:/root/.local/share/code-server"
- environment:
- - PASSWORD=$$secret_password
- ports:
- - "8080"
- variables:
- - id: $$secret_password
- name: PASSWORD
- label: Password
- defaultValue: $$generate_password
- description: ""
- showOnConfiguration: true
-- templateVersion: 1.0.0
- defaultVersion: RELEASE.2022-12-12T19-27-27Z
- documentation: https://min.io/docs/minio
- type: minio
- name: MinIO
- description: "A cloud storage server compatible with Amazon S3."
- labels:
- - storage
- - s3
- services:
- $$id:
- name: MinIO
- command: "server /data --console-address :9001"
- depends_on: []
- image: "minio/minio:$$core_version"
- volumes:
- - "$$id-minio-data:/data"
- - "$$id-data-write:/files"
- environment:
- - MINIO_SERVER_URL=$$config_coolify_fqdn_minio_console
- - MINIO_BROWSER_REDIRECT_URL=$$config_minio_browser_redirect_url
- - MINIO_DOMAIN=$$config_minio_domain
- - MINIO_ROOT_USER=$$config_minio_root_user
- - MINIO_ROOT_PASSWORD=$$secret_minio_root_password
- ports:
- - "9000"
- - "9001"
- proxy:
- - port: "9000"
- domain: $$config_coolify_fqdn_minio_console
- - port: "9001"
- variables:
- - id: $$config_coolify_fqdn_minio_console
- name: MINIO_SERVER_URL
- label: MinIO Server URL
- defaultValue: ""
- description: "Specify the URL hostname the MinIO Console should use for connecting to the MinIO Server."
- required: true
- - id: $$config_minio_browser_redirect_url
- name: MINIO_BROWSER_REDIRECT_URL
- label: Browser Redirect URL
- defaultValue: $$generate_fqdn
- description: ""
- - id: $$config_minio_domain
- name: MINIO_DOMAIN
- label: Domain
- defaultValue: $$generate_domain
- description: ""
- - id: $$config_minio_root_user
- name: MINIO_ROOT_USER
- label: Root User
- defaultValue: $$generate_username
- description: ""
- - id: $$secret_minio_root_password
- name: MINIO_ROOT_PASSWORD
- label: Root User Password
- defaultValue: $$generate_password
- description: ""
- showOnConfiguration: true
-- templateVersion: 1.0.0
- defaultVersion: 0.21.1
- documentation: https://fider.io/docs
- type: fider
- name: Fider
- description: A platform to collect and organize customer feedback.
- labels:
- - suggestion
- - feedback
- services:
- $$id:
- name: Fider
- image: "getfider/fider:$$core_version"
- depends_on:
- - $$id-postgresql
- environment:
- - BASE_URL=$$config_base_url
- - DATABASE_URL=$$secret_database_url
- - JWT_SECRET=$$secret_jwt_secret
- - EMAIL_NOREPLY=$$config_email_noreply
- - EMAIL_MAILGUN_API=$$secret_email_mailgun_api
- - EMAIL_MAILGUN_REGION=$$config_email_mailgun_region
- - EMAIL_MAILGUN_DOMAIN=$$config_email_mailgun_domain
- - EMAIL_SMTP_HOST=$$config_email_smtp_host
- - EMAIL_SMTP_PORT=$$config_email_smtp_port
- - EMAIL_SMTP_USER=$$config_email_smtp_user
- - EMAIL_SMTP_PASSWORD=$$secret_email_smtp_password
- - EMAIL_SMTP_ENABLE_STARTTLS=$$config_email_smtp_enable_starttls
- ports:
- - "3000"
- $$id-postgresql:
- name: PostgreSQL
- depends_on: []
- image: "postgres:12-alpine"
- volumes:
- - "$$id-postgresql-data:/var/lib/postgresql/data"
- environment:
- - POSTGRES_USER=$$config_postgres_user
- - POSTGRES_PASSWORD=$$secret_postgres_password
- - POSTGRES_DB=$$config_postgres_db
- variables:
- - id: $$config_base_url
- name: BASE_URL
- label: Base URL
- defaultValue: $$generate_fqdn
- description: ""
- - id: $$secret_database_url
- name: DATABASE_URL
- label: Database URL for PostgreSQL
- defaultValue: >-
- postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db?sslmode=disable
- description: ""
- - id: $$secret_jwt_secret
- name: JWT_SECRET
- label: JWT Secret
- defaultValue: $$generate_hex(64)
- description: ""
- - id: $$config_email_noreply
- name: EMAIL_NOREPLY
- label: No Reply Email Address
- defaultValue: noreply@example.com
- description: ""
- - id: $$secret_email_mailgun_api
- name: EMAIL_MAILGUN_API
- label: Mailgun API Key
- defaultValue: ""
- description: ""
- showOnConfiguration: true
- - id: $$config_email_mailgun_region
- name: EMAIL_MAILGUN_REGION
- label: Mailgun Region
- defaultValue: EU
- description: ""
- - id: $$config_email_mailgun_domain
- name: EMAIL_MAILGUN_DOMAIN
- label: Mailgun Domain
- defaultValue: ""
- description: ""
- - id: $$config_email_smtp_host
- name: EMAIL_SMTP_HOST
- label: SMTP Host
- defaultValue: ""
- description: ""
- - id: $$config_email_smtp_port
- name: EMAIL_SMTP_PORT
- label: SMTP Port
- defaultValue: "587"
- description: ""
- - id: $$config_email_smtp_user
- name: EMAIL_SMTP_USER
- label: SMTP User
- defaultValue: ""
- description: ""
- - id: $$secret_email_smtp_password
- name: EMAIL_SMTP_PASSWORD
- label: SMTP Password
- defaultValue: ""
- description: ""
- showOnConfiguration: true
- - id: $$config_email_smtp_enable_starttls
- name: EMAIL_SMTP_ENABLE_STARTTLS
- label: SMTP Enable StartTLS
- defaultValue: "false"
- description: ""
- - id: $$config_postgres_user
- name: POSTGRES_USER
- label: PostgreSQL User
- defaultValue: $$generate_username
- description: ""
- - id: $$secret_postgres_password
- name: POSTGRES_PASSWORD
- label: PostgreSQL Password
- defaultValue: $$generate_password
- description: ""
- - id: $$config_postgres_db
- name: POSTGRES_DB
- label: PostgreSQL Database
- defaultValue: $$generate_username
- description: ""
-- templateVersion: 1.0.0
- defaultVersion: 0.207.0
- documentation: https://docs.n8n.io
- type: n8n
- name: n8n.io
- description: A free and open node based Workflow Automation Tool.
- labels:
- - workflow
- - automation
- - ifttt
- - zapier
- - nodered
- services:
- $$id:
- name: N8n
- depends_on: []
- image: "n8nio/n8n:$$core_version"
- volumes:
- - "$$id-data:/root/.n8n"
- - "$$id-data-write:/files"
- - "/var/run/docker.sock:/var/run/docker.sock"
- environment:
- - WEBHOOK_URL=$$config_webhook_url
- ports:
- - "5678"
- variables:
- - id: $$config_webhook_url
- name: WEBHOOK_URL
- label: Webhook URL
- defaultValue: $$generate_fqdn
- description: ""
-- templateVersion: 1.0.0
- defaultVersion: stable
- documentation: https://plausible.io/doc/
- arch: amd64
- type: plausibleanalytics
- name: Plausible Analytics
- description: A lightweight and open-source website analytics tool.
- labels:
- - analytics
- - statistics
- - plausible
- - gdpr
- - no-cookie
- - google analytics
- services:
- $$id:
- name: Plausible Analytics
- command: >-
- sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db
- migrate && /entrypoint.sh db init-admin && /entrypoint.sh run"
- depends_on:
- - $$id-postgresql
- - $$id-clickhouse
- image: "plausible/analytics:$$core_version"
- environment:
- - ADMIN_USER_EMAIL=$$config_admin_user_email
- - ADMIN_USER_NAME=$$config_admin_user_name
- - ADMIN_USER_PWD=$$secret_admin_user_pwd
- - BASE_URL=$$config_base_url
- - SECRET_KEY_BASE=$$secret_secret_key_base
- - DISABLE_AUTH=$$config_disable_auth
- - DISABLE_REGISTRATION=$$config_disable_registration
- - DATABASE_URL=$$secret_database_url
- - CLICKHOUSE_DATABASE_URL=$$secret_clickhouse_database_url
- ports:
- - "8000"
- $$id-postgresql:
- name: PostgreSQL
- image: "bitnami/postgresql:13"
- volumes:
- - "$$id-postgresql-data:/bitnami/postgresql"
- environment:
- - POSTGRESQL_PASSWORD=$$secret_postgresql_password
- - POSTGRESQL_USERNAME=$$config_postgresql_username
- - POSTGRESQL_DATABASE=$$config_postgresql_database
- $$id-clickhouse:
- name: Clickhouse
- volumes:
- - "$$id-clickhouse-data:/var/lib/clickhouse"
- image: "clickhouse/clickhouse-server:22.6-alpine"
- ulimits:
- nofile:
- soft: 262144
- hard: 262144
- files:
- - location: /etc/clickhouse-server/users.d/logging.xml
- content: >-
- warning true
- - location: /etc/clickhouse-server/config.d/logging.xml
- content: >-
- 0 0
- - location: /docker-entrypoint-initdb.d/init.query
- content: CREATE DATABASE IF NOT EXISTS plausible;
- - location: /docker-entrypoint-initdb.d/init-db.sh
- content: >-
- clickhouse client --queries-file
- /docker-entrypoint-initdb.d/init.query
- variables:
- - id: $$config_base_url
- name: BASE_URL
- label: Base URL
- defaultValue: $$generate_fqdn
- description: >-
- You must set this to the FQDN of the Plausible Analytics instance. This
- is used to generate the links to the Plausible Analytics instance.
- - id: $$secret_database_url
- name: DATABASE_URL
- label: Database URL for PostgreSQL
- defaultValue: >-
- postgresql://$$config_postgresql_username:$$secret_postgresql_password@$$id-postgresql:5432/$$config_postgresql_database
- description: ""
- - id: $$secret_clickhouse_database_url
- name: CLICKHOUSE_DATABASE_URL
- label: Database URL for Clickhouse
- defaultValue: "http://$$id-clickhouse:8123/plausible"
- description: ""
- - id: $$config_admin_user_email
- name: ADMIN_USER_EMAIL
- label: Admin Email Address
- defaultValue: admin@example.com
- description: This is the admin email. Please change it.
- - id: $$config_admin_user_name
- name: ADMIN_USER_NAME
- label: Admin User Name
- defaultValue: $$generate_username
- description: This is the admin username. Please change it.
- - id: $$secret_admin_user_pwd
- name: ADMIN_USER_PWD
- label: Admin User Password
- defaultValue: $$generate_password
- description: This is the admin password. Please change it.
- showOnConfiguration: true
- - id: $$secret_secret_key_base
- name: SECRET_KEY_BASE
- label: Secret Key Base
- defaultValue: $$generate_hex(64)
- description: ""
- - id: $$config_disable_auth
- name: DISABLE_AUTH
- label: Authentication
- defaultValue: "false"
- description: ""
- - id: $$config_disable_registration
- name: DISABLE_REGISTRATION
- label: Registration
- defaultValue: "true"
- description: ""
- - id: $$config_postgresql_username
- main: $$id-postgresql
- name: POSTGRESQL_USERNAME
- label: PostgreSQL Username
- defaultValue: postgresql
- description: ""
- - id: $$secret_postgresql_password
- main: $$id-postgresql
- name: POSTGRESQL_PASSWORD
- label: PostgreSQL Password
- defaultValue: $$generate_password
- description: ""
- showOnConfiguration: true
- - id: $$config_postgresql_database
- main: $$id-postgresql
- name: POSTGRESQL_DATABASE
- label: PostgreSQL Database
- defaultValue: plausible
- description: ""
- - id: $$config_scriptName
- name: SCRIPT_NAME
- label: Custom Script Name
- defaultValue: plausible.js
- description: This is the default script name.
-- templateVersion: 1.0.0
- defaultVersion: 0.99.1
- documentation: https://docs.nocodb.com
- type: nocodb
- name: NocoDB
- description: >-
- Turns any MySQL, PostgreSQL, SQL Server, SQLite & MariaDB into a smart-spreadsheet.
- labels:
- - database
- - airtable
- - spreadsheet
- services:
- $$id:
- name: NocoDB
- image: nocodb/nocodb:$$core_version
- environment:
- - PORT=$$config_port
- - NC_DB=$$config_nc_db
- - DATABASE_URL=$$secret_database_url
- - NC_PUBLIC_URL=$$config_public_url
- - NC_AUTH_JWT_SECRET=$$secret_auth_jwt_secret
- - NC_SENTRY_DSN=$$secret_sentry_dsn
- - >-
- NC_CONNECT_TO_EXTERNAL_DB_DISABLED=$$config_connect_to_external_db_disabled
- - NC_DISABLE_TELE=$$config_disable_tele
- volumes:
- - $$id-data:/usr/app/data
- ports:
- - "8080"
- variables:
- - id: $$config_nc_db
- name: NC_DB
- label: Database
- defaultValue: ""
- description: >-
- MySQL, PostgreSQL and MSSQL connection urls supported. If absent: A
- local SQLite will be created in root folder.
- - id: $$config_port
- name: PORT
- label: Port
- defaultValue: "8080"
- description: >-
-
- - id: $$secret_database_url
- name: DATABASE_URL
- label: Database URL
- defaultValue: ""
- description: >-
- JDBC URL Format. Can be used instead of NC_DB. Used in 1-Click Heroku
- deployment.
- - id: $$config_public_url
- name: NC_PUBLIC_URL
- label: Public URL
- defaultValue: ""
- description: >-
- Used for sending Email invitations. If absent: Best guess from http
- request params.
- - id: $$secret_auth_jwt_secret
- name: NC_AUTH_JWT_SECRET
- label: Auth JWT Secret
- defaultValue: $$generate_hex(64)
- description: >-
- JWT secret used for auth and storing other secrets. If absent: A Random
- secret will be generated.
- - id: $$secret_sentry_dsn
- name: NC_SENTRY_DSN
- label: Sentry DSN
- defaultValue: ""
- description: For Sentry monitoring.
- - id: $$config_connect_to_external_db_disabled
- name: NC_CONNECT_TO_EXTERNAL_DB_DISABLED
- label: Disable External Database
- defaultValue: "0"
- description: Disable Project creation with external database. (Enter "1" to disable).
- - id: $$config_disable_tele
- name: NC_DISABLE_TELE
- label: NocoDB Disable Telemetry
- defaultValue: "1"
- description: Disable telemetry (Enter "1" to disable).
diff --git a/apps/trpc-experimental/server/nodemon.json b/apps/trpc-experimental/server/nodemon.json
deleted file mode 100644
index 48bb2f143..000000000
--- a/apps/trpc-experimental/server/nodemon.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "watch": ["src"],
- "ignore": ["src/**/*.test.ts"],
- "ext": "ts,mjs,json,graphql",
- "exec": "rimraf build && esbuild `find src \\( -name '*.ts' -o -name '*.js' \\)` --platform=node --outdir=build --format=cjs && node build",
- "legacyWatch": true
-}
diff --git a/apps/trpc-experimental/server/package.json b/apps/trpc-experimental/server/package.json
deleted file mode 100644
index 45177559a..000000000
--- a/apps/trpc-experimental/server/package.json
+++ /dev/null
@@ -1,85 +0,0 @@
-{
- "name": "server",
- "description": "Coolify's Fastify API",
- "license": "Apache-2.0",
- "scripts": {
- "build": "rimraf ../../build && tsc --outDir ../../build",
- "dev-old": "tsx watch --clear-screen=false src",
- "dev": "nodemon",
- "lint": "prettier --plugin-search-dir . --check . && eslint .",
- "format": "prettier --plugin-search-dir . --write .",
- "test-dev": "start-server-and-test 'tsx src/server' http-get://localhost:2022 'tsx src/client'",
- "test-start": "start-server-and-test 'node dist/server' http-get://localhost:2022 'node dist/client'",
- "db:generate": "prisma generate",
- "db:push": "prisma db push && prisma generate",
- "db:seed": "prisma db seed",
- "db:studio": "prisma studio",
- "db:migrate": "DATABASE_URL=file:../db/migration.db prisma migrate dev --skip-seed --name"
- },
- "dependencies": {
- "@breejs/ts-worker": "2.0.0",
- "@fastify/autoload": "5.6.0",
- "@fastify/cors": "8.2.0",
- "@fastify/env": "4.1.0",
- "@fastify/jwt": "6.5.0",
- "@fastify/static": "6.6.0",
- "@fastify/websocket": "7.1.1",
- "@iarna/toml": "2.2.5",
- "@ladjs/graceful": "3.0.2",
- "@prisma/client": "4.6.1",
- "@trpc/client": "10.1.0",
- "@trpc/server": "10.1.0",
- "abort-controller": "3.0.0",
- "axe": "11.0.0",
- "bcryptjs": "2.4.3",
- "bree": "9.1.2",
- "cabin": "11.0.1",
- "csvtojson": "2.0.10",
- "cuid": "2.1.8",
- "dayjs": "1.11.6",
- "dotenv": "^16.0.3",
- "execa": "6.1.0",
- "fastify": "4.10.2",
- "fastify-plugin": "4.4.0",
- "got": "^12.5.3",
- "is-ip": "5.0.0",
- "is-port-reachable": "4.0.0",
- "js-yaml": "4.1.0",
- "jsonwebtoken": "9.0.0",
- "node-fetch": "3.3.0",
- "p-all": "4.0.0",
- "p-throttle": "5.0.0",
- "prisma": "4.6.1",
- "shell-quote": "^1.7.4",
- "ssh-config": "4.1.6",
- "strip-ansi": "7.0.1",
- "superjson": "1.11.0",
- "tslib": "2.4.1",
- "unique-names-generator": "4.7.1",
- "ws": "8.11.0",
- "zod": "3.19.1"
- },
- "devDependencies": {
- "@types/bcryptjs": "^2.4.2",
- "@types/js-yaml": "^4.0.5",
- "@types/jsonwebtoken": "^8.5.9",
- "@types/node": "18.11.9",
- "@types/node-fetch": "2.6.2",
- "@types/shell-quote": "^1.7.1",
- "@types/ws": "8.5.3",
- "esbuild": "0.15.15",
- "nodemon": "2.0.20",
- "npm-run-all": "4.1.5",
- "rimraf": "3.0.2",
- "start-server-and-test": "1.14.0",
- "tsx": "3.12.1",
- "typescript": "4.9.3",
- "wait-port": "1.0.4"
- },
- "publishConfig": {
- "access": "restricted"
- },
- "prisma": {
- "seed": "tsx prisma/seed.ts"
- }
-}
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220131142425_init/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220131142425_init/migration.sql
deleted file mode 100644
index 6607a48b5..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220131142425_init/migration.sql
+++ /dev/null
@@ -1,443 +0,0 @@
--- CreateTable
-CREATE TABLE "Setting" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "fqdn" TEXT,
- "isRegistrationEnabled" BOOLEAN NOT NULL DEFAULT false,
- "proxyPassword" TEXT NOT NULL,
- "proxyUser" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL
-);
-
--- CreateTable
-CREATE TABLE "User" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "email" TEXT NOT NULL,
- "type" TEXT NOT NULL,
- "password" TEXT,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL
-);
-
--- CreateTable
-CREATE TABLE "Permission" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "userId" TEXT NOT NULL,
- "teamId" TEXT NOT NULL,
- "permission" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Permission_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
- CONSTRAINT "Permission_teamId_fkey" FOREIGN KEY ("teamId") REFERENCES "Team" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "Team" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "databaseId" TEXT,
- "serviceId" TEXT,
- FOREIGN KEY ("databaseId") REFERENCES "Database" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
- FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE SET NULL ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "TeamInvitation" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "uid" TEXT NOT NULL,
- "email" TEXT NOT NULL,
- "teamId" TEXT NOT NULL,
- "teamName" TEXT NOT NULL,
- "permission" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
-);
-
--- CreateTable
-CREATE TABLE "Application" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT NOT NULL,
- "fqdn" TEXT,
- "repository" TEXT,
- "configHash" TEXT,
- "branch" TEXT,
- "buildPack" TEXT,
- "projectId" INTEGER,
- "port" INTEGER,
- "installCommand" TEXT,
- "buildCommand" TEXT,
- "startCommand" TEXT,
- "baseDirectory" TEXT,
- "publishDirectory" TEXT,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "destinationDockerId" TEXT,
- "gitSourceId" TEXT,
- CONSTRAINT "Application_destinationDockerId_fkey" FOREIGN KEY ("destinationDockerId") REFERENCES "DestinationDocker" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
- CONSTRAINT "Application_gitSourceId_fkey" FOREIGN KEY ("gitSourceId") REFERENCES "GitSource" ("id") ON DELETE SET NULL ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "ApplicationSettings" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "applicationId" TEXT NOT NULL,
- "debug" BOOLEAN NOT NULL DEFAULT false,
- "previews" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "ApplicationSettings_applicationId_fkey" FOREIGN KEY ("applicationId") REFERENCES "Application" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "Secret" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT NOT NULL,
- "value" TEXT NOT NULL,
- "isBuildSecret" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "applicationId" TEXT NOT NULL,
- CONSTRAINT "Secret_applicationId_fkey" FOREIGN KEY ("applicationId") REFERENCES "Application" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "BuildLog" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "applicationId" TEXT,
- "buildId" TEXT NOT NULL,
- "line" TEXT NOT NULL,
- "time" INTEGER NOT NULL
-);
-
--- CreateTable
-CREATE TABLE "Build" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "type" TEXT NOT NULL,
- "applicationId" TEXT,
- "destinationDockerId" TEXT,
- "gitSourceId" TEXT,
- "githubAppId" TEXT,
- "gitlabAppId" TEXT,
- "commit" TEXT,
- "status" TEXT DEFAULT 'queued',
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL
-);
-
--- CreateTable
-CREATE TABLE "DestinationDocker" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "network" TEXT NOT NULL,
- "name" TEXT NOT NULL,
- "engine" TEXT NOT NULL,
- "remoteEngine" BOOLEAN NOT NULL DEFAULT false,
- "isCoolifyProxyUsed" BOOLEAN DEFAULT false,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL
-);
-
--- CreateTable
-CREATE TABLE "GitSource" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT NOT NULL,
- "type" TEXT,
- "apiUrl" TEXT,
- "htmlUrl" TEXT,
- "organization" TEXT,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "githubAppId" TEXT,
- "gitlabAppId" TEXT,
- CONSTRAINT "GitSource_githubAppId_fkey" FOREIGN KEY ("githubAppId") REFERENCES "GithubApp" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
- CONSTRAINT "GitSource_gitlabAppId_fkey" FOREIGN KEY ("gitlabAppId") REFERENCES "GitlabApp" ("id") ON DELETE SET NULL ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "GithubApp" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT,
- "appId" INTEGER,
- "installationId" INTEGER,
- "clientId" TEXT,
- "clientSecret" TEXT,
- "webhookSecret" TEXT,
- "privateKey" TEXT,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL
-);
-
--- CreateTable
-CREATE TABLE "GitlabApp" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "oauthId" INTEGER NOT NULL,
- "groupName" TEXT,
- "deployKeyId" INTEGER,
- "privateSshKey" TEXT,
- "publicSshKey" TEXT,
- "webhookToken" TEXT,
- "appId" TEXT,
- "appSecret" TEXT,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL
-);
-
--- CreateTable
-CREATE TABLE "Database" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT NOT NULL,
- "publicPort" INTEGER,
- "defaultDatabase" TEXT,
- "type" TEXT,
- "version" TEXT,
- "dbUser" TEXT,
- "dbUserPassword" TEXT,
- "rootUser" TEXT,
- "rootUserPassword" TEXT,
- "destinationDockerId" TEXT,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Database_destinationDockerId_fkey" FOREIGN KEY ("destinationDockerId") REFERENCES "DestinationDocker" ("id") ON DELETE SET NULL ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "DatabaseSettings" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "databaseId" TEXT NOT NULL,
- "isPublic" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "DatabaseSettings_databaseId_fkey" FOREIGN KEY ("databaseId") REFERENCES "Database" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "Service" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT NOT NULL,
- "fqdn" TEXT,
- "type" TEXT,
- "version" TEXT,
- "destinationDockerId" TEXT,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Service_destinationDockerId_fkey" FOREIGN KEY ("destinationDockerId") REFERENCES "DestinationDocker" ("id") ON DELETE SET NULL ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "PlausibleAnalytics" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "email" TEXT,
- "username" TEXT,
- "password" TEXT NOT NULL,
- "postgresqlUser" TEXT NOT NULL,
- "postgresqlPassword" TEXT NOT NULL,
- "postgresqlDatabase" TEXT NOT NULL,
- "postgresqlPublicPort" INTEGER,
- "secretKeyBase" TEXT,
- "serviceId" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "PlausibleAnalytics_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "Minio" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "rootUser" TEXT NOT NULL,
- "rootUserPassword" TEXT NOT NULL,
- "publicPort" INTEGER,
- "serviceId" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Minio_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "Vscodeserver" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "password" TEXT NOT NULL,
- "serviceId" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Vscodeserver_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "Wordpress" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "extraConfig" TEXT,
- "tablePrefix" TEXT,
- "mysqlUser" TEXT NOT NULL,
- "mysqlPassword" TEXT NOT NULL,
- "mysqlRootUser" TEXT NOT NULL,
- "mysqlRootUserPassword" TEXT NOT NULL,
- "mysqlDatabase" TEXT,
- "mysqlPublicPort" INTEGER,
- "serviceId" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Wordpress_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "_TeamToUser" (
- "A" TEXT NOT NULL,
- "B" TEXT NOT NULL,
- FOREIGN KEY ("A") REFERENCES "Team" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
- FOREIGN KEY ("B") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "_ApplicationToTeam" (
- "A" TEXT NOT NULL,
- "B" TEXT NOT NULL,
- FOREIGN KEY ("A") REFERENCES "Application" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
- FOREIGN KEY ("B") REFERENCES "Team" ("id") ON DELETE CASCADE ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "_GitSourceToTeam" (
- "A" TEXT NOT NULL,
- "B" TEXT NOT NULL,
- FOREIGN KEY ("A") REFERENCES "GitSource" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
- FOREIGN KEY ("B") REFERENCES "Team" ("id") ON DELETE CASCADE ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "_GithubAppToTeam" (
- "A" TEXT NOT NULL,
- "B" TEXT NOT NULL,
- FOREIGN KEY ("A") REFERENCES "GithubApp" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
- FOREIGN KEY ("B") REFERENCES "Team" ("id") ON DELETE CASCADE ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "_GitlabAppToTeam" (
- "A" TEXT NOT NULL,
- "B" TEXT NOT NULL,
- FOREIGN KEY ("A") REFERENCES "GitlabApp" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
- FOREIGN KEY ("B") REFERENCES "Team" ("id") ON DELETE CASCADE ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "_DestinationDockerToTeam" (
- "A" TEXT NOT NULL,
- "B" TEXT NOT NULL,
- FOREIGN KEY ("A") REFERENCES "DestinationDocker" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
- FOREIGN KEY ("B") REFERENCES "Team" ("id") ON DELETE CASCADE ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "_DatabaseToTeam" (
- "A" TEXT NOT NULL,
- "B" TEXT NOT NULL,
- FOREIGN KEY ("A") REFERENCES "Database" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
- FOREIGN KEY ("B") REFERENCES "Team" ("id") ON DELETE CASCADE ON UPDATE CASCADE
-);
-
--- CreateTable
-CREATE TABLE "_ServiceToTeam" (
- "A" TEXT NOT NULL,
- "B" TEXT NOT NULL,
- FOREIGN KEY ("A") REFERENCES "Service" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
- FOREIGN KEY ("B") REFERENCES "Team" ("id") ON DELETE CASCADE ON UPDATE CASCADE
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "Setting_fqdn_key" ON "Setting"("fqdn");
-
--- CreateIndex
-CREATE UNIQUE INDEX "User_id_key" ON "User"("id");
-
--- CreateIndex
-CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
-
--- CreateIndex
-CREATE UNIQUE INDEX "Application_fqdn_key" ON "Application"("fqdn");
-
--- CreateIndex
-CREATE UNIQUE INDEX "ApplicationSettings_applicationId_key" ON "ApplicationSettings"("applicationId");
-
--- CreateIndex
-CREATE UNIQUE INDEX "Secret_name_key" ON "Secret"("name");
-
--- CreateIndex
-CREATE UNIQUE INDEX "DestinationDocker_network_key" ON "DestinationDocker"("network");
-
--- CreateIndex
-CREATE UNIQUE INDEX "GitSource_githubAppId_key" ON "GitSource"("githubAppId");
-
--- CreateIndex
-CREATE UNIQUE INDEX "GitSource_gitlabAppId_key" ON "GitSource"("gitlabAppId");
-
--- CreateIndex
-CREATE UNIQUE INDEX "GithubApp_name_key" ON "GithubApp"("name");
-
--- CreateIndex
-CREATE UNIQUE INDEX "GitlabApp_oauthId_key" ON "GitlabApp"("oauthId");
-
--- CreateIndex
-CREATE UNIQUE INDEX "GitlabApp_groupName_key" ON "GitlabApp"("groupName");
-
--- CreateIndex
-CREATE UNIQUE INDEX "DatabaseSettings_databaseId_key" ON "DatabaseSettings"("databaseId");
-
--- CreateIndex
-CREATE UNIQUE INDEX "PlausibleAnalytics_serviceId_key" ON "PlausibleAnalytics"("serviceId");
-
--- CreateIndex
-CREATE UNIQUE INDEX "Minio_serviceId_key" ON "Minio"("serviceId");
-
--- CreateIndex
-CREATE UNIQUE INDEX "Vscodeserver_serviceId_key" ON "Vscodeserver"("serviceId");
-
--- CreateIndex
-CREATE UNIQUE INDEX "Wordpress_serviceId_key" ON "Wordpress"("serviceId");
-
--- CreateIndex
-CREATE UNIQUE INDEX "_TeamToUser_AB_unique" ON "_TeamToUser"("A", "B");
-
--- CreateIndex
-CREATE INDEX "_TeamToUser_B_index" ON "_TeamToUser"("B");
-
--- CreateIndex
-CREATE UNIQUE INDEX "_ApplicationToTeam_AB_unique" ON "_ApplicationToTeam"("A", "B");
-
--- CreateIndex
-CREATE INDEX "_ApplicationToTeam_B_index" ON "_ApplicationToTeam"("B");
-
--- CreateIndex
-CREATE UNIQUE INDEX "_GitSourceToTeam_AB_unique" ON "_GitSourceToTeam"("A", "B");
-
--- CreateIndex
-CREATE INDEX "_GitSourceToTeam_B_index" ON "_GitSourceToTeam"("B");
-
--- CreateIndex
-CREATE UNIQUE INDEX "_GithubAppToTeam_AB_unique" ON "_GithubAppToTeam"("A", "B");
-
--- CreateIndex
-CREATE INDEX "_GithubAppToTeam_B_index" ON "_GithubAppToTeam"("B");
-
--- CreateIndex
-CREATE UNIQUE INDEX "_GitlabAppToTeam_AB_unique" ON "_GitlabAppToTeam"("A", "B");
-
--- CreateIndex
-CREATE INDEX "_GitlabAppToTeam_B_index" ON "_GitlabAppToTeam"("B");
-
--- CreateIndex
-CREATE UNIQUE INDEX "_DestinationDockerToTeam_AB_unique" ON "_DestinationDockerToTeam"("A", "B");
-
--- CreateIndex
-CREATE INDEX "_DestinationDockerToTeam_B_index" ON "_DestinationDockerToTeam"("B");
-
--- CreateIndex
-CREATE UNIQUE INDEX "_DatabaseToTeam_AB_unique" ON "_DatabaseToTeam"("A", "B");
-
--- CreateIndex
-CREATE INDEX "_DatabaseToTeam_B_index" ON "_DatabaseToTeam"("B");
-
--- CreateIndex
-CREATE UNIQUE INDEX "_ServiceToTeam_AB_unique" ON "_ServiceToTeam"("A", "B");
-
--- CreateIndex
-CREATE INDEX "_ServiceToTeam_B_index" ON "_ServiceToTeam"("B");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220210104005_redis_aol/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220210104005_redis_aol/migration.sql
deleted file mode 100644
index 8a7e41098..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220210104005_redis_aol/migration.sql
+++ /dev/null
@@ -1,28 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Team" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "databaseId" TEXT,
- "serviceId" TEXT
-);
-INSERT INTO "new_Team" ("createdAt", "databaseId", "id", "name", "serviceId", "updatedAt") SELECT "createdAt", "databaseId", "id", "name", "serviceId", "updatedAt" FROM "Team";
-DROP TABLE "Team";
-ALTER TABLE "new_Team" RENAME TO "Team";
-CREATE TABLE "new_DatabaseSettings" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "databaseId" TEXT NOT NULL,
- "isPublic" BOOLEAN NOT NULL DEFAULT false,
- "appendOnly" BOOLEAN NOT NULL DEFAULT true,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "DatabaseSettings_databaseId_fkey" FOREIGN KEY ("databaseId") REFERENCES "Database" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-INSERT INTO "new_DatabaseSettings" ("createdAt", "databaseId", "id", "isPublic", "updatedAt") SELECT "createdAt", "databaseId", "id", "isPublic", "updatedAt" FROM "DatabaseSettings";
-DROP TABLE "DatabaseSettings";
-ALTER TABLE "new_DatabaseSettings" RENAME TO "DatabaseSettings";
-CREATE UNIQUE INDEX "DatabaseSettings_databaseId_key" ON "DatabaseSettings"("databaseId");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220212142309_unique_secret_by_application/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220212142309_unique_secret_by_application/migration.sql
deleted file mode 100644
index da4aa8e7c..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220212142309_unique_secret_by_application/migration.sql
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- Warnings:
-
- - A unique constraint covering the columns `[name,applicationId]` on the table `Secret` will be added. If there are existing duplicate values, this will fail.
-
-*/
--- DropIndex
-DROP INDEX "Secret_name_key";
-
--- CreateIndex
-CREATE UNIQUE INDEX "Secret_name_applicationId_key" ON "Secret"("name", "applicationId");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220217211304_dualcerts/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220217211304_dualcerts/migration.sql
deleted file mode 100644
index a6ea0a57d..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220217211304_dualcerts/migration.sql
+++ /dev/null
@@ -1,47 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Setting" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "fqdn" TEXT,
- "isRegistrationEnabled" BOOLEAN NOT NULL DEFAULT false,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "proxyPassword" TEXT NOT NULL,
- "proxyUser" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL
-);
-INSERT INTO "new_Setting" ("createdAt", "fqdn", "id", "isRegistrationEnabled", "proxyPassword", "proxyUser", "updatedAt") SELECT "createdAt", "fqdn", "id", "isRegistrationEnabled", "proxyPassword", "proxyUser", "updatedAt" FROM "Setting";
-DROP TABLE "Setting";
-ALTER TABLE "new_Setting" RENAME TO "Setting";
-CREATE UNIQUE INDEX "Setting_fqdn_key" ON "Setting"("fqdn");
-CREATE TABLE "new_ApplicationSettings" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "applicationId" TEXT NOT NULL,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "debug" BOOLEAN NOT NULL DEFAULT false,
- "previews" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "ApplicationSettings_applicationId_fkey" FOREIGN KEY ("applicationId") REFERENCES "Application" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-INSERT INTO "new_ApplicationSettings" ("applicationId", "createdAt", "debug", "id", "previews", "updatedAt") SELECT "applicationId", "createdAt", "debug", "id", "previews", "updatedAt" FROM "ApplicationSettings";
-DROP TABLE "ApplicationSettings";
-ALTER TABLE "new_ApplicationSettings" RENAME TO "ApplicationSettings";
-CREATE UNIQUE INDEX "ApplicationSettings_applicationId_key" ON "ApplicationSettings"("applicationId");
-CREATE TABLE "new_Service" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT NOT NULL,
- "fqdn" TEXT,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "type" TEXT,
- "version" TEXT,
- "destinationDockerId" TEXT,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Service_destinationDockerId_fkey" FOREIGN KEY ("destinationDockerId") REFERENCES "DestinationDocker" ("id") ON DELETE SET NULL ON UPDATE CASCADE
-);
-INSERT INTO "new_Service" ("createdAt", "destinationDockerId", "fqdn", "id", "name", "type", "updatedAt", "version") SELECT "createdAt", "destinationDockerId", "fqdn", "id", "name", "type", "updatedAt", "version" FROM "Service";
-DROP TABLE "Service";
-ALTER TABLE "new_Service" RENAME TO "Service";
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220219231255_prmr_secrets/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220219231255_prmr_secrets/migration.sql
deleted file mode 100644
index 728fcae36..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220219231255_prmr_secrets/migration.sql
+++ /dev/null
@@ -1,19 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Secret" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT NOT NULL,
- "value" TEXT NOT NULL,
- "isPRMRSecret" BOOLEAN NOT NULL DEFAULT false,
- "isBuildSecret" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "applicationId" TEXT NOT NULL,
- CONSTRAINT "Secret_applicationId_fkey" FOREIGN KEY ("applicationId") REFERENCES "Application" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-INSERT INTO "new_Secret" ("applicationId", "createdAt", "id", "isBuildSecret", "name", "updatedAt", "value") SELECT "applicationId", "createdAt", "id", "isBuildSecret", "name", "updatedAt", "value" FROM "Secret";
-DROP TABLE "Secret";
-ALTER TABLE "new_Secret" RENAME TO "Secret";
-CREATE UNIQUE INDEX "Secret_name_applicationId_isPRMRSecret_key" ON "Secret"("name", "applicationId", "isPRMRSecret");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220220141136_public_portrange/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220220141136_public_portrange/migration.sql
deleted file mode 100644
index 6423e9761..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220220141136_public_portrange/migration.sql
+++ /dev/null
@@ -1,20 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Setting" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "fqdn" TEXT,
- "isRegistrationEnabled" BOOLEAN NOT NULL DEFAULT false,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "minPort" INTEGER NOT NULL DEFAULT 9000,
- "maxPort" INTEGER NOT NULL DEFAULT 9100,
- "proxyPassword" TEXT NOT NULL,
- "proxyUser" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL
-);
-INSERT INTO "new_Setting" ("createdAt", "dualCerts", "fqdn", "id", "isRegistrationEnabled", "proxyPassword", "proxyUser", "updatedAt") SELECT "createdAt", "dualCerts", "fqdn", "id", "isRegistrationEnabled", "proxyPassword", "proxyUser", "updatedAt" FROM "Setting";
-DROP TABLE "Setting";
-ALTER TABLE "new_Setting" RENAME TO "Setting";
-CREATE UNIQUE INDEX "Setting_fqdn_key" ON "Setting"("fqdn");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220301101928_proxyhash/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220301101928_proxyhash/migration.sql
deleted file mode 100644
index 87845b38b..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220301101928_proxyhash/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Setting" ADD COLUMN "proxyHash" TEXT;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220304141408_service_secrets/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220304141408_service_secrets/migration.sql
deleted file mode 100644
index baa0c3f54..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220304141408_service_secrets/migration.sql
+++ /dev/null
@@ -1,13 +0,0 @@
--- CreateTable
-CREATE TABLE "ServiceSecret" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT NOT NULL,
- "value" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "serviceId" TEXT NOT NULL,
- CONSTRAINT "ServiceSecret_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "ServiceSecret_name_serviceId_key" ON "ServiceSecret"("name", "serviceId");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220311213422_autodeploy/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220311213422_autodeploy/migration.sql
deleted file mode 100644
index d534d9372..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220311213422_autodeploy/migration.sql
+++ /dev/null
@@ -1,19 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_ApplicationSettings" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "applicationId" TEXT NOT NULL,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "debug" BOOLEAN NOT NULL DEFAULT false,
- "previews" BOOLEAN NOT NULL DEFAULT false,
- "autodeploy" BOOLEAN NOT NULL DEFAULT true,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "ApplicationSettings_applicationId_fkey" FOREIGN KEY ("applicationId") REFERENCES "Application" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-INSERT INTO "new_ApplicationSettings" ("applicationId", "createdAt", "debug", "dualCerts", "id", "previews", "updatedAt") SELECT "applicationId", "createdAt", "debug", "dualCerts", "id", "previews", "updatedAt" FROM "ApplicationSettings";
-DROP TABLE "ApplicationSettings";
-ALTER TABLE "new_ApplicationSettings" RENAME TO "ApplicationSettings";
-CREATE UNIQUE INDEX "ApplicationSettings_applicationId_key" ON "ApplicationSettings"("applicationId");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220320141424_phpmodules/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220320141424_phpmodules/migration.sql
deleted file mode 100644
index 6a17ff8a3..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220320141424_phpmodules/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Application" ADD COLUMN "phpModules" TEXT;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220322135800_persistent_storage/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220322135800_persistent_storage/migration.sql
deleted file mode 100644
index d26ae3f8b..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220322135800_persistent_storage/migration.sql
+++ /dev/null
@@ -1,18 +0,0 @@
--- CreateTable
-CREATE TABLE "ApplicationPersistentStorage" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "applicationId" TEXT NOT NULL,
- "path" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "ApplicationPersistentStorage_applicationId_fkey" FOREIGN KEY ("applicationId") REFERENCES "Application" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "ApplicationPersistentStorage_applicationId_key" ON "ApplicationPersistentStorage"("applicationId");
-
--- CreateIndex
-CREATE UNIQUE INDEX "ApplicationPersistentStorage_path_key" ON "ApplicationPersistentStorage"("path");
-
--- CreateIndex
-CREATE UNIQUE INDEX "ApplicationPersistentStorage_applicationId_path_key" ON "ApplicationPersistentStorage"("applicationId", "path");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220327180323_ghost/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220327180323_ghost/migration.sql
deleted file mode 100644
index 3c1cec36f..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220327180323_ghost/migration.sql
+++ /dev/null
@@ -1,19 +0,0 @@
--- CreateTable
-CREATE TABLE "Ghost" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "defaultEmail" TEXT NOT NULL,
- "defaultPassword" TEXT NOT NULL,
- "mariadbUser" TEXT NOT NULL,
- "mariadbPassword" TEXT NOT NULL,
- "mariadbRootUser" TEXT NOT NULL,
- "mariadbRootUserPassword" TEXT NOT NULL,
- "mariadbDatabase" TEXT,
- "mariadbPublicPort" INTEGER,
- "serviceId" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Ghost_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "Ghost_serviceId_key" ON "Ghost"("serviceId");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220402135305_python/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220402135305_python/migration.sql
deleted file mode 100644
index 0c253d539..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220402135305_python/migration.sql
+++ /dev/null
@@ -1,4 +0,0 @@
--- AlterTable
-ALTER TABLE "Application" ADD COLUMN "pythonModule" TEXT;
-ALTER TABLE "Application" ADD COLUMN "pythonVariable" TEXT;
-ALTER TABLE "Application" ADD COLUMN "pythonWSGI" TEXT;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220402210645_meilisearch/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220402210645_meilisearch/migration.sql
deleted file mode 100644
index 9e832b107..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220402210645_meilisearch/migration.sql
+++ /dev/null
@@ -1,12 +0,0 @@
--- CreateTable
-CREATE TABLE "MeiliSearch" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "masterKey" TEXT NOT NULL,
- "serviceId" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "MeiliSearch_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "MeiliSearch_serviceId_key" ON "MeiliSearch"("serviceId");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220405151428_wordpress_sftp/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220405151428_wordpress_sftp/migration.sql
deleted file mode 100644
index 6c3c4b907..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220405151428_wordpress_sftp/migration.sql
+++ /dev/null
@@ -1,29 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Wordpress" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "extraConfig" TEXT,
- "tablePrefix" TEXT,
- "mysqlUser" TEXT NOT NULL,
- "mysqlPassword" TEXT NOT NULL,
- "mysqlRootUser" TEXT NOT NULL,
- "mysqlRootUserPassword" TEXT NOT NULL,
- "mysqlDatabase" TEXT,
- "mysqlPublicPort" INTEGER,
- "ftpEnabled" BOOLEAN NOT NULL DEFAULT false,
- "ftpUser" TEXT,
- "ftpPassword" TEXT,
- "ftpPublicPort" INTEGER,
- "ftpHostKey" TEXT,
- "ftpHostKeyPrivate" TEXT,
- "serviceId" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Wordpress_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-INSERT INTO "new_Wordpress" ("createdAt", "extraConfig", "id", "mysqlDatabase", "mysqlPassword", "mysqlPublicPort", "mysqlRootUser", "mysqlRootUserPassword", "mysqlUser", "serviceId", "tablePrefix", "updatedAt") SELECT "createdAt", "extraConfig", "id", "mysqlDatabase", "mysqlPassword", "mysqlPublicPort", "mysqlRootUser", "mysqlRootUserPassword", "mysqlUser", "serviceId", "tablePrefix", "updatedAt" FROM "Wordpress";
-DROP TABLE "Wordpress";
-ALTER TABLE "new_Wordpress" RENAME TO "Wordpress";
-CREATE UNIQUE INDEX "Wordpress_serviceId_key" ON "Wordpress"("serviceId");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220407220809_unique_storage_fix/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220407220809_unique_storage_fix/migration.sql
deleted file mode 100644
index 9b645cc3b..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220407220809_unique_storage_fix/migration.sql
+++ /dev/null
@@ -1,5 +0,0 @@
--- DropIndex
-DROP INDEX "ApplicationPersistentStorage_path_key";
-
--- DropIndex
-DROP INDEX "ApplicationPersistentStorage_applicationId_key";
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220408070805_added_expose_port/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220408070805_added_expose_port/migration.sql
deleted file mode 100644
index a23afd64a..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220408070805_added_expose_port/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Application" ADD COLUMN "exposePort" INTEGER;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220418214843_persistent_storage_services/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220418214843_persistent_storage_services/migration.sql
deleted file mode 100644
index f85fd31df..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220418214843_persistent_storage_services/migration.sql
+++ /dev/null
@@ -1,12 +0,0 @@
--- CreateTable
-CREATE TABLE "ServicePersistentStorage" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "serviceId" TEXT NOT NULL,
- "path" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "ServicePersistentStorage_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "ServicePersistentStorage_serviceId_path_key" ON "ServicePersistentStorage"("serviceId", "path");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220419203408_multiply_dockerfile_locations/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220419203408_multiply_dockerfile_locations/migration.sql
deleted file mode 100644
index ce32f0844..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220419203408_multiply_dockerfile_locations/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Application" ADD COLUMN "dockerFileLocation" TEXT;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220420202031_deno_configurations/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220420202031_deno_configurations/migration.sql
deleted file mode 100644
index 9d0e832dc..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220420202031_deno_configurations/migration.sql
+++ /dev/null
@@ -1,3 +0,0 @@
--- AlterTable
-ALTER TABLE "Application" ADD COLUMN "denoMainFile" TEXT;
-ALTER TABLE "Application" ADD COLUMN "denoOptions" TEXT;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220420210057_branch_for_builds/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220420210057_branch_for_builds/migration.sql
deleted file mode 100644
index 8cd8e653d..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220420210057_branch_for_builds/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Build" ADD COLUMN "branch" TEXT;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220425071132_umami/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220425071132_umami/migration.sql
deleted file mode 100644
index 259fb76cd..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220425071132_umami/migration.sql
+++ /dev/null
@@ -1,17 +0,0 @@
--- CreateTable
-CREATE TABLE "Umami" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "serviceId" TEXT NOT NULL,
- "postgresqlUser" TEXT NOT NULL,
- "postgresqlPassword" TEXT NOT NULL,
- "postgresqlDatabase" TEXT NOT NULL,
- "postgresqlPublicPort" INTEGER,
- "umamiAdminPassword" TEXT NOT NULL,
- "hashSalt" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Umami_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "Umami_serviceId_key" ON "Umami"("serviceId");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220425075326_auto_update_coolify/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220425075326_auto_update_coolify/migration.sql
deleted file mode 100644
index a102973ee..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220425075326_auto_update_coolify/migration.sql
+++ /dev/null
@@ -1,22 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Setting" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "fqdn" TEXT,
- "isRegistrationEnabled" BOOLEAN NOT NULL DEFAULT false,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "minPort" INTEGER NOT NULL DEFAULT 9000,
- "maxPort" INTEGER NOT NULL DEFAULT 9100,
- "proxyPassword" TEXT NOT NULL,
- "proxyUser" TEXT NOT NULL,
- "proxyHash" TEXT,
- "isAutoUpdateEnabled" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL
-);
-INSERT INTO "new_Setting" ("createdAt", "dualCerts", "fqdn", "id", "isRegistrationEnabled", "maxPort", "minPort", "proxyHash", "proxyPassword", "proxyUser", "updatedAt") SELECT "createdAt", "dualCerts", "fqdn", "id", "isRegistrationEnabled", "maxPort", "minPort", "proxyHash", "proxyPassword", "proxyUser", "updatedAt" FROM "Setting";
-DROP TABLE "Setting";
-ALTER TABLE "new_Setting" RENAME TO "Setting";
-CREATE UNIQUE INDEX "Setting_fqdn_key" ON "Setting"("fqdn");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220426125053_select_base_image/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220426125053_select_base_image/migration.sql
deleted file mode 100644
index 37209d82f..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220426125053_select_base_image/migration.sql
+++ /dev/null
@@ -1,3 +0,0 @@
--- AlterTable
-ALTER TABLE "Application" ADD COLUMN "baseBuildImage" TEXT;
-ALTER TABLE "Application" ADD COLUMN "baseImage" TEXT;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220427133656_hasura/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220427133656_hasura/migration.sql
deleted file mode 100644
index c679ad0fb..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220427133656_hasura/migration.sql
+++ /dev/null
@@ -1,16 +0,0 @@
--- CreateTable
-CREATE TABLE "Hasura" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "serviceId" TEXT NOT NULL,
- "postgresqlUser" TEXT NOT NULL,
- "postgresqlPassword" TEXT NOT NULL,
- "postgresqlDatabase" TEXT NOT NULL,
- "postgresqlPublicPort" INTEGER,
- "graphQLAdminPassword" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Hasura_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "Hasura_serviceId_key" ON "Hasura"("serviceId");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220429202516_fider/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220429202516_fider/migration.sql
deleted file mode 100644
index a6d31a24d..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220429202516_fider/migration.sql
+++ /dev/null
@@ -1,25 +0,0 @@
--- CreateTable
-CREATE TABLE "Fider" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "serviceId" TEXT NOT NULL,
- "postgresqlUser" TEXT NOT NULL,
- "postgresqlPassword" TEXT NOT NULL,
- "postgresqlDatabase" TEXT NOT NULL,
- "postgresqlPublicPort" INTEGER,
- "jwtSecret" TEXT NOT NULL,
- "emailNoreply" TEXT,
- "emailMailgunApiKey" TEXT,
- "emailMailgunDomain" TEXT,
- "emailMailgunRegion" TEXT,
- "emailSmtpHost" TEXT,
- "emailSmtpPort" INTEGER,
- "emailSmtpUser" TEXT,
- "emailSmtpPassword" TEXT,
- "emailSmtpEnableStartTls" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Fider_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "Fider_serviceId_key" ON "Fider"("serviceId");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220429214112_fider_correction/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220429214112_fider_correction/migration.sql
deleted file mode 100644
index 429524f72..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220429214112_fider_correction/migration.sql
+++ /dev/null
@@ -1,29 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Fider" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "serviceId" TEXT NOT NULL,
- "postgresqlUser" TEXT NOT NULL,
- "postgresqlPassword" TEXT NOT NULL,
- "postgresqlDatabase" TEXT NOT NULL,
- "postgresqlPublicPort" INTEGER,
- "jwtSecret" TEXT NOT NULL,
- "emailNoreply" TEXT,
- "emailMailgunApiKey" TEXT,
- "emailMailgunDomain" TEXT,
- "emailMailgunRegion" TEXT NOT NULL DEFAULT 'EU',
- "emailSmtpHost" TEXT,
- "emailSmtpPort" INTEGER,
- "emailSmtpUser" TEXT,
- "emailSmtpPassword" TEXT,
- "emailSmtpEnableStartTls" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Fider_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-INSERT INTO "new_Fider" ("createdAt", "emailMailgunApiKey", "emailMailgunDomain", "emailMailgunRegion", "emailNoreply", "emailSmtpEnableStartTls", "emailSmtpHost", "emailSmtpPassword", "emailSmtpPort", "emailSmtpUser", "id", "jwtSecret", "postgresqlDatabase", "postgresqlPassword", "postgresqlPublicPort", "postgresqlUser", "serviceId", "updatedAt") SELECT "createdAt", "emailMailgunApiKey", "emailMailgunDomain", coalesce("emailMailgunRegion", 'EU') AS "emailMailgunRegion", "emailNoreply", "emailSmtpEnableStartTls", "emailSmtpHost", "emailSmtpPassword", "emailSmtpPort", "emailSmtpUser", "id", "jwtSecret", "postgresqlDatabase", "postgresqlPassword", "postgresqlPublicPort", "postgresqlUser", "serviceId", "updatedAt" FROM "Fider";
-DROP TABLE "Fider";
-ALTER TABLE "new_Fider" RENAME TO "Fider";
-CREATE UNIQUE INDEX "Fider_serviceId_key" ON "Fider"("serviceId");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220430111953_ssl_dns_check_settings/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220430111953_ssl_dns_check_settings/migration.sql
deleted file mode 100644
index cf57379ca..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220430111953_ssl_dns_check_settings/migration.sql
+++ /dev/null
@@ -1,23 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Setting" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "fqdn" TEXT,
- "isRegistrationEnabled" BOOLEAN NOT NULL DEFAULT false,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "minPort" INTEGER NOT NULL DEFAULT 9000,
- "maxPort" INTEGER NOT NULL DEFAULT 9100,
- "proxyPassword" TEXT NOT NULL,
- "proxyUser" TEXT NOT NULL,
- "proxyHash" TEXT,
- "isAutoUpdateEnabled" BOOLEAN NOT NULL DEFAULT false,
- "isDNSCheckEnabled" BOOLEAN NOT NULL DEFAULT true,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL
-);
-INSERT INTO "new_Setting" ("createdAt", "dualCerts", "fqdn", "id", "isAutoUpdateEnabled", "isRegistrationEnabled", "maxPort", "minPort", "proxyHash", "proxyPassword", "proxyUser", "updatedAt") SELECT "createdAt", "dualCerts", "fqdn", "id", "isAutoUpdateEnabled", "isRegistrationEnabled", "maxPort", "minPort", "proxyHash", "proxyPassword", "proxyUser", "updatedAt" FROM "Setting";
-DROP TABLE "Setting";
-ALTER TABLE "new_Setting" RENAME TO "Setting";
-CREATE UNIQUE INDEX "Setting_fqdn_key" ON "Setting"("fqdn");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220430124553_expose_port_for_services/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220430124553_expose_port_for_services/migration.sql
deleted file mode 100644
index fdbab5713..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220430124553_expose_port_for_services/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Service" ADD COLUMN "exposePort" INTEGER;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220509130501_custom_plausible_script/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220509130501_custom_plausible_script/migration.sql
deleted file mode 100644
index 6c8c28ff4..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220509130501_custom_plausible_script/migration.sql
+++ /dev/null
@@ -1,24 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_PlausibleAnalytics" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "email" TEXT,
- "username" TEXT,
- "password" TEXT NOT NULL,
- "postgresqlUser" TEXT NOT NULL,
- "postgresqlPassword" TEXT NOT NULL,
- "postgresqlDatabase" TEXT NOT NULL,
- "postgresqlPublicPort" INTEGER,
- "secretKeyBase" TEXT,
- "scriptName" TEXT NOT NULL DEFAULT 'plausible.js',
- "serviceId" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "PlausibleAnalytics_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-INSERT INTO "new_PlausibleAnalytics" ("createdAt", "email", "id", "password", "postgresqlDatabase", "postgresqlPassword", "postgresqlPublicPort", "postgresqlUser", "secretKeyBase", "serviceId", "updatedAt", "username") SELECT "createdAt", "email", "id", "password", "postgresqlDatabase", "postgresqlPassword", "postgresqlPublicPort", "postgresqlUser", "secretKeyBase", "serviceId", "updatedAt", "username" FROM "PlausibleAnalytics";
-DROP TABLE "PlausibleAnalytics";
-ALTER TABLE "new_PlausibleAnalytics" RENAME TO "PlausibleAnalytics";
-CREATE UNIQUE INDEX "PlausibleAnalytics_serviceId_key" ON "PlausibleAnalytics"("serviceId");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220510081125_custom_wordpress_db/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220510081125_custom_wordpress_db/migration.sql
deleted file mode 100644
index 5a1cd301c..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220510081125_custom_wordpress_db/migration.sql
+++ /dev/null
@@ -1,32 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Wordpress" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "extraConfig" TEXT,
- "tablePrefix" TEXT,
- "ownMysql" BOOLEAN NOT NULL DEFAULT false,
- "mysqlHost" TEXT,
- "mysqlPort" INTEGER,
- "mysqlUser" TEXT NOT NULL,
- "mysqlPassword" TEXT NOT NULL,
- "mysqlRootUser" TEXT NOT NULL,
- "mysqlRootUserPassword" TEXT NOT NULL,
- "mysqlDatabase" TEXT,
- "mysqlPublicPort" INTEGER,
- "ftpEnabled" BOOLEAN NOT NULL DEFAULT false,
- "ftpUser" TEXT,
- "ftpPassword" TEXT,
- "ftpPublicPort" INTEGER,
- "ftpHostKey" TEXT,
- "ftpHostKeyPrivate" TEXT,
- "serviceId" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Wordpress_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-INSERT INTO "new_Wordpress" ("createdAt", "extraConfig", "ftpEnabled", "ftpHostKey", "ftpHostKeyPrivate", "ftpPassword", "ftpPublicPort", "ftpUser", "id", "mysqlDatabase", "mysqlPassword", "mysqlPublicPort", "mysqlRootUser", "mysqlRootUserPassword", "mysqlUser", "serviceId", "tablePrefix", "updatedAt") SELECT "createdAt", "extraConfig", "ftpEnabled", "ftpHostKey", "ftpHostKeyPrivate", "ftpPassword", "ftpPublicPort", "ftpUser", "id", "mysqlDatabase", "mysqlPassword", "mysqlPublicPort", "mysqlRootUser", "mysqlRootUserPassword", "mysqlUser", "serviceId", "tablePrefix", "updatedAt" FROM "Wordpress";
-DROP TABLE "Wordpress";
-ALTER TABLE "new_Wordpress" RENAME TO "Wordpress";
-CREATE UNIQUE INDEX "Wordpress_serviceId_key" ON "Wordpress"("serviceId");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220517081328_traefik/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220517081328_traefik/migration.sql
deleted file mode 100644
index a83281fa4..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220517081328_traefik/migration.sql
+++ /dev/null
@@ -1,24 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Setting" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "fqdn" TEXT,
- "isRegistrationEnabled" BOOLEAN NOT NULL DEFAULT false,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "minPort" INTEGER NOT NULL DEFAULT 9000,
- "maxPort" INTEGER NOT NULL DEFAULT 9100,
- "proxyPassword" TEXT NOT NULL,
- "proxyUser" TEXT NOT NULL,
- "proxyHash" TEXT,
- "isAutoUpdateEnabled" BOOLEAN NOT NULL DEFAULT false,
- "isDNSCheckEnabled" BOOLEAN NOT NULL DEFAULT true,
- "isTraefikUsed" BOOLEAN NOT NULL DEFAULT true,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL
-);
-INSERT INTO "new_Setting" ("createdAt", "dualCerts", "fqdn", "id", "isAutoUpdateEnabled", "isDNSCheckEnabled", "isRegistrationEnabled", "maxPort", "minPort", "proxyHash", "proxyPassword", "proxyUser", "updatedAt") SELECT "createdAt", "dualCerts", "fqdn", "id", "isAutoUpdateEnabled", "isDNSCheckEnabled", "isRegistrationEnabled", "maxPort", "minPort", "proxyHash", "proxyPassword", "proxyUser", "updatedAt" FROM "Setting";
-DROP TABLE "Setting";
-ALTER TABLE "new_Setting" RENAME TO "Setting";
-CREATE UNIQUE INDEX "Setting_fqdn_key" ON "Setting"("fqdn");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220519095648_minio_apifqdn/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220519095648_minio_apifqdn/migration.sql
deleted file mode 100644
index a44712864..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220519095648_minio_apifqdn/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Minio" ADD COLUMN "apiFqdn" TEXT;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220708132655_deployment_type_for_applications/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220708132655_deployment_type_for_applications/migration.sql
deleted file mode 100644
index 2776d1b88..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220708132655_deployment_type_for_applications/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Application" ADD COLUMN "deploymentType" TEXT;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220712083523_custom_port_git_sources/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220712083523_custom_port_git_sources/migration.sql
deleted file mode 100644
index f702291b2..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220712083523_custom_port_git_sources/migration.sql
+++ /dev/null
@@ -1,24 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_GitSource" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT NOT NULL,
- "type" TEXT,
- "apiUrl" TEXT,
- "htmlUrl" TEXT,
- "customPort" INTEGER NOT NULL DEFAULT 22,
- "organization" TEXT,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "githubAppId" TEXT,
- "gitlabAppId" TEXT,
- CONSTRAINT "GitSource_githubAppId_fkey" FOREIGN KEY ("githubAppId") REFERENCES "GithubApp" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
- CONSTRAINT "GitSource_gitlabAppId_fkey" FOREIGN KEY ("gitlabAppId") REFERENCES "GitlabApp" ("id") ON DELETE SET NULL ON UPDATE CASCADE
-);
-INSERT INTO "new_GitSource" ("apiUrl", "createdAt", "githubAppId", "gitlabAppId", "htmlUrl", "id", "name", "organization", "type", "updatedAt") SELECT "apiUrl", "createdAt", "githubAppId", "gitlabAppId", "htmlUrl", "id", "name", "organization", "type", "updatedAt" FROM "GitSource";
-DROP TABLE "GitSource";
-ALTER TABLE "new_GitSource" RENAME TO "GitSource";
-CREATE UNIQUE INDEX "GitSource_githubAppId_key" ON "GitSource"("githubAppId");
-CREATE UNIQUE INDEX "GitSource_gitlabAppId_key" ON "GitSource"("gitlabAppId");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220718083646_moodle/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220718083646_moodle/migration.sql
deleted file mode 100644
index eaed14a4a..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220718083646_moodle/migration.sql
+++ /dev/null
@@ -1,20 +0,0 @@
--- CreateTable
-CREATE TABLE "Moodle" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "serviceId" TEXT NOT NULL,
- "defaultUsername" TEXT NOT NULL,
- "defaultPassword" TEXT NOT NULL,
- "defaultEmail" TEXT NOT NULL,
- "mariadbUser" TEXT NOT NULL,
- "mariadbPassword" TEXT NOT NULL,
- "mariadbRootUser" TEXT NOT NULL,
- "mariadbRootUserPassword" TEXT NOT NULL,
- "mariadbDatabase" TEXT NOT NULL,
- "mariadbPublicPort" INTEGER,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Moodle_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "Moodle_serviceId_key" ON "Moodle"("serviceId");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220718114551_remote_docker_engine/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220718114551_remote_docker_engine/migration.sql
deleted file mode 100644
index e80df22f2..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220718114551_remote_docker_engine/migration.sql
+++ /dev/null
@@ -1,21 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_DestinationDocker" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "network" TEXT NOT NULL,
- "name" TEXT NOT NULL,
- "engine" TEXT,
- "remoteEngine" BOOLEAN NOT NULL DEFAULT false,
- "remoteIpAddress" TEXT,
- "remoteUser" TEXT,
- "remotePort" INTEGER,
- "isCoolifyProxyUsed" BOOLEAN DEFAULT false,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL
-);
-INSERT INTO "new_DestinationDocker" ("createdAt", "engine", "id", "isCoolifyProxyUsed", "name", "network", "remoteEngine", "updatedAt") SELECT "createdAt", "engine", "id", "isCoolifyProxyUsed", "name", "network", "remoteEngine", "updatedAt" FROM "DestinationDocker";
-DROP TABLE "DestinationDocker";
-ALTER TABLE "new_DestinationDocker" RENAME TO "DestinationDocker";
-CREATE UNIQUE INDEX "DestinationDocker_network_key" ON "DestinationDocker"("network");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220721084020_ssh_key/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220721084020_ssh_key/migration.sql
deleted file mode 100644
index 8323af409..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220721084020_ssh_key/migration.sql
+++ /dev/null
@@ -1,33 +0,0 @@
--- CreateTable
-CREATE TABLE "SshKey" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT NOT NULL,
- "privateKey" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL
-);
-
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_DestinationDocker" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "network" TEXT NOT NULL,
- "name" TEXT NOT NULL,
- "engine" TEXT,
- "remoteEngine" BOOLEAN NOT NULL DEFAULT false,
- "remoteIpAddress" TEXT,
- "remoteUser" TEXT,
- "remotePort" INTEGER,
- "remoteVerified" BOOLEAN NOT NULL DEFAULT false,
- "isCoolifyProxyUsed" BOOLEAN DEFAULT false,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "sshKeyId" TEXT,
- CONSTRAINT "DestinationDocker_sshKeyId_fkey" FOREIGN KEY ("sshKeyId") REFERENCES "SshKey" ("id") ON DELETE SET NULL ON UPDATE CASCADE
-);
-INSERT INTO "new_DestinationDocker" ("createdAt", "engine", "id", "isCoolifyProxyUsed", "name", "network", "remoteEngine", "remoteIpAddress", "remotePort", "remoteUser", "updatedAt") SELECT "createdAt", "engine", "id", "isCoolifyProxyUsed", "name", "network", "remoteEngine", "remoteIpAddress", "remotePort", "remoteUser", "updatedAt" FROM "DestinationDocker";
-DROP TABLE "DestinationDocker";
-ALTER TABLE "new_DestinationDocker" RENAME TO "DestinationDocker";
-CREATE UNIQUE INDEX "DestinationDocker_network_key" ON "DestinationDocker"("network");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220722203927_ipaddress/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220722203927_ipaddress/migration.sql
deleted file mode 100644
index 21d45ada3..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220722203927_ipaddress/migration.sql
+++ /dev/null
@@ -1,3 +0,0 @@
--- AlterTable
-ALTER TABLE "Setting" ADD COLUMN "ipv4" TEXT;
-ALTER TABLE "Setting" ADD COLUMN "ipv6" TEXT;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220725191205_architecture/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220725191205_architecture/migration.sql
deleted file mode 100644
index 2e0ff3e01..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220725191205_architecture/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Setting" ADD COLUMN "arch" TEXT;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220726121333_fix_ssh_key/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220726121333_fix_ssh_key/migration.sql
deleted file mode 100644
index e6e47b197..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220726121333_fix_ssh_key/migration.sql
+++ /dev/null
@@ -1,16 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_SshKey" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT NOT NULL,
- "privateKey" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "teamId" TEXT,
- CONSTRAINT "SshKey_teamId_fkey" FOREIGN KEY ("teamId") REFERENCES "Team" ("id") ON DELETE SET NULL ON UPDATE CASCADE
-);
-INSERT INTO "new_SshKey" ("createdAt", "id", "name", "privateKey", "updatedAt") SELECT "createdAt", "id", "name", "privateKey", "updatedAt" FROM "SshKey";
-DROP TABLE "SshKey";
-ALTER TABLE "new_SshKey" RENAME TO "SshKey";
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220806090621_fqdn_not_unique_anymore/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220806090621_fqdn_not_unique_anymore/migration.sql
deleted file mode 100644
index f1eab666b..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220806090621_fqdn_not_unique_anymore/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- DropIndex
-DROP INDEX "Application_fqdn_key";
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220806102340_rde_ssh_local_port/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220806102340_rde_ssh_local_port/migration.sql
deleted file mode 100644
index ae4c39846..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220806102340_rde_ssh_local_port/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "DestinationDocker" ADD COLUMN "sshLocalPort" INTEGER;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220815092230_glitchtip/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220815092230_glitchtip/migration.sql
deleted file mode 100644
index dba98ab82..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220815092230_glitchtip/migration.sql
+++ /dev/null
@@ -1,30 +0,0 @@
--- CreateTable
-CREATE TABLE "GlitchTip" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "postgresqlUser" TEXT NOT NULL,
- "postgresqlPassword" TEXT NOT NULL,
- "postgresqlDatabase" TEXT NOT NULL,
- "postgresqlPublicPort" INTEGER,
- "secretKeyBase" TEXT,
- "defaultEmail" TEXT NOT NULL,
- "defaultUsername" TEXT NOT NULL,
- "defaultPassword" TEXT NOT NULL,
- "defaultEmailFrom" TEXT NOT NULL DEFAULT 'glitchtip@domain.tdl',
- "emailSmtpHost" TEXT DEFAULT 'domain.tdl',
- "emailSmtpPort" INTEGER DEFAULT 25,
- "emailSmtpUser" TEXT,
- "emailSmtpPassword" TEXT,
- "emailSmtpUseTls" BOOLEAN DEFAULT false,
- "emailSmtpUseSsl" BOOLEAN DEFAULT false,
- "emailBackend" TEXT,
- "mailgunApiKey" TEXT,
- "sendgridApiKey" TEXT,
- "enableOpenUserRegistration" BOOLEAN NOT NULL DEFAULT true,
- "serviceId" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "GlitchTip_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "GlitchTip_serviceId_key" ON "GlitchTip"("serviceId");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220815133844_appwrite/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220815133844_appwrite/migration.sql
deleted file mode 100644
index ec61dc434..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220815133844_appwrite/migration.sql
+++ /dev/null
@@ -1,22 +0,0 @@
--- CreateTable
-CREATE TABLE "Appwrite" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "serviceId" TEXT NOT NULL,
- "opensslKeyV1" TEXT NOT NULL,
- "executorSecret" TEXT NOT NULL,
- "redisPassword" TEXT NOT NULL,
- "mariadbHost" TEXT,
- "mariadbPort" INTEGER NOT NULL DEFAULT 3306,
- "mariadbUser" TEXT NOT NULL,
- "mariadbPassword" TEXT NOT NULL,
- "mariadbRootUser" TEXT NOT NULL,
- "mariadbRootUserPassword" TEXT NOT NULL,
- "mariadbDatabase" TEXT NOT NULL,
- "mariadbPublicPort" INTEGER,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Appwrite_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "Appwrite_serviceId_key" ON "Appwrite"("serviceId");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220816133447_bot_deployments/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220816133447_bot_deployments/migration.sql
deleted file mode 100644
index 3d6d92d0e..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220816133447_bot_deployments/migration.sql
+++ /dev/null
@@ -1,20 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_ApplicationSettings" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "applicationId" TEXT NOT NULL,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "debug" BOOLEAN NOT NULL DEFAULT false,
- "previews" BOOLEAN NOT NULL DEFAULT false,
- "autodeploy" BOOLEAN NOT NULL DEFAULT true,
- "isBot" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "ApplicationSettings_applicationId_fkey" FOREIGN KEY ("applicationId") REFERENCES "Application" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-INSERT INTO "new_ApplicationSettings" ("applicationId", "autodeploy", "createdAt", "debug", "dualCerts", "id", "previews", "updatedAt") SELECT "applicationId", "autodeploy", "createdAt", "debug", "dualCerts", "id", "previews", "updatedAt" FROM "ApplicationSettings";
-DROP TABLE "ApplicationSettings";
-ALTER TABLE "new_ApplicationSettings" RENAME TO "ApplicationSettings";
-CREATE UNIQUE INDEX "ApplicationSettings_applicationId_key" ON "ApplicationSettings"("applicationId");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220817082342_custom_dns_servers/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220817082342_custom_dns_servers/migration.sql
deleted file mode 100644
index 03588b549..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220817082342_custom_dns_servers/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Setting" ADD COLUMN "DNSServers" TEXT;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220818093615_public_repositories/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220818093615_public_repositories/migration.sql
deleted file mode 100644
index 7f08c29fd..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220818093615_public_repositories/migration.sql
+++ /dev/null
@@ -1,42 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_GitSource" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT NOT NULL,
- "forPublic" BOOLEAN NOT NULL DEFAULT false,
- "type" TEXT,
- "apiUrl" TEXT,
- "htmlUrl" TEXT,
- "customPort" INTEGER NOT NULL DEFAULT 22,
- "organization" TEXT,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "githubAppId" TEXT,
- "gitlabAppId" TEXT,
- CONSTRAINT "GitSource_githubAppId_fkey" FOREIGN KEY ("githubAppId") REFERENCES "GithubApp" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
- CONSTRAINT "GitSource_gitlabAppId_fkey" FOREIGN KEY ("gitlabAppId") REFERENCES "GitlabApp" ("id") ON DELETE SET NULL ON UPDATE CASCADE
-);
-INSERT INTO "new_GitSource" ("apiUrl", "createdAt", "customPort", "githubAppId", "gitlabAppId", "htmlUrl", "id", "name", "organization", "type", "updatedAt") SELECT "apiUrl", "createdAt", "customPort", "githubAppId", "gitlabAppId", "htmlUrl", "id", "name", "organization", "type", "updatedAt" FROM "GitSource";
-DROP TABLE "GitSource";
-ALTER TABLE "new_GitSource" RENAME TO "GitSource";
-CREATE UNIQUE INDEX "GitSource_githubAppId_key" ON "GitSource"("githubAppId");
-CREATE UNIQUE INDEX "GitSource_gitlabAppId_key" ON "GitSource"("gitlabAppId");
-CREATE TABLE "new_ApplicationSettings" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "applicationId" TEXT NOT NULL,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "debug" BOOLEAN NOT NULL DEFAULT false,
- "previews" BOOLEAN NOT NULL DEFAULT false,
- "autodeploy" BOOLEAN NOT NULL DEFAULT true,
- "isBot" BOOLEAN NOT NULL DEFAULT false,
- "isPublicRepository" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "ApplicationSettings_applicationId_fkey" FOREIGN KEY ("applicationId") REFERENCES "Application" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-INSERT INTO "new_ApplicationSettings" ("applicationId", "autodeploy", "createdAt", "debug", "dualCerts", "id", "isBot", "previews", "updatedAt") SELECT "applicationId", "autodeploy", "createdAt", "debug", "dualCerts", "id", "isBot", "previews", "updatedAt" FROM "ApplicationSettings";
-DROP TABLE "ApplicationSettings";
-ALTER TABLE "new_ApplicationSettings" RENAME TO "ApplicationSettings";
-CREATE UNIQUE INDEX "ApplicationSettings_applicationId_key" ON "ApplicationSettings"("applicationId");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220823070532_service_searxng/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220823070532_service_searxng/migration.sql
deleted file mode 100644
index 81ecc81c8..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220823070532_service_searxng/migration.sql
+++ /dev/null
@@ -1,13 +0,0 @@
--- CreateTable
-CREATE TABLE "Searxng" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "secretKey" TEXT NOT NULL,
- "redisPassword" TEXT NOT NULL,
- "serviceId" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Searxng_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "Searxng_serviceId_key" ON "Searxng"("serviceId");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220825064811_concurrent_build_settings/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220825064811_concurrent_build_settings/migration.sql
deleted file mode 100644
index 1535c2bf7..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220825064811_concurrent_build_settings/migration.sql
+++ /dev/null
@@ -1,29 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Setting" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "fqdn" TEXT,
- "isRegistrationEnabled" BOOLEAN NOT NULL DEFAULT false,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "minPort" INTEGER NOT NULL DEFAULT 9000,
- "maxPort" INTEGER NOT NULL DEFAULT 9100,
- "proxyPassword" TEXT NOT NULL,
- "proxyUser" TEXT NOT NULL,
- "proxyHash" TEXT,
- "isAutoUpdateEnabled" BOOLEAN NOT NULL DEFAULT false,
- "isDNSCheckEnabled" BOOLEAN NOT NULL DEFAULT true,
- "DNSServers" TEXT,
- "isTraefikUsed" BOOLEAN NOT NULL DEFAULT true,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "ipv4" TEXT,
- "ipv6" TEXT,
- "arch" TEXT,
- "concurrentBuilds" INTEGER NOT NULL DEFAULT 1
-);
-INSERT INTO "new_Setting" ("DNSServers", "arch", "createdAt", "dualCerts", "fqdn", "id", "ipv4", "ipv6", "isAutoUpdateEnabled", "isDNSCheckEnabled", "isRegistrationEnabled", "isTraefikUsed", "maxPort", "minPort", "proxyHash", "proxyPassword", "proxyUser", "updatedAt") SELECT "DNSServers", "arch", "createdAt", "dualCerts", "fqdn", "id", "ipv4", "ipv6", "isAutoUpdateEnabled", "isDNSCheckEnabled", "isRegistrationEnabled", "isTraefikUsed", "maxPort", "minPort", "proxyHash", "proxyPassword", "proxyUser", "updatedAt" FROM "Setting";
-DROP TABLE "Setting";
-ALTER TABLE "new_Setting" RENAME TO "Setting";
-CREATE UNIQUE INDEX "Setting_fqdn_key" ON "Setting"("fqdn");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220825072007_build_queue_improvements/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220825072007_build_queue_improvements/migration.sql
deleted file mode 100644
index 78c51fc15..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220825072007_build_queue_improvements/migration.sql
+++ /dev/null
@@ -1,24 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Build" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "type" TEXT NOT NULL,
- "applicationId" TEXT,
- "destinationDockerId" TEXT,
- "gitSourceId" TEXT,
- "githubAppId" TEXT,
- "gitlabAppId" TEXT,
- "commit" TEXT,
- "pullmergeRequestId" TEXT,
- "forceRebuild" BOOLEAN NOT NULL DEFAULT false,
- "sourceBranch" TEXT,
- "branch" TEXT,
- "status" TEXT DEFAULT 'queued',
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL
-);
-INSERT INTO "new_Build" ("applicationId", "branch", "commit", "createdAt", "destinationDockerId", "gitSourceId", "githubAppId", "gitlabAppId", "id", "status", "type", "updatedAt") SELECT "applicationId", "branch", "commit", "createdAt", "destinationDockerId", "gitSourceId", "githubAppId", "gitlabAppId", "id", "status", "type", "updatedAt" FROM "Build";
-DROP TABLE "Build";
-ALTER TABLE "new_Build" RENAME TO "Build";
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220831095714_service_weblate/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220831095714_service_weblate/migration.sql
deleted file mode 100644
index c985b4ae2..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220831095714_service_weblate/migration.sql
+++ /dev/null
@@ -1,18 +0,0 @@
--- CreateTable
-CREATE TABLE "Weblate" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "adminPassword" TEXT NOT NULL,
- "postgresqlHost" TEXT NOT NULL,
- "postgresqlPort" INTEGER NOT NULL,
- "postgresqlUser" TEXT NOT NULL,
- "postgresqlPassword" TEXT NOT NULL,
- "postgresqlDatabase" TEXT NOT NULL,
- "postgresqlPublicPort" INTEGER,
- "serviceId" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Weblate_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "Weblate_serviceId_key" ON "Weblate"("serviceId");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220902115640_service_taiga/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220902115640_service_taiga/migration.sql
deleted file mode 100644
index 3035dd8ef..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220902115640_service_taiga/migration.sql
+++ /dev/null
@@ -1,23 +0,0 @@
--- CreateTable
-CREATE TABLE "Taiga" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "secretKey" TEXT NOT NULL,
- "erlangSecret" TEXT NOT NULL,
- "djangoAdminPassword" TEXT NOT NULL,
- "djangoAdminUser" TEXT NOT NULL,
- "rabbitMQUser" TEXT NOT NULL,
- "rabbitMQPassword" TEXT NOT NULL,
- "postgresqlHost" TEXT NOT NULL,
- "postgresqlPort" INTEGER NOT NULL,
- "postgresqlUser" TEXT NOT NULL,
- "postgresqlPassword" TEXT NOT NULL,
- "postgresqlDatabase" TEXT NOT NULL,
- "postgresqlPublicPort" INTEGER,
- "serviceId" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Taiga_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "Taiga_serviceId_key" ON "Taiga"("serviceId");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220905062318_database_branching/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220905062318_database_branching/migration.sql
deleted file mode 100644
index d828a4c66..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220905062318_database_branching/migration.sql
+++ /dev/null
@@ -1,22 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_ApplicationSettings" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "applicationId" TEXT NOT NULL,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "debug" BOOLEAN NOT NULL DEFAULT false,
- "previews" BOOLEAN NOT NULL DEFAULT false,
- "autodeploy" BOOLEAN NOT NULL DEFAULT true,
- "isBot" BOOLEAN NOT NULL DEFAULT false,
- "isPublicRepository" BOOLEAN NOT NULL DEFAULT false,
- "isDBBranching" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "ApplicationSettings_applicationId_fkey" FOREIGN KEY ("applicationId") REFERENCES "Application" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-INSERT INTO "new_ApplicationSettings" ("applicationId", "autodeploy", "createdAt", "debug", "dualCerts", "id", "isBot", "isPublicRepository", "previews", "updatedAt") SELECT "applicationId", "autodeploy", "createdAt", "debug", "dualCerts", "id", "isBot", "isPublicRepository", "previews", "updatedAt" FROM "ApplicationSettings";
-DROP TABLE "ApplicationSettings";
-ALTER TABLE "new_ApplicationSettings" RENAME TO "ApplicationSettings";
-CREATE UNIQUE INDEX "ApplicationSettings_applicationId_key" ON "ApplicationSettings"("applicationId");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220905113241_prisma_migration/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220905113241_prisma_migration/migration.sql
deleted file mode 100644
index 324bcfff0..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220905113241_prisma_migration/migration.sql
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- Warnings:
-
- - You are about to alter the column `time` on the `BuildLog` table. The data in that column could be lost. The data in that column will be cast from `Int` to `BigInt`.
-
-*/
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_BuildLog" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "applicationId" TEXT,
- "buildId" TEXT NOT NULL,
- "line" TEXT NOT NULL,
- "time" BIGINT NOT NULL
-);
-INSERT INTO "new_BuildLog" ("applicationId", "buildId", "id", "line", "time") SELECT "applicationId", "buildId", "id", "line", "time" FROM "BuildLog";
-DROP TABLE "BuildLog";
-ALTER TABLE "new_BuildLog" RENAME TO "BuildLog";
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220905115321_application_connected_database/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220905115321_application_connected_database/migration.sql
deleted file mode 100644
index 576c23bdf..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220905115321_application_connected_database/migration.sql
+++ /dev/null
@@ -1,20 +0,0 @@
--- CreateTable
-CREATE TABLE "ApplicationConnectedDatabase" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "applicationId" TEXT NOT NULL,
- "databaseId" TEXT,
- "hostedDatabaseType" TEXT,
- "hostedDatabaseHost" TEXT,
- "hostedDatabasePort" INTEGER,
- "hostedDatabaseName" TEXT,
- "hostedDatabaseUser" TEXT,
- "hostedDatabasePassword" TEXT,
- "hostedDatabaseDBName" TEXT,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "ApplicationConnectedDatabase_databaseId_fkey" FOREIGN KEY ("databaseId") REFERENCES "Database" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
- CONSTRAINT "ApplicationConnectedDatabase_applicationId_fkey" FOREIGN KEY ("applicationId") REFERENCES "Application" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "ApplicationConnectedDatabase_applicationId_key" ON "ApplicationConnectedDatabase"("applicationId");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220906120112_enable_api_debug_logging/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220906120112_enable_api_debug_logging/migration.sql
deleted file mode 100644
index 05fb3e285..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220906120112_enable_api_debug_logging/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Setting" ADD COLUMN "isAPIDebuggingEnabled" BOOLEAN DEFAULT false;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220907092244_database_secrets/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220907092244_database_secrets/migration.sql
deleted file mode 100644
index 53ff2d19e..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220907092244_database_secrets/migration.sql
+++ /dev/null
@@ -1,13 +0,0 @@
--- CreateTable
-CREATE TABLE "DatabaseSecret" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT NOT NULL,
- "value" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "databaseId" TEXT NOT NULL,
- CONSTRAINT "DatabaseSecret_databaseId_fkey" FOREIGN KEY ("databaseId") REFERENCES "Database" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "DatabaseSecret_name_databaseId_key" ON "DatabaseSecret"("name", "databaseId");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220913092100_preview_applications/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220913092100_preview_applications/migration.sql
deleted file mode 100644
index 0ec1aafa0..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220913092100_preview_applications/migration.sql
+++ /dev/null
@@ -1,18 +0,0 @@
--- AlterTable
-ALTER TABLE "Build" ADD COLUMN "previewApplicationId" TEXT;
-
--- CreateTable
-CREATE TABLE "PreviewApplication" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "pullmergeRequestId" TEXT NOT NULL,
- "sourceBranch" TEXT NOT NULL,
- "isRandomDomain" BOOLEAN NOT NULL DEFAULT false,
- "customDomain" TEXT,
- "applicationId" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "PreviewApplication_applicationId_fkey" FOREIGN KEY ("applicationId") REFERENCES "Application" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "PreviewApplication_applicationId_key" ON "PreviewApplication"("applicationId");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220922064605_custom_certificates/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220922064605_custom_certificates/migration.sql
deleted file mode 100644
index 804913038..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220922064605_custom_certificates/migration.sql
+++ /dev/null
@@ -1,10 +0,0 @@
--- CreateTable
-CREATE TABLE "Certificate" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "key" TEXT NOT NULL,
- "cert" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "teamId" TEXT,
- CONSTRAINT "Certificate_teamId_fkey" FOREIGN KEY ("teamId") REFERENCES "Team" ("id") ON DELETE SET NULL ON UPDATE CASCADE
-);
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220923122227_custom_ssl_for_applications/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220923122227_custom_ssl_for_applications/migration.sql
deleted file mode 100644
index b9261a955..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220923122227_custom_ssl_for_applications/migration.sql
+++ /dev/null
@@ -1,23 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_ApplicationSettings" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "applicationId" TEXT NOT NULL,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "debug" BOOLEAN NOT NULL DEFAULT false,
- "previews" BOOLEAN NOT NULL DEFAULT false,
- "autodeploy" BOOLEAN NOT NULL DEFAULT true,
- "isBot" BOOLEAN NOT NULL DEFAULT false,
- "isPublicRepository" BOOLEAN NOT NULL DEFAULT false,
- "isDBBranching" BOOLEAN NOT NULL DEFAULT false,
- "isCustomSSL" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "ApplicationSettings_applicationId_fkey" FOREIGN KEY ("applicationId") REFERENCES "Application" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-INSERT INTO "new_ApplicationSettings" ("applicationId", "autodeploy", "createdAt", "debug", "dualCerts", "id", "isBot", "isDBBranching", "isPublicRepository", "previews", "updatedAt") SELECT "applicationId", "autodeploy", "createdAt", "debug", "dualCerts", "id", "isBot", "isDBBranching", "isPublicRepository", "previews", "updatedAt" FROM "ApplicationSettings";
-DROP TABLE "ApplicationSettings";
-ALTER TABLE "new_ApplicationSettings" RENAME TO "ApplicationSettings";
-CREATE UNIQUE INDEX "ApplicationSettings_applicationId_key" ON "ApplicationSettings"("applicationId");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20220928083348_system_wide_git_sources/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20220928083348_system_wide_git_sources/migration.sql
deleted file mode 100644
index a3657504d..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20220928083348_system_wide_git_sources/migration.sql
+++ /dev/null
@@ -1,26 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_GitSource" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT NOT NULL,
- "forPublic" BOOLEAN NOT NULL DEFAULT false,
- "type" TEXT,
- "apiUrl" TEXT,
- "htmlUrl" TEXT,
- "customPort" INTEGER NOT NULL DEFAULT 22,
- "organization" TEXT,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "githubAppId" TEXT,
- "gitlabAppId" TEXT,
- "isSystemWide" BOOLEAN NOT NULL DEFAULT false,
- CONSTRAINT "GitSource_gitlabAppId_fkey" FOREIGN KEY ("gitlabAppId") REFERENCES "GitlabApp" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
- CONSTRAINT "GitSource_githubAppId_fkey" FOREIGN KEY ("githubAppId") REFERENCES "GithubApp" ("id") ON DELETE SET NULL ON UPDATE CASCADE
-);
-INSERT INTO "new_GitSource" ("apiUrl", "createdAt", "customPort", "forPublic", "githubAppId", "gitlabAppId", "htmlUrl", "id", "name", "organization", "type", "updatedAt") SELECT "apiUrl", "createdAt", "customPort", "forPublic", "githubAppId", "gitlabAppId", "htmlUrl", "id", "name", "organization", "type", "updatedAt" FROM "GitSource";
-DROP TABLE "GitSource";
-ALTER TABLE "new_GitSource" RENAME TO "GitSource";
-CREATE UNIQUE INDEX "GitSource_githubAppId_key" ON "GitSource"("githubAppId");
-CREATE UNIQUE INDEX "GitSource_gitlabAppId_key" ON "GitSource"("gitlabAppId");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/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
deleted file mode 100644
index 031f842cb..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221002084246_no_unique_appid_on_previews/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- DropIndex
-DROP INDEX "PreviewApplication_applicationId_key";
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221002091630_forked_previews/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221002091630_forked_previews/migration.sql
deleted file mode 100644
index 2312c011b..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221002091630_forked_previews/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Build" ADD COLUMN "sourceRepository" TEXT;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221005120323_initial_docker_compose/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221005120323_initial_docker_compose/migration.sql
deleted file mode 100644
index bb93e1aaf..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221005120323_initial_docker_compose/migration.sql
+++ /dev/null
@@ -1,3 +0,0 @@
--- AlterTable
-ALTER TABLE "Application" ADD COLUMN "dockerComposeFile" TEXT;
-ALTER TABLE "Application" ADD COLUMN "dockerComposeFileLocation" TEXT;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221005132352_docker_compose_configuration/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221005132352_docker_compose_configuration/migration.sql
deleted file mode 100644
index e7368dc1a..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221005132352_docker_compose_configuration/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Application" ADD COLUMN "dockerComposeConfiguration" TEXT;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221017134342_standardized_service_configs/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221017134342_standardized_service_configs/migration.sql
deleted file mode 100644
index 837017435..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221017134342_standardized_service_configs/migration.sql
+++ /dev/null
@@ -1,13 +0,0 @@
--- CreateTable
-CREATE TABLE "ServiceSetting" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "serviceId" TEXT NOT NULL,
- "name" TEXT NOT NULL,
- "value" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "ServiceSetting_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "ServiceSetting_serviceId_name_key" ON "ServiceSetting"("serviceId", "name");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221018090939_service_peristent_volumes_predefined/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221018090939_service_peristent_volumes_predefined/migration.sql
deleted file mode 100644
index c7b935eb7..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221018090939_service_peristent_volumes_predefined/migration.sql
+++ /dev/null
@@ -1,19 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_ServicePersistentStorage" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "serviceId" TEXT NOT NULL,
- "path" TEXT NOT NULL,
- "volumeName" TEXT,
- "predefined" BOOLEAN NOT NULL DEFAULT false,
- "containerId" TEXT,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "ServicePersistentStorage_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-INSERT INTO "new_ServicePersistentStorage" ("createdAt", "id", "path", "serviceId", "updatedAt") SELECT "createdAt", "id", "path", "serviceId", "updatedAt" FROM "ServicePersistentStorage";
-DROP TABLE "ServicePersistentStorage";
-ALTER TABLE "new_ServicePersistentStorage" RENAME TO "ServicePersistentStorage";
-CREATE UNIQUE INDEX "ServicePersistentStorage_serviceId_path_key" ON "ServicePersistentStorage"("serviceId", "path");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221021112429_serivce_settings_extended/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221021112429_serivce_settings_extended/migration.sql
deleted file mode 100644
index b2eddcfd9..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221021112429_serivce_settings_extended/migration.sql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- Warnings:
-
- - Added the required column `variableName` to the `ServiceSetting` table without a default value. This is not possible if the table is not empty.
-
-*/
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_ServiceSetting" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "serviceId" TEXT NOT NULL,
- "name" TEXT NOT NULL,
- "value" TEXT NOT NULL,
- "variableName" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "ServiceSetting_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-INSERT INTO "new_ServiceSetting" ("createdAt", "id", "name", "serviceId", "updatedAt", "value") SELECT "createdAt", "id", "name", "serviceId", "updatedAt", "value" FROM "ServiceSetting";
-DROP TABLE "ServiceSetting";
-ALTER TABLE "new_ServiceSetting" RENAME TO "ServiceSetting";
-CREATE UNIQUE INDEX "ServiceSetting_serviceId_name_key" ON "ServiceSetting"("serviceId", "name");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221021185630_service_template_version/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221021185630_service_template_version/migration.sql
deleted file mode 100644
index f716a2340..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221021185630_service_template_version/migration.sql
+++ /dev/null
@@ -1,21 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Service" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT NOT NULL,
- "fqdn" TEXT,
- "exposePort" INTEGER,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "type" TEXT,
- "version" TEXT,
- "templateVersion" TEXT NOT NULL DEFAULT '0.0.0',
- "destinationDockerId" TEXT,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Service_destinationDockerId_fkey" FOREIGN KEY ("destinationDockerId") REFERENCES "DestinationDocker" ("id") ON DELETE SET NULL ON UPDATE CASCADE
-);
-INSERT INTO "new_Service" ("createdAt", "destinationDockerId", "dualCerts", "exposePort", "fqdn", "id", "name", "type", "updatedAt", "version") SELECT "createdAt", "destinationDockerId", "dualCerts", "exposePort", "fqdn", "id", "name", "type", "updatedAt", "version" FROM "Service";
-DROP TABLE "Service";
-ALTER TABLE "new_Service" RENAME TO "Service";
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221026115123_service_persistent_unique/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221026115123_service_persistent_unique/migration.sql
deleted file mode 100644
index dae80a76a..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221026115123_service_persistent_unique/migration.sql
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- Warnings:
-
- - A unique constraint covering the columns `[serviceId,containerId,path]` on the table `ServicePersistentStorage` will be added. If there are existing duplicate values, this will fail.
-
-*/
--- DropIndex
-DROP INDEX "ServicePersistentStorage_serviceId_path_key";
-
--- CreateIndex
-CREATE UNIQUE INDEX "ServicePersistentStorage_serviceId_containerId_path_key" ON "ServicePersistentStorage"("serviceId", "containerId", "path");
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221028074301_wordpress_optional_fields/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221028074301_wordpress_optional_fields/migration.sql
deleted file mode 100644
index 217039d97..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221028074301_wordpress_optional_fields/migration.sql
+++ /dev/null
@@ -1,32 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Wordpress" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "extraConfig" TEXT,
- "tablePrefix" TEXT,
- "ownMysql" BOOLEAN NOT NULL DEFAULT false,
- "mysqlHost" TEXT,
- "mysqlPort" INTEGER,
- "mysqlUser" TEXT,
- "mysqlPassword" TEXT,
- "mysqlRootUser" TEXT,
- "mysqlRootUserPassword" TEXT,
- "mysqlDatabase" TEXT,
- "mysqlPublicPort" INTEGER,
- "ftpEnabled" BOOLEAN NOT NULL DEFAULT false,
- "ftpUser" TEXT,
- "ftpPassword" TEXT,
- "ftpPublicPort" INTEGER,
- "ftpHostKey" TEXT,
- "ftpHostKeyPrivate" TEXT,
- "serviceId" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "Wordpress_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-INSERT INTO "new_Wordpress" ("createdAt", "extraConfig", "ftpEnabled", "ftpHostKey", "ftpHostKeyPrivate", "ftpPassword", "ftpPublicPort", "ftpUser", "id", "mysqlDatabase", "mysqlHost", "mysqlPassword", "mysqlPort", "mysqlPublicPort", "mysqlRootUser", "mysqlRootUserPassword", "mysqlUser", "ownMysql", "serviceId", "tablePrefix", "updatedAt") SELECT "createdAt", "extraConfig", "ftpEnabled", "ftpHostKey", "ftpHostKeyPrivate", "ftpPassword", "ftpPublicPort", "ftpUser", "id", "mysqlDatabase", "mysqlHost", "mysqlPassword", "mysqlPort", "mysqlPublicPort", "mysqlRootUser", "mysqlRootUserPassword", "mysqlUser", "ownMysql", "serviceId", "tablePrefix", "updatedAt" FROM "Wordpress";
-DROP TABLE "Wordpress";
-ALTER TABLE "new_Wordpress" RENAME TO "Wordpress";
-CREATE UNIQUE INDEX "Wordpress_serviceId_key" ON "Wordpress"("serviceId");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221104092223_default_redirect_proxy/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221104092223_default_redirect_proxy/migration.sql
deleted file mode 100644
index 8584fe25c..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221104092223_default_redirect_proxy/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Setting" ADD COLUMN "proxyDefaultRedirect" TEXT;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221114093217_application_storage_path_migration/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221114093217_application_storage_path_migration/migration.sql
deleted file mode 100644
index 6913c8b00..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221114093217_application_storage_path_migration/migration.sql
+++ /dev/null
@@ -1,45 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Setting" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "fqdn" TEXT,
- "isAPIDebuggingEnabled" BOOLEAN DEFAULT false,
- "isRegistrationEnabled" BOOLEAN NOT NULL DEFAULT false,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "minPort" INTEGER NOT NULL DEFAULT 9000,
- "maxPort" INTEGER NOT NULL DEFAULT 9100,
- "proxyPassword" TEXT NOT NULL,
- "proxyUser" TEXT NOT NULL,
- "proxyHash" TEXT,
- "proxyDefaultRedirect" TEXT,
- "isAutoUpdateEnabled" BOOLEAN NOT NULL DEFAULT false,
- "isDNSCheckEnabled" BOOLEAN NOT NULL DEFAULT true,
- "DNSServers" TEXT,
- "isTraefikUsed" BOOLEAN NOT NULL DEFAULT true,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "ipv4" TEXT,
- "ipv6" TEXT,
- "arch" TEXT,
- "concurrentBuilds" INTEGER NOT NULL DEFAULT 1,
- "applicationStoragePathMigrationFinished" BOOLEAN NOT NULL DEFAULT false
-);
-INSERT INTO "new_Setting" ("DNSServers", "arch", "concurrentBuilds", "createdAt", "dualCerts", "fqdn", "id", "ipv4", "ipv6", "isAPIDebuggingEnabled", "isAutoUpdateEnabled", "isDNSCheckEnabled", "isRegistrationEnabled", "isTraefikUsed", "maxPort", "minPort", "proxyDefaultRedirect", "proxyHash", "proxyPassword", "proxyUser", "updatedAt") SELECT "DNSServers", "arch", "concurrentBuilds", "createdAt", "dualCerts", "fqdn", "id", "ipv4", "ipv6", "isAPIDebuggingEnabled", "isAutoUpdateEnabled", "isDNSCheckEnabled", "isRegistrationEnabled", "isTraefikUsed", "maxPort", "minPort", "proxyDefaultRedirect", "proxyHash", "proxyPassword", "proxyUser", "updatedAt" FROM "Setting";
-DROP TABLE "Setting";
-ALTER TABLE "new_Setting" RENAME TO "Setting";
-CREATE UNIQUE INDEX "Setting_fqdn_key" ON "Setting"("fqdn");
-CREATE TABLE "new_ApplicationPersistentStorage" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "applicationId" TEXT NOT NULL,
- "path" TEXT NOT NULL,
- "oldPath" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "ApplicationPersistentStorage_applicationId_fkey" FOREIGN KEY ("applicationId") REFERENCES "Application" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-INSERT INTO "new_ApplicationPersistentStorage" ("applicationId", "createdAt", "id", "path", "updatedAt") SELECT "applicationId", "createdAt", "id", "path", "updatedAt" FROM "ApplicationPersistentStorage";
-DROP TABLE "ApplicationPersistentStorage";
-ALTER TABLE "new_ApplicationPersistentStorage" RENAME TO "ApplicationPersistentStorage";
-CREATE UNIQUE INDEX "ApplicationPersistentStorage_applicationId_path_key" ON "ApplicationPersistentStorage"("applicationId", "path");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221123122143_remote_haproxy_from_db/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221123122143_remote_haproxy_from_db/migration.sql
deleted file mode 100644
index 1acf261a5..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221123122143_remote_haproxy_from_db/migration.sql
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- Warnings:
-
- - You are about to drop the column `proxyHash` on the `Setting` table. All the data in the column will be lost.
- - You are about to drop the column `proxyPassword` on the `Setting` table. All the data in the column will be lost.
- - You are about to drop the column `proxyUser` on the `Setting` table. All the data in the column will be lost.
-
-*/
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Setting" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "fqdn" TEXT,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "minPort" INTEGER NOT NULL DEFAULT 9000,
- "maxPort" INTEGER NOT NULL DEFAULT 9100,
- "DNSServers" TEXT,
- "ipv4" TEXT,
- "ipv6" TEXT,
- "arch" TEXT,
- "concurrentBuilds" INTEGER NOT NULL DEFAULT 1,
- "applicationStoragePathMigrationFinished" BOOLEAN NOT NULL DEFAULT false,
- "proxyDefaultRedirect" TEXT,
- "isAPIDebuggingEnabled" BOOLEAN DEFAULT false,
- "isRegistrationEnabled" BOOLEAN NOT NULL DEFAULT false,
- "isAutoUpdateEnabled" BOOLEAN NOT NULL DEFAULT false,
- "isDNSCheckEnabled" BOOLEAN NOT NULL DEFAULT true,
- "isTraefikUsed" BOOLEAN NOT NULL DEFAULT true,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL
-);
-INSERT INTO "new_Setting" ("DNSServers", "applicationStoragePathMigrationFinished", "arch", "concurrentBuilds", "createdAt", "dualCerts", "fqdn", "id", "ipv4", "ipv6", "isAPIDebuggingEnabled", "isAutoUpdateEnabled", "isDNSCheckEnabled", "isRegistrationEnabled", "isTraefikUsed", "maxPort", "minPort", "proxyDefaultRedirect", "updatedAt") SELECT "DNSServers", "applicationStoragePathMigrationFinished", "arch", "concurrentBuilds", "createdAt", "dualCerts", "fqdn", "id", "ipv4", "ipv6", "isAPIDebuggingEnabled", "isAutoUpdateEnabled", "isDNSCheckEnabled", "isRegistrationEnabled", "isTraefikUsed", "maxPort", "minPort", "proxyDefaultRedirect", "updatedAt" FROM "Setting";
-DROP TABLE "Setting";
-ALTER TABLE "new_Setting" RENAME TO "Setting";
-CREATE UNIQUE INDEX "Setting_fqdn_key" ON "Setting"("fqdn");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221123133429_docker_registries/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221123133429_docker_registries/migration.sql
deleted file mode 100644
index abebc5514..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221123133429_docker_registries/migration.sql
+++ /dev/null
@@ -1,59 +0,0 @@
--- CreateTable
-CREATE TABLE "DockerRegistry" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT NOT NULL,
- "url" TEXT NOT NULL,
- "username" TEXT,
- "password" TEXT,
- "isSystemWide" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "teamId" TEXT,
- CONSTRAINT "DockerRegistry_teamId_fkey" FOREIGN KEY ("teamId") REFERENCES "Team" ("id") ON DELETE SET NULL ON UPDATE CASCADE
-);
-
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Application" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT NOT NULL,
- "fqdn" TEXT,
- "repository" TEXT,
- "configHash" TEXT,
- "branch" TEXT,
- "buildPack" TEXT,
- "projectId" INTEGER,
- "port" INTEGER,
- "exposePort" INTEGER,
- "installCommand" TEXT,
- "buildCommand" TEXT,
- "startCommand" TEXT,
- "baseDirectory" TEXT,
- "publishDirectory" TEXT,
- "deploymentType" TEXT,
- "phpModules" TEXT,
- "pythonWSGI" TEXT,
- "pythonModule" TEXT,
- "pythonVariable" TEXT,
- "dockerFileLocation" TEXT,
- "denoMainFile" TEXT,
- "denoOptions" TEXT,
- "dockerComposeFile" TEXT,
- "dockerComposeFileLocation" TEXT,
- "dockerComposeConfiguration" TEXT,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "destinationDockerId" TEXT,
- "gitSourceId" TEXT,
- "baseImage" TEXT,
- "baseBuildImage" TEXT,
- "dockerRegistryId" TEXT NOT NULL DEFAULT '0',
- CONSTRAINT "Application_gitSourceId_fkey" FOREIGN KEY ("gitSourceId") REFERENCES "GitSource" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
- CONSTRAINT "Application_destinationDockerId_fkey" FOREIGN KEY ("destinationDockerId") REFERENCES "DestinationDocker" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
- CONSTRAINT "Application_dockerRegistryId_fkey" FOREIGN KEY ("dockerRegistryId") REFERENCES "DockerRegistry" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-INSERT INTO "new_Application" ("baseBuildImage", "baseDirectory", "baseImage", "branch", "buildCommand", "buildPack", "configHash", "createdAt", "denoMainFile", "denoOptions", "deploymentType", "destinationDockerId", "dockerComposeConfiguration", "dockerComposeFile", "dockerComposeFileLocation", "dockerFileLocation", "exposePort", "fqdn", "gitSourceId", "id", "installCommand", "name", "phpModules", "port", "projectId", "publishDirectory", "pythonModule", "pythonVariable", "pythonWSGI", "repository", "startCommand", "updatedAt") SELECT "baseBuildImage", "baseDirectory", "baseImage", "branch", "buildCommand", "buildPack", "configHash", "createdAt", "denoMainFile", "denoOptions", "deploymentType", "destinationDockerId", "dockerComposeConfiguration", "dockerComposeFile", "dockerComposeFileLocation", "dockerFileLocation", "exposePort", "fqdn", "gitSourceId", "id", "installCommand", "name", "phpModules", "port", "projectId", "publishDirectory", "pythonModule", "pythonVariable", "pythonWSGI", "repository", "startCommand", "updatedAt" FROM "Application";
-DROP TABLE "Application";
-ALTER TABLE "new_Application" RENAME TO "Application";
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221128104158_do_not_track/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221128104158_do_not_track/migration.sql
deleted file mode 100644
index 9cf26d8a8..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221128104158_do_not_track/migration.sql
+++ /dev/null
@@ -1,30 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Setting" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "fqdn" TEXT,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "minPort" INTEGER NOT NULL DEFAULT 9000,
- "maxPort" INTEGER NOT NULL DEFAULT 9100,
- "DNSServers" TEXT,
- "ipv4" TEXT,
- "ipv6" TEXT,
- "arch" TEXT,
- "concurrentBuilds" INTEGER NOT NULL DEFAULT 1,
- "applicationStoragePathMigrationFinished" BOOLEAN NOT NULL DEFAULT false,
- "proxyDefaultRedirect" TEXT,
- "doNotTrack" BOOLEAN NOT NULL DEFAULT false,
- "isAPIDebuggingEnabled" BOOLEAN DEFAULT false,
- "isRegistrationEnabled" BOOLEAN NOT NULL DEFAULT false,
- "isAutoUpdateEnabled" BOOLEAN NOT NULL DEFAULT false,
- "isDNSCheckEnabled" BOOLEAN NOT NULL DEFAULT true,
- "isTraefikUsed" BOOLEAN NOT NULL DEFAULT true,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL
-);
-INSERT INTO "new_Setting" ("DNSServers", "applicationStoragePathMigrationFinished", "arch", "concurrentBuilds", "createdAt", "dualCerts", "fqdn", "id", "ipv4", "ipv6", "isAPIDebuggingEnabled", "isAutoUpdateEnabled", "isDNSCheckEnabled", "isRegistrationEnabled", "isTraefikUsed", "maxPort", "minPort", "proxyDefaultRedirect", "updatedAt") SELECT "DNSServers", "applicationStoragePathMigrationFinished", "arch", "concurrentBuilds", "createdAt", "dualCerts", "fqdn", "id", "ipv4", "ipv6", "isAPIDebuggingEnabled", "isAutoUpdateEnabled", "isDNSCheckEnabled", "isRegistrationEnabled", "isTraefikUsed", "maxPort", "minPort", "proxyDefaultRedirect", "updatedAt" FROM "Setting";
-DROP TABLE "Setting";
-ALTER TABLE "new_Setting" RENAME TO "Setting";
-CREATE UNIQUE INDEX "Setting_fqdn_key" ON "Setting"("fqdn");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221128104718_fix_defaults/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221128104718_fix_defaults/migration.sql
deleted file mode 100644
index c1152cdc3..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221128104718_fix_defaults/migration.sql
+++ /dev/null
@@ -1,60 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Setting" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "fqdn" TEXT,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "minPort" INTEGER NOT NULL DEFAULT 9000,
- "maxPort" INTEGER NOT NULL DEFAULT 9100,
- "DNSServers" TEXT,
- "ipv4" TEXT,
- "ipv6" TEXT,
- "arch" TEXT,
- "concurrentBuilds" INTEGER NOT NULL DEFAULT 1,
- "applicationStoragePathMigrationFinished" BOOLEAN NOT NULL DEFAULT false,
- "proxyDefaultRedirect" TEXT,
- "doNotTrack" BOOLEAN NOT NULL DEFAULT false,
- "isAPIDebuggingEnabled" BOOLEAN NOT NULL DEFAULT false,
- "isRegistrationEnabled" BOOLEAN NOT NULL DEFAULT false,
- "isAutoUpdateEnabled" BOOLEAN NOT NULL DEFAULT false,
- "isDNSCheckEnabled" BOOLEAN NOT NULL DEFAULT true,
- "isTraefikUsed" BOOLEAN NOT NULL DEFAULT true,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL
-);
-INSERT INTO "new_Setting" ("DNSServers", "applicationStoragePathMigrationFinished", "arch", "concurrentBuilds", "createdAt", "doNotTrack", "dualCerts", "fqdn", "id", "ipv4", "ipv6", "isAPIDebuggingEnabled", "isAutoUpdateEnabled", "isDNSCheckEnabled", "isRegistrationEnabled", "isTraefikUsed", "maxPort", "minPort", "proxyDefaultRedirect", "updatedAt") SELECT "DNSServers", "applicationStoragePathMigrationFinished", "arch", "concurrentBuilds", "createdAt", "doNotTrack", "dualCerts", "fqdn", "id", "ipv4", "ipv6", coalesce("isAPIDebuggingEnabled", false) AS "isAPIDebuggingEnabled", "isAutoUpdateEnabled", "isDNSCheckEnabled", "isRegistrationEnabled", "isTraefikUsed", "maxPort", "minPort", "proxyDefaultRedirect", "updatedAt" FROM "Setting";
-DROP TABLE "Setting";
-ALTER TABLE "new_Setting" RENAME TO "Setting";
-CREATE UNIQUE INDEX "Setting_fqdn_key" ON "Setting"("fqdn");
-CREATE TABLE "new_GlitchTip" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "postgresqlUser" TEXT NOT NULL,
- "postgresqlPassword" TEXT NOT NULL,
- "postgresqlDatabase" TEXT NOT NULL,
- "postgresqlPublicPort" INTEGER,
- "secretKeyBase" TEXT,
- "defaultEmail" TEXT NOT NULL,
- "defaultUsername" TEXT NOT NULL,
- "defaultPassword" TEXT NOT NULL,
- "defaultEmailFrom" TEXT NOT NULL DEFAULT 'glitchtip@domain.tdl',
- "emailSmtpHost" TEXT DEFAULT 'domain.tdl',
- "emailSmtpPort" INTEGER DEFAULT 25,
- "emailSmtpUser" TEXT,
- "emailSmtpPassword" TEXT,
- "emailSmtpUseTls" BOOLEAN NOT NULL DEFAULT false,
- "emailSmtpUseSsl" BOOLEAN NOT NULL DEFAULT false,
- "emailBackend" TEXT,
- "mailgunApiKey" TEXT,
- "sendgridApiKey" TEXT,
- "enableOpenUserRegistration" BOOLEAN NOT NULL DEFAULT true,
- "serviceId" TEXT NOT NULL,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "GlitchTip_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "Service" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-INSERT INTO "new_GlitchTip" ("createdAt", "defaultEmail", "defaultEmailFrom", "defaultPassword", "defaultUsername", "emailBackend", "emailSmtpHost", "emailSmtpPassword", "emailSmtpPort", "emailSmtpUseSsl", "emailSmtpUseTls", "emailSmtpUser", "enableOpenUserRegistration", "id", "mailgunApiKey", "postgresqlDatabase", "postgresqlPassword", "postgresqlPublicPort", "postgresqlUser", "secretKeyBase", "sendgridApiKey", "serviceId", "updatedAt") SELECT "createdAt", "defaultEmail", "defaultEmailFrom", "defaultPassword", "defaultUsername", "emailBackend", "emailSmtpHost", "emailSmtpPassword", "emailSmtpPort", coalesce("emailSmtpUseSsl", false) AS "emailSmtpUseSsl", coalesce("emailSmtpUseTls", false) AS "emailSmtpUseTls", "emailSmtpUser", "enableOpenUserRegistration", "id", "mailgunApiKey", "postgresqlDatabase", "postgresqlPassword", "postgresqlPublicPort", "postgresqlUser", "secretKeyBase", "sendgridApiKey", "serviceId", "updatedAt" FROM "GlitchTip";
-DROP TABLE "GlitchTip";
-ALTER TABLE "new_GlitchTip" RENAME TO "GlitchTip";
-CREATE UNIQUE INDEX "GlitchTip_serviceId_key" ON "GlitchTip"("serviceId");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221128105615_custom_sentry/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221128105615_custom_sentry/migration.sql
deleted file mode 100644
index 00857eb0d..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221128105615_custom_sentry/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Setting" ADD COLUMN "sentryDSN" TEXT;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221129081832_fix_defaults/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221129081832_fix_defaults/migration.sql
deleted file mode 100644
index 96f6de3fb..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221129081832_fix_defaults/migration.sql
+++ /dev/null
@@ -1,31 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Setting" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "fqdn" TEXT,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "minPort" INTEGER NOT NULL DEFAULT 9000,
- "maxPort" INTEGER NOT NULL DEFAULT 9100,
- "DNSServers" TEXT NOT NULL DEFAULT '1.1.1.1,8.8.8.8',
- "ipv4" TEXT,
- "ipv6" TEXT,
- "arch" TEXT,
- "concurrentBuilds" INTEGER NOT NULL DEFAULT 1,
- "applicationStoragePathMigrationFinished" BOOLEAN NOT NULL DEFAULT false,
- "proxyDefaultRedirect" TEXT,
- "doNotTrack" BOOLEAN NOT NULL DEFAULT false,
- "sentryDSN" TEXT,
- "isAPIDebuggingEnabled" BOOLEAN NOT NULL DEFAULT false,
- "isRegistrationEnabled" BOOLEAN NOT NULL DEFAULT true,
- "isAutoUpdateEnabled" BOOLEAN NOT NULL DEFAULT false,
- "isDNSCheckEnabled" BOOLEAN NOT NULL DEFAULT true,
- "isTraefikUsed" BOOLEAN NOT NULL DEFAULT true,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL
-);
-INSERT INTO "new_Setting" ("DNSServers", "applicationStoragePathMigrationFinished", "arch", "concurrentBuilds", "createdAt", "doNotTrack", "dualCerts", "fqdn", "id", "ipv4", "ipv6", "isAPIDebuggingEnabled", "isAutoUpdateEnabled", "isDNSCheckEnabled", "isRegistrationEnabled", "isTraefikUsed", "maxPort", "minPort", "proxyDefaultRedirect", "sentryDSN", "updatedAt") SELECT coalesce("DNSServers", '1.1.1.1,8.8.8.8') AS "DNSServers", "applicationStoragePathMigrationFinished", "arch", "concurrentBuilds", "createdAt", "doNotTrack", "dualCerts", "fqdn", "id", "ipv4", "ipv6", "isAPIDebuggingEnabled", "isAutoUpdateEnabled", "isDNSCheckEnabled", "isRegistrationEnabled", "isTraefikUsed", "maxPort", "minPort", "proxyDefaultRedirect", "sentryDSN", "updatedAt" FROM "Setting";
-DROP TABLE "Setting";
-ALTER TABLE "new_Setting" RENAME TO "Setting";
-CREATE UNIQUE INDEX "Setting_fqdn_key" ON "Setting"("fqdn");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221129121702_preview_separator/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221129121702_preview_separator/migration.sql
deleted file mode 100644
index e0d64cdc8..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221129121702_preview_separator/migration.sql
+++ /dev/null
@@ -1,33 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_Setting" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "fqdn" TEXT,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "minPort" INTEGER NOT NULL DEFAULT 9000,
- "maxPort" INTEGER NOT NULL DEFAULT 9100,
- "DNSServers" TEXT NOT NULL DEFAULT '1.1.1.1,8.8.8.8',
- "ipv4" TEXT,
- "ipv6" TEXT,
- "arch" TEXT,
- "concurrentBuilds" INTEGER NOT NULL DEFAULT 1,
- "applicationStoragePathMigrationFinished" BOOLEAN NOT NULL DEFAULT false,
- "numberOfDockerImagesKeptLocally" INTEGER NOT NULL DEFAULT 3,
- "proxyDefaultRedirect" TEXT,
- "doNotTrack" BOOLEAN NOT NULL DEFAULT false,
- "sentryDSN" TEXT,
- "previewSeparator" TEXT NOT NULL DEFAULT '.',
- "isAPIDebuggingEnabled" BOOLEAN NOT NULL DEFAULT false,
- "isRegistrationEnabled" BOOLEAN NOT NULL DEFAULT true,
- "isAutoUpdateEnabled" BOOLEAN NOT NULL DEFAULT false,
- "isDNSCheckEnabled" BOOLEAN NOT NULL DEFAULT true,
- "isTraefikUsed" BOOLEAN NOT NULL DEFAULT true,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL
-);
-INSERT INTO "new_Setting" ("DNSServers", "applicationStoragePathMigrationFinished", "arch", "concurrentBuilds", "createdAt", "doNotTrack", "dualCerts", "fqdn", "id", "ipv4", "ipv6", "isAPIDebuggingEnabled", "isAutoUpdateEnabled", "isDNSCheckEnabled", "isRegistrationEnabled", "isTraefikUsed", "maxPort", "minPort", "numberOfDockerImagesKeptLocally", "proxyDefaultRedirect", "sentryDSN", "updatedAt") SELECT "DNSServers", "applicationStoragePathMigrationFinished", "arch", "concurrentBuilds", "createdAt", "doNotTrack", "dualCerts", "fqdn", "id", "ipv4", "ipv6", "isAPIDebuggingEnabled", "isAutoUpdateEnabled", "isDNSCheckEnabled", "isRegistrationEnabled", "isTraefikUsed", "maxPort", "minPort", 3, "proxyDefaultRedirect", "sentryDSN", "updatedAt" FROM "Setting";
-DROP TABLE "Setting";
-ALTER TABLE "new_Setting" RENAME TO "Setting";
-CREATE UNIQUE INDEX "Setting_fqdn_key" ON "Setting"("fqdn");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221129130036_keep_local_docker_images/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221129130036_keep_local_docker_images/migration.sql
deleted file mode 100644
index aa8136ed8..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221129130036_keep_local_docker_images/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Application" ADD COLUMN "gitCommitHash" TEXT;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221130142058_reconfigure_docker_registries/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221130142058_reconfigure_docker_registries/migration.sql
deleted file mode 100644
index c77afb687..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221130142058_reconfigure_docker_registries/migration.sql
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- Warnings:
-
- - You are about to drop the column `isSystemWide` on the `DockerRegistry` table. All the data in the column will be lost.
-
-*/
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_DockerRegistry" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT NOT NULL,
- "url" TEXT NOT NULL,
- "username" TEXT,
- "password" TEXT,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "teamId" TEXT,
- CONSTRAINT "DockerRegistry_teamId_fkey" FOREIGN KEY ("teamId") REFERENCES "Team" ("id") ON DELETE SET NULL ON UPDATE CASCADE
-);
-INSERT INTO "new_DockerRegistry" ("createdAt", "id", "name", "password", "teamId", "updatedAt", "url", "username") SELECT "createdAt", "id", "name", "password", "teamId", "updatedAt", "url", "username" FROM "DockerRegistry";
-DROP TABLE "DockerRegistry";
-ALTER TABLE "new_DockerRegistry" RENAME TO "DockerRegistry";
-CREATE TABLE "new_Application" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "name" TEXT NOT NULL,
- "fqdn" TEXT,
- "repository" TEXT,
- "configHash" TEXT,
- "branch" TEXT,
- "buildPack" TEXT,
- "projectId" INTEGER,
- "port" INTEGER,
- "exposePort" INTEGER,
- "installCommand" TEXT,
- "buildCommand" TEXT,
- "startCommand" TEXT,
- "baseDirectory" TEXT,
- "publishDirectory" TEXT,
- "deploymentType" TEXT,
- "phpModules" TEXT,
- "pythonWSGI" TEXT,
- "pythonModule" TEXT,
- "pythonVariable" TEXT,
- "dockerFileLocation" TEXT,
- "denoMainFile" TEXT,
- "denoOptions" TEXT,
- "dockerComposeFile" TEXT,
- "dockerComposeFileLocation" TEXT,
- "dockerComposeConfiguration" TEXT,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- "destinationDockerId" TEXT,
- "gitSourceId" TEXT,
- "gitCommitHash" TEXT,
- "baseImage" TEXT,
- "baseBuildImage" TEXT,
- "dockerRegistryId" TEXT,
- CONSTRAINT "Application_gitSourceId_fkey" FOREIGN KEY ("gitSourceId") REFERENCES "GitSource" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
- CONSTRAINT "Application_destinationDockerId_fkey" FOREIGN KEY ("destinationDockerId") REFERENCES "DestinationDocker" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
- CONSTRAINT "Application_dockerRegistryId_fkey" FOREIGN KEY ("dockerRegistryId") REFERENCES "DockerRegistry" ("id") ON DELETE SET NULL ON UPDATE CASCADE
-);
-INSERT INTO "new_Application" ("baseBuildImage", "baseDirectory", "baseImage", "branch", "buildCommand", "buildPack", "configHash", "createdAt", "denoMainFile", "denoOptions", "deploymentType", "destinationDockerId", "dockerComposeConfiguration", "dockerComposeFile", "dockerComposeFileLocation", "dockerFileLocation", "dockerRegistryId", "exposePort", "fqdn", "gitCommitHash", "gitSourceId", "id", "installCommand", "name", "phpModules", "port", "projectId", "publishDirectory", "pythonModule", "pythonVariable", "pythonWSGI", "repository", "startCommand", "updatedAt") SELECT "baseBuildImage", "baseDirectory", "baseImage", "branch", "buildCommand", "buildPack", "configHash", "createdAt", "denoMainFile", "denoOptions", "deploymentType", "destinationDockerId", "dockerComposeConfiguration", "dockerComposeFile", "dockerComposeFileLocation", "dockerFileLocation", "dockerRegistryId", "exposePort", "fqdn", "gitCommitHash", "gitSourceId", "id", "installCommand", "name", "phpModules", "port", "projectId", "publishDirectory", "pythonModule", "pythonVariable", "pythonWSGI", "repository", "startCommand", "updatedAt" FROM "Application";
-DROP TABLE "Application";
-ALTER TABLE "new_Application" RENAME TO "Application";
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20221201115801_simple_dockerfile_deployment/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20221201115801_simple_dockerfile_deployment/migration.sql
deleted file mode 100644
index b3406e59e..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221201115801_simple_dockerfile_deployment/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Application" ADD COLUMN "simpleDockerfile" TEXT;
diff --git a/apps/trpc-experimental/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
deleted file mode 100644
index 9f85d3518..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20221201133847_push_image_to_docker_registry/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Application" ADD COLUMN "dockerRegistryImageName" TEXT;
diff --git a/apps/trpc-experimental/server/prisma/migrations/20230117092356_http2_protocol/migration.sql b/apps/trpc-experimental/server/prisma/migrations/20230117092356_http2_protocol/migration.sql
deleted file mode 100644
index 7b24ac820..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/20230117092356_http2_protocol/migration.sql
+++ /dev/null
@@ -1,24 +0,0 @@
--- RedefineTables
-PRAGMA foreign_keys=OFF;
-CREATE TABLE "new_ApplicationSettings" (
- "id" TEXT NOT NULL PRIMARY KEY,
- "applicationId" TEXT NOT NULL,
- "dualCerts" BOOLEAN NOT NULL DEFAULT false,
- "debug" BOOLEAN NOT NULL DEFAULT false,
- "previews" BOOLEAN NOT NULL DEFAULT false,
- "autodeploy" BOOLEAN NOT NULL DEFAULT true,
- "isBot" BOOLEAN NOT NULL DEFAULT false,
- "isPublicRepository" BOOLEAN NOT NULL DEFAULT false,
- "isDBBranching" BOOLEAN NOT NULL DEFAULT false,
- "isCustomSSL" BOOLEAN NOT NULL DEFAULT false,
- "isHttp2" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" DATETIME NOT NULL,
- CONSTRAINT "ApplicationSettings_applicationId_fkey" FOREIGN KEY ("applicationId") REFERENCES "Application" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
-);
-INSERT INTO "new_ApplicationSettings" ("applicationId", "autodeploy", "createdAt", "debug", "dualCerts", "id", "isBot", "isCustomSSL", "isDBBranching", "isPublicRepository", "previews", "updatedAt") SELECT "applicationId", "autodeploy", "createdAt", "debug", "dualCerts", "id", "isBot", "isCustomSSL", "isDBBranching", "isPublicRepository", "previews", "updatedAt" FROM "ApplicationSettings";
-DROP TABLE "ApplicationSettings";
-ALTER TABLE "new_ApplicationSettings" RENAME TO "ApplicationSettings";
-CREATE UNIQUE INDEX "ApplicationSettings_applicationId_key" ON "ApplicationSettings"("applicationId");
-PRAGMA foreign_key_check;
-PRAGMA foreign_keys=ON;
diff --git a/apps/trpc-experimental/server/prisma/migrations/migration_lock.toml b/apps/trpc-experimental/server/prisma/migrations/migration_lock.toml
deleted file mode 100644
index e5e5c4705..000000000
--- a/apps/trpc-experimental/server/prisma/migrations/migration_lock.toml
+++ /dev/null
@@ -1,3 +0,0 @@
-# Please do not edit this file manually
-# It should be added in your version-control system (i.e. Git)
-provider = "sqlite"
\ No newline at end of file
diff --git a/apps/trpc-experimental/server/prisma/schema.prisma b/apps/trpc-experimental/server/prisma/schema.prisma
deleted file mode 100644
index bb76d83b0..000000000
--- a/apps/trpc-experimental/server/prisma/schema.prisma
+++ /dev/null
@@ -1,707 +0,0 @@
-generator client {
- provider = "prisma-client-js"
- binaryTargets = ["native"]
-}
-
-datasource db {
- provider = "sqlite"
- url = env("COOLIFY_DATABASE_URL")
-}
-
-model Certificate {
- id String @id @default(cuid())
- key String
- cert String
- team Team? @relation(fields: [teamId], references: [id])
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- teamId String?
-}
-
-model Setting {
- id String @id @default(cuid())
- fqdn String? @unique
- dualCerts Boolean @default(false)
- minPort Int @default(9000)
- maxPort Int @default(9100)
- DNSServers String @default("1.1.1.1,8.8.8.8")
- ipv4 String?
- ipv6 String?
- arch String?
- concurrentBuilds Int @default(1)
- applicationStoragePathMigrationFinished Boolean @default(false)
- numberOfDockerImagesKeptLocally Int @default(3)
- proxyDefaultRedirect String?
- doNotTrack Boolean @default(false)
- sentryDSN String?
- previewSeparator String @default(".")
- isAPIDebuggingEnabled Boolean @default(false)
- isRegistrationEnabled Boolean @default(true)
- isAutoUpdateEnabled Boolean @default(false)
- isDNSCheckEnabled Boolean @default(true)
- isTraefikUsed Boolean @default(true)
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
-}
-
-model User {
- id String @id @unique @default(cuid())
- email String @unique
- type String
- password String?
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- permission Permission[]
- teams Team[]
-}
-
-model Permission {
- id String @id @default(cuid())
- userId String
- teamId String
- permission String
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- team Team @relation(fields: [teamId], references: [id])
- user User @relation(fields: [userId], references: [id])
-}
-
-model Team {
- id String @id @default(cuid())
- name String?
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- databaseId String?
- serviceId String?
- permissions Permission[]
- sshKey SshKey[]
- applications Application[]
- database Database[]
- destinationDocker DestinationDocker[]
- gitSources GitSource[]
- gitHubApps GithubApp[]
- gitLabApps GitlabApp[]
- service Service[]
- users User[]
- certificate Certificate[]
- dockerRegistry DockerRegistry[]
-}
-
-model TeamInvitation {
- id String @id @default(cuid())
- uid String
- email String
- teamId String
- teamName String
- permission String
- createdAt DateTime @default(now())
-}
-
-model Application {
- id String @id @default(cuid())
- name String
- fqdn String?
- repository String?
- configHash String?
- branch String?
- buildPack String?
- projectId Int?
- port Int?
- exposePort Int?
- installCommand String?
- buildCommand String?
- startCommand String?
- baseDirectory String?
- publishDirectory String?
- deploymentType String?
- phpModules String?
- pythonWSGI String?
- pythonModule String?
- pythonVariable String?
- dockerFileLocation String?
- denoMainFile String?
- denoOptions String?
- dockerComposeFile String?
- dockerComposeFileLocation String?
- dockerComposeConfiguration String?
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- destinationDockerId String?
- gitSourceId String?
- gitCommitHash String?
- baseImage String?
- baseBuildImage String?
- settings ApplicationSettings?
- dockerRegistryId String?
- dockerRegistryImageName String?
- simpleDockerfile String?
-
- persistentStorage ApplicationPersistentStorage[]
- secrets Secret[]
- teams Team[]
- connectedDatabase ApplicationConnectedDatabase?
- previewApplication PreviewApplication[]
- gitSource GitSource? @relation(fields: [gitSourceId], references: [id])
- destinationDocker DestinationDocker? @relation(fields: [destinationDockerId], references: [id])
- dockerRegistry DockerRegistry? @relation(fields: [dockerRegistryId], references: [id])
-}
-
-model PreviewApplication {
- id String @id @default(cuid())
- pullmergeRequestId String
- sourceBranch String
- isRandomDomain Boolean @default(false)
- customDomain String?
- applicationId String
- application Application @relation(fields: [applicationId], references: [id])
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
-}
-
-model ApplicationConnectedDatabase {
- id String @id @default(cuid())
- applicationId String @unique
- databaseId String?
- hostedDatabaseType String?
- hostedDatabaseHost String?
- hostedDatabasePort Int?
- hostedDatabaseName String?
- hostedDatabaseUser String?
- hostedDatabasePassword String?
- hostedDatabaseDBName String?
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- database Database? @relation(fields: [databaseId], references: [id])
- application Application @relation(fields: [applicationId], references: [id])
-}
-
-model ApplicationSettings {
- id String @id @default(cuid())
- applicationId String @unique
- dualCerts Boolean @default(false)
- debug Boolean @default(false)
- previews Boolean @default(false)
- autodeploy Boolean @default(true)
- isBot Boolean @default(false)
- isPublicRepository Boolean @default(false)
- isDBBranching Boolean @default(false)
- isCustomSSL Boolean @default(false)
- isHttp2 Boolean @default(false)
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- application Application @relation(fields: [applicationId], references: [id])
-}
-
-model ApplicationPersistentStorage {
- id String @id @default(cuid())
- applicationId String
- path String
- oldPath Boolean @default(false)
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- application Application @relation(fields: [applicationId], references: [id])
-
- @@unique([applicationId, path])
-}
-
-model ServicePersistentStorage {
- id String @id @default(cuid())
- serviceId String
- path String
- volumeName String?
- predefined Boolean @default(false)
- containerId String?
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- service Service @relation(fields: [serviceId], references: [id])
-
- @@unique([serviceId, containerId, path])
-}
-
-model Secret {
- id String @id @default(cuid())
- name String
- value String
- isPRMRSecret Boolean @default(false)
- isBuildSecret Boolean @default(false)
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- applicationId String
- application Application @relation(fields: [applicationId], references: [id])
-
- @@unique([name, applicationId, isPRMRSecret])
-}
-
-model ServiceSecret {
- id String @id @default(cuid())
- name String
- value String
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- serviceId String
- service Service @relation(fields: [serviceId], references: [id])
-
- @@unique([name, serviceId])
-}
-
-model BuildLog {
- id String @id @default(cuid())
- applicationId String?
- buildId String
- line String
- time BigInt
-}
-
-model Build {
- id String @id @default(cuid())
- type String
- applicationId String?
- destinationDockerId String?
- gitSourceId String?
- githubAppId String?
- gitlabAppId String?
- commit String?
- pullmergeRequestId String?
- previewApplicationId String?
- forceRebuild Boolean @default(false)
- sourceBranch String?
- sourceRepository String?
- branch String?
- status String? @default("queued")
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
-}
-
-model DestinationDocker {
- id String @id @default(cuid())
- network String @unique
- name String
- engine String?
- remoteEngine Boolean @default(false)
- remoteIpAddress String?
- remoteUser String?
- remotePort Int?
- remoteVerified Boolean @default(false)
- isCoolifyProxyUsed Boolean? @default(false)
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- sshKeyId String?
- sshKey SshKey? @relation(fields: [sshKeyId], references: [id])
- sshLocalPort Int?
- application Application[]
- database Database[]
- service Service[]
- teams Team[]
-}
-
-model SshKey {
- id String @id @default(cuid())
- name String
- privateKey String
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- teamId String?
- team Team? @relation(fields: [teamId], references: [id])
- destinationDocker DestinationDocker[]
-}
-
-model DockerRegistry {
- id String @id @default(cuid())
- name String
- url String
- username String?
- password String?
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- teamId String?
- team Team? @relation(fields: [teamId], references: [id])
- application Application[]
-}
-
-model GitSource {
- id String @id @default(cuid())
- name String
- forPublic Boolean @default(false)
- type String?
- apiUrl String?
- htmlUrl String?
- customPort Int @default(22)
- customUser String @default("git")
- organization String?
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- githubAppId String? @unique
- gitlabAppId String? @unique
- isSystemWide Boolean @default(false)
- gitlabApp GitlabApp? @relation(fields: [gitlabAppId], references: [id])
- githubApp GithubApp? @relation(fields: [githubAppId], references: [id])
- application Application[]
- teams Team[]
-}
-
-model GithubApp {
- id String @id @default(cuid())
- name String? @unique
- appId Int?
- installationId Int?
- clientId String?
- clientSecret String?
- webhookSecret String?
- privateKey String?
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- gitSource GitSource?
- teams Team[]
-}
-
-model GitlabApp {
- id String @id @default(cuid())
- oauthId Int @unique
- groupName String? @unique
- deployKeyId Int?
- privateSshKey String?
- publicSshKey String?
- webhookToken String?
- appId String?
- appSecret String?
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- gitSource GitSource?
- teams Team[]
-}
-
-model Database {
- id String @id @default(cuid())
- name String
- publicPort Int?
- defaultDatabase String?
- type String?
- version String?
- dbUser String?
- dbUserPassword String?
- rootUser String?
- rootUserPassword String?
- destinationDockerId String?
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- destinationDocker DestinationDocker? @relation(fields: [destinationDockerId], references: [id])
- settings DatabaseSettings?
- teams Team[]
- applicationConnectedDatabase ApplicationConnectedDatabase[]
- databaseSecret DatabaseSecret[]
-}
-
-model DatabaseSecret {
- id String @id @default(cuid())
- name String
- value String
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- databaseId String
- database Database @relation(fields: [databaseId], references: [id])
-
- @@unique([name, databaseId])
-}
-
-model DatabaseSettings {
- id String @id @default(cuid())
- databaseId String @unique
- isPublic Boolean @default(false)
- appendOnly Boolean @default(true)
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- database Database @relation(fields: [databaseId], references: [id])
-}
-
-model Service {
- id String @id @default(cuid())
- name String
- fqdn String?
- exposePort Int?
- dualCerts Boolean @default(false)
- type String?
- version String?
- templateVersion String @default("0.0.0")
- destinationDockerId String?
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- destinationDocker DestinationDocker? @relation(fields: [destinationDockerId], references: [id])
- persistentStorage ServicePersistentStorage[]
- serviceSecret ServiceSecret[]
- serviceSetting ServiceSetting[]
- teams Team[]
-
- fider Fider?
- ghost Ghost?
- glitchTip GlitchTip?
- hasura Hasura?
- meiliSearch MeiliSearch?
- minio Minio?
- moodle Moodle?
- plausibleAnalytics PlausibleAnalytics?
- umami Umami?
- vscodeserver Vscodeserver?
- wordpress Wordpress?
- appwrite Appwrite?
- searxng Searxng?
- weblate Weblate?
- taiga Taiga?
-}
-
-model ServiceSetting {
- id String @id @default(cuid())
- serviceId String
- name String
- value String
- variableName String
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- service Service @relation(fields: [serviceId], references: [id])
-
- @@unique([serviceId, name])
-}
-
-model PlausibleAnalytics {
- id String @id @default(cuid())
- email String?
- username String?
- password String
- postgresqlUser String
- postgresqlPassword String
- postgresqlDatabase String
- postgresqlPublicPort Int?
- secretKeyBase String?
- scriptName String @default("plausible.js")
- serviceId String @unique
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- service Service @relation(fields: [serviceId], references: [id])
-}
-
-model Minio {
- id String @id @default(cuid())
- rootUser String
- rootUserPassword String
- publicPort Int?
- apiFqdn String?
- serviceId String @unique
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- service Service @relation(fields: [serviceId], references: [id])
-}
-
-model Vscodeserver {
- id String @id @default(cuid())
- password String
- serviceId String @unique
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- service Service @relation(fields: [serviceId], references: [id])
-}
-
-model Wordpress {
- id String @id @default(cuid())
- extraConfig String?
- tablePrefix String?
- ownMysql Boolean @default(false)
- mysqlHost String?
- mysqlPort Int?
- mysqlUser String?
- mysqlPassword String?
- mysqlRootUser String?
- mysqlRootUserPassword String?
- mysqlDatabase String?
- mysqlPublicPort Int?
- ftpEnabled Boolean @default(false)
- ftpUser String?
- ftpPassword String?
- ftpPublicPort Int?
- ftpHostKey String?
- ftpHostKeyPrivate String?
- serviceId String @unique
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- service Service @relation(fields: [serviceId], references: [id])
-}
-
-model Ghost {
- id String @id @default(cuid())
- defaultEmail String
- defaultPassword String
- mariadbUser String
- mariadbPassword String
- mariadbRootUser String
- mariadbRootUserPassword String
- mariadbDatabase String?
- mariadbPublicPort Int?
- serviceId String @unique
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- service Service @relation(fields: [serviceId], references: [id])
-}
-
-model MeiliSearch {
- id String @id @default(cuid())
- masterKey String
- serviceId String @unique
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- service Service @relation(fields: [serviceId], references: [id])
-}
-
-model Umami {
- id String @id @default(cuid())
- serviceId String @unique
- postgresqlUser String
- postgresqlPassword String
- postgresqlDatabase String
- postgresqlPublicPort Int?
- umamiAdminPassword String
- hashSalt String
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- service Service @relation(fields: [serviceId], references: [id])
-}
-
-model Hasura {
- id String @id @default(cuid())
- serviceId String @unique
- postgresqlUser String
- postgresqlPassword String
- postgresqlDatabase String
- postgresqlPublicPort Int?
- graphQLAdminPassword String
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- service Service @relation(fields: [serviceId], references: [id])
-}
-
-model Fider {
- id String @id @default(cuid())
- serviceId String @unique
- postgresqlUser String
- postgresqlPassword String
- postgresqlDatabase String
- postgresqlPublicPort Int?
- jwtSecret String
- emailNoreply String?
- emailMailgunApiKey String?
- emailMailgunDomain String?
- emailMailgunRegion String @default("EU")
- emailSmtpHost String?
- emailSmtpPort Int?
- emailSmtpUser String?
- emailSmtpPassword String?
- emailSmtpEnableStartTls Boolean @default(false)
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- service Service @relation(fields: [serviceId], references: [id])
-}
-
-model Moodle {
- id String @id @default(cuid())
- serviceId String @unique
- defaultUsername String
- defaultPassword String
- defaultEmail String
- mariadbUser String
- mariadbPassword String
- mariadbRootUser String
- mariadbRootUserPassword String
- mariadbDatabase String
- mariadbPublicPort Int?
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- service Service @relation(fields: [serviceId], references: [id])
-}
-
-model Appwrite {
- id String @id @default(cuid())
- serviceId String @unique
- opensslKeyV1 String
- executorSecret String
- redisPassword String
- mariadbHost String?
- mariadbPort Int @default(3306)
- mariadbUser String
- mariadbPassword String
- mariadbRootUser String
- mariadbRootUserPassword String
- mariadbDatabase String
- mariadbPublicPort Int?
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- service Service @relation(fields: [serviceId], references: [id])
-}
-
-model GlitchTip {
- id String @id @default(cuid())
- postgresqlUser String
- postgresqlPassword String
- postgresqlDatabase String
- postgresqlPublicPort Int?
- secretKeyBase String?
- defaultEmail String
- defaultUsername String
- defaultPassword String
- defaultEmailFrom String @default("glitchtip@domain.tdl")
- emailSmtpHost String? @default("domain.tdl")
- emailSmtpPort Int? @default(25)
- emailSmtpUser String?
- emailSmtpPassword String?
- emailSmtpUseTls Boolean @default(false)
- emailSmtpUseSsl Boolean @default(false)
- emailBackend String?
- mailgunApiKey String?
- sendgridApiKey String?
- enableOpenUserRegistration Boolean @default(true)
- serviceId String @unique
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- service Service @relation(fields: [serviceId], references: [id])
-}
-
-model Searxng {
- id String @id @default(cuid())
- secretKey String
- redisPassword String
- serviceId String @unique
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- service Service @relation(fields: [serviceId], references: [id])
-}
-
-model Weblate {
- id String @id @default(cuid())
- adminPassword String
- postgresqlHost String
- postgresqlPort Int
- postgresqlUser String
- postgresqlPassword String
- postgresqlDatabase String
- postgresqlPublicPort Int?
- serviceId String @unique
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- service Service @relation(fields: [serviceId], references: [id])
-}
-
-model Taiga {
- id String @id @default(cuid())
- secretKey String
- erlangSecret String
- djangoAdminPassword String
- djangoAdminUser String
- rabbitMQUser String
- rabbitMQPassword String
- postgresqlHost String
- postgresqlPort Int
- postgresqlUser String
- postgresqlPassword String
- postgresqlDatabase String
- postgresqlPublicPort Int?
- serviceId String @unique
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- service Service @relation(fields: [serviceId], references: [id])
-}
diff --git a/apps/trpc-experimental/server/prisma/seed.js b/apps/trpc-experimental/server/prisma/seed.js
deleted file mode 100644
index 3d4b16a28..000000000
--- a/apps/trpc-experimental/server/prisma/seed.js
+++ /dev/null
@@ -1,113 +0,0 @@
-const dotEnvExtended = require('dotenv-extended');
-dotEnvExtended.load();
-const crypto = require('crypto');
-const { PrismaClient } = require('@prisma/client');
-const prisma = new PrismaClient();
-const algorithm = 'aes-256-ctr';
-
-async function main() {
- // Enable registration for the first user
- const settingsFound = await prisma.setting.findFirst({});
- if (!settingsFound) {
- await prisma.setting.create({
- data: {
- id: '0',
- arch: process.arch,
- }
- });
- } else {
- await prisma.setting.update({
- where: {
- id: settingsFound.id
- },
- data: {
- id: '0'
- }
- });
- }
- // Create local docker engine
- const localDocker = await prisma.destinationDocker.findFirst({
- where: { engine: '/var/run/docker.sock' }
- });
- if (!localDocker) {
- await prisma.destinationDocker.create({
- data: {
- engine: '/var/run/docker.sock',
- name: 'Local Docker',
- isCoolifyProxyUsed: true,
- network: 'coolify'
- }
- });
- }
-
- // Set auto-update based on env variable
- const isAutoUpdateEnabled = process.env['COOLIFY_AUTO_UPDATE'] === 'true';
- await prisma.setting.update({
- where: {
- id: '0'
- },
- data: {
- isAutoUpdateEnabled
- }
- });
- // Create public github source
- const github = await prisma.gitSource.findFirst({
- where: { htmlUrl: 'https://github.com', forPublic: true }
- });
- if (!github) {
- await prisma.gitSource.create({
- data: {
- apiUrl: 'https://api.github.com',
- htmlUrl: 'https://github.com',
- forPublic: true,
- name: 'Github Public',
- type: 'github'
- }
- });
- }
- // Create public gitlab source
- const gitlab = await prisma.gitSource.findFirst({
- where: { htmlUrl: 'https://gitlab.com', forPublic: true }
- });
- if (!gitlab) {
- await prisma.gitSource.create({
- data: {
- apiUrl: 'https://gitlab.com/api/v4',
- htmlUrl: 'https://gitlab.com',
- forPublic: true,
- name: 'Gitlab Public',
- type: 'gitlab'
- }
- });
- }
- // Set new preview secrets
- const secrets = await prisma.secret.findMany({ where: { isPRMRSecret: false } })
- if (secrets.length > 0) {
- for (const secret of secrets) {
- const previewSecrets = await prisma.secret.findMany({ where: { applicationId: secret.applicationId, name: secret.name, isPRMRSecret: true } })
- if (previewSecrets.length === 0) {
- await prisma.secret.create({ data: { ...secret, id: undefined, isPRMRSecret: true } })
- }
- }
- }
-}
-main()
- .catch((e) => {
- console.error(e);
- process.exit(1);
- })
- .finally(async () => {
- await prisma.$disconnect();
- });
-
-const encrypt = (text) => {
- if (text) {
- const iv = crypto.randomBytes(16);
- const cipher = crypto.createCipheriv(algorithm, process.env['COOLIFY_SECRET_KEY'], iv);
- const encrypted = Buffer.concat([cipher.update(text), cipher.final()]);
- return JSON.stringify({
- iv: iv.toString('hex'),
- content: encrypted.toString('hex')
- });
- }
-};
\ No newline at end of file
diff --git a/apps/trpc-experimental/server/src/api/index.ts b/apps/trpc-experimental/server/src/api/index.ts
deleted file mode 100644
index b47d8358c..000000000
--- a/apps/trpc-experimental/server/src/api/index.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import type { FastifyPluginAsync } from 'fastify';
-
-const root: FastifyPluginAsync = async (fastify): Promise => {
- fastify.get('/', async function (_request, _reply) {
- return { status: 'ok' };
- });
-};
-export default root;
diff --git a/apps/trpc-experimental/server/src/config.ts b/apps/trpc-experimental/server/src/config.ts
deleted file mode 100644
index e45c2a4bd..000000000
--- a/apps/trpc-experimental/server/src/config.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import type { ServerOptions } from './server';
-
-export const serverConfig: ServerOptions = {
- dev: false,
- port: 2022,
- prefix: '/trpc'
-};
diff --git a/apps/trpc-experimental/server/src/env.js b/apps/trpc-experimental/server/src/env.js
deleted file mode 100644
index fece0be52..000000000
--- a/apps/trpc-experimental/server/src/env.js
+++ /dev/null
@@ -1,23 +0,0 @@
-const dotenv = require('dotenv');
-// const isDev = process.env.NODE_ENV === 'development';
-// dotenv.config({ path: isDev ? '../../.env' : '.env' });
-dotenv.config();
-const { z } = require('zod');
-
-/*eslint sort-keys: "error"*/
-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('❌ 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/src/index.ts b/apps/trpc-experimental/server/src/index.ts
deleted file mode 100644
index 8f2d2782e..000000000
--- a/apps/trpc-experimental/server/src/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { serverConfig } from './config';
-import { createServer } from './server';
-
-const server = createServer(serverConfig);
-
-server.start();
-
diff --git a/apps/trpc-experimental/server/src/jobs/applicationBuildQueue.ts b/apps/trpc-experimental/server/src/jobs/applicationBuildQueue.ts
deleted file mode 100644
index 0242d2a11..000000000
--- a/apps/trpc-experimental/server/src/jobs/applicationBuildQueue.ts
+++ /dev/null
@@ -1,851 +0,0 @@
-import { parentPort } from 'node:worker_threads';
-import crypto from 'crypto';
-import fs from 'fs/promises';
-import yaml from 'js-yaml';
-
-import {
- copyBaseConfigurationFiles,
- makeLabelForSimpleDockerfile,
- makeLabelForStandaloneApplication,
- saveBuildLog,
- saveDockerRegistryCredentials,
- setDefaultConfiguration
-} from '../lib/buildPacks/common';
-import {
- createDirectories,
- decrypt,
- getDomain,
- generateSecrets,
- decryptApplication,
- pushToRegistry
-} from '../lib/common';
-import * as importers from '../lib/importers';
-import * as buildpacks from '../lib/buildPacks';
-import { prisma } from '../prisma';
-import { executeCommand } from '../lib/executeCommand';
-import { defaultComposeConfiguration } from '../lib/docker';
-
-(async () => {
- if (parentPort) {
- parentPort.on('message', async (message) => {
- if (message === 'error') throw new Error('oops');
- if (message === 'cancel') {
- parentPort.postMessage('cancelled');
- await prisma.$disconnect();
- process.exit(0);
- }
- });
- const pThrottle = await import('p-throttle');
- const throttle = pThrottle.default({
- limit: 1,
- interval: 2000
- });
-
- const th = throttle(async () => {
- try {
- const queuedBuilds = await prisma.build.findMany({
- where: { status: { in: ['queued', 'running'] } },
- orderBy: { createdAt: 'asc' }
- });
- const { concurrentBuilds } = await prisma.setting.findFirst({});
- if (queuedBuilds.length > 0) {
- 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 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 = decryptApplication(application);
-
- if (!gitSourceId && application.simpleDockerfile) {
- const {
- id: applicationId,
- destinationDocker,
- destinationDockerId,
- secrets,
- port,
- persistentStorage,
- exposePort,
- simpleDockerfile,
- dockerRegistry
- } = application;
- const { workdir } = await createDirectories({ repository: applicationId, buildId });
- try {
- if (queueBuild.status === 'running') {
- await saveBuildLog({
- line: 'Building halted, restarting...',
- buildId,
- applicationId: application.id
- });
- }
- 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}`;
- }) || [];
-
- if (destinationDockerId) {
- await prisma.build.update({
- where: { id: buildId },
- data: { status: 'running' }
- });
- try {
- const { stdout: containers } = await executeCommand({
- dockerId: destinationDockerId,
- command: `docker ps -a --filter 'label=com.docker.compose.service=${applicationId}' --format {{.ID}}`
- });
- if (containers) {
- const containerArray = containers.split('\n');
- if (containerArray.length > 0) {
- for (const container of containerArray) {
- await executeCommand({
- dockerId: destinationDockerId,
- command: `docker stop -t 0 ${container}`
- });
- await executeCommand({
- dockerId: destinationDockerId,
- command: `docker rm --force ${container}`
- });
- }
- }
- }
- } catch (error) {
- //
- }
- let envs = [];
- if (secrets.length > 0) {
- envs = [
- ...envs,
- ...generateSecrets(secrets, pullmergeRequestId, false, port)
- ];
- }
- await fs.writeFile(`${workdir}/Dockerfile`, simpleDockerfile);
- if (dockerRegistry) {
- const { url, username, password } = dockerRegistry;
- await saveDockerRegistryCredentials({ url, username, password, workdir });
- }
-
- const labels = makeLabelForSimpleDockerfile({
- applicationId,
- type,
- port: exposePort ? `${exposePort}:${port}` : port
- });
- try {
- const composeVolumes = volumes.map((volume) => {
- return {
- [`${volume.split(':')[0]}`]: {
- name: volume.split(':')[0]
- }
- };
- });
- const composeFile = {
- version: '3.8',
- services: {
- [applicationId]: {
- build: {
- context: workdir
- },
- image: `${applicationId}:${buildId}`,
- container_name: applicationId,
- volumes,
- labels,
- environment: envs,
- depends_on: [],
- expose: [port],
- ...(exposePort ? { ports: [`${exposePort}:${port}`] } : {}),
- ...defaultComposeConfiguration(destinationDocker.network)
- }
- },
- networks: {
- [destinationDocker.network]: {
- external: true
- }
- },
- volumes: Object.assign({}, ...composeVolumes)
- };
- await fs.writeFile(`${workdir}/docker-compose.yml`, yaml.dump(composeFile));
- await executeCommand({
- debug: true,
- dockerId: destinationDocker.id,
- command: `docker compose --project-directory ${workdir} -f ${workdir}/docker-compose.yml up -d`
- });
- await saveBuildLog({ line: 'Deployed 🎉', buildId, applicationId });
- } catch (error) {
- await saveBuildLog({ line: error, buildId, applicationId });
- const foundBuild = await prisma.build.findUnique({ where: { id: buildId } });
- if (foundBuild) {
- await prisma.build.update({
- where: { id: buildId },
- data: {
- status: 'failed'
- }
- });
- }
- throw new Error(error);
- }
- }
- } catch (error) {
- const foundBuild = await prisma.build.findUnique({ where: { id: buildId } });
- if (foundBuild) {
- await prisma.build.update({
- where: { id: buildId },
- data: {
- status: 'failed'
- }
- });
- }
- if (error !== 1) {
- await saveBuildLog({ line: error, buildId, applicationId: application.id });
- }
- if (error instanceof Error) {
- await saveBuildLog({
- line: error.message,
- buildId,
- applicationId: application.id
- });
- }
- await fs.rm(workdir, { recursive: true, force: true });
- return;
- }
- try {
- if (application.dockerRegistryImageName) {
- const customTag = application.dockerRegistryImageName.split(':')[1] || buildId;
- const imageName = application.dockerRegistryImageName.split(':')[0];
- await saveBuildLog({
- line: `Pushing ${imageName}:${customTag} to Docker Registry... It could take a while...`,
- buildId,
- applicationId: application.id
- });
- await pushToRegistry(application, workdir, buildId, imageName, customTag);
- await saveBuildLog({ line: 'Success', buildId, applicationId: application.id });
- }
- } catch (error) {
- if (error.stdout) {
- await saveBuildLog({ line: error.stdout, buildId, applicationId });
- }
- if (error.stderr) {
- await saveBuildLog({ line: error.stderr, buildId, applicationId });
- }
- } finally {
- await fs.rm(workdir, { recursive: true, force: true });
- await 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 = 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 prisma.previewApplication.findMany({
- where: { applicationId: originalApplicationId, pullmergeRequestId }
- });
- if (previewApplications.length > 0) {
- previewApplicationId = previewApplications[0].id;
- }
- // Previews, we need to get the source branch and set subdomain
- branch = sourceBranch;
- domain = `${pullmergeRequestId}.${domain}`;
- imageId = `${applicationId}-${pullmergeRequestId}`;
- repository = sourceRepository || repository;
- }
- const { workdir, repodir } = await createDirectories({ repository, buildId });
- try {
- if (queueBuild.status === 'running') {
- await saveBuildLog({
- line: 'Building halted, restarting...',
- buildId,
- applicationId: application.id
- });
- }
-
- const currentHash = crypto
- .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 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 prisma.build.update({
- where: { id: buildId },
- data: { status: 'running' }
- });
-
- const configuration = await 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: 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 prisma.build.update({ where: { id: buildId }, data: { commit } });
- } catch (err) {}
-
- if (!pullmergeRequestId) {
- if (configHash !== currentHash) {
- deployNeeded = true;
- if (configHash) {
- await saveBuildLog({
- line: 'Configuration changed',
- buildId,
- applicationId
- });
- }
- } else {
- deployNeeded = false;
- }
- } else {
- deployNeeded = true;
- }
-
- try {
- await executeCommand({
- dockerId: destinationDocker.id,
- command: `docker image inspect ${applicationId}:${tag}`
- });
- imageFoundLocally = true;
- } catch (error) {
- //
- }
- if (dockerRegistry) {
- const { url, username, password } = dockerRegistry;
- location = await saveDockerRegistryCredentials({
- url,
- username,
- password,
- workdir
- });
- }
-
- try {
- await 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 copyBaseConfigurationFiles(
- buildPack,
- workdir,
- buildId,
- applicationId,
- baseImage
- );
- const labels = 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 saveBuildLog({
- line: `Build pack ${buildPack} not found`,
- buildId,
- applicationId
- });
- throw new Error(`Build pack ${buildPack} not found.`);
- }
- } else {
- if (imageFoundRemotely || deployNeeded) {
- await saveBuildLog({
- line: `Container image ${imageFound} found in Docker Registry - reuising it`,
- buildId,
- applicationId
- });
- } else {
- if (imageFoundLocally || deployNeeded) {
- await saveBuildLog({
- line: `Container image ${imageFound} found locally - reuising it`,
- buildId,
- applicationId
- });
- }
- }
- }
-
- if (buildPack === 'compose') {
- const fileYaml = `${workdir}${baseDirectory}${dockerComposeFileLocation}`;
- try {
- const { stdout: containers } = await 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 executeCommand({
- dockerId: destinationDockerId,
- command: `docker stop -t 0 ${container}`
- });
- await executeCommand({
- dockerId: destinationDockerId,
- command: `docker rm --force ${container}`
- });
- }
- }
- }
- } catch (error) {
- //
- }
- try {
- await executeCommand({
- debug,
- buildId,
- applicationId,
- dockerId: destinationDocker.id,
- command: `docker compose --project-directory ${workdir} -f ${fileYaml} up -d`
- });
- await saveBuildLog({ line: 'Deployed 🎉', buildId, applicationId });
- await prisma.build.update({
- where: { id: buildId },
- data: { status: 'success' }
- });
- await prisma.application.update({
- where: { id: applicationId },
- data: { configHash: currentHash }
- });
- } catch (error) {
- await saveBuildLog({ line: error, buildId, applicationId });
- const foundBuild = await prisma.build.findUnique({ where: { id: buildId } });
- if (foundBuild) {
- await prisma.build.update({
- where: { id: buildId },
- data: {
- status: 'failed'
- }
- });
- }
- throw new Error(error);
- }
- } else {
- try {
- const { stdout: containers } = await 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 executeCommand({
- dockerId: destinationDockerId,
- command: `docker stop -t 0 ${container}`
- });
- await executeCommand({
- dockerId: destinationDockerId,
- command: `docker rm --force ${container}`
- });
- }
- }
- }
- } catch (error) {
- //
- }
- let envs = [];
- if (secrets.length > 0) {
- envs = [
- ...envs,
- ...generateSecrets(secrets, pullmergeRequestId, false, port)
- ];
- }
- if (dockerRegistry) {
- const { url, username, password } = dockerRegistry;
- await 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}`] } : {}),
- ...defaultComposeConfiguration(destinationDocker.network)
- }
- },
- networks: {
- [destinationDocker.network]: {
- external: true
- }
- },
- volumes: Object.assign({}, ...composeVolumes)
- };
- await fs.writeFile(`${workdir}/docker-compose.yml`, yaml.dump(composeFile));
- await executeCommand({
- debug,
- dockerId: destinationDocker.id,
- command: `docker compose --project-directory ${workdir} -f ${workdir}/docker-compose.yml up -d`
- });
- await saveBuildLog({ line: 'Deployed 🎉', buildId, applicationId });
- } catch (error) {
- await saveBuildLog({ line: error, buildId, applicationId });
- const foundBuild = await prisma.build.findUnique({ where: { id: buildId } });
- if (foundBuild) {
- await prisma.build.update({
- where: { id: buildId },
- data: {
- status: 'failed'
- }
- });
- }
- throw new Error(error);
- }
-
- if (!pullmergeRequestId)
- await prisma.application.update({
- where: { id: applicationId },
- data: { configHash: currentHash }
- });
- }
- }
- } catch (error) {
- const foundBuild = await prisma.build.findUnique({ where: { id: buildId } });
- if (foundBuild) {
- await prisma.build.update({
- where: { id: buildId },
- data: {
- status: 'failed'
- }
- });
- }
- if (error !== 1) {
- await saveBuildLog({ line: error, buildId, applicationId: application.id });
- }
- if (error instanceof Error) {
- await saveBuildLog({
- line: error.message,
- buildId,
- applicationId: application.id
- });
- }
- await fs.rm(workdir, { recursive: true, force: true });
- return;
- }
- try {
- if (application.dockerRegistryImageName && (!imageFoundRemotely || forceRebuild)) {
- await saveBuildLog({
- line: `Pushing ${imageName}:${customTag} to Docker Registry... It could take a while...`,
- buildId,
- applicationId: application.id
- });
- await pushToRegistry(application, workdir, tag, imageName, customTag);
- await saveBuildLog({ line: 'Success', buildId, applicationId: application.id });
- }
- } catch (error) {
- if (error.stdout) {
- await saveBuildLog({ line: error.stdout, buildId, applicationId });
- }
- if (error.stderr) {
- await saveBuildLog({ line: error.stderr, buildId, applicationId });
- }
- } finally {
- await fs.rm(workdir, { recursive: true, force: true });
- await 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/src/lib/buildPacks/common.ts b/apps/trpc-experimental/server/src/lib/buildPacks/common.ts
deleted file mode 100644
index ebbd83583..000000000
--- a/apps/trpc-experimental/server/src/lib/buildPacks/common.ts
+++ /dev/null
@@ -1,843 +0,0 @@
-import {
- base64Encode,
- decrypt,
- encrypt,
- generateSecrets,
- generateTimestamp,
- getDomain,
- isARM,
- isDev,
- version
-} from '../common';
-import { promises as fs } from 'fs';
-import { day } from '../dayjs';
-import { prisma } from '../../prisma';
-import { executeCommand } from '../executeCommand';
-
-const staticApps = ['static', 'react', 'vuejs', 'svelte', 'gatsby', 'astro', 'eleventy'];
-const nodeBased = [
- 'react',
- 'preact',
- 'vuejs',
- 'svelte',
- 'gatsby',
- 'astro',
- 'eleventy',
- 'node',
- 'nestjs',
- 'nuxtjs',
- 'nextjs'
-];
-
-export function setDefaultBaseImage(
- buildPack: string | null,
- deploymentType: string | null = 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: any = {
- baseImage: null,
- baseBuildImage: null,
- baseImages: [],
- baseBuildImages: []
- };
- if (nodeBased.includes(buildPack)) {
- if (deploymentType === 'static') {
- payload.baseImage = isARM(process.arch) ? 'nginx:alpine' : 'webdevops/nginx:alpine';
- payload.baseImages = 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 = isARM(process.arch) ? 'nginx:alpine' : 'webdevops/nginx:alpine';
- payload.baseImages = 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 = isARM(process.arch)
- ? 'php:8.1-fpm-alpine'
- : 'webdevops/php-apache:8.2-alpine';
- payload.baseImages = isARM(process.arch)
- ? phpVersions.filter((version) => !version.value.includes('webdevops'))
- : phpVersions;
- }
- if (buildPack === 'laravel') {
- payload.baseImage = isARM(process.arch)
- ? 'php:8.1-fpm-alpine'
- : 'webdevops/php-apache:8.2-alpine';
- payload.baseImages = 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;
-}
-
-export const setDefaultConfiguration = async (data: any) => {
- let {
- buildPack,
- port,
- installCommand,
- startCommand,
- buildCommand,
- publishDirectory,
- baseDirectory,
- dockerFileLocation,
- dockerComposeFileLocation,
- denoMainFile
- } = data;
- //@ts-ignore
- const template = scanningTemplates[buildPack];
- if (!port) {
- port = template?.port || 3000;
-
- if (buildPack === 'static') port = 80;
- else if (buildPack === 'node') port = 3000;
- else if (buildPack === 'php') port = 80;
- else if (buildPack === 'python') port = 8000;
- }
- 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
- };
-};
-
-export 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'
- }
-};
-
-export const saveBuildLog = async ({
- line,
- buildId,
- applicationId
-}: {
- line: string;
- buildId: string;
- applicationId: string;
-}): Promise => {
- 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 = `[${generateTimestamp()}] ${line}`;
- const fluentBitUrl = isDev
- ? process.env.COOLIFY_CONTAINER_DEV === 'true'
- ? 'http://coolify-fluentbit:24224'
- : 'http://localhost:24224'
- : 'http://coolify-fluentbit:24224';
-
- if (isDev && !process.env.COOLIFY_CONTAINER_DEV) {
- console.debug(`[${applicationId}] ${addTimestamp}`);
- }
- try {
- return await got.post(`${fluentBitUrl}/${applicationId}_buildlog_${buildId}.csv`, {
- json: {
- line: encrypt(line)
- }
- });
- } catch (error) {
- return await prisma.buildLog.create({
- data: {
- line: addTimestamp,
- buildId,
- time: Number(day().valueOf()),
- applicationId
- }
- });
- }
-};
-
-export async function copyBaseConfigurationFiles(
- buildPack,
- workdir,
- buildId,
- applicationId,
- baseImage
-) {
- try {
- if (buildPack === 'php') {
- await fs.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 fs.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;
- }
-
- }
-
- }
- `
- );
- }
- // TODO: Add more configuration files for other buildpacks, like apache2, etc.
- } catch (error) {
- throw new Error(error);
- }
-}
-
-export function checkPnpm(installCommand = null, buildCommand = null, startCommand = null) {
- return (
- installCommand?.includes('pnpm') ||
- buildCommand?.includes('pnpm') ||
- startCommand?.includes('pnpm')
- );
-}
-
-export async function saveDockerRegistryCredentials({ url, username, password, workdir }) {
- if (!username || !password) {
- return null;
- }
-
- let decryptedPassword = decrypt(password);
- const location = `${workdir}/.docker`;
-
- try {
- await fs.mkdir(`${workdir}/.docker`);
- } catch (error) {
- // console.log(error);
- }
- const payload = JSON.stringify({
- auths: {
- [url]: {
- auth: Buffer.from(`${username}:${decryptedPassword}`).toString('base64')
- }
- }
- });
- await fs.writeFile(`${location}/config.json`, payload);
- return location;
-}
-export 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 prisma.application.findUnique({
- where: { id: applicationId },
- select: { dockerRegistry: true }
- });
- if (dockerRegistry) {
- const { url, username, password } = dockerRegistry;
- location = await saveDockerRegistryCredentials({ url, username, password, workdir });
- }
-
- await 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 prisma.build.findUnique({ where: { id: buildId } });
- if (status === 'canceled') {
- throw new Error('Canceled.');
- }
-}
-export function makeLabelForSimpleDockerfile({ applicationId, port, type }) {
- return [
- 'coolify.managed=true',
- `coolify.version=${version}`,
- `coolify.applicationId=${applicationId}`,
- `coolify.type=standalone-application`
- ];
-}
-export 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 = getDomain(fqdn);
- fqdn = `${protocol}://${pullmergeRequestId}.${domain}`;
- }
- return [
- 'coolify.managed=true',
- `coolify.version=${version}`,
- `coolify.applicationId=${applicationId}`,
- `coolify.type=standalone-application`,
- `coolify.name=${name}`,
- `coolify.configuration=${base64Encode(
- JSON.stringify({
- applicationId,
- fqdn,
- name,
- type,
- pullmergeRequestId,
- buildPack,
- repository,
- branch,
- projectId,
- port,
- commit,
- installCommand,
- buildCommand,
- startCommand,
- baseDirectory,
- publishDirectory
- })
- )}`
- ];
-}
-
-export async function buildCacheImageWithNode(data, imageForBuild) {
- const {
- workdir,
- buildId,
- baseDirectory,
- installCommand,
- buildCommand,
- secrets,
- pullmergeRequestId
- } = data;
- const isPnpm = checkPnpm(installCommand, buildCommand);
- const Dockerfile: Array = [];
- Dockerfile.push(`FROM ${imageForBuild}`);
- Dockerfile.push('WORKDIR /app');
- Dockerfile.push(`LABEL coolify.buildId=${buildId}`);
- if (secrets.length > 0) {
- 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 fs.writeFile(`${workdir}/Dockerfile-cache`, Dockerfile.join('\n'));
- await buildImage({ ...data, isCache: true });
-}
-
-export async function buildCacheImageForLaravel(data, imageForBuild) {
- const { workdir, buildId, secrets, pullmergeRequestId } = data;
- const Dockerfile: Array = [];
- Dockerfile.push(`FROM ${imageForBuild}`);
- Dockerfile.push('WORKDIR /app');
- Dockerfile.push(`LABEL coolify.buildId=${buildId}`);
- if (secrets.length > 0) {
- 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 fs.writeFile(`${workdir}/Dockerfile-cache`, Dockerfile.join('\n'));
- await buildImage({ ...data, isCache: true });
-}
-
-export async function buildCacheImageWithCargo(data, imageForBuild) {
- const { applicationId, workdir, buildId } = data;
-
- const Dockerfile: Array = [];
- 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 fs.writeFile(`${workdir}/Dockerfile-cache`, Dockerfile.join('\n'));
- await buildImage({ ...data, isCache: true });
-}
diff --git a/apps/trpc-experimental/server/src/lib/buildPacks/compose.ts b/apps/trpc-experimental/server/src/lib/buildPacks/compose.ts
deleted file mode 100644
index f34e1fddd..000000000
--- a/apps/trpc-experimental/server/src/lib/buildPacks/compose.ts
+++ /dev/null
@@ -1,137 +0,0 @@
-import { promises as fs } from 'fs';
-import { saveBuildLog } from './common';
-import yaml from 'js-yaml';
-import { generateSecrets } from '../common';
-import { defaultComposeConfiguration } from '../docker';
-import { executeCommand } from '../executeCommand';
-
-export default async function (data) {
- let {
- applicationId,
- debug,
- buildId,
- dockerId,
- network,
- volumes,
- labels,
- workdir,
- baseDirectory,
- secrets,
- pullmergeRequestId,
- dockerComposeConfiguration,
- dockerComposeFileLocation
- } = data;
- const fileYaml = `${workdir}${baseDirectory}${dockerComposeFileLocation}`;
- const dockerComposeRaw = await fs.readFile(fileYaml, 'utf8');
- const dockerComposeYaml = yaml.load(dockerComposeRaw);
- if (!dockerComposeYaml.services) {
- throw 'No Services found in docker-compose file.';
- }
- let envs = [];
- let buildEnvs = [];
- if (secrets.length > 0) {
- envs = [...envs, ...generateSecrets(secrets, pullmergeRequestId, false, null)];
- buildEnvs = [...buildEnvs, ...generateSecrets(secrets, pullmergeRequestId, true, null, true)];
- }
-
- 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'];
- if (Object.keys(environment).length > 0) {
- environment = Object.entries(environment).map(([key, value]) => `${key}=${value}`);
- }
- value['environment'] = [...environment, ...envs];
-
- let build = typeof value['build'] === 'undefined' ? [] : value['build'];
- if (typeof build === 'string') {
- build = { context: build };
- }
- const buildArgs = typeof build['args'] === 'undefined' ? [] : build['args'];
- let finalArgs = [...buildEnvs];
- if (Object.keys(buildArgs).length > 0) {
- for (const arg of buildArgs) {
- const [key, _] = arg.split('=');
- if (finalArgs.filter((env) => env.startsWith(key)).length === 0) {
- finalArgs.push(arg);
- }
- }
- }
- value['build'] = {
- ...build,
- args: finalArgs
- };
-
- value['labels'] = labels;
- // TODO: If we support separated volume for each service, we need to add it here
- 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((network) => {
- networks[network] = {
- name: network
- };
- });
- }
- value['networks'] = [...(value['networks'] || ''), network];
- dockerComposeYaml.services[key] = {
- ...dockerComposeYaml.services[key],
- restart: defaultComposeConfiguration(network).restart,
- deploy: defaultComposeConfiguration(network).deploy
- };
- }
- if (Object.keys(composeVolumes).length > 0) {
- dockerComposeYaml['volumes'] = { ...composeVolumes };
- }
- dockerComposeYaml['networks'] = Object.assign({ ...networks }, { [network]: { external: true } });
-
- await fs.writeFile(fileYaml, yaml.dump(dockerComposeYaml));
- await executeCommand({
- debug,
- buildId,
- applicationId,
- dockerId,
- command: `docker compose --project-directory ${workdir} -f ${fileYaml} pull`
- });
- await saveBuildLog({ line: 'Pulling images from Compose file...', buildId, applicationId });
- await executeCommand({
- debug,
- buildId,
- applicationId,
- dockerId,
- command: `docker compose --project-directory ${workdir} -f ${fileYaml} build --progress plain`
- });
- await saveBuildLog({ line: 'Building images from Compose file...', buildId, applicationId });
-}
diff --git a/apps/trpc-experimental/server/src/lib/buildPacks/deno.ts b/apps/trpc-experimental/server/src/lib/buildPacks/deno.ts
deleted file mode 100644
index 2649e3d0a..000000000
--- a/apps/trpc-experimental/server/src/lib/buildPacks/deno.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { promises as fs } from 'fs';
-import { generateSecrets } from '../common';
-import { buildImage } from './common';
-
-const createDockerfile = async (data, image): Promise => {
- const {
- workdir,
- port,
- baseDirectory,
- secrets,
- pullmergeRequestId,
- denoMainFile,
- denoOptions,
- buildId
- } = data;
- const Dockerfile: Array = [];
-
- let depsFound = false;
- try {
- await fs.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) {
- 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 fs.writeFile(`${workdir}/Dockerfile`, Dockerfile.join('\n'));
-};
-
-export default async function (data) {
- try {
- const { baseImage, baseBuildImage } = data;
- await createDockerfile(data, baseImage);
- await buildImage(data);
- } catch (error) {
- throw error;
- }
-}
diff --git a/apps/trpc-experimental/server/src/lib/buildPacks/docker.ts b/apps/trpc-experimental/server/src/lib/buildPacks/docker.ts
deleted file mode 100644
index e02103f88..000000000
--- a/apps/trpc-experimental/server/src/lib/buildPacks/docker.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { promises as fs } from 'fs';
-import { generateSecrets } from '../common';
-import { buildImage } from './common';
-
-export default async function (data) {
- let { workdir, buildId, baseDirectory, secrets, pullmergeRequestId, dockerFileLocation } = data;
- const file = `${workdir}${baseDirectory}${dockerFileLocation}`;
- data.workdir = `${workdir}${baseDirectory}`;
- const DockerfileRaw = await fs.readFile(`${file}`, 'utf8');
- const Dockerfile: Array = 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) {
- generateSecrets(secrets, pullmergeRequestId, true).forEach((env) => {
- Dockerfile.forEach((line, index) => {
- if (line.startsWith('FROM')) {
- Dockerfile.splice(index + 1, 0, env);
- }
- });
- });
- }
- await fs.writeFile(`${data.workdir}${dockerFileLocation}`, Dockerfile.join('\n'));
- await buildImage(data);
-}
diff --git a/apps/trpc-experimental/server/src/lib/buildPacks/gatsby.ts b/apps/trpc-experimental/server/src/lib/buildPacks/gatsby.ts
deleted file mode 100644
index fbb0a933f..000000000
--- a/apps/trpc-experimental/server/src/lib/buildPacks/gatsby.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { promises as fs } from 'fs';
-import { buildCacheImageWithNode, buildImage } from './common';
-
-const createDockerfile = async (data, imageforBuild): Promise => {
- const { applicationId, tag, workdir, publishDirectory, baseImage, buildId, port } = data;
- const Dockerfile: Array = [];
-
- 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 fs.writeFile(`${workdir}/Dockerfile`, Dockerfile.join('\n'));
-};
-
-export default async function (data) {
- try {
- const { baseImage, baseBuildImage } = data;
- await buildCacheImageWithNode(data, baseBuildImage);
- await createDockerfile(data, baseImage);
- await buildImage(data);
- } catch (error) {
- throw error;
- }
-}
diff --git a/apps/trpc-experimental/server/src/lib/buildPacks/heroku.ts b/apps/trpc-experimental/server/src/lib/buildPacks/heroku.ts
deleted file mode 100644
index a58fd8fcf..000000000
--- a/apps/trpc-experimental/server/src/lib/buildPacks/heroku.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { executeCommand } from "../executeCommand";
-import { saveBuildLog } from "./common";
-
-export default async function (data: any): Promise {
- const { buildId, applicationId, tag, dockerId, debug, workdir, baseDirectory, baseImage } = data
- try {
- await saveBuildLog({ line: `Building production image...`, buildId, applicationId });
- await executeCommand({
- buildId,
- debug,
- dockerId,
- command: `pack build -p ${workdir}${baseDirectory} ${applicationId}:${tag} --builder ${baseImage}`
- })
- } catch (error) {
- throw error;
- }
-}
diff --git a/apps/trpc-experimental/server/src/lib/buildPacks/index.ts b/apps/trpc-experimental/server/src/lib/buildPacks/index.ts
deleted file mode 100644
index fa10e4bcd..000000000
--- a/apps/trpc-experimental/server/src/lib/buildPacks/index.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import node from './node';
-import staticApp from './static';
-import docker from './docker';
-import gatsby from './gatsby';
-import svelte from './svelte';
-import react from './react';
-import nestjs from './nestjs';
-import nextjs from './nextjs';
-import nuxtjs from './nuxtjs';
-import vuejs from './vuejs';
-import php from './php';
-import rust from './rust';
-import astro from './static';
-import eleventy from './static';
-import python from './python';
-import deno from './deno';
-import laravel from './laravel';
-import heroku from './heroku';
-import compose from './compose';
-
-export {
- node,
- staticApp,
- docker,
- gatsby,
- svelte,
- react,
- nestjs,
- nextjs,
- nuxtjs,
- vuejs,
- php,
- rust,
- astro,
- eleventy,
- python,
- deno,
- laravel,
- heroku,
- compose
-};
diff --git a/apps/trpc-experimental/server/src/lib/buildPacks/laravel.ts b/apps/trpc-experimental/server/src/lib/buildPacks/laravel.ts
deleted file mode 100644
index 159e8d9ca..000000000
--- a/apps/trpc-experimental/server/src/lib/buildPacks/laravel.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { promises as fs } from 'fs';
-import { generateSecrets } from '../common';
-import { buildCacheImageForLaravel, buildImage } from './common';
-
-const createDockerfile = async (data, image): Promise => {
- const { workdir, applicationId, tag, buildId, port, secrets, pullmergeRequestId } = data;
- const Dockerfile: Array = [];
-
- Dockerfile.push(`FROM ${image}`);
- Dockerfile.push(`LABEL coolify.buildId=${buildId}`);
- if (secrets.length > 0) {
- 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 fs.writeFile(`${workdir}/Dockerfile`, Dockerfile.join('\n'));
-};
-
-export default async function (data) {
- const { baseImage, baseBuildImage } = data;
- try {
- await buildCacheImageForLaravel(data, baseBuildImage);
- await createDockerfile(data, baseImage);
- await buildImage(data);
- } catch (error) {
- throw error;
- }
-}
diff --git a/apps/trpc-experimental/server/src/lib/buildPacks/nestjs.ts b/apps/trpc-experimental/server/src/lib/buildPacks/nestjs.ts
deleted file mode 100644
index 90c99301b..000000000
--- a/apps/trpc-experimental/server/src/lib/buildPacks/nestjs.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { promises as fs } from 'fs';
-import { buildCacheImageWithNode, buildImage } from './common';
-
-const createDockerfile = async (data, image): Promise => {
- const { buildId, applicationId, tag, port, startCommand, workdir, baseDirectory } = data;
- const Dockerfile: Array = [];
- 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 fs.writeFile(`${workdir}/Dockerfile`, Dockerfile.join('\n'));
-};
-
-export default async function (data) {
- try {
- const { baseImage, baseBuildImage } = data;
- await buildCacheImageWithNode(data, baseBuildImage);
- await createDockerfile(data, baseImage);
- await buildImage(data);
- } catch (error) {
- throw error;
- }
-}
diff --git a/apps/trpc-experimental/server/src/lib/buildPacks/nextjs.ts b/apps/trpc-experimental/server/src/lib/buildPacks/nextjs.ts
deleted file mode 100644
index 957dc5bce..000000000
--- a/apps/trpc-experimental/server/src/lib/buildPacks/nextjs.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-import { promises as fs } from 'fs';
-import { generateSecrets } from '../common';
-import { buildCacheImageWithNode, buildImage, checkPnpm } from './common';
-
-const createDockerfile = async (data, image): Promise => {
- const {
- applicationId,
- buildId,
- tag,
- workdir,
- publishDirectory,
- port,
- installCommand,
- buildCommand,
- startCommand,
- baseDirectory,
- secrets,
- pullmergeRequestId,
- deploymentType,
- baseImage
- } = data;
- const Dockerfile: Array = [];
- const isPnpm = checkPnpm(installCommand, buildCommand, startCommand);
- Dockerfile.push(`FROM ${image}`);
- Dockerfile.push('WORKDIR /app');
- Dockerfile.push(`LABEL coolify.buildId=${buildId}`);
- if (secrets.length > 0) {
- 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 fs.writeFile(`${workdir}/Dockerfile`, Dockerfile.join('\n'));
-};
-
-export default async function (data) {
- try {
- const { baseImage, baseBuildImage, deploymentType, buildCommand } = data;
- if (deploymentType === 'node') {
- await createDockerfile(data, baseImage);
- await buildImage(data);
- } else if (deploymentType === 'static') {
- if (buildCommand) await buildCacheImageWithNode(data, baseBuildImage);
- await createDockerfile(data, baseImage);
- await buildImage(data);
- }
- } catch (error) {
- throw error;
- }
-}
diff --git a/apps/trpc-experimental/server/src/lib/buildPacks/node.ts b/apps/trpc-experimental/server/src/lib/buildPacks/node.ts
deleted file mode 100644
index 8ccfcc68e..000000000
--- a/apps/trpc-experimental/server/src/lib/buildPacks/node.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { promises as fs } from 'fs';
-import { generateSecrets } from '../common';
-import { buildImage, checkPnpm } from './common';
-
-const createDockerfile = async (data, image): Promise => {
- const {
- workdir,
- port,
- installCommand,
- buildCommand,
- startCommand,
- baseDirectory,
- secrets,
- pullmergeRequestId,
- buildId
- } = data;
- const Dockerfile: Array = [];
- const isPnpm = checkPnpm(installCommand, buildCommand, startCommand);
-
- Dockerfile.push(`FROM ${image}`);
- Dockerfile.push('WORKDIR /app');
- Dockerfile.push(`LABEL coolify.buildId=${buildId}`);
- if (secrets.length > 0) {
- 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 fs.writeFile(`${workdir}/Dockerfile`, Dockerfile.join('\n'));
-};
-
-export default async function (data) {
- try {
- const { baseImage } = data;
- await createDockerfile(data, baseImage);
- await buildImage(data);
- } catch (error) {
- throw error;
- }
-}
diff --git a/apps/trpc-experimental/server/src/lib/buildPacks/nuxtjs.ts b/apps/trpc-experimental/server/src/lib/buildPacks/nuxtjs.ts
deleted file mode 100644
index 957dc5bce..000000000
--- a/apps/trpc-experimental/server/src/lib/buildPacks/nuxtjs.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-import { promises as fs } from 'fs';
-import { generateSecrets } from '../common';
-import { buildCacheImageWithNode, buildImage, checkPnpm } from './common';
-
-const createDockerfile = async (data, image): Promise => {
- const {
- applicationId,
- buildId,
- tag,
- workdir,
- publishDirectory,
- port,
- installCommand,
- buildCommand,
- startCommand,
- baseDirectory,
- secrets,
- pullmergeRequestId,
- deploymentType,
- baseImage
- } = data;
- const Dockerfile: Array = [];
- const isPnpm = checkPnpm(installCommand, buildCommand, startCommand);
- Dockerfile.push(`FROM ${image}`);
- Dockerfile.push('WORKDIR /app');
- Dockerfile.push(`LABEL coolify.buildId=${buildId}`);
- if (secrets.length > 0) {
- 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 fs.writeFile(`${workdir}/Dockerfile`, Dockerfile.join('\n'));
-};
-
-export default async function (data) {
- try {
- const { baseImage, baseBuildImage, deploymentType, buildCommand } = data;
- if (deploymentType === 'node') {
- await createDockerfile(data, baseImage);
- await buildImage(data);
- } else if (deploymentType === 'static') {
- if (buildCommand) await buildCacheImageWithNode(data, baseBuildImage);
- await createDockerfile(data, baseImage);
- await buildImage(data);
- }
- } catch (error) {
- throw error;
- }
-}
diff --git a/apps/trpc-experimental/server/src/lib/buildPacks/php.ts b/apps/trpc-experimental/server/src/lib/buildPacks/php.ts
deleted file mode 100644
index abfd7af4f..000000000
--- a/apps/trpc-experimental/server/src/lib/buildPacks/php.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { promises as fs } from 'fs';
-import { generateSecrets } from '../common';
-import { buildImage } from './common';
-
-const createDockerfile = async (data, image, htaccessFound): Promise => {
- const { workdir, baseDirectory, buildId, port, secrets, pullmergeRequestId } = data;
- const Dockerfile: Array = [];
- let composerFound = false;
- try {
- await fs.readFile(`${workdir}${baseDirectory || ''}/composer.json`);
- composerFound = true;
- } catch (error) {}
-
- Dockerfile.push(`FROM ${image}`);
- Dockerfile.push(`LABEL coolify.buildId=${buildId}`);
- if (secrets.length > 0) {
- 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 fs.writeFile(`${workdir}/Dockerfile`, Dockerfile.join('\n'));
-};
-
-export default async function (data) {
- const { workdir, baseDirectory, baseImage } = data;
- try {
- let htaccessFound = false;
- try {
- await fs.readFile(`${workdir}${baseDirectory || ''}/.htaccess`);
- htaccessFound = true;
- } catch (e) {
- //
- }
- await createDockerfile(data, baseImage, htaccessFound);
- await buildImage(data);
- } catch (error) {
- throw error;
- }
-}
diff --git a/apps/trpc-experimental/server/src/lib/buildPacks/python.ts b/apps/trpc-experimental/server/src/lib/buildPacks/python.ts
deleted file mode 100644
index 56294660f..000000000
--- a/apps/trpc-experimental/server/src/lib/buildPacks/python.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import { promises as fs } from 'fs';
-import { generateSecrets } from '../common';
-import { buildImage } from './common';
-
-const createDockerfile = async (data, image): Promise => {
- const {
- workdir,
- port,
- baseDirectory,
- secrets,
- pullmergeRequestId,
- pythonWSGI,
- pythonModule,
- pythonVariable,
- buildId
- } = data;
- const Dockerfile: Array = [];
- Dockerfile.push(`FROM ${image}`);
- Dockerfile.push('WORKDIR /app');
- Dockerfile.push(`LABEL coolify.buildId=${buildId}`);
- if (secrets.length > 0) {
- 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`);
- // Dockerfile.push(`RUN pip install --no-cache-dir uwsgi`)
- }
-
- try {
- await fs.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 fs.writeFile(`${workdir}/Dockerfile`, Dockerfile.join('\n'));
-};
-
-export default async function (data) {
- try {
- const { baseImage, baseBuildImage } = data;
- await createDockerfile(data, baseImage);
- await buildImage(data);
- } catch (error) {
- throw error;
- }
-}
diff --git a/apps/trpc-experimental/server/src/lib/buildPacks/react.ts b/apps/trpc-experimental/server/src/lib/buildPacks/react.ts
deleted file mode 100644
index e85704d3f..000000000
--- a/apps/trpc-experimental/server/src/lib/buildPacks/react.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { promises as fs } from 'fs';
-import { buildCacheImageWithNode, buildImage } from './common';
-
-const createDockerfile = async (data, image): Promise => {
- const { applicationId, tag, workdir, publishDirectory, baseImage, buildId, port } = data;
- const Dockerfile: Array = [];
-
- 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 fs.writeFile(`${workdir}/Dockerfile`, Dockerfile.join('\n'));
-};
-
-export default async function (data) {
- try {
- const { baseImage, baseBuildImage } = data;
- await buildCacheImageWithNode(data, baseBuildImage);
- await createDockerfile(data, baseImage);
- await buildImage(data);
- } catch (error) {
- throw error;
- }
-}
diff --git a/apps/trpc-experimental/server/src/lib/buildPacks/rust.ts b/apps/trpc-experimental/server/src/lib/buildPacks/rust.ts
deleted file mode 100644
index f3c9ef918..000000000
--- a/apps/trpc-experimental/server/src/lib/buildPacks/rust.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { promises as fs } from 'fs';
-import TOML from '@iarna/toml';
-import { buildCacheImageWithCargo, buildImage } from './common';
-import { executeCommand } from '../executeCommand';
-
-const createDockerfile = async (data, image, name): Promise => {
- const { workdir, port, applicationId, tag, buildId } = data;
- const Dockerfile: Array = [];
- 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 fs.writeFile(`${workdir}/Dockerfile`, Dockerfile.join('\n'));
-};
-
-export default async function (data) {
- try {
- const { workdir, baseImage, baseBuildImage } = data;
- const { stdout: cargoToml } = await executeCommand({ command: `cat ${workdir}/Cargo.toml` });
- const parsedToml: any = TOML.parse(cargoToml);
- const name = parsedToml.package.name;
- await buildCacheImageWithCargo(data, baseBuildImage);
- await createDockerfile(data, baseImage, name);
- await buildImage(data);
- } catch (error) {
- throw error;
- }
-}
diff --git a/apps/trpc-experimental/server/src/lib/buildPacks/static.ts b/apps/trpc-experimental/server/src/lib/buildPacks/static.ts
deleted file mode 100644
index 19b13cef3..000000000
--- a/apps/trpc-experimental/server/src/lib/buildPacks/static.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import { promises as fs } from 'fs';
-import { generateSecrets } from '../common';
-import { buildCacheImageWithNode, buildImage } from './common';
-
-const createDockerfile = async (data, image): Promise => {
- const {
- applicationId,
- tag,
- workdir,
- buildCommand,
- baseDirectory,
- publishDirectory,
- secrets,
- pullmergeRequestId,
- baseImage,
- buildId,
- port
- } = data;
- const Dockerfile: Array = [];
-
- 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) {
- 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 fs.writeFile(`${workdir}/Dockerfile`, Dockerfile.join('\n'));
-};
-
-export default async function (data) {
- try {
- const { baseImage, baseBuildImage } = data;
- if (data.buildCommand) await buildCacheImageWithNode(data, baseBuildImage);
- await createDockerfile(data, baseImage);
- await buildImage(data);
- } catch (error) {
- throw error;
- }
-}
diff --git a/apps/trpc-experimental/server/src/lib/buildPacks/svelte.ts b/apps/trpc-experimental/server/src/lib/buildPacks/svelte.ts
deleted file mode 100644
index 56fc12d7a..000000000
--- a/apps/trpc-experimental/server/src/lib/buildPacks/svelte.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { promises as fs } from 'fs';
-import { buildCacheImageWithNode, buildImage } from './common';
-
-const createDockerfile = async (data, image): Promise => {
- const { applicationId, tag, workdir, publishDirectory, baseImage, buildId, port } = data;
- const Dockerfile: Array = [];
-
- 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 fs.writeFile(`${workdir}/Dockerfile`, Dockerfile.join('\n'));
-};
-
-export default async function (data) {
- try {
- const { baseImage, baseBuildImage } = data;
- await buildCacheImageWithNode(data, baseBuildImage);
- await createDockerfile(data, baseImage);
- await buildImage(data);
- } catch (error) {
- throw error;
- }
-}
diff --git a/apps/trpc-experimental/server/src/lib/buildPacks/vuejs.ts b/apps/trpc-experimental/server/src/lib/buildPacks/vuejs.ts
deleted file mode 100644
index 56fc12d7a..000000000
--- a/apps/trpc-experimental/server/src/lib/buildPacks/vuejs.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { promises as fs } from 'fs';
-import { buildCacheImageWithNode, buildImage } from './common';
-
-const createDockerfile = async (data, image): Promise => {
- const { applicationId, tag, workdir, publishDirectory, baseImage, buildId, port } = data;
- const Dockerfile: Array = [];
-
- 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 fs.writeFile(`${workdir}/Dockerfile`, Dockerfile.join('\n'));
-};
-
-export default async function (data) {
- try {
- const { baseImage, baseBuildImage } = data;
- await buildCacheImageWithNode(data, baseBuildImage);
- await createDockerfile(data, baseImage);
- await buildImage(data);
- } catch (error) {
- throw error;
- }
-}
diff --git a/apps/trpc-experimental/server/src/lib/common.ts b/apps/trpc-experimental/server/src/lib/common.ts
deleted file mode 100644
index 70893ff3b..000000000
--- a/apps/trpc-experimental/server/src/lib/common.ts
+++ /dev/null
@@ -1,939 +0,0 @@
-import type { Permission, Setting, Team, TeamInvitation, User } from '@prisma/client';
-import { prisma } from '../prisma';
-import bcrypt from 'bcryptjs';
-import crypto from 'crypto';
-import { promises as dns } from 'dns';
-import fs from 'fs/promises';
-import { uniqueNamesGenerator, adjectives, colors, animals } from 'unique-names-generator';
-import type { Config } from 'unique-names-generator';
-import { env } from '../env';
-import { day } from './dayjs';
-import { executeCommand } from './executeCommand';
-import { saveBuildLog } from './logging';
-import { checkContainer } from './docker';
-import yaml from 'js-yaml';
-
-const customConfig: Config = {
- dictionaries: [adjectives, colors, animals],
- style: 'capital',
- separator: ' ',
- length: 3
-};
-const algorithm = 'aes-256-ctr';
-export const isDev = env.NODE_ENV === 'development';
-export const version = '3.13.0';
-export const sentryDSN =
- 'https://409f09bcb7af47928d3e0f46b78987f3@o1082494.ingest.sentry.io/4504236622217216';
-export const defaultTraefikImage = `traefik:v2.8`;
-export 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';
-}
-
-export 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';
-
-export async function listSettings(): Promise {
- return await prisma.setting.findUnique({ where: { id: '0' } });
-}
-export async function getCurrentUser(
- userId: string
-): Promise<(User & { permission: Permission[]; teams: Team[] }) | null> {
- return await prisma.user.findUnique({
- where: { id: userId },
- include: { teams: true, permission: true }
- });
-}
-export async function getTeamInvitation(userId: string): Promise {
- return await prisma.teamInvitation.findMany({ where: { uid: userId } });
-}
-
-export async function hashPassword(password: string): Promise {
- const saltRounds = 15;
- return bcrypt.hash(password, saltRounds);
-}
-export async function comparePassword(password: string, hashedPassword: string): Promise {
- return bcrypt.compare(password, hashedPassword);
-}
-export const uniqueName = (): string => uniqueNamesGenerator(customConfig);
-
-export const decrypt = (hashString: string) => {
- if (hashString) {
- try {
- const hash = JSON.parse(hashString);
- const decipher = crypto.createDecipheriv(
- algorithm,
- 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;
-};
-
-export function generateRangeArray(start: number, end: number) {
- return Array.from({ length: end - start }, (_v, k) => k + start);
-}
-export function generateTimestamp(): string {
- return `${day().format('HH:mm:ss.SSS')}`;
-}
-export const encrypt = (text: string) => {
- if (text) {
- const iv = crypto.randomBytes(16);
- const cipher = crypto.createCipheriv(algorithm, 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;
-};
-
-export async function getTemplates() {
- const templatePath = isDev ? './templates.json' : '/app/templates.json';
- const open = await fs.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: { arch: string }) => d.arch !== 'amd64');
- }
- return jsonData;
- } catch (error) {
- return [];
- } finally {
- await open?.close();
- }
-}
-export function isARM(arch: string) {
- if (arch === 'arm' || arch === 'arm64' || arch === 'aarch' || arch === 'aarch64') {
- return true;
- }
- return false;
-}
-
-export async function removeService({ id }: { id: string }): Promise {
- await prisma.serviceSecret.deleteMany({ where: { serviceId: id } });
- await prisma.serviceSetting.deleteMany({ where: { serviceId: id } });
- await prisma.servicePersistentStorage.deleteMany({ where: { serviceId: id } });
- await prisma.meiliSearch.deleteMany({ where: { serviceId: id } });
- await prisma.fider.deleteMany({ where: { serviceId: id } });
- await prisma.ghost.deleteMany({ where: { serviceId: id } });
- await prisma.umami.deleteMany({ where: { serviceId: id } });
- await prisma.hasura.deleteMany({ where: { serviceId: id } });
- await prisma.plausibleAnalytics.deleteMany({ where: { serviceId: id } });
- await prisma.minio.deleteMany({ where: { serviceId: id } });
- await prisma.vscodeserver.deleteMany({ where: { serviceId: id } });
- await prisma.wordpress.deleteMany({ where: { serviceId: id } });
- await prisma.glitchTip.deleteMany({ where: { serviceId: id } });
- await prisma.moodle.deleteMany({ where: { serviceId: id } });
- await prisma.appwrite.deleteMany({ where: { serviceId: id } });
- await prisma.searxng.deleteMany({ where: { serviceId: id } });
- await prisma.weblate.deleteMany({ where: { serviceId: id } });
- await prisma.taiga.deleteMany({ where: { serviceId: id } });
-
- await prisma.service.delete({ where: { id } });
-}
-
-export const createDirectories = async ({
- repository,
- buildId
-}: {
- repository: string;
- buildId: string;
-}): Promise<{ workdir: string; repodir: string }> => {
- if (repository) repository = repository.replaceAll(' ', '');
- const repodir = `/tmp/build-sources/${repository}/`;
- const workdir = `/tmp/build-sources/${repository}/${buildId}`;
- let workdirFound = false;
- try {
- workdirFound = !!(await fs.stat(workdir));
- } catch (error) {}
- if (workdirFound) {
- await executeCommand({ command: `rm -fr ${workdir}` });
- }
- await executeCommand({ command: `mkdir -p ${workdir}` });
- return {
- workdir,
- repodir
- };
-};
-
-export async function saveDockerRegistryCredentials({ url, username, password, workdir }) {
- if (!username || !password) {
- return null;
- }
-
- let decryptedPassword = decrypt(password);
- const location = `${workdir}/.docker`;
-
- try {
- await fs.mkdir(`${workdir}/.docker`);
- } catch (error) {
- console.log(error);
- }
- const payload = JSON.stringify({
- auths: {
- [url]: {
- auth: Buffer.from(`${username}:${decryptedPassword}`).toString('base64')
- }
- }
- });
- await fs.writeFile(`${location}/config.json`, payload);
- return location;
-}
-export function getDomain(domain: string): string {
- if (domain) {
- return domain?.replace('https://', '').replace('http://', '');
- } else {
- return '';
- }
-}
-
-export async function isDomainConfigured({
- id,
- fqdn,
- checkOwn = false,
- remoteIpAddress = undefined
-}: {
- id: string;
- fqdn: string;
- checkOwn?: boolean;
- remoteIpAddress?: string;
-}): Promise {
- const domain = getDomain(fqdn);
- const nakedDomain = domain.replace('www.', '');
- const foundApp = await 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 prisma.service.findFirst({
- where: {
- OR: [
- { fqdn: { endsWith: `//${nakedDomain}` } },
- { fqdn: { endsWith: `//www.${nakedDomain}` } }
- ],
- id: { not: checkOwn ? undefined : id },
- destinationDocker: {
- remoteIpAddress
- }
- },
- select: { fqdn: true }
- });
-
- const coolifyFqdn = await prisma.setting.findFirst({
- where: {
- OR: [
- { fqdn: { endsWith: `//${nakedDomain}` } },
- { fqdn: { endsWith: `//www.${nakedDomain}` } }
- ],
- id: { not: id }
- },
- select: { fqdn: true }
- });
- return !!(foundApp || foundService || coolifyFqdn);
-}
-
-export async function checkExposedPort({
- id,
- configuredPort,
- exposePort,
- engine,
- remoteEngine,
- remoteIpAddress
-}: {
- id: string;
- configuredPort?: number;
- exposePort: number;
- engine: string;
- remoteEngine: boolean;
- remoteIpAddress?: string;
-}) {
- 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.` };
- }
- }
-}
-export async function getFreeExposedPort(id, exposePort, engine, remoteEngine, remoteIpAddress) {
- const { default: checkPort } = await import('is-port-reachable');
- if (remoteEngine) {
- const applicationUsed = await (
- await prisma.application.findMany({
- where: {
- exposePort: { not: null },
- id: { not: id },
- destinationDocker: { remoteIpAddress }
- },
- select: { exposePort: true }
- })
- ).map((a) => a.exposePort);
- const serviceUsed = await (
- await 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 prisma.application.findMany({
- where: { exposePort: { not: null }, id: { not: id }, destinationDocker: { engine } },
- select: { exposePort: true }
- })
- ).map((a) => a.exposePort);
- const serviceUsed = await (
- await 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;
- }
-}
-
-export async function checkDomainsIsValidInDNS({ hostname, fqdn, dualCerts }): Promise {
- 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) {
- dns.setServers([...DNSServers.split(',')]);
- }
-
- let resolves = [];
- try {
- if (isIP(hostname)) {
- resolves = [hostname];
- } else {
- resolves = await dns.resolve4(hostname);
- }
- } catch (error) {
- throw { status: 500, message: `Could not determine IP address for ${hostname}.` };
- }
-
- if (dualCerts) {
- try {
- const ipDomain = await dns.resolve4(domain);
- const ipDomainDualCert = await dns.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 dns.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.`
- };
- }
- }
-}
-export const setDefaultConfiguration = async (data: any) => {
- let {
- buildPack,
- port,
- installCommand,
- startCommand,
- buildCommand,
- publishDirectory,
- baseDirectory,
- dockerFileLocation,
- dockerComposeFileLocation,
- denoMainFile
- } = data;
- //@ts-ignore
- const template = scanningTemplates[buildPack];
- if (!port) {
- port = template?.port || 3000;
-
- if (buildPack === 'static') port = 80;
- else if (buildPack === 'node') port = 3000;
- else if (buildPack === 'php') port = 80;
- else if (buildPack === 'python') port = 8000;
- }
- 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
- };
-};
-
-export 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'
- }
-};
-
-export async function cleanupDB(buildId: string, applicationId: string) {
- const data = await prisma.build.findUnique({ where: { id: buildId } });
- if (data?.status === 'queued' || data?.status === 'running') {
- await prisma.build.update({ where: { id: buildId }, data: { status: 'canceled' } });
- }
- await saveBuildLog({ line: 'Canceled.', buildId, applicationId });
-}
-
-export const base64Encode = (text: string): string => {
- return Buffer.from(text).toString('base64');
-};
-export const base64Decode = (text: string): string => {
- 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}`;
- }
- }
-}
-export function generateSecrets(
- secrets: Array,
- pullmergeRequestId: string,
- isBuild = false,
- port = null,
- compose = false
-): Array {
- 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) || (!isBuild && secret.isBuildSecret)) {
- return;
- }
- const build = isBuild && secret.isBuildSecret;
- envs.push(parseSecret(secret, compose ? false : build));
- });
- }
- if (!pullmergeRequestId && normalSecrets.length > 0) {
- normalSecrets.forEach((secret) => {
- if ((isBuild && !secret.isBuildSecret) || (!isBuild && secret.isBuildSecret)) {
- return;
- }
- const build = isBuild && secret.isBuildSecret;
- envs.push(parseSecret(secret, compose ? false : build));
- });
- }
- const portFound = envs.filter((env) => env.startsWith('PORT'));
- if (portFound.length === 0 && port && !isBuild) {
- envs.push(`PORT=${port}`);
- }
- const nodeEnv = envs.filter((env) => env.startsWith('NODE_ENV'));
- if (nodeEnv.length === 0 && !isBuild) {
- envs.push(`NODE_ENV=production`);
- }
- return envs;
-}
-export function decryptApplication(application: any) {
- 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: any) => {
- s.value = decrypt(s.value) || null;
- return s;
- });
- }
-
- return application;
- }
-}
-export async function pushToRegistry(
- application: any,
- workdir: string,
- tag: string,
- imageName: string,
- customTag: string
-) {
- const location = `${workdir}/.docker`;
- const tagCommand = `docker tag ${application.id}:${tag} ${imageName}:${customTag}`;
- const pushCommand = `docker --config ${location} push ${imageName}:${customTag}`;
- await executeCommand({
- dockerId: application.destinationDockerId,
- command: tagCommand
- });
- await executeCommand({
- dockerId: application.destinationDockerId,
- command: pushCommand
- });
-}
-
-export async function getContainerUsage(dockerId: string, container: string): Promise {
- try {
- const { stdout } = await 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
- };
- }
-}
-export function fixType(type) {
- return type?.replaceAll(' ', '').toLowerCase() || null;
-}
-const compareSemanticVersions = (a: string, b: string) => {
- 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;
-};
-export async function getTags(type: string) {
- try {
- if (type) {
- const tagsPath = isDev ? './tags.json' : '/app/tags.json';
- const data = await fs.readFile(tagsPath, 'utf8');
- let tags = JSON.parse(data);
- if (tags) {
- tags = tags.find((tag: any) => tag.name.includes(type));
- tags.tags = tags.tags.sort(compareSemanticVersions).reverse();
- return tags;
- }
- }
- } catch (error) {
- return [];
- }
-}
-export function makeLabelForServices(type) {
- return [
- 'coolify.managed=true',
- `coolify.version=${version}`,
- `coolify.type=service`,
- `coolify.service.type=${type}`
- ];
-}
-export const asyncSleep = (delay: number): Promise =>
- new Promise((resolve) => setTimeout(resolve, delay));
-
-export async function startTraefikTCPProxy(
- destinationDocker: any,
- id: string,
- publicPort: number,
- privatePort: number,
- type?: string
-): Promise<{ stdout: string; stderr: string }> {
- const { network, id: dockerId, remoteEngine } = destinationDocker;
- const container = `${id}-${publicPort}`;
- const { found } = await checkContainer({ dockerId, container, remove: true });
- const { ipv4, ipv6 } = await listSettings();
-
- let dependentId = id;
- if (type === 'wordpressftp') dependentId = `${id}-ftp`;
- const { found: foundDependentContainer } = await checkContainer({
- dockerId,
- container: dependentId,
- remove: true
- });
- if (foundDependentContainer && !found) {
- const { stdout: Config } = await executeCommand({
- dockerId,
- command: `docker network inspect ${network} --format '{{json .IPAM.Config }}'`
- });
-
- const ip = JSON.parse(Config)[0].Gateway;
- let traefikUrl = otherTraefikEndpoint;
- if (remoteEngine) {
- let ip = null;
- if (isDev) {
- ip = getAPIUrl();
- } else {
- ip = `http://${ipv4 || ipv6}:3000`;
- }
- traefikUrl = `${ip}/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 fs.writeFile(`/tmp/docker-compose-${id}.yaml`, yaml.dump(tcpProxy));
- await executeCommand({
- dockerId,
- command: `docker compose -f /tmp/docker-compose-${id}.yaml up -d`
- });
- await fs.rm(`/tmp/docker-compose-${id}.yaml`);
- }
- if (!foundDependentContainer && found) {
- await executeCommand({
- dockerId,
- command: `docker stop -t 0 ${container} && docker rm ${container}`,
- shell: true
- });
- }
-}
-export async function startTraefikProxy(id: string): Promise {
- const { engine, network, remoteEngine, remoteIpAddress } =
- await prisma.destinationDocker.findUnique({ where: { id } });
- const { found } = await checkContainer({
- dockerId: id,
- container: 'coolify-proxy',
- remove: true
- });
- const { id: settingsId, ipv4, ipv6 } = await listSettings();
-
- if (!found) {
- const { stdout: coolifyNetwork } = await executeCommand({
- dockerId: id,
- command: `docker network ls --filter 'name=coolify-infra' --no-trunc --format "{{json .}}"`
- });
-
- if (!coolifyNetwork) {
- await executeCommand({
- dockerId: id,
- command: `docker network create --attachable coolify-infra`
- });
- }
- const { stdout: Config } = await 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 ip = null;
- if (isDev) {
- ip = getAPIUrl();
- } else {
- ip = `http://${ipv4 || ipv6}:3000`;
- }
- traefikUrl = `${ip}/webhooks/traefik/remote/${id}`;
- }
- await 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 prisma.destinationDocker.update({
- where: { id },
- data: { isCoolifyProxyUsed: true }
- });
- }
- // Configure networks for local docker engine
- if (engine) {
- const destinations = await prisma.destinationDocker.findMany({ where: { engine } });
- for (const destination of destinations) {
- await configureNetworkTraefikProxy(destination);
- }
- }
- // Configure networks for remote docker engine
- if (remoteEngine) {
- const destinations = await prisma.destinationDocker.findMany({ where: { remoteIpAddress } });
- for (const destination of destinations) {
- await configureNetworkTraefikProxy(destination);
- }
- }
-}
-
-export async function configureNetworkTraefikProxy(destination: any): Promise {
- const { id } = destination;
- const { stdout: networks } = await 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 executeCommand({
- dockerId: destination.id,
- command: `docker network connect ${destination.network} coolify-proxy`
- });
- }
-}
-
-export async function stopTraefikProxy(id: string): Promise<{ stdout: string; stderr: string }> {
- const { found } = await checkContainer({ dockerId: id, container: 'coolify-proxy' });
- await prisma.destinationDocker.update({
- where: { id },
- data: { isCoolifyProxyUsed: false }
- });
- if (found) {
- return await executeCommand({
- dockerId: id,
- command: `docker stop -t 0 coolify-proxy && docker rm coolify-proxy`,
- shell: true
- });
- }
- return { stdout: '', stderr: '' };
-}
diff --git a/apps/trpc-experimental/server/src/lib/dayjs.ts b/apps/trpc-experimental/server/src/lib/dayjs.ts
deleted file mode 100644
index 9ff5b0a1a..000000000
--- a/apps/trpc-experimental/server/src/lib/dayjs.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import dayjs from 'dayjs';
-import utc from 'dayjs/plugin/utc.js';
-import relativeTime from 'dayjs/plugin/relativeTime.js';
-dayjs.extend(utc);
-dayjs.extend(relativeTime);
-
-export { dayjs as day };
diff --git a/apps/trpc-experimental/server/src/lib/docker.ts b/apps/trpc-experimental/server/src/lib/docker.ts
deleted file mode 100644
index 0f02da0e2..000000000
--- a/apps/trpc-experimental/server/src/lib/docker.ts
+++ /dev/null
@@ -1,157 +0,0 @@
-import { executeCommand } from './executeCommand';
-
-export async function checkContainer({
- dockerId,
- container,
- remove = false
-}: {
- dockerId: string;
- container: string;
- remove?: boolean;
-}): Promise<{
- found: boolean;
- status?: { isExited: boolean; isRunning: boolean; isRestarting: boolean };
-}> {
- let containerFound = false;
- try {
- const { stdout } = await 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 executeCommand({
- dockerId,
- command: `docker rm ${container}`
- });
- }
- if (remove && status === 'exited') {
- await executeCommand({
- dockerId,
- command: `docker rm ${container}`
- });
- }
-
- return {
- found: containerFound,
- status: {
- isRunning,
- isRestarting,
- isExited
- }
- };
- } catch (err) {
- // Container not found
- }
- return {
- found: false
- };
-}
-
-export async function removeContainer({
- id,
- dockerId
-}: {
- id: string;
- dockerId: string;
-}): Promise {
- try {
- const { stdout } = await executeCommand({
- dockerId,
- command: `docker inspect --format '{{json .State}}' ${id}`
- });
- if (JSON.parse(stdout).Running) {
- await executeCommand({ dockerId, command: `docker stop -t 0 ${id}` });
- await executeCommand({ dockerId, command: `docker rm ${id}` });
- }
- if (JSON.parse(stdout).Status === 'exited') {
- await executeCommand({ dockerId, command: `docker rm ${id}` });
- }
- } catch (error) {
- throw error;
- }
-}
-
-export async function stopDatabaseContainer(database: any): Promise {
- let everStarted = false;
- const {
- id,
- destinationDockerId,
- destinationDocker: { engine, id: dockerId }
- } = database;
- if (destinationDockerId) {
- try {
- const { stdout } = await executeCommand({
- dockerId,
- command: `docker inspect --format '{{json .State}}' ${id}`
- });
-
- if (stdout) {
- everStarted = true;
- await removeContainer({ id, dockerId });
- }
- } catch (error) {
- //
- }
- }
- return everStarted;
-}
-export async function stopTcpHttpProxy(
- id: string,
- destinationDocker: any,
- publicPort: number,
- forceName: string | null = null
-): Promise<{ stdout: string; stderr: string } | Error | unknown> {
- 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 executeCommand({
- dockerId,
- command: `docker stop -t 0 ${container} && docker rm ${container}`,
- shell: true
- });
- } catch (error) {
- return error;
- }
-}
-
-export function formatLabelsOnDocker(data: any) {
- 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;
- });
-}
-
-export function defaultComposeConfiguration(network: string): any {
- return {
- networks: [network],
- restart: 'on-failure',
- deploy: {
- restart_policy: {
- condition: 'on-failure',
- delay: '5s',
- max_attempts: 10,
- window: '120s'
- }
- }
- };
-}
diff --git a/apps/trpc-experimental/server/src/lib/executeCommand.ts b/apps/trpc-experimental/server/src/lib/executeCommand.ts
deleted file mode 100644
index 31119be08..000000000
--- a/apps/trpc-experimental/server/src/lib/executeCommand.ts
+++ /dev/null
@@ -1,196 +0,0 @@
-import { prisma } from '../prisma';
-import os from 'os';
-import fs from 'fs/promises';
-import type { ExecaChildProcess } from 'execa';
-import sshConfig from 'ssh-config';
-
-import { getFreeSSHLocalPort } from './ssh';
-import { env } from '../env';
-import { BuildLog, saveBuildLog } from './logging';
-import { decrypt } from './common';
-
-export async function executeCommand({
- command,
- dockerId = null,
- sshCommand = false,
- shell = false,
- stream = false,
- buildId,
- applicationId,
- debug
-}: {
- command: string;
- sshCommand?: boolean;
- shell?: boolean;
- stream?: boolean;
- dockerId?: string | null;
- buildId?: string;
- applicationId?: string;
- debug?: boolean;
-}): Promise> {
- 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 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 (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}`);
- }
- //@ts-ignore
- return await execa('ssh', [`${remoteIpAddress}-remote`, dockerCommand, ...dockerArgs]);
- }
- if (stream) {
- return await new Promise(async (resolve, reject) => {
- let subprocess = null;
- if (shell) {
- //@ts-ignore
- subprocess = execaCommand(command, {
- env: { DOCKER_BUILDKIT: '1', DOCKER_HOST: engine }
- });
- } else {
- //@ts-ignore
- subprocess = execa(dockerCommand, dockerArgs, {
- env: { DOCKER_BUILDKIT: '1', DOCKER_HOST: engine }
- });
- }
- const logs: any[] = [];
- if (subprocess && subprocess.stdout && subprocess.stderr) {
- subprocess.stdout.on('data', async (data: string) => {
- const stdout = data.toString();
- const array = stdout.split('\n');
- for (const line of array) {
- if (line !== '\n' && line !== '') {
- const log: BuildLog = {
- line: `${line.replace('\n', '')}`,
- buildId,
- applicationId
- };
- logs.push(log);
- if (debug) {
- await saveBuildLog(log);
- }
- }
- }
- });
- subprocess.stderr.on('data', async (data: string) => {
- 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 saveBuildLog(log);
- }
- }
- }
- });
- subprocess.on('exit', async (code: number) => {
- if (code === 0) {
- //@ts-ignore
- resolve(code);
- } else {
- if (!debug) {
- for (const log of logs) {
- await saveBuildLog(log);
- }
- }
- reject(code);
- }
- });
- }
- });
- } else {
- if (shell) {
- return await execaCommand(command, {
- //@ts-ignore
- env: { DOCKER_BUILDKIT: '1', DOCKER_HOST: engine }
- });
- } else {
- //@ts-ignore
- return await execa(dockerCommand, dockerArgs, {
- env: { DOCKER_BUILDKIT: '1', DOCKER_HOST: engine }
- });
- }
- }
- } else {
- if (shell) {
- return execaCommand(command, { shell: true });
- }
- //@ts-ignore
- return await execa(dockerCommand, dockerArgs);
- }
-}
-
-export async function createRemoteEngineConfiguration(id: string) {
- const homedir = os.homedir();
- const sshKeyFile = `/tmp/id_rsa-${id}`;
- const localPort = await getFreeSSHLocalPort(id);
- const {
- sshKey: { privateKey },
- network,
- remoteIpAddress,
- remotePort,
- remoteUser
- } = await prisma.destinationDocker.findFirst({ where: { id }, include: { sshKey: true } });
- await fs.writeFile(sshKeyFile, decrypt(privateKey) + '\n', { encoding: 'utf8', mode: 400 });
- const config = sshConfig.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 fs.stat(`${homedir}/.ssh/`);
- } catch (error) {
- await fs.mkdir(`${homedir}/.ssh/`);
- }
- return await fs.writeFile(`${homedir}/.ssh/config`, sshConfig.stringify(config));
-}
diff --git a/apps/trpc-experimental/server/src/lib/importers/github.ts b/apps/trpc-experimental/server/src/lib/importers/github.ts
deleted file mode 100644
index dfaa4c724..000000000
--- a/apps/trpc-experimental/server/src/lib/importers/github.ts
+++ /dev/null
@@ -1,96 +0,0 @@
-
-import jsonwebtoken from 'jsonwebtoken';
-import { prisma } from '../../prisma';
-import { saveBuildLog } from '../buildPacks/common';
-import { decrypt } from '../common';
-import { executeCommand } from '../executeCommand';
-
-export default async function ({
- applicationId,
- workdir,
- githubAppId,
- repository,
- apiUrl,
- gitCommitHash,
- htmlUrl,
- branch,
- buildId,
- customPort,
- forPublic
-}: {
- applicationId: string;
- workdir: string;
- githubAppId: string;
- repository: string;
- apiUrl: string;
- gitCommitHash?: string;
- htmlUrl: string;
- branch: string;
- buildId: string;
- customPort: number;
- forPublic?: boolean;
-}): Promise {
- const { default: got } = await import('got')
- const url = htmlUrl.replace('https://', '').replace('http://', '');
- if (forPublic) {
- await saveBuildLog({
- line: `Cloning ${repository}:${branch}...`,
- buildId,
- applicationId
- });
- if (gitCommitHash) {
- await saveBuildLog({
- line: `Checking out ${gitCommitHash} commit...`,
- buildId,
- applicationId
- });
- }
- await 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 prisma.githubApp.findUnique({ where: { id: githubAppId } });
- if (body.privateKey) body.privateKey = 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() / 1000),
- exp: Math.round(new Date().getTime() / 1000 + 60),
- iss: appId
- };
- const jwtToken = jsonwebtoken.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 saveBuildLog({
- line: `Cloning ${repository}:${branch}...`,
- buildId,
- applicationId
- });
- if (gitCommitHash) {
- await saveBuildLog({
- line: `Checking out ${gitCommitHash} commit...`,
- buildId,
- applicationId
- });
- }
- await 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 executeCommand({ command: `cd ${workdir}/ && git rev-parse HEAD`, shell: true });
- return commit.replace('\n', '');
-}
diff --git a/apps/trpc-experimental/server/src/lib/importers/gitlab.ts b/apps/trpc-experimental/server/src/lib/importers/gitlab.ts
deleted file mode 100644
index 4f49fbd0e..000000000
--- a/apps/trpc-experimental/server/src/lib/importers/gitlab.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import { saveBuildLog } from "../buildPacks/common";
-import { executeCommand } from "../executeCommand";
-
-export default async function ({
- applicationId,
- workdir,
- repodir,
- htmlUrl,
- gitCommitHash,
- repository,
- branch,
- buildId,
- privateSshKey,
- customPort,
- forPublic,
- customUser,
-}: {
- applicationId: string;
- workdir: string;
- repository: string;
- htmlUrl: string;
- branch: string;
- buildId: string;
- repodir: string;
- gitCommitHash: string;
- privateSshKey: string;
- customPort: number;
- forPublic: boolean;
- customUser: string;
-}): Promise {
- const url = htmlUrl.replace('https://', '').replace('http://', '').replace(/\/$/, '');
- if (!forPublic) {
- await executeCommand({ command: `echo '${privateSshKey}' > ${repodir}/id.rsa`, shell: true });
- await executeCommand({ command: `chmod 600 ${repodir}/id.rsa` });
- }
-
- await saveBuildLog({
- line: `Cloning ${repository}:${branch}...`,
- buildId,
- applicationId
- });
- if (gitCommitHash) {
- await saveBuildLog({
- line: `Checking out ${gitCommitHash} commit...`,
- buildId,
- applicationId
- });
- }
- if (forPublic) {
- await 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 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 executeCommand({ command: `cd ${workdir}/ && git rev-parse HEAD`, shell: true });
- return commit.replace('\n', '');
-}
diff --git a/apps/trpc-experimental/server/src/lib/importers/index.ts b/apps/trpc-experimental/server/src/lib/importers/index.ts
deleted file mode 100644
index 193443890..000000000
--- a/apps/trpc-experimental/server/src/lib/importers/index.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import github from './github';
-import gitlab from './gitlab';
-
-export { github, gitlab };
diff --git a/apps/trpc-experimental/server/src/lib/logging.ts b/apps/trpc-experimental/server/src/lib/logging.ts
deleted file mode 100644
index bb4dde7a0..000000000
--- a/apps/trpc-experimental/server/src/lib/logging.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { prisma } from '../prisma';
-import { encrypt, generateTimestamp, isDev } from './common';
-import { day } from './dayjs';
-
-export type Line = string | { shortMessage: string; stderr: string };
-export type BuildLog = {
- line: Line;
- buildId?: string;
- applicationId?: string;
-};
-export const saveBuildLog = async ({ line, buildId, applicationId }: BuildLog): Promise => {
- 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 = `[${generateTimestamp()}] ${line}`;
- const fluentBitUrl = isDev ? 'http://localhost:24224' : 'http://coolify-fluentbit:24224';
-
- if (isDev) {
- console.debug(`[${applicationId}] ${addTimestamp}`);
- }
- try {
- return await got.post(`${fluentBitUrl}/${applicationId}_buildlog_${buildId}.csv`, {
- json: {
- line: encrypt(line)
- }
- });
- } catch (error) {
- return await prisma.buildLog.create({
- data: {
- line: addTimestamp,
- buildId,
- time: Number(day().valueOf()),
- applicationId
- }
- });
- }
-};
diff --git a/apps/trpc-experimental/server/src/lib/ssh.ts b/apps/trpc-experimental/server/src/lib/ssh.ts
deleted file mode 100644
index 77cbf7307..000000000
--- a/apps/trpc-experimental/server/src/lib/ssh.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { prisma } from '../prisma';
-import { generateRangeArray } from './common';
-
-export async function getFreeSSHLocalPort(id: string): Promise {
- const { default: isReachable } = await import('is-port-reachable');
- const { remoteIpAddress, sshLocalPort } = await prisma.destinationDocker.findUnique({
- where: { id }
- });
- if (sshLocalPort) {
- return Number(sshLocalPort);
- }
-
- const data = await prisma.setting.findFirst();
- const { minPort, maxPort } = data;
-
- const ports = await prisma.destinationDocker.findMany({
- where: { sshLocalPort: { not: null }, remoteIpAddress: { not: remoteIpAddress } }
- });
-
- const alreadyConfigured = await prisma.destinationDocker.findFirst({
- where: {
- remoteIpAddress,
- id: { not: id },
- sshLocalPort: { not: null }
- }
- });
- if (alreadyConfigured?.sshLocalPort) {
- await prisma.destinationDocker.update({
- where: { id },
- data: { sshLocalPort: alreadyConfigured.sshLocalPort }
- });
- return Number(alreadyConfigured.sshLocalPort);
- }
- const range = 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 prisma.destinationDocker.update({
- where: { id },
- data: { sshLocalPort: Number(port) }
- });
- return Number(port);
- }
- }
- return false;
-}
diff --git a/apps/trpc-experimental/server/src/prisma.ts b/apps/trpc-experimental/server/src/prisma.ts
deleted file mode 100644
index 6aa0585c4..000000000
--- a/apps/trpc-experimental/server/src/prisma.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * Instantiates a single instance PrismaClient and save it on the global object.
- * @link https://www.prisma.io/docs/support/help-articles/nextjs-prisma-client-dev-practices
- */
-import { env } from './env';
-import { PrismaClient } from '@prisma/client';
-
-const prismaGlobal = global as typeof global & {
- prisma?: PrismaClient;
-};
-
-export const prisma: PrismaClient =
- prismaGlobal.prisma ||
- new PrismaClient({
- log: env.NODE_ENV !== 'development' ? ['query', 'error', 'warn'] : ['error']
- });
-
-if (env.NODE_ENV !== 'production') {
- prismaGlobal.prisma = prisma;
-}
diff --git a/apps/trpc-experimental/server/src/scheduler.ts b/apps/trpc-experimental/server/src/scheduler.ts
deleted file mode 100644
index 9a8583fc2..000000000
--- a/apps/trpc-experimental/server/src/scheduler.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import Bree from 'bree';
-import path from 'path';
-import Cabin from 'cabin';
-import TSBree from '@breejs/ts-worker';
-
-export const isDev = process.env['NODE_ENV'] === 'development';
-
-Bree.extend(TSBree);
-
-const options: any = {
- defaultExtension: 'js',
- logger: false,
- jobs: [{ name: 'applicationBuildQueue' }]
-};
-if (isDev) options.root = path.join(__dirname, './jobs');
-
-export const scheduler = new Bree(options);
diff --git a/apps/trpc-experimental/server/src/server.ts b/apps/trpc-experimental/server/src/server.ts
deleted file mode 100644
index 6b2d9d87d..000000000
--- a/apps/trpc-experimental/server/src/server.ts
+++ /dev/null
@@ -1,79 +0,0 @@
-import { fastifyTRPCPlugin } from '@trpc/server/adapters/fastify';
-import fastify from 'fastify';
-import { appRouter } from './trpc';
-import { createContext } from './trpc/context';
-import cors from '@fastify/cors';
-import * as path from 'node:path';
-import serve from '@fastify/static';
-import autoLoad from '@fastify/autoload';
-// import { prisma } from './prisma';
-import Graceful from '@ladjs/graceful';
-import { scheduler } from './scheduler';
-
-const isDev = process.env['NODE_ENV'] === 'development';
-
-export interface ServerOptions {
- dev?: boolean;
- port?: number;
- prefix?: string;
-}
-
-export function createServer(opts: ServerOptions) {
- const dev = opts.dev ?? true;
- const port = opts.port ?? 3000;
- const prefix = opts.prefix ?? '/trpc';
- const server = fastify({ logger: dev, trustProxy: true });
- server.register(cors);
- server.register(fastifyTRPCPlugin, {
- prefix,
- trpcOptions: {
- router: appRouter,
- createContext,
- onError({ error, type, path, input, ctx, req }) {
- console.error('Error:', error);
- if (error.code === 'INTERNAL_SERVER_ERROR') {
- // send to bug reporting
- }
- }
- }
- });
- // Serve static files in production. Static files are generated by `yarn build` in the client folder by SvelteKit.
- if (!isDev) {
- server.register(serve, {
- 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(autoLoad, {
- 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 🚀');
- const graceful = new Graceful({ brees: [scheduler] });
- graceful.listen();
- setInterval(async () => {
- if (!scheduler.workers.has('applicationBuildQueue')) {
- scheduler.run('applicationBuildQueue');
- }
- }, 2000);
- } catch (err) {
- server.log.error(err);
- process.exit(1);
- }
- };
-
- return { server, start, stop };
-}
diff --git a/apps/trpc-experimental/server/src/tags.json b/apps/trpc-experimental/server/src/tags.json
deleted file mode 100644
index 0d84f6caa..000000000
--- a/apps/trpc-experimental/server/src/tags.json
+++ /dev/null
@@ -1 +0,0 @@
-[{"name":"appsmith","image":"appsmith/appsmith-ce","tags":["v1.8.8","v1.8.6","v1.8.4","v1.8.2","v1.8.10","v1.8.0","v1.7.8","v1.7.6","v1.7.4","v1.7.2","v1.7.13","v1.7.11","v1.7.1","v1.6.9","v1.6.7","v1.6.5","v1.6.3","v1.6.22","v1.6.20","v1.6.19","v1.6.17","v1.6.15","v1.6.13","v1.6.11","v1.6.1","v1.5.30","v1.5.28","v1.5.26","v1.5.24","v1.5.22"]},{"name":"appwrite","image":"appwrite/appwrite","tags":["1.1.2","1.1.0","1.0.3","1.0.1","1.0.0","0.9.3","0.9.1","0.8.0","0.7.1","0.6.2","0.6.0","0.5.2","0.5.0","0.3.1","0.2.0","0.15.2","0.15.0","0.14.2","0.14.0","0.13.4","0.13.2","0.13.0","0.12.3","0.12.1","0.12.0","0.11.2","0.11.0","0.10.4","0.10.2","0.10.0"]},{"name":"fider","image":"getfider/fider","tags":["stable","master","main","dev","SHA_ee6e83cfaadadaa56ab76e089e01f5631af3506f","SHA_deb4f9b4f561d890d8a80e6872fea9a98a265cc6","SHA_d5cc307909d43447200483d76b5db74d8ed8349e","SHA_d1674476577a7fd3c88fc29f91c3f35f5bd6a260","SHA_d107cbb157abca6576110080736213efe0955cff","SHA_c9c55b2f5b33a76015241b97e03cfac1254b42a7","SHA_bcf451a3cb02d5c8a489fd30309249296057b084","SHA_bbfe419639514f949a042807addf0fde7d4de225","SHA_adc3afc4c7bcf96931a5f90cab65c282d860dbfd","SHA_ab5283ae95334f10b5041402dce79e333c472015","SHA_a3f4cb5ed0a4ee2d726705fc426636364aac17a1","SHA_a18224142bf51bc6463c3d22f45f62287902e9a6","SHA_8e5cff30d95963eaee2587488d351e0d658c8195","SHA_8cabe2817ce7ccaf2f0a9fdbb1b5d3411de87f81","SHA_7851f9da566132d87fa2a63004e78c3bc9c09c6c","SHA_6c0f2bed1754e9d579eb9575129a6e3dbc529c32","SHA_603508c8790d6a6fb1e852df1a58ead8e5b3ea6c","SHA_55efacf164a4749b50ee68ae8925e7dc9dfa3a0c","SHA_4bdd291ce61e5f5dfc063fa1b2d9be8c9ff1d4c4","SHA_3fba9cb6a9ceab0c78c6cff3220610f591f657cb","SHA_3d635b57606a9885babe91fe975b11429e0f2c38","SHA_3b794edbd9789a8aa38ecd3714bc536a675d3058","SHA_3570c454ad3252b690608f7bf8051737d8519f8a","SHA_263e2709fd145f3ea511e5557e170102899995b0","SHA_255c30ed012fc4c39ffc97efc1d3b00425b17c72","SHA_17f92b16ef790003338f0926fc8d791a9a61333c"]},{"name":"ghost-mariadb","image":"bitnami/ghost","tags":["5.7.1","5.7.0","5.5.0","5.4.1","5.4.0","5.3.1","5.3.0","5.24.2","5.24.1","5.24.0","5.23.0","5.22.9","5.22.8","5.22.7","5.22.6","5.22.5","5.22.4","5.22.3","5.22.2","5.22.11","5.22.10","5.22.1","5.22.0","5.21.0","5.20.0","5.2.4","5.2.3","5.2.2","5.2.1","5.19.3","4.48.8"]},{"name":"ghost-mysql","image":"library/ghost","tags":["5.9.4","5.8.3","5.8.2","5.7.1","5.7.0","5.5.0","5.4.1","5.3.1","5.3.0","5.24.2","5.24.1","5.23.0","5.22.9","5.22.8","5.22.4","5.22.11","5.22.10","5.22.1","5.20.0","5.2.4","5.2.3","5.2.2","5.2.1","5.19.3","5.19.0","5.18.0","5.17.2","5.17.1","5.17.0","5.16.2"]},{"name":"ghost-only","image":"library/ghost","tags":["5.9.4","5.8.3","5.8.2","5.7.1","5.7.0","5.5.0","5.4.1","5.3.1","5.3.0","5.24.2","5.24.1","5.23.0","5.22.9","5.22.8","5.22.4","5.22.11","5.22.10","5.22.1","5.20.0","5.2.4","5.2.3","5.2.2","5.2.1","5.19.3","5.19.0","5.18.0","5.17.2","5.17.1","5.17.0","5.16.2"]},{"name":"gitea","image":"gitea/gitea","tags":["1.9.6","1.9.5","1.9.4","1.9.3","1.9.2","1.9.0","1.8.3","1.8.1","1.8.0","1.7.5","1.7.3","1.7.1","1.7.0","1.6.3","1.6.1","1.6.0","1.5.3","1.5.1","1.5.0","1.4.3","1.4.1","1.4.0","1.3.3","1.3.1","1.3.0","1.2.3","1.2.1","1.2.0","1.17.3","1.17.2"]},{"name":"glitchtip","image":"glitchtip/glitchtip","tags":["v2.0.7","v2.0.5","v2.0.2","v2.0.0","v1.9.2","v1.9.0","v1.8.4","v1.8.2","v1.8.0","v1.7.1","v1.6.4","v1.6.2","v1.6.0","v1.5.3","v1.5.1","v1.4.1","v1.3.3","v1.3.1","v1.2.6","v1.2.4","v1.2.2","v1.2.0","v1.12.4","v1.12.2","v1.12.0","v1.10.3","v1.10.1","v1.1.2","v1.1.0","v1.0.8"]},{"name":"grafana","image":"grafana/grafana","tags":["9.3.1","9.3.0","9.2.7","9.2.6","9.2.5","9.2.4","9.2.3","9.2.2","9.2.1","9.2.0","9.1.8","9.1.7","9.1.6","9.1.5","9.1.4","9.1.3","9.1.2","9.1.1","9.1.0","9.0.9","9.0.8","9.0.7","9.0.6","9.0.5","9.0.4","9.0.3","9.0.2","9.0.1","9.0.0","8.5.9"]},{"name":"hasura","image":"hasura/graphql-engine","tags":["v2.9.0","v2.8.4","v2.8.3","v2.8.2","v2.8.1","v2.8.0","v2.7.0","v2.6.2","v2.6.1","v2.6.0","v2.5.2","v2.5.1","v2.5.0","v2.4.0","v2.3.1","v2.3.0","v2.2.2","v2.2.1","v2.2.0","v2.15.2","v2.15.1","v2.15.0","v2.14.1","v2.14.0","v2.13.2","v2.13.1","v2.13.0","v2.12.1","v2.12.0","v2.11.3"]},{"name":"keycloak","image":"quay.io/keycloak/keycloak","tags":["9.0.3","9.0.0","8.0.1","7.0.0","6.0.1","6.0.0","20.0.1","20.0.0","19.0.3","19.0.1","19.0.0","18.0.1","18.0.0","17.0.1","17.0.0","16.1.0","15.1.1","15.0.2","15.0.0","13.0.1","12.0.4","12.0.2","12.0.0","11.0.2","11.0.0","10.0.1"]},{"name":"languagetool","image":"silviof/docker-languagetool","tags":["latest","5.8","5.7","5.6","5.5","5.4","5.3"]},{"name":"lavalink","image":"fredboat/lavalink","tags":["v3.7","v3.6","v3-vda0b3a4b3916a7b1a2b79702de1143c3a6939810-SNAPSHOT","v3-vc92690c425390bd20f6c51643c67ba79ab85b7e0-SNAPSHOT","v3-vab81dcd46adf3e8a961dd57eacd2a1bde1233e6c-SNAPSHOT","v3-v9c9432704d6a4badfcbd06a57597c54bed8f4326-SNAPSHOT","v3-v3.0","v3-v3","v3-v124f8fae7dab299f9cdf1cb4c1715be455497286-SNAPSHOT","v3-","v3","v2.0.1","v2.0","v2","update-udpqueue-vb4a439d6147dbd8641ea4f265e8efc9f1e16e2d3-SNAPSHOT","update-udpqueue-","update-udpqueue","revert-713-fix-error-for-loading-jda-nas","refactor-github-actions","patch-update-github-actions","patch-more-configurable-github-actions","patch-lavaplayer-update","patch-lavaplayer-bump","patch-build-number","next-api-vd4db194cac7a839a3899857f1f6d7b910369309d-SNAPSHOT","next-api-vc2e018d5ffef54b2d17244b3d213e31723a084d6-SNAPSHOT","next-api-v42cb5f7c58e98d1911e87bffb35aee0a235b85f8-SNAPSHOT","next-api-v31a243bda80badbd7d643f68fc1f87e99639060f-SNAPSHOT","next-api-v17f6884434c2d70d1704b2322a951d9f07af8865-SNAPSHOT","next-api-"]},{"name":"meilisearch","image":"getmeili/meilisearch","tags":["v0.9.0","v0.8.3","v0.8.1","v0.30.0","v0.29.1","v0.29.0","v0.28.1","v0.28.0","v0.27.1","v0.27.0","v0.26.1","v0.26.0","v0.25.1","v0.25.0","v0.23.1","v0.23.0","v0.21.1","v0.21.0","v0.20.0","v0.19.0","v0.18.1","v0.18.0","v0.17.0","v0.16.0","v0.14.1","v0.14.0","v0.12.0","v0.11.0","v0.10.0","0.14.1"]},{"name":"minio","image":"minio/minio","tags":["RELEASE.2022-11-29T23-40-49Z.fips","RELEASE.2022-11-26T22-43-32Z.fips","RELEASE.2022-11-17T23-20-09Z.fips","RELEASE.2022-11-11T03-44-20Z.fips","RELEASE.2022-11-10T18-20-21Z.fips","RELEASE.2022-11-08T05-27-07Z.fips","RELEASE.2022-10-29T06-21-33Z.fips","RELEASE.2022-10-24T18-35-07Z.hotfix.ce525fdaf","RELEASE.2022-10-24T18-35-07Z.fips","RELEASE.2022-10-21T22-37-48Z.fips","RELEASE.2022-10-20T00-55-09Z.fips","RELEASE.2022-10-15T19-57-03Z.fips","RELEASE.2022-10-08T20-11-00Z.fips","RELEASE.2022-10-05T14-58-27Z.fips","RELEASE.2022-10-02T19-29-29Z.fips","RELEASE.2022-09-25T15-44-53Z.fips","RELEASE.2022-09-22T18-57-27Z.fips","RELEASE.2022-09-17T00-09-45Z.hotfix.fc6d6fdbd","RELEASE.2022-09-17T00-09-45Z.hotfix.4bb22d5cd","RELEASE.2022-09-17T00-09-45Z","RELEASE.2022-09-07T22-25-02Z","RELEASE.2022-09-01T23-53-36Z","RELEASE.2022-08-26T19-53-15Z","RELEASE.2022-08-25T07-17-05Z","RELEASE.2022-08-22T23-53-06Z.fips","RELEASE.2022-08-13T21-54-44Z.fips","RELEASE.2022-08-11T04-37-28Z.fips","RELEASE.2022-08-08T18-34-09Z.fips","RELEASE.2022-08-05T23-27-09Z.fips","RELEASE.2022-08-02T23-59-16Z.fips"]},{"name":"n8n","image":"n8nio/n8n","tags":["0.99.1","0.99.0","0.98.0","0.97.0","0.96.0","0.95.1","0.95.0","0.94.1","0.94.0","0.93.0","0.92.0","0.91.0","0.9.0","0.89.2","0.88.1","0.88.0","0.87.2","0.87.1","0.87.0","0.86.1","0.86.0","0.85.0","0.84.4","0.84.3","0.84.1","0.84.0","0.83.0","0.82.1","0.82.0","0.81.0"]},{"name":"nocodb","image":"nocodb/nocodb","tags":["0.99.2","0.99.0","0.98.3","0.98.1","0.97.0","0.96.3","0.96.1","0.92.4","0.92.0","0.91.8","0.91.6","0.91.1","0.90.8","0.90.5","0.90.3","0.90.11","0.90.1","0.9.9","0.9.7","0.9.43","0.9.41","0.9.39","0.9.37","0.9.35","0.9.33","0.9.31","0.9.29","0.9.27","0.9.25","0.9.22"]},{"name":"plausibleanalytics-arm","image":"plausible/analytics","tags":["v1.5.0-rc.2","v1.5.0-rc.1","v1.4.4","v1.4.3","v1.4.2","v1.4.1","v1.4.0.rc.0","v1.4.0-rc.0","v1.4.0","v1.4","v1.3.0-rc.1","v1.3.0-rc.0","v1.3.0","v1.3","v1.2.1","v1.2.0","v1.2-rc.1","v1.2-rc.0","v1.2","v1.1.1","v1.1.0","v1.1","v1.0.0","v1.0","v1","stable","master","loadtest","latest","1.5.0-rc.0"]},{"name":"plausibleanalytics","image":"plausible/analytics","tags":["v1.5.0-rc.2","v1.5.0-rc.1","v1.4.4","v1.4.3","v1.4.2","v1.4.1","v1.4.0.rc.0","v1.4.0-rc.0","v1.4.0","v1.4","v1.3.0-rc.1","v1.3.0-rc.0","v1.3.0","v1.3","v1.2.1","v1.2.0","v1.2-rc.1","v1.2-rc.0","v1.2","v1.1.1","v1.1.0","v1.1","v1.0.0","v1.0","v1","stable","master","loadtest","latest","1.5.0-rc.0"]},{"name":"pocketbase","image":"coollabsio/pocketbase","tags":["0.8.0-arm64","0.8.0-amd64","0.8.0-aarch64","0.8.0"]},{"name":"searxng","image":"searxng/searxng","tags":["2022.12.02-ffb72dfd","2022.12.02-890d63b9","2022.12.02-4970db05","2022.12.02-317fe0a2","2022.11.30-f19837cf","2022.11.30-44d4a171","2022.11.30-0361f836","2022.11.29-a8359dd4","2022.11.29-82af2f44","2022.11.29-768659f2","2022.11.29-5b19f892","2022.11.29-3579a38a","2022.11.29-1b2f1c17","2022.11.25-5ca6868c","2022.11.25-28ae469f","2022.11.25-1314c1c5","2022.11.19-b5371b7a","2022.11.18-fe8b0472","2022.11.18-1cdadf4b","2022.11.11-e6345758","2022.11.11-3a765113","2022.11.10-117f69fa","2022.11.09-ee4475ff","2022.11.07-d3949269","2022.11.07-8f19bdaf","2022.11.06-ae54c7d5","2022.11.06-2dc5c0e1","2022.11.05-e9f42e1c","2022.11.05-d764d94a","2022.11.05-d3a7399e"]},{"name":"trilium","image":"zadam/trilium","tags":["0.57.2","0.56.1","0.55.1","0.54.2","0.53.2","0.52.4","0.52.2","0.51.2","0.50.3","0.50.1","0.49.5","0.49.3","0.48.9","0.48.7","0.48.4","0.48.2","0.47.8","0.47.6","0.47.4","0.47.2","0.46.7","0.46.5","0.45.9","0.45.7","0.45.5","0.45.3","0.45.10","0.44.8","0.44.6","0.44.4"]},{"name":"umami-postgresql","image":"ghcr.io/umami-software/umami","tags":["postgresql-v1.39.5","postgresql-v1.39.4","postgresql-v1.39.3","postgresql-v1.39.2","postgresql-v1.39.1","postgresql-v1.39.0","postgresql-v1.38.0","postgresql-v1.37.0","postgresql-v1.36.1","postgresql-v1.36.0","postgresql-v1.35.0","postgresql-v1.34.0","postgresql-v1.33.3","postgresql-latest","mysql-v1.39.5","mysql-v1.39.4","mysql-v1.39.3","mysql-v1.39.2","mysql-v1.39.1","mysql-v1.39.0","mysql-v1.38.0","mysql-v1.37.0","mysql-v1.36.1","mysql-v1.36.0","mysql-v1.35.0","mysql-v1.34.0","mysql-v1.33.3","mysql-latest"]},{"name":"umami","image":"ghcr.io/umami-software/umami","tags":["postgresql-v1.39.5","postgresql-v1.39.4","postgresql-v1.39.3","postgresql-v1.39.2","postgresql-v1.39.1","postgresql-v1.39.0","postgresql-v1.38.0","postgresql-v1.37.0","postgresql-v1.36.1","postgresql-v1.36.0","postgresql-v1.35.0","postgresql-v1.34.0","postgresql-v1.33.3","postgresql-latest","mysql-v1.39.5","mysql-v1.39.4","mysql-v1.39.3","mysql-v1.39.2","mysql-v1.39.1","mysql-v1.39.0","mysql-v1.38.0","mysql-v1.37.0","mysql-v1.36.1","mysql-v1.36.0","mysql-v1.35.0","mysql-v1.34.0","mysql-v1.33.3","mysql-latest"]},{"name":"uptimekuma","image":"louislam/uptime-kuma","tags":["1.9.2","1.9.1","1.9.0","1.8.0","1.7.3","1.7.1","1.7.0","1.6.3","1.6.2","1.6.1","1.6.0","1.5.3","1.5.2","1.5.0","1.3.1","1.2.0","1.18.5","1.18.4","1.18.3","1.18.2","1.18.1","1.18.0","1.17.1","1.17.0","1.16.1","1.16.0","1.15.1","1.15.0","1.14.1","1.14.0"]},{"name":"vaultwarden","image":"vaultwarden/server","tags":["1.26.0","1.25.2","1.25.1","1.25.0","1.24.0","1.23.1","1.23.0","1.22.2","1.22.1","1.22.0","1.21.0"]},{"name":"vscodeserver","image":"codercom/code-server","tags":["4.8.3","4.8.2","4.8.1","4.8.0","4.7.0","4.6.0","4.5.1","4.4.0","4.2.0","4.0.2","3.9.3","3.9.1","3.8.1","3.7.4","3.7.2","3.7.0","3.6.1","3.5.0","3.4.0","3.3.0","3.2.0","3.11.1","3.10.2","3.10.0","3.1.1","3.1.0","3.0.2","3.0.0"]},{"name":"weblate","image":"weblate/weblate","tags":["latest","edge-2022-12-01-0295bd44d4d9da0e0836b9152319fba173a0825e","edge-2022-11-28-f28431a1e78f88bf49ccf539fbc00afe0925542d","edge-2022-11-26-558811de16025b83de43d2747f1fe209a5b829f1","edge-2022-11-23-4a1fe25c7b70e49156e02183a8deec3b357b9030","edge-2022-11-22-9a178e7f5c2e387329592a1dd7700671f64f6682","edge-2022-11-21-eb741ebad70211ecb1babdfd23e4f43c5a59fc7b","edge-2022-11-21-4580d37f616650cf5b0851fee051651f785e8852","edge-2022-11-21-0f74d6c4d3777dbf28affd09b45c69c85ed01d84","edge-2022-11-15-cad0a043b32c1ee61611ab258db0f01c5e6d718f","edge-2022-11-10-bf41db3afbab22384e103718094738dcfdc1a270","edge-2022-11-09-9bc90ce8b873778d2f486eccd0163bb1bb65ca6e","edge-2022-11-08-36e221037ff7097f8cd2c88d779135b6c7d3f363","edge-2022-11-08-3568e3c6759a9e9b779d98cb98393526d451466a","edge-2022-11-08-261d197970ca0679514d32ff783467972e807061","edge-2022-11-05-fa5cb203d854a11cc7850868a2890168afa3e7da","edge-2022-11-05-d93ae789eef8f065240f9fb6feb3edb236a7e6f8","edge-2022-11-05-8fc2be8e9d22e5ca2da2773488da7f72c5927ec3","edge-2022-11-05-85da67e88a113bed65530f0695ad4cddec0ed05a","edge-2022-11-05-3f4d77b6f2cb16bf008a4ef587e843ccb9c0c5d0","edge-2022-11-05-226eed520a2b32c3583c6e3247109ec8950764e7","edge-2022-11-03-487f3255cb89415fbe0769fa4b7bd2a9209deca6","edge-2022-11-02-e4171e0c5657ca38341cce8ac31f5cbdf25389eb","edge-2022-11-02-6d886c40cd62eb23d21f7c0a1840b4a7a4c51ad0","edge-2022-11-01-608df4dd95a2d1f76c15cddd9e116bb4c3229168","edge-2022-11-01-54957be78eb76f602ceae50c0b01b64b20402b2a","edge-2022-10-31-c55c7302a6c82a160ee9d711893c12d67ecd3b27","edge-2022-10-26-c69cfdd83ed1fad4a4d57398552b8c70894a6586","edge-2022-10-26-410b3aff37de5bbfacbc47642ce28b2518bee506","edge-2022-10-25-e09e2c29ed3748eb0fa248453635dd27768e8dd9"]},{"name":"wordpress-only","image":"library/wordpress","tags":["php8.1-fpm-alpine","php8.1-fpm","php8.1-apache","php8.1","php8.0-fpm-alpine","php8.0-fpm","php8.0-apache","php8.0","php7.4-fpm-alpine","php7.4-fpm","php7.4-apache","php7.4","php7.3-fpm-alpine","php7.3-fpm","php7.3-apache","php7.3","php7.2-fpm-alpine","php7.2-fpm","php7.2-apache","php7.2","php7.1-fpm-alpine","php7.1-fpm","php7.1-apache","php7.1","php7.0-fpm-alpine","php7.0-fpm","php7.0-apache","php7.0","php5.6-fpm-alpine","php5.6-fpm"]},{"name":"wordpress","image":"library/wordpress","tags":["php8.1-fpm-alpine","php8.1-fpm","php8.1-apache","php8.1","php8.0-fpm-alpine","php8.0-fpm","php8.0-apache","php8.0","php7.4-fpm-alpine","php7.4-fpm","php7.4-apache","php7.4","php7.3-fpm-alpine","php7.3-fpm","php7.3-apache","php7.3","php7.2-fpm-alpine","php7.2-fpm","php7.2-apache","php7.2","php7.1-fpm-alpine","php7.1-fpm","php7.1-apache","php7.1","php7.0-fpm-alpine","php7.0-fpm","php7.0-apache","php7.0","php5.6-fpm-alpine","php5.6-fpm"]}]
\ No newline at end of file
diff --git a/apps/trpc-experimental/server/src/templates.json b/apps/trpc-experimental/server/src/templates.json
deleted file mode 100644
index 256cca609..000000000
--- a/apps/trpc-experimental/server/src/templates.json
+++ /dev/null
@@ -1 +0,0 @@
-[{"templateVersion":"1.0.0","defaultVersion":"0.8.0","documentation":"https://pocketbase.io/docs/","type":"pocketbase","name":"Pocketbase","description":"Open Source realtime backend in 1 file","services":{"$$id":{"image":"coollabsio/pocketbase:$$core_version","volumes":["$$id-data:/app/pb_data"],"ports":["8080"]}}},{"templateVersion":"1.0.0","defaultVersion":"1.5.0-rc.0","documentation":"https://plausible.io/doc/","type":"plausibleanalytics-arm","name":"Plausible Analytics (ARM)","description":"A lightweight and open-source website analytics tool.","labels":["analytics","statistics","plausible","gdpr","no-cookie","google analytics"],"services":{"$$id":{"name":"Plausible Analytics","command":"sh -c \"sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh db init-admin && /entrypoint.sh run\"","depends_on":["$$id-postgresql","$$id-clickhouse"],"image":"plausible/analytics:$$core_version","environment":["ADMIN_USER_EMAIL=$$config_admin_user_email","ADMIN_USER_NAME=$$config_admin_user_name","ADMIN_USER_PWD=$$secret_admin_user_pwd","BASE_URL=$$config_base_url","SECRET_KEY_BASE=$$secret_secret_key_base","DISABLE_AUTH=$$config_disable_auth","DISABLE_REGISTRATION=$$config_disable_registration","DATABASE_URL=$$secret_database_url","CLICKHOUSE_DATABASE_URL=$$secret_clickhouse_database_url"],"ports":["8000"]},"$$id-postgresql":{"name":"PostgreSQL","image":"postgres:14-alpine","volumes":["$$id-postgresql-data:/var/lib/postgresql/data"],"environment":["POSTGRES_PASSWORD=$$secret_postgres_password","POSTGRES_USER=$$config_postgres_user","POSTGRES_DB=$$config_postgres_db"]},"$$id-clickhouse":{"name":"Clickhouse","volumes":["$$id-clickhouse-data:/var/lib/clickhouse"],"image":"clickhouse/clickhouse-server:22.6-alpine","ulimits":{"nofile":{"soft":262144,"hard":262144}},"files":[{"location":"/etc/clickhouse-server/users.d/logging.xml","content":"warning true "},{"location":"/etc/clickhouse-server/config.d/logging.xml","content":"0 0 "},{"location":"/docker-entrypoint-initdb.d/init.query","content":"CREATE DATABASE IF NOT EXISTS plausible;"},{"location":"/docker-entrypoint-initdb.d/init-db.sh","content":"clickhouse client --queries-file /docker-entrypoint-initdb.d/init.query"}]}},"variables":[{"id":"$$config_base_url","name":"BASE_URL","label":"Base URL","defaultValue":"$$generate_fqdn","description":"You must set this to the FQDN of the Plausible Analytics instance. This is used to generate the links to the Plausible Analytics instance."},{"id":"$$secret_database_url","name":"DATABASE_URL","label":"Database URL for PostgreSQL","defaultValue":"postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db","description":""},{"id":"$$secret_clickhouse_database_url","name":"CLICKHOUSE_DATABASE_URL","label":"Database URL for Clickhouse","defaultValue":"http://$$id-clickhouse:8123/plausible","description":""},{"id":"$$config_admin_user_email","name":"ADMIN_USER_EMAIL","label":"Admin Email Address","defaultValue":"admin@example.com","description":"This is the admin email. Please change it."},{"id":"$$config_admin_user_name","name":"ADMIN_USER_NAME","label":"Admin User Name","defaultValue":"$$generate_username","description":"This is the admin username. Please change it."},{"id":"$$secret_admin_user_pwd","name":"ADMIN_USER_PWD","label":"Admin User Password","defaultValue":"$$generate_password","description":"This is the admin password. Please change it.","showOnConfiguration":true},{"id":"$$secret_secret_key_base","name":"SECRET_KEY_BASE","label":"Secret Key Base","defaultValue":"$$generate_hex(64)","description":""},{"id":"$$config_disable_auth","name":"DISABLE_AUTH","label":"Disable Authentication","defaultValue":"false","description":""},{"id":"$$config_disable_registration","name":"DISABLE_REGISTRATION","label":"Disable Registration","defaultValue":"true","description":""},{"id":"$$config_postgres_user","main":"$$id-postgresql","name":"POSTGRES_USER","label":"PostgreSQL Username","defaultValue":"postgresql","description":""},{"id":"$$secret_postgres_password","main":"$$id-postgresql","name":"POSTGRES_PASSWORD","label":"PostgreSQL Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true},{"id":"$$config_postgres_db","main":"$$id-postgresql","name":"POSTGRES_DB","label":"PostgreSQL Database","defaultValue":"plausible","description":""},{"id":"$$config_scriptName","name":"SCRIPT_NAME","label":"Custom Script Name","defaultValue":"plausible.js","description":"This is the default script name."}]},{"templateVersion":"1.0.0","defaultVersion":"1.17","documentation":"https://docs.gitea.io","type":"gitea","name":"Gitea","description":"Gitea is a community managed lightweight code hosting solution written in Go.","labels":["storage","git"],"services":{"$$id":{"name":"Gitea","documentation":"https://docs.gitea.io","image":"gitea/gitea:$$core_version","volumes":["$$id-data:/data","/etc/timezone:/etc/timezone:ro","/etc/localtime:/etc/localtime:ro"],"environment":["USER_UID=1000","USER_GID=1000","DOMAIN=$$config_domain","SSH_DOMAIN=$$config_ssh_domain","ROOT_URL=$$config_root_url","SECRET_KEY=$$secret_secret_key","INTERNAL_TOKEN=$$secret_internal_token","SSH_PORT=22","START_SSH_SERVER=$$config_start_ssh_server"],"ports":["3000","22"],"proxy":[{"port":"22","hostPort":"$$config_hostport_ssh"}]}},"variables":[{"id":"$$config_hostport_ssh","name":"SSH_PORT","label":"SSH Port","defaultValue":"8022","description":"","required":true},{"id":"$$config_domain","name":"DOMAIN","label":"Domain","defaultValue":"$$generate_domain","description":""},{"id":"$$config_ssh_domain","name":"SSH_DOMAIN","label":"SSH Domain","defaultValue":"$$generate_domain","description":""},{"id":"$$config_start_ssh_server","name":"START_SSH_SERVER","label":"Start SSH Server","defaultValue":"true","description":""},{"id":"$$config_root_url","name":"ROOT_URL","label":"Root URL of Gitea","defaultValue":"$$generate_fqdn_slash","description":""},{"id":"$$secret_secret_key","name":"SECRET_KEY","label":"Secret Key","defaultValue":"$$generate_hex(32)","description":""},{"id":"$$secret_internal_token","name":"INTERNAL_TOKEN","label":"Internal JWT Token","defaultValue":"$$generate_token","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"20.0","documentation":"https://www.keycloak.org/documentation","type":"keycloak","name":"Keycloak","description":"Keycloak provides user federation, strong authentication, user management, fine-grained authorization, and more.","labels":["authentication","authorization","oidconnect","saml2"],"services":{"$$id":{"name":"Keycloak","command":"start --db=postgres --features=token-exchange --import-realm","depends_on":["$$id-postgresql"],"image":"quay.io/keycloak/keycloak:$$core_version","volumes":["$$id-import:/opt/keycloak/data/import"],"environment":["KC_HEALTH_ENABLED=true","KC_PROXY=edge","KC_DB=postgres","KC_HOSTNAME=$$config_keycloak_domain","KEYCLOAK_ADMIN=$$config_admin_user","KEYCLOAK_ADMIN_PASSWORD=$$secret_keycloak_admin_password","KC_DB_PASSWORD=$$secret_postgres_password","KC_DB_USERNAME=$$config_postgres_user","KC_DB_URL=$$secret_keycloak_database_url"],"ports":["8080"]},"$$id-postgresql":{"name":"PostgreSQL","depends_on":[],"image":"postgres:14-alpine","volumes":["$$id-postgresql-data:/var/lib/postgresql/data"],"environment":["POSTGRES_USER=$$config_postgres_user","POSTGRES_PASSWORD=$$secret_postgres_password","POSTGRES_DB=$$config_postgres_db"],"ports":[]}},"variables":[{"id":"$$config_keycloak_domain","name":"KEYCLOAK_DOMAIN","label":"Keycloak Domain","defaultValue":"$$generate_domain","description":""},{"id":"$$secret_keycloak_database_url","name":"KEYCLOAK_DATABASE_URL","label":"Keycloak Database Url","defaultValue":"jdbc:postgresql://$$id-postgresql:5432/$$config_postgres_db","description":""},{"id":"$$config_admin_user","name":"KEYCLOAK_ADMIN","label":"Keycloak Admin User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_keycloak_admin_password","name":"KEYCLOAK_ADMIN_PASSWORD","label":"Keycloak Admin Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true},{"id":"$$config_postgres_user","main":"$$id-postgresql","name":"POSTGRES_USER","label":"PostgreSQL User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_postgres_password","main":"$$id-postgresql","name":"POSTGRES_PASSWORD","label":"PostgreSQL Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true},{"id":"$$config_postgres_db","main":"$$id-postgresql","name":"POSTGRES_DB","label":"PostgreSQL Database","defaultValue":"keycloak","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"v3.6","documentation":"https://github.com/freyacodes/Lavalink","description":"Standalone audio sending node based on Lavaplayer.","type":"lavalink","name":"Lavalink","labels":["discord","discord bot","audio","lavalink","jda"],"services":{"$$id":{"name":"Lavalink","image":"fredboat/lavalink:$$core_version","environment":[],"volumes":["$$id-lavalink:/lavalink"],"ports":["2333"],"files":[{"location":"/opt/Lavalink/application.yml","content":"server:\n port: $$config_port\n address: 0.0.0.0\nlavalink:\n server:\n password: \"$$secret_password\"\n sources:\n youtube: true\n bandcamp: true\n soundcloud: true\n twitch: true\n vimeo: true\n http: true\n local: false\n\nlogging:\n file:\n path: ./logs/\n\n level:\n root: INFO\n lavalink: INFO\n\n logback:\n rollingpolicy:\n max-file-size: 1GB\n max-history: 30"}]}},"variables":[{"id":"$$config_port","name":"PORT","label":"Port","defaultValue":"2333","required":true},{"id":"$$secret_password","name":"PASSWORD","label":"Password","defaultValue":"$$generate_password","required":true}]},{"templateVersion":"1.0.0","defaultVersion":"v1.8.6","documentation":"https://docs.appsmith.com/getting-started/setup/instance-configuration/","type":"appsmith","name":"Appsmith","description":"Fastest way to build internal apps over any database or API.","services":{"$$id":{"image":"appsmith/appsmith-ce:$$core_version","environment":["APPSMITH_MAIL_ENABLED=$$config_appsmith_mail_enabled","APPSMITH_DISABLE_TELEMETRY=$$config_appsmith_disable_telemetry","APPSMITH_DISABLE_INTERCOM=$$config_appsmith_disable_intercom"],"volumes":["$$id-stacks-data:/appsmith-stacks"],"ports":["80"]}},"variables":[{"id":"$$config_appsmith_mail_enabled","name":"APPSMITH_MAIL_ENABLED","label":"Enable Mail","defaultValue":"false","description":""},{"id":"$$config_appsmith_disable_telemetry","name":"APPSMITH_DISABLE_TELEMETRY","label":"Disable Telemetry","defaultValue":"true","description":""},{"id":"$$config_appsmith_disable_intercom","name":"APPSMITH_DISABLE_INTERCOM","label":"Disable Intercom","defaultValue":"true","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"0.56.2","documentation":"https://hub.docker.com/r/zadam/trilium","description":"A hierarchical note taking application with focus on building large personal knowledge bases.","labels":["personal","knowledge","notes","wiki"],"type":"trilium","name":"Trilium Notes","services":{"$$id":{"image":"zadam/trilium:$$core_version","environment":[],"volumes":["$$id-trilium:/home/node/trilium-data"],"ports":["8080"]}},"variables":[]},{"templateVersion":"1.0.0","defaultVersion":"1.9.2","documentation":"https://hub.docker.com/r/louislam/uptime-kuma","description":"A free & fancy self-hosted monitoring tool.","labels":["uptime"],"type":"uptimekuma","name":"UptimeKuma","services":{"$$id":{"image":"louislam/uptime-kuma:$$core_version","environment":[],"volumes":["$$id-uptimekuma:/app/data"],"ports":["3001"]}},"variables":[]},{"templateVersion":"1.0.0","defaultVersion":"5.8","documentation":"https://hub.docker.com/r/silviof/docker-languagetool","description":"A multilingual grammar, style and spell checker.","type":"languagetool","name":"LanguageTool","services":{"$$id":{"image":"silviof/docker-languagetool:$$core_version","environment":[],"volumes":["$$id-ngrams:/ngrams"],"ports":["8010"]}},"variables":[]},{"templateVersion":"1.0.0","defaultVersion":"1.26.0","documentation":"https://hub.docker.com/r/vaultwarden/server","description":"Bitwarden compatible server written in Rust.","type":"vaultwarden","name":"VaultWarden","labels":["bitwarden","password manager"],"services":{"$$id":{"image":"vaultwarden/server:$$core_version","environment":[],"volumes":["$$id-data:/data"],"ports":["80"]}},"variables":[]},{"templateVersion":"1.0.0","defaultVersion":"9.2.3","documentation":"https://hub.docker.com/r/grafana/grafana","type":"grafana","name":"Grafana","description":"Grafana allows you to query, visualize, alert on and understand your metrics.","labels":["monitoring","metrics","dashboard"],"services":{"$$id":{"image":"grafana/grafana:$$core_version","environment":[],"volumes":["$$id-config:/etc/grafana","$$id-grafana:/var/lib/grafana"],"ports":["3000"]}},"variables":[]},{"templateVersion":"1.0.0","defaultVersion":"1.0.3","documentation":"https://appwrite.io/docs","type":"appwrite","name":"Appwrite","description":"Secure Backend Server for Web, Mobile & Flutter Developers.","labels":["serverless","backend","storage","api"],"services":{"$$id":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_WORKER_PER_CORE=$$config__app_worker_per_core","_APP_LOCALE=$$config__app_locale","_APP_CONSOLE_WHITELIST_ROOT=$$config__app_console_whitelist_root","_APP_CONSOLE_WHITELIST_EMAILS=$$config__app_console_whitelist_emails","_APP_CONSOLE_WHITELIST_IPS=$$config__app_console_whitelist_ips","_APP_SYSTEM_EMAIL_NAME=$$config__app_system_email_name","_APP_SYSTEM_EMAIL_ADDRESS=$$config__app_system_email_address","_APP_SYSTEM_SECURITY_EMAIL_ADDRESS=$$config__app_system_security_email_address","_APP_SYSTEM_RESPONSE_FORMAT=$$config__app_system_response_format","_APP_OPTIONS_ABUSE=$$config__app_options_abuse","_APP_OPTIONS_FORCE_HTTPS=$$config__app_options_force_https","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_DOMAIN=$$config__app_domain","_APP_DOMAIN_TARGET=$$config__app_domain_target","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_SMTP_HOST=$$config__app_smtp_host","_APP_SMTP_PORT=$$config__app_smtp_port","_APP_SMTP_SECURE=$$config__app_smtp_secure","_APP_SMTP_USERNAME=$$config__app_smtp_username","_APP_SMTP_PASSWORD=$$secret__app_smtp_password","_APP_USAGE_STATS=$$config__app_usage_stats","_APP_INFLUXDB_HOST=$$config__app_influxdb_host","_APP_INFLUXDB_PORT=$$config__app_influxdb_port","_APP_STORAGE_LIMIT=$$config__app_storage_limit","_APP_STORAGE_PREVIEW_LIMIT=$$config__app_storage_preview_limit","_APP_STORAGE_ANTIVIRUS=$$config__app_storage_antivirus_enabled","_APP_STORAGE_ANTIVIRUS_HOST=$$config__app_storage_antivirus_host","_APP_STORAGE_ANTIVIRUS_PORT=$$config__app_storage_antivirus_port","_APP_STORAGE_DEVICE=$$config__app_storage_device","_APP_STORAGE_S3_ACCESS_KEY=$$secret__app_storage_s3_access_key","_APP_STORAGE_S3_SECRET=$$secret__app_storage_s3_secret","_APP_STORAGE_S3_REGION=$$config__app_storage_s3_region","_APP_STORAGE_S3_BUCKET=$$config__app_storage_s3_bucket","_APP_STORAGE_DO_SPACES_ACCESS_KEY=$$secret__app_storage_do_spaces_access_key","_APP_STORAGE_DO_SPACES_SECRET=$$secret__app_storage_do_spaces_secret","_APP_STORAGE_DO_SPACES_REGION=$$config__app_storage_do_spaces_region","_APP_STORAGE_DO_SPACES_BUCKET=$$config__app_storage_do_spaces_bucket","_APP_STORAGE_BACKBLAZE_ACCESS_KEY=$$secret__app_storage_backblaze_access_key","_APP_STORAGE_BACKBLAZE_SECRET=$$secret__app_storage_backblaze_secret","_APP_STORAGE_BACKBLAZE_REGION=$$config__app_storage_backblaze_region","_APP_STORAGE_BACKBLAZE_BUCKET=$$config__app_storage_backblaze_bucket","_APP_STORAGE_LINODE_ACCESS_KEY=$$secret__app_storage_linode_access_key","_APP_STORAGE_LINODE_SECRET=$$secret__app_storage_linode_secret","_APP_STORAGE_LINODE_REGION=$$config__app_storage_linode_region","_APP_STORAGE_LINODE_BUCKET=$$config__app_storage_linode_bucket","_APP_STORAGE_WASABI_ACCESS_KEY=$$secret__app_storage_wasabi_access_key","_APP_STORAGE_WASABI_SECRET=$$secret__app_storage_wasabi_secret","_APP_STORAGE_WASABI_REGION=$$config__app_storage_wasabi_region","_APP_STORAGE_WASABI_BUCKET=$$config__app_storage_wasabi_bucket","_APP_FUNCTIONS_SIZE_LIMIT=$$config__app_functions_size_limit","_APP_FUNCTIONS_TIMEOUT=$$config__app_functions_timeout","_APP_FUNCTIONS_BUILD_TIMEOUT=$$config__app_functions_build_timeout","_APP_FUNCTIONS_CONTAINERS=$$config__app_functions_containers","_APP_FUNCTIONS_CPUS=$$config__app_functions_cpus","_APP_FUNCTIONS_MEMORY=$$config__app_functions_memory_allocated","_APP_FUNCTIONS_MEMORY_SWAP=$$config__app_functions_memory_swap","_APP_FUNCTIONS_RUNTIMES=$$config__app_functions_runtimes","_APP_EXECUTOR_SECRET=$$secret__app_executor_secret","_APP_EXECUTOR_HOST=$$config__app_executor_host","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","_APP_STATSD_HOST=$$config__app_statsd_host","_APP_STATSD_PORT=$$config__app_statsd_port","_APP_MAINTENANCE_INTERVAL=$$config__app_maintenance_interval","_APP_MAINTENANCE_RETENTION_EXECUTION=$$config__app_maintenance_retention_execution","_APP_MAINTENANCE_RETENTION_CACHE=$$config__app_maintenance_retention_cache","_APP_MAINTENANCE_RETENTION_ABUSE=$$config__app_maintenance_retention_abuse","_APP_MAINTENANCE_RETENTION_AUDIT=$$config__app_maintenance_retention_audit","_APP_SMS_PROVIDER=$$config__app_sms_provider","_APP_SMS_FROM=$$config__app_sms_from","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":["$$id-uploads:/storage/uploads","$$id-cache:/storage/cache","$$id-config:/storage/config","$$id-certificates:/storage/certificates","$$id-functions:/storage/functions"],"ports":["80"],"proxy":[{"port":"80"}]},"$$id-executor":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_FUNCTIONS_TIMEOUT=$$config__app_functions_timeout","_APP_FUNCTIONS_BUILD_TIMEOUT=$$config__app_functions_build_timeout","_APP_FUNCTIONS_CONTAINERS=$$config__app_functions_containers","_APP_FUNCTIONS_RUNTIMES=$$config__app_functions_runtimes","_APP_FUNCTIONS_CPUS=$$config__app_functions_cpus","_APP_FUNCTIONS_MEMORY=$$config__app_functions_memory_allocated","_APP_FUNCTIONS_MEMORY_SWAP=$$config__app_functions_memory_swap","_APP_FUNCTIONS_INACTIVE_THRESHOLD=$$config__app_functions_inactive_threshold","_APP_EXECUTOR_SECRET=$$secret__app_executor_secret","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","_APP_STORAGE_DEVICE=$$config__app_storage_device","_APP_STORAGE_S3_ACCESS_KEY=$$secret__app_storage_s3_access_key","_APP_STORAGE_S3_SECRET=$$secret__app_storage_s3_secret","_APP_STORAGE_S3_REGION=$$config__app_storage_s3_region","_APP_STORAGE_S3_BUCKET=$$config__app_storage_s3_bucket","_APP_STORAGE_DO_SPACES_ACCESS_KEY=$$secret__app_storage_do_spaces_access_key","_APP_STORAGE_DO_SPACES_SECRET=$$secret__app_storage_do_spaces_secret","_APP_STORAGE_DO_SPACES_REGION=$$config__app_storage_do_spaces_region","_APP_STORAGE_DO_SPACES_BUCKET=$$config__app_storage_do_spaces_bucket","_APP_STORAGE_BACKBLAZE_ACCESS_KEY=$$secret__app_storage_backblaze_access_key","_APP_STORAGE_BACKBLAZE_SECRET=$$secret__app_storage_backblaze_secret","_APP_STORAGE_BACKBLAZE_REGION=$$config__app_storage_backblaze_region","_APP_STORAGE_BACKBLAZE_BUCKET=$$config__app_storage_backblaze_bucket","_APP_STORAGE_LINODE_ACCESS_KEY=$$secret__app_storage_linode_access_key","_APP_STORAGE_LINODE_SECRET=$$secret__app_storage_linode_secret","_APP_STORAGE_LINODE_REGION=$$config__app_storage_linode_region","_APP_STORAGE_LINODE_BUCKET=$$config__app_storage_linode_bucket","_APP_STORAGE_WASABI_ACCESS_KEY=$$secret__app_storage_wasabi_access_key","_APP_STORAGE_WASABI_SECRET=$$secret__app_storage_wasabi_secret","_APP_STORAGE_WASABI_REGION=$$config__app_storage_wasabi_region","_APP_STORAGE_WASABI_BUCKET=$$config__app_storage_wasabi_bucket","DOCKERHUB_PULL_USERNAME=$$config_dockerhub_pull_username","DOCKERHUB_PULL_PASSWORD=$$secret_dockerhub_pull_password","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":["$$id-functions:/storage/functions","$$id-builds:/storage/builds","/var/run/docker.sock:/var/run/docker.sock"],"entrypoint":"executor"},"$$id-influxdb":{"image":"appwrite/influxdb:1.5.0","environment":[],"volumes":["$$id-influxdb:/var/lib/influxdb"]},"$$id-maintenance":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_DOMAIN=$$config__app_domain","_APP_DOMAIN_TARGET=$$config__app_domain_target","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_MAINTENANCE_INTERVAL=$$config__app_maintenance_interval","_APP_MAINTENANCE_RETENTION_EXECUTION=$$config__app_maintenance_retention_execution","_APP_MAINTENANCE_RETENTION_CACHE=$$config__app_maintenance_retention_cache","_APP_MAINTENANCE_RETENTION_ABUSE=$$config__app_maintenance_retention_abuse","_APP_MAINTENANCE_RETENTION_AUDIT=$$config__app_maintenance_retention_audit","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"maintenance"},"$$id-mariadb":{"image":"mariadb:10.7","command":"--innodb-flush-method fsync","environment":["MARIADB_ROOT_PASSWORD=$$secret__app_db_root_pass","MARIADB_DATABASE=$$config__app_db_schema","MARIADB_USER=$$config__app_db_user","MARIADB_PASSWORD=$$secret__app_db_pass","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":["$$id-mariadb:/var/lib/mysql"]},"$$id-realtime":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_WORKER_PER_CORE=$$config__app_worker_per_core","_APP_OPTIONS_ABUSE=$$config__app_options_abuse","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_USAGE_STATS=$$config__app_usage_stats","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"realtime","proxy":[{"port":"80","pathPrefix":"/v1/realtime"}]},"$$id-redis":{"image":"redis:7.0.4-alpine","command":"--maxmemory 512mb --maxmemory-policy allkeys-lru --maxmemory-samples 5","environment":[],"volumes":["$$id-redis:/data"]},"$$id-schedule":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"schedule"},"$$id-telegraf":{"image":"appwrite/telegraf:1.4.0","environment":["_APP_INFLUXDB_HOST=$$config__app_influxdb_host","_APP_INFLUXDB_PORT=$$config__app_influxdb_port","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":["$$id-influxdb:/var/lib/influxdb"]},"$$id-usage-database":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_INFLUXDB_HOST=$$config__app_influxdb_host","_APP_INFLUXDB_PORT=$$config__app_influxdb_port","_APP_USAGE_TIMESERIES_INTERVAL=$$config__app_usage_timeseries_interval","_APP_USAGE_DATABASE_INTERVAL=$$config__app_usage_database_interval","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"usage --type database"},"$$id-usage":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_INFLUXDB_HOST=$$config__app_influxdb_host","_APP_INFLUXDB_PORT=$$config__app_influxdb_port","_APP_USAGE_TIMESERIES_INTERVAL=$$config__app_usage_timeseries_interval","_APP_USAGE_DATABASE_INTERVAL=$$config__app_usage_database_interval","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"usage --type timeseries"},"$$id-worker-audits":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"worker-audits"},"$$id-worker-builds":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_EXECUTOR_SECRET=$$secret__app_executor_secret","_APP_EXECUTOR_HOST=$$config__app_executor_host","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"worker-builds"},"$$id-worker-certificates":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_DOMAIN=$$config__app_domain","_APP_DOMAIN_TARGET=$$config__app_domain_target","_APP_SYSTEM_SECURITY_EMAIL_ADDRESS=$$config__app_system_security_email_address","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":["$$id-config:/storage/config","$$id-certificates:/storage/certificates"],"entrypoint":"worker-certificates"},"$$id-worker-databases":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"worker-databases"},"$$id-worker-deletes":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_STORAGE_DEVICE=$$config__app_storage_device","_APP_STORAGE_S3_ACCESS_KEY=$$secret__app_storage_s3_access_key","_APP_STORAGE_S3_SECRET=$$secret__app_storage_s3_secret","_APP_STORAGE_S3_REGION=$$config__app_storage_s3_region","_APP_STORAGE_S3_BUCKET=$$config__app_storage_s3_bucket","_APP_STORAGE_DO_SPACES_ACCESS_KEY=$$secret__app_storage_do_spaces_access_key","_APP_STORAGE_DO_SPACES_SECRET=$$secret__app_storage_do_spaces_secret","_APP_STORAGE_DO_SPACES_REGION=$$config__app_storage_do_spaces_region","_APP_STORAGE_DO_SPACES_BUCKET=$$config__app_storage_do_spaces_bucket","_APP_STORAGE_BACKBLAZE_ACCESS_KEY=$$secret__app_storage_backblaze_access_key","_APP_STORAGE_BACKBLAZE_SECRET=$$secret__app_storage_backblaze_secret","_APP_STORAGE_BACKBLAZE_REGION=$$config__app_storage_backblaze_region","_APP_STORAGE_BACKBLAZE_BUCKET=$$config__app_storage_backblaze_bucket","_APP_STORAGE_LINODE_ACCESS_KEY=$$secret__app_storage_linode_access_key","_APP_STORAGE_LINODE_SECRET=$$secret__app_storage_linode_secret","_APP_STORAGE_LINODE_REGION=$$config__app_storage_linode_region","_APP_STORAGE_LINODE_BUCKET=$$config__app_storage_linode_bucket","_APP_STORAGE_WASABI_ACCESS_KEY=$$secret__app_storage_wasabi_access_key","_APP_STORAGE_WASABI_SECRET=$$secret__app_storage_wasabi_secret","_APP_STORAGE_WASABI_REGION=$$config__app_storage_wasabi_region","_APP_STORAGE_WASABI_BUCKET=$$config__app_storage_wasabi_bucket","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","_APP_EXECUTOR_SECRET=$$secret__app_executor_secret","_APP_EXECUTOR_HOST=$$config__app_executor_host","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":["$$id-uploads:/storage/uploads","$$id-cache:/storage/cache","$$id-functions:/storage/functions","$$id-builds:/storage/builds","$$id-certificates:/storage/certificates"],"entrypoint":"worker-deletes"},"$$id-worker-functions":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_FUNCTIONS_TIMEOUT=$$config__app_functions_timeout","_APP_EXECUTOR_SECRET=$$secret__app_executor_secret","_APP_EXECUTOR_HOST=$$config__app_executor_host","_APP_USAGE_STATS=$$config__app_usage_stats","DOCKERHUB_PULL_USERNAME=$$config_dockerhub_pull_username","DOCKERHUB_PULL_PASSWORD=$$secret_dockerhub_pull_password","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"worker-functions"},"$$id-worker-mails":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_SYSTEM_EMAIL_NAME=$$config__app_system_email_name","_APP_SYSTEM_EMAIL_ADDRESS=$$config__app_system_email_address","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_SMTP_HOST=$$config__app_smtp_host","_APP_SMTP_PORT=$$config__app_smtp_port","_APP_SMTP_SECURE=$$config__app_smtp_secure","_APP_SMTP_USERNAME=$$config__app_smtp_username","_APP_SMTP_PASSWORD=$$secret__app_smtp_password","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"worker-mails"},"$$id-worker-messaging":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_SMS_PROVIDER=$$config__app_sms_provider","_APP_SMS_FROM=$$config__app_sms_from","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"worker-messaging"},"$$id-worker-webhooks":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_SYSTEM_SECURITY_EMAIL_ADDRESS=$$config__app_system_security_email_address","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"worker-webhooks"}},"variables":[{"id":"$$config__app_influxdb_host","name":"_APP_INFLUXDB_HOST","label":"InfluxDB | _APP_INFLUXDB_HOST","defaultValue":"$$id-influxdb","description":""},{"id":"$$config__app_influxdb_port","name":"_APP_INFLUXDB_PORT","label":"InfluxDB | _APP_INFLUXDB_PORT","defaultValue":"8086","description":"InfluxDB server TCP port."},{"id":"$$config__app_env","name":"_APP_ENV","label":"General | _APP_ENV","defaultValue":"production","description":"Set your server running environment."},{"id":"$$config__app_worker_per_core","name":"_APP_WORKER_PER_CORE","label":"General | _APP_WORKER_PER_CORE","defaultValue":"6","description":"Internal Worker per core for the API, Realtime and Executor containers. Can be configured to optimize performance."},{"id":"$$config__app_locale","name":"_APP_LOCALE","label":"General | _APP_LOCALE","defaultValue":"en","description":"Set your Appwrite's locale. By default, the locale is set to 'en'."},{"id":"$$config__app_console_whitelist_root","name":"_APP_CONSOLE_WHITELIST_ROOT","label":"General | _APP_CONSOLE_WHITELIST_ROOT","defaultValue":"enabled","description":"This option allows you to disable the creation of new users on the Appwrite console. When enabled only 1 user will be able to use the registration form. New users can be added by inviting them to your project. By default this option is enabled."},{"id":"$$config__app_console_whitelist_emails","name":"_APP_CONSOLE_WHITELIST_EMAILS","label":"General | _APP_CONSOLE_WHITELIST_EMAILS","defaultValue":"","description":"This option allows you to limit creation of new users on the Appwrite console. This option is very useful for small teams or sole developers. To enable it, pass a list of allowed email addresses separated by a comma."},{"id":"$$config__app_console_whitelist_ips","name":"_APP_CONSOLE_WHITELIST_IPS","label":"General | _APP_CONSOLE_WHITELIST_IPS","defaultValue":"","description":"This last option allows you to limit creation of users in Appwrite console for users sharing the same set of IP addresses. This option is very useful for team working with a VPN service or a company IP.\\n\\nTo enable/activate this option, pass a list of allowed IP addresses separated by a comma."},{"id":"$$config__app_system_email_name","name":"_APP_SYSTEM_EMAIL_NAME","label":"General | _APP_SYSTEM_EMAIL_NAME","defaultValue":"Appwrite","description":"This is the sender name value that will appear on email messages sent to developers from the Appwrite console. You can use url encoded strings for spaces and special chars."},{"id":"$$config__app_system_email_address","name":"_APP_SYSTEM_EMAIL_ADDRESS","label":"General | _APP_SYSTEM_EMAIL_ADDRESS","defaultValue":"team@appwrite.io","description":"This is the sender email address that will appear on email messages sent to developers from the Appwrite console. You should choose an email address that is allowed to be used from your SMTP server to avoid the server email ending in the users' SPAM folders."},{"id":"$$config__app_system_security_email_address","name":"_APP_SYSTEM_SECURITY_EMAIL_ADDRESS","label":"General | _APP_SYSTEM_SECURITY_EMAIL_ADDRESS","defaultValue":"certs@appwrite.io","description":"This is the email address used to issue SSL certificates for custom domains or the user agent in your webhooks payload."},{"id":"$$config__app_system_response_format","name":"_APP_SYSTEM_RESPONSE_FORMAT","label":"General | _APP_SYSTEM_RESPONSE_FORMAT","defaultValue":"","description":"Use this environment variable to set the default Appwrite HTTP response format to support an older version of Appwrite. This option is useful to overcome breaking changes between versions. You can also use the X-Appwrite-Response-Format HTTP request header to overwrite the response for a specific request. This variable accepts any valid Appwrite version. To use the current version format, leave the value of the variable empty."},{"id":"$$config__app_options_abuse","name":"_APP_OPTIONS_ABUSE","label":"General | _APP_OPTIONS_ABUSE","defaultValue":"enabled","description":"Allows you to disable abuse checks and API rate limiting. By default, set to 'enabled'. To cancel the abuse checking, set to 'disabled'. It is not recommended to disable this check-in a production environment."},{"id":"$$config__app_options_force_https","name":"_APP_OPTIONS_FORCE_HTTPS","label":"General | _APP_OPTIONS_FORCE_HTTPS","defaultValue":"disabled","description":"Allows you to force HTTPS connection to your API. This feature redirects any HTTP call to HTTPS and adds the 'Strict-Transport-Security' header to all HTTP responses."},{"id":"$$secret__app_openssl_key_v1","name":"_APP_OPENSSL_KEY_V1","label":"General | _APP_OPENSSL_KEY_V1","defaultValue":"$$generate_hex(256)","description":"This is your server private secret key that is used to encrypt all sensitive data on your server. Appwrite server encrypts all secret data on your server like webhooks, HTTP passwords, user sessions, and storage files. Keep it a secret and have a backup for it."},{"id":"$$config__app_domain","name":"_APP_DOMAIN","label":"General | _APP_DOMAIN","defaultValue":"$$generate_domain","description":"Your Appwrite domain address. When setting a public suffix domain, Appwrite will attempt to issue a valid SSL certificate automatically. When used with a dev domain, Appwrite will assign a self-signed SSL certificate. The default value is 'localhost'."},{"id":"$$config__app_domain_target","name":"_APP_DOMAIN_TARGET","label":"General | _APP_DOMAIN_TARGET","defaultValue":"$$generate_fqdn","description":"A DNS A record hostname to serve as a CNAME target for your Appwrite custom domains. You can use the same value as used for the Appwrite '_APP_DOMAIN' variable. The default value is 'localhost'."},{"id":"$$config__app_redis_host","name":"_APP_REDIS_HOST","label":"Redis | _APP_REDIS_HOST","defaultValue":"$$id-redis","description":""},{"id":"$$config__app_redis_port","name":"_APP_REDIS_PORT","label":"Redis | _APP_REDIS_PORT","defaultValue":"6379","description":"Redis server TCP port."},{"id":"$$config__app_redis_user","name":"_APP_REDIS_USER","label":"Redis | _APP_REDIS_USER","defaultValue":"","description":"Redis server user. This is an optional variable. Default value is an empty string."},{"id":"$$secret__app_redis_pass","name":"_APP_REDIS_PASS","label":"Redis | _APP_REDIS_PASS","defaultValue":"","description":"Redis server password. This is an optional variable. Default value is an empty string."},{"id":"$$config__app_db_host","name":"_APP_DB_HOST","label":"MariaDB | _APP_DB_HOST","defaultValue":"$$id-mariadb","description":""},{"id":"$$config__app_db_port","name":"_APP_DB_PORT","label":"MariaDB | _APP_DB_PORT","defaultValue":"3306","description":"MariaDB server TCP port."},{"id":"$$config__app_db_schema","name":"_APP_DB_SCHEMA","label":"MariaDB | _APP_DB_SCHEMA","defaultValue":"appwrite","description":"MariaDB server database schema."},{"id":"$$config__app_db_user","name":"_APP_DB_USER","label":"MariaDB | _APP_DB_USER","defaultValue":"user","description":"MariaDB server user name."},{"id":"$$secret__app_db_root_pass","name":"MARIADB_ROOT_PASSWORD","label":"MariaDB | MARIADB_ROOT_PASSWORD","defaultValue":"$$generate_hex(16)","description":"MariaDB server root user password."},{"id":"$$secret__app_db_pass","name":"_APP_DB_PASS","label":"MariaDB | _APP_DB_PASS","defaultValue":"$$generate_hex(16)","description":"MariaDB server user password."},{"id":"$$config__app_smtp_host","name":"_APP_SMTP_HOST","label":"SMTP | _APP_SMTP_HOST","defaultValue":"","description":"SMTP server host name address. Use an empty string to disable all mail sending from the server. The default value for this variable is an empty string."},{"id":"$$config__app_smtp_port","name":"_APP_SMTP_PORT","label":"SMTP | _APP_SMTP_PORT","defaultValue":"","description":"SMTP server TCP port. Empty by default."},{"id":"$$config__app_smtp_secure","name":"_APP_SMTP_SECURE","label":"SMTP | _APP_SMTP_SECURE","defaultValue":"","description":"SMTP secure connection protocol. Empty by default, change to 'tls' if running on a secure connection."},{"id":"$$config__app_smtp_username","name":"_APP_SMTP_USERNAME","label":"SMTP | _APP_SMTP_USERNAME","defaultValue":"","description":"SMTP server user name. Empty by default."},{"id":"$$secret__app_smtp_password","name":"_APP_SMTP_PASSWORD","label":"SMTP | _APP_SMTP_PASSWORD","defaultValue":"","description":"SMTP server user password. Empty by default."},{"id":"$$config__app_usage_stats","name":"_APP_USAGE_STATS","label":"General | _APP_USAGE_STATS","defaultValue":"enabled","description":"This variable allows you to disable the collection and displaying of usage stats. This value is set to 'enabled' by default, to disable the usage stats set the value to 'disabled'. When disabled, it's recommended to turn off the Worker Usage, Influxdb and Telegraf containers for better resource usage."},{"id":"$$config__app_storage_limit","name":"_APP_STORAGE_LIMIT","label":"Storage | _APP_STORAGE_LIMIT","defaultValue":"30000000","description":"Maximum file size allowed for file upload. The default value is 30MB. You should pass your size limit value in bytes."},{"id":"$$config__app_storage_preview_limit","name":"_APP_STORAGE_PREVIEW_LIMIT","label":"Storage | _APP_STORAGE_PREVIEW_LIMIT","defaultValue":"20000000","description":"Maximum file size allowed for file image preview. The default value is 20MB. You should pass your size limit value in bytes."},{"id":"$$config__app_storage_antivirus_enabled","name":"_APP_STORAGE_ANTIVIRUS","label":"Storage | _APP_STORAGE_ANTIVIRUS","defaultValue":"disabled","description":"This variable allows you to disable the internal anti-virus scans. This value is set to 'disabled' by default, to enable the scans set the value to 'enabled'. Before enabling, you must add the ClamAV service and depend on it on main Appwrite service."},{"id":"$$config__app_storage_antivirus_host","name":"_APP_STORAGE_ANTIVIRUS_HOST","label":"Storage | _APP_STORAGE_ANTIVIRUS_HOST","defaultValue":"clamav","description":"ClamAV server host name address."},{"id":"$$config__app_storage_antivirus_port","name":"_APP_STORAGE_ANTIVIRUS_PORT","label":"Storage | _APP_STORAGE_ANTIVIRUS_PORT","defaultValue":"3310","description":"ClamAV server TCP port."},{"id":"$$config__app_storage_device","name":"_APP_STORAGE_DEVICE","label":"Storage | _APP_STORAGE_DEVICE","defaultValue":"Local","description":"Select default storage device. The default value is 'Local'. List of supported adapters are 'Local', 'S3', 'DOSpaces', 'Backblaze', 'Linode' and 'Wasabi'."},{"id":"$$secret__app_storage_s3_access_key","name":"_APP_STORAGE_S3_ACCESS_KEY","label":"Storage | _APP_STORAGE_S3_ACCESS_KEY","defaultValue":"","description":"AWS S3 storage access key. Required when the storage adapter is set to S3. You can get your access key from your AWS console."},{"id":"$$secret__app_storage_s3_secret","name":"_APP_STORAGE_S3_SECRET","label":"Storage | _APP_STORAGE_S3_SECRET","defaultValue":"","description":"AWS S3 storage secret key. Required when the storage adapter is set to S3. You can get your secret key from your AWS console."},{"id":"$$config__app_storage_s3_region","name":"_APP_STORAGE_S3_REGION","label":"Storage | _APP_STORAGE_S3_REGION","defaultValue":"us-east-1","description":"AWS S3 storage region. Required when storage adapter is set to S3. You can find your region info for your bucket from AWS console."},{"id":"$$config__app_storage_s3_bucket","name":"_APP_STORAGE_S3_BUCKET","label":"Storage | _APP_STORAGE_S3_BUCKET","defaultValue":"","description":"AWS S3 storage bucket. Required when storage adapter is set to S3. You can create buckets in your AWS console."},{"id":"$$secret__app_storage_do_spaces_access_key","name":"_APP_STORAGE_DO_SPACES_ACCESS_KEY","label":"Storage | _APP_STORAGE_DO_SPACES_ACCESS_KEY","defaultValue":"","description":"DigitalOcean spaces access key. Required when the storage adapter is set to DOSpaces. You can get your access key from your DigitalOcean console."},{"id":"$$secret__app_storage_do_spaces_secret","name":"_APP_STORAGE_DO_SPACES_SECRET","label":"Storage | _APP_STORAGE_DO_SPACES_SECRET","defaultValue":"","description":"DigitalOcean spaces secret key. Required when the storage adapter is set to DOSpaces. You can get your secret key from your DigitalOcean console."},{"id":"$$config__app_storage_do_spaces_region","name":"_APP_STORAGE_DO_SPACES_REGION","label":"Storage | _APP_STORAGE_DO_SPACES_REGION","defaultValue":"us-east-1","description":"DigitalOcean spaces region. Required when storage adapter is set to DOSpaces. You can find your region info for your space from DigitalOcean console."},{"id":"$$config__app_storage_do_spaces_bucket","name":"_APP_STORAGE_DO_SPACES_BUCKET","label":"Storage | _APP_STORAGE_DO_SPACES_BUCKET","defaultValue":"","description":"DigitalOcean spaces bucket. Required when storage adapter is set to DOSpaces. You can create spaces in your DigitalOcean console."},{"id":"$$secret__app_storage_backblaze_access_key","name":"_APP_STORAGE_BACKBLAZE_ACCESS_KEY","label":"Storage | _APP_STORAGE_BACKBLAZE_ACCESS_KEY","defaultValue":"","description":"Backblaze access key. Required when the storage adapter is set to Backblaze. Your Backblaze keyID will be your access key. You can get your keyID from your Backblaze console."},{"id":"$$secret__app_storage_backblaze_secret","name":"_APP_STORAGE_BACKBLAZE_SECRET","label":"Storage | _APP_STORAGE_BACKBLAZE_SECRET","defaultValue":"","description":"Backblaze secret key. Required when the storage adapter is set to Backblaze. Your Backblaze applicationKey will be your secret key. You can get your applicationKey from your Backblaze console."},{"id":"$$config__app_storage_backblaze_region","name":"_APP_STORAGE_BACKBLAZE_REGION","label":"Storage | _APP_STORAGE_BACKBLAZE_REGION","defaultValue":"us-west-004","description":"Backblaze region. Required when storage adapter is set to Backblaze. You can find your region info from your Backblaze console."},{"id":"$$config__app_storage_backblaze_bucket","name":"_APP_STORAGE_BACKBLAZE_BUCKET","label":"Storage | _APP_STORAGE_BACKBLAZE_BUCKET","defaultValue":"","description":"Backblaze bucket. Required when storage adapter is set to Backblaze. You can create your bucket from your Backblaze console."},{"id":"$$secret__app_storage_linode_access_key","name":"_APP_STORAGE_LINODE_ACCESS_KEY","label":"Storage | _APP_STORAGE_LINODE_ACCESS_KEY","defaultValue":"","description":"Linode object storage access key. Required when the storage adapter is set to Linode. You can get your access key from your Linode console."},{"id":"$$secret__app_storage_linode_secret","name":"_APP_STORAGE_LINODE_SECRET","label":"Storage | _APP_STORAGE_LINODE_SECRET","defaultValue":"","description":"Linode object storage secret key. Required when the storage adapter is set to Linode. You can get your secret key from your Linode console."},{"id":"$$config__app_storage_linode_region","name":"_APP_STORAGE_LINODE_REGION","label":"Storage | _APP_STORAGE_LINODE_REGION","defaultValue":"eu-central-1","description":"Linode object storage region. Required when storage adapter is set to Linode. You can find your region info from your Linode console."},{"id":"$$config__app_storage_linode_bucket","name":"_APP_STORAGE_LINODE_BUCKET","label":"Storage | _APP_STORAGE_LINODE_BUCKET","defaultValue":"","description":"Linode object storage bucket. Required when storage adapter is set to Linode. You can create buckets in your Linode console."},{"id":"$$secret__app_storage_wasabi_access_key","name":"_APP_STORAGE_WASABI_ACCESS_KEY","label":"Storage | _APP_STORAGE_WASABI_ACCESS_KEY","defaultValue":"","description":"Wasabi access key. Required when the storage adapter is set to Wasabi. You can get your access key from your Wasabi console."},{"id":"$$secret__app_storage_wasabi_secret","name":"_APP_STORAGE_WASABI_SECRET","label":"Storage | _APP_STORAGE_WASABI_SECRET","defaultValue":"","description":"Wasabi secret key. Required when the storage adapter is set to Wasabi. You can get your secret key from your Wasabi console."},{"id":"$$config__app_storage_wasabi_region","name":"_APP_STORAGE_WASABI_REGION","label":"Storage | _APP_STORAGE_WASABI_REGION","defaultValue":"eu-central-1","description":"Wasabi region. Required when storage adapter is set to Wasabi. You can find your region info from your Wasabi console."},{"id":"$$config__app_storage_wasabi_bucket","name":"_APP_STORAGE_WASABI_BUCKET","label":"Storage | _APP_STORAGE_WASABI_BUCKET","defaultValue":"","description":"Wasabi bucket. Required when storage adapter is set to Wasabi. You can create buckets in your Wasabi console."},{"id":"$$config__app_functions_size_limit","name":"_APP_FUNCTIONS_SIZE_LIMIT","label":"Functions | _APP_FUNCTIONS_SIZE_LIMIT","defaultValue":"30000000","description":"The maximum size deployment in bytes. The default value is 30MB."},{"id":"$$config__app_functions_timeout","name":"_APP_FUNCTIONS_TIMEOUT","label":"Functions | _APP_FUNCTIONS_TIMEOUT","defaultValue":"900","description":"The maximum number of seconds allowed as a timeout value when creating a new function. The default value is 900 seconds."},{"id":"$$config__app_functions_build_timeout","name":"_APP_FUNCTIONS_BUILD_TIMEOUT","label":"Functions | _APP_FUNCTIONS_BUILD_TIMEOUT","defaultValue":"900","description":"The maximum number of seconds allowed as a timeout value when building a new function. The default value is 900 seconds."},{"id":"$$config__app_functions_containers","name":"_APP_FUNCTIONS_CONTAINERS","label":"Functions | _APP_FUNCTIONS_CONTAINERS","defaultValue":"10","description":"The maximum number of containers Appwrite is allowed to keep alive in the background for function environments. Running containers allow faster execution time as there is no need to recreate each container every time a function gets executed. The default value is 10."},{"id":"$$config__app_functions_cpus","name":"_APP_FUNCTIONS_CPUS","label":"Functions | _APP_FUNCTIONS_CPUS","defaultValue":"","description":"The maximum number of CPU core a single cloud function is allowed to use. Please note that setting a value higher than available cores will result in a function error, which might result in an error. The default value is empty. When it's empty, CPU limit will be disabled."},{"id":"$$config__app_functions_memory_allocated","name":"_APP_FUNCTIONS_MEMORY","label":"Functions | _APP_FUNCTIONS_MEMORY","defaultValue":"","description":"The maximum amount of memory a single cloud function is allowed to use in megabytes. The default value is empty. When it's empty, memory limit will be disabled."},{"id":"$$config__app_functions_memory_swap","name":"_APP_FUNCTIONS_MEMORY_SWAP","label":"Functions | _APP_FUNCTIONS_MEMORY_SWAP","defaultValue":"","description":"The maximum amount of swap memory a single cloud function is allowed to use in megabytes. The default value is empty. When it's empty, swap memory limit will be disabled."},{"id":"$$config__app_functions_runtimes","name":"_APP_FUNCTIONS_RUNTIMES","label":"Functions | _APP_FUNCTIONS_RUNTIMES","defaultValue":"node-18.0","description":"This option allows you to limit the available environments for cloud functions. This option is very useful for low-cost servers to safe disk space.\nTo enable/activate this option, pass a list of allowed environments separated by a comma.\nCurrently, supported environments are: node-14.5, node-16.0, node-18.0, php-8.0, php-8.1, ruby-3.0, ruby-3.1, python-3.8, python-3.9, python-3.10, deno-1.21, deno-1.24, dart-2.15, dart-2.16, dart-2.17, dotnet-3.1, dotnet-6.0, java-8.0, java-11.0, java-17.0, java-18.0, swift-5.5, kotlin-1.6, cpp-17.0"},{"id":"$$secret__app_executor_secret","name":"_APP_EXECUTOR_SECRET","label":"Functions | _APP_EXECUTOR_SECRET","defaultValue":"$$generate_hex(16)","description":"The secret key used by Appwrite to communicate with the function executor."},{"id":"$$config__app_executor_host","name":"_APP_EXECUTOR_HOST","label":"","defaultValue":"http://$$id-executor/v1","description":""},{"id":"$$config__app_logging_provider","name":"_APP_LOGGING_PROVIDER","label":"General | _APP_LOGGING_PROVIDER","defaultValue":"","description":"This variable allows you to enable logging errors to 3rd party providers. This value is empty by default, to enable the logger set the value to one of 'sentry', 'raygun', 'appsignal', 'logowl'"},{"id":"$$config__app_logging_config","name":"_APP_LOGGING_CONFIG","label":"General | _APP_LOGGING_CONFIG","defaultValue":"","description":"This variable configures authentication to 3rd party error logging providers. If using Sentry, this should be 'SENTRY_API_KEY;SENTRY_APP_ID'. If using Raygun, this should be Raygun API key. If using AppSignal, this should be AppSignal API key. If using LogOwl, this should be LogOwl Service Ticket."},{"id":"$$config__app_statsd_host","name":"_APP_STATSD_HOST","label":"","defaultValue":"$$id-telegraf","description":""},{"id":"$$config__app_statsd_port","name":"_APP_STATSD_PORT","label":"StatsD | _APP_STATSD_PORT","defaultValue":"8125","description":"StatsD server TCP port."},{"id":"$$config__app_maintenance_interval","name":"_APP_MAINTENANCE_INTERVAL","label":"Functions | _APP_MAINTENANCE_INTERVAL","defaultValue":"86400","description":"Interval value containing the number of seconds that the Appwrite maintenance process should wait before executing system cleanups and optimizations. The default value is 86400 seconds (1 day)."},{"id":"$$config__app_maintenance_retention_execution","name":"_APP_MAINTENANCE_RETENTION_EXECUTION","label":"Functions | _APP_MAINTENANCE_RETENTION_EXECUTION","defaultValue":"1209600","description":"The maximum duration (in seconds) upto which to retain execution logs. The default value is 1209600 seconds (14 days)."},{"id":"$$config__app_maintenance_retention_cache","name":"_APP_MAINTENANCE_RETENTION_CACHE","label":"Functions | _APP_MAINTENANCE_RETENTION_CACHE","defaultValue":"2592000","description":"The maximum duration (in seconds) upto which to retain cached files. The default value is 2592000 seconds (30 days)."},{"id":"$$config__app_maintenance_retention_abuse","name":"_APP_MAINTENANCE_RETENTION_ABUSE","label":"Functions | _APP_MAINTENANCE_RETENTION_ABUSE","defaultValue":"86400","description":"The maximum duration (in seconds) upto which to retain abuse logs. The default value is 86400 seconds (1 day)."},{"id":"$$config__app_maintenance_retention_audit","name":"_APP_MAINTENANCE_RETENTION_AUDIT","label":"Functions | _APP_MAINTENANCE_RETENTION_AUDIT","defaultValue":"1209600","description":"The maximum duration (in seconds) upto which to retain audit logs. The default value is 1209600 seconds (14 days)."},{"id":"$$config__app_sms_provider","name":"_APP_SMS_PROVIDER","label":"Phone | _APP_SMS_PROVIDER","defaultValue":"","description":"Provider used for delivering SMS for Phone authentication. Use the following format: 'sms://[USER]:[SECRET]@[PROVIDER]'. Available providers are twilio, text-magic, telesign, msg91, and vonage."},{"id":"$$config__app_sms_from","name":"_APP_SMS_FROM","label":"Phone | _APP_SMS_FROM","defaultValue":"","description":"Phone number used for sending out messages. Must start with a leading '+' and maximum of 15 digits without spaces (+123456789)."},{"id":"$$config__app_functions_inactive_threshold","name":"_APP_FUNCTIONS_INACTIVE_THRESHOLD","label":"Functions | _APP_FUNCTIONS_INACTIVE_THRESHOLD","defaultValue":"60","description":"The minimum time a function can be inactive before it's container is shutdown and put to sleep. The default value is 60 seconds"},{"id":"$$config_open_runtimes_network","name":"OPEN_RUNTIMES_NETWORK","label":"","defaultValue":"$$generate_network","description":""},{"id":"$$config_dockerhub_pull_username","name":"DOCKERHUB_PULL_USERNAME","label":"Functions | DOCKERHUB_PULL_USERNAME","defaultValue":"","description":"The username for hub.docker.com. This variable is used to pull images from hub.docker.com."},{"id":"$$secret_dockerhub_pull_password","name":"DOCKERHUB_PULL_PASSWORD","label":"Functions | DOCKERHUB_PULL_PASSWORD","defaultValue":"","description":"The password for hub.docker.com. This variable is used to pull images from hub.docker.com."},{"id":"$$config__app_usage_timeseries_interval","name":"_APP_USAGE_TIMESERIES_INTERVAL","label":"General | _APP_USAGE_TIMESERIES_INTERVAL","defaultValue":"30","description":"Interval value containing the number of seconds that the Appwrite usage process should wait before aggregating stats and syncing it to mariadb from InfluxDB. The default value is 30 seconds."},{"id":"$$config__app_usage_database_interval","name":"_APP_USAGE_DATABASE_INTERVAL","label":"General | _APP_USAGE_DATABASE_INTERVAL","defaultValue":"900","description":"Interval value containing the number of seconds that the Appwrite usage process should wait before aggregating stats from data in Appwrite Database. The default value is 15 minutes."}]},{"templateVersion":"1.0.0","defaultVersion":"latest","documentation":"https://docs.weblate.org/en/latest/admin/install/docker.html","description":"A copylefted libre software web-based continuous localization system.","type":"weblate","name":"Weblate","labels":["translate","localization"],"services":{"$$id":{"name":"Weblate","depends_on":["$$id-postgresql","$$id-redis"],"image":"weblate/weblate:$$core_version","volumes":["$$id-data:/app/data"],"environment":["WEBLATE_SITE_DOMAIN=$$config_weblate_site_domain","WEBLATE_ADMIN_PASSWORD=$$secret_weblate_admin_password","POSTGRES_PASSWORD=$$secret_postgres_password","POSTGRES_USER=$$config_postgres_user","POSTGRES_DATABASE=$$config_postgres_db","POSTGRES_HOST=$$id-postgresql","POSTGRES_PORT=5432","REDIS_HOST=$$id-redis"],"ports":["8080"]},"$$id-postgresql":{"name":"PostgreSQL","depends_on":[],"image":"postgres:14-alpine","volumes":["$$id-postgresql-data:/var/lib/postgresql/data"],"environment":["POSTGRES_USER=$$config_postgres_user","POSTGRES_PASSWORD=$$secret_postgres_password","POSTGRES_DB=$$config_postgres_db"],"ports":[]},"$$id-redis":{"name":"Redis","depends_on":[],"image":"redis:7-alpine","volumes":["$$id-redis-data:/data"],"environment":[],"ports":[]}},"variables":[{"id":"$$config_weblate_site_domain","name":"WEBLATE_SITE_DOMAIN","label":"Weblate Domain","defaultValue":"$$generate_domain","description":""},{"id":"$$secret_weblate_admin_password","name":"WEBLATE_ADMIN_PASSWORD","label":"Weblate Admin Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true},{"id":"$$config_postgres_user","main":"$$id-postgresql","name":"POSTGRES_USER","label":"PostgreSQL User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_postgres_password","main":"$$id-postgresql","name":"POSTGRES_PASSWORD","label":"PostgreSQL Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true},{"id":"$$config_postgres_db","main":"$$id-postgresql","name":"POSTGRES_DB","label":"PostgreSQL Database","defaultValue":"weblate","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"2022.10.14-1a5b0965","documentation":"https://docs.searxng.org/","type":"searxng","name":"SearXNG","description":"Free internet metasearch engine which aggregates results from more than 70 search services.","services":{"$$id":{"name":"SearXNG","depends_on":["$$id-redis"],"image":"searxng/searxng:$$core_version","volumes":["$$id-searxng:/etc/searxng"],"environment":["SEARXNG_BASE_URL=$$config_searxng_base_url"],"ports":["8080"],"cap_drop":["ALL"],"cap_add":["CHOWN","SETGID","SETUID","DAC_OVERRIDE"],"files":[{"location":"/etc/searxng/settings.yml","content":"\n # see https://docs.searxng.org/admin/engines/settings.html#use-default-settings\n use_default_settings: true\n server:\n secret_key: $$secret_secret_key\n limiter: true\n image_proxy: true\n ui:\n static_use_hash: true\n redis:\n url: redis://:$$secret_redis_password@$$id-redis:6379/0"}]},"$$id-redis":{"name":"Redis","command":"redis-server --requirepass $$secret_redis_password --save \"\" --appendonly \"no\"","depends_on":[],"image":"redis:7-alpine","volumes":["$$id-redis-data:/data"],"environment":["REDIS_PASSWORD=$$secret_redis_password"],"ports":[],"cap_drop":["ALL"],"cap_add":["SETGID","SETUID","DAC_OVERRIDE"]}},"variables":[{"id":"$$config_searxng_base_url","name":"SEARXNG_BASE_URL","label":"SearXNG Base URL","defaultValue":"$$generate_fqdn","description":""},{"id":"$$secret_secret_key","name":"SECRET_KEY","label":"Secret Key","defaultValue":"$$generate_hex(64)","description":""},{"id":"$$secret_redis_password","name":"REDIS_PASSWORD","label":"Redis Password","defaultValue":"$$generate_password","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"v2.0.6","documentation":"https://glitchtip.com/documentation","type":"glitchtip","name":"GlitchTip","description":"Simple, open source error tracking.","labels":["sentry","bugsnag"],"services":{"$$id":{"name":"GlitchTip","depends_on":["$$id-postgresql","$$id-redis"],"image":"glitchtip/glitchtip:$$core_version","volumes":[],"environment":["PORT=$$config_port","GLITCHTIP_DOMAIN=$$config_glitchtip_domain","SECRET_KEY=$$secret_secret_key","DATABASE_URL=$$secret_database_url","REDIS_URL=$$secret_redis_url","DEFAULT_FROM_EMAIL=$$config_default_from_email","EMAIL_URL=$$secret_email_url","EMAIL_HOST=$$config_email_host","EMAIL_PORT=$$config_email_port","EMAIL_HOST_USER=$$config_email_host_user","EMAIL_HOST_PASSWORD=$$secret_email_host_password","EMAIL_USE_TLS=$$config_email_use_tls","EMAIL_USE_SSL=$$config_email_use_ssl","EMAIL_BACKEND=$$config_email_backend","MAILGUN_API_KEY=$$secret_mailgun_api_key","SENDGRID_API_KEY=$$secret_sendgrid_api_key","ENABLE_OPEN_USER_REGISTRATION=$$config_enable_open_user_registration","DJANGO_SUPERUSER_EMAIL=$$config_django_superuser_email","DJANGO_SUPERUSER_PASSWORD=$$secret_django_superuser_password","DJANGO_SUPERUSER_USERNAME=$$config_django_superuser_username","CELERY_WORKER_CONCURRENCY=$$config_celery_worker_concurrency"],"ports":["8000"]},"$$id-worker":{"name":"Celery Worker","command":"./bin/run-celery-with-beat.sh","depends_on":["$$id-postgresql","$$id-redis"],"image":"glitchtip/glitchtip:$$core_version","environment":["GLITCHTIP_DOMAIN=$$config_glitchtip_domain","SECRET_KEY=$$secret_secret_key","DATABASE_URL=$$secret_database_url","REDIS_URL=$$secret_redis_url","DEFAULT_FROM_EMAIL=$$config_default_from_email","EMAIL_URL=$$secret_email_url","CELERY_WORKER_CONCURRENCY=$$config_celery_worker_concurrency"],"ports":[]},"$$id-migrate":{"exclude":true,"name":"Migrate","command":"./manage.py migrate","depends_on":["$$id-postgresql","$$id-redis"],"image":"glitchtip/glitchtip:$$core_version","environment":["GLITCHTIP_DOMAIN=$$config_glitchtip_domain","SECRET_KEY=$$secret_secret_key","DATABASE_URL=$$secret_database_url","REDIS_URL=$$secret_redis_url","DEFAULT_FROM_EMAIL=$$config_default_from_email","EMAIL_URL=$$secret_email_url"],"ports":[]},"$$id-postgresql":{"name":"PostgreSQL","depends_on":[],"image":"postgres:14-alpine","volumes":["$$id-postgresql-data:/var/lib/postgresql/data"],"environment":["POSTGRES_USER=$$config_postgres_user","POSTGRES_PASSWORD=$$secret_postgres_password","POSTGRES_DB=$$config_postgres_db"],"ports":[]},"$$id-redis":{"name":"Redis","depends_on":[],"image":"redis:7-alpine","volumes":["$$id-postgresql-redis-data:/data"],"environment":[],"ports":[]}},"variables":[{"id":"$$config_django_superuser_username","name":"DJANGO_SUPERUSER_USERNAME","label":"Django Superuser Username","defaultValue":"$$generate_username","description":""},{"id":"$$secret_django_superuser_password","name":"DJANGO_SUPERUSER_PASSWORD","label":"Django Superuser Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true},{"id":"$$config_port","name":"PORT","label":"GlitchTip Port","defaultValue":"8000","description":""},{"id":"$$config_celery_worker_concurrency","main":"$$id-worker","name":"CELERY_WORKER_CONCURRENCY","label":"Celery Worker Concurrency","defaultValue":"2","description":""},{"id":"$$config_glitchtip_domain","name":"GLITCHTIP_DOMAIN","label":"GlitchTip Domain","defaultValue":"$$generate_fqdn","description":""},{"id":"$$secret_email_url","name":"EMAIL_URL","label":"SMTP Email URL","defaultValue":"smtp://$$config_email_host_user:$$secret_email_host_password@$$config_email_host:$$config_email_port","description":""},{"id":"$$secret_database_url","name":"DATABASE_URL","label":"Database URL for PostgreSQL","defaultValue":"postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db","description":""},{"id":"$$secret_redis_url","name":"REDIS_URL","label":"Redis URL","defaultValue":"redis://$$id-redis:6379/0","description":""},{"id":"$$config_default_from_email","name":"DEFAULT_FROM_EMAIL","label":"Default Email Address","defaultValue":"noreply@example.com","description":""},{"id":"$$config_email_host","name":"EMAIL_HOST","label":"Email SMTP Host","defaultValue":"","description":""},{"id":"$$config_email_port","name":"EMAIL_PORT","label":"Email SMTP Port","defaultValue":"25","description":""},{"id":"$$config_email_host_user","name":"EMAIL_HOST_USER","label":"Email SMTP User","defaultValue":"","description":""},{"id":"$$secret_email_host_password","name":"EMAIL_HOST_PASSWORD","label":"Email SMTP Password","defaultValue":"","description":""},{"id":"$$config_email_use_tls","name":"EMAIL_USE_TLS","label":"Email Use TLS","defaultValue":"false","description":""},{"id":"$$config_email_use_ssl","name":"EMAIL_USE_SSL","label":"Email Use SSL","defaultValue":"false","description":""},{"id":"$$secret_email_smtp_password","name":"EMAIL_SMTP_PASSWORD","label":"SMTP Password","defaultValue":"","description":""},{"id":"$$config_email_backend","name":"EMAIL_BACKEND","label":"Email Backend","defaultValue":"","description":""},{"id":"$$secret_mailgun_api_key","name":"MAILGUN_API_KEY","label":"Mailgun API Key","defaultValue":"","description":"","showOnConfiguration":true},{"id":"$$secret_sendgrid_api_key","name":"SENDGRID_API_KEY","label":"Sendgrid API Key","defaultValue":"","description":"","showOnConfiguration":true},{"id":"$$config_enable_open_user_registration","name":"ENABLE_OPEN_USER_REGISTRATION","label":"Enable Open User Registration","defaultValue":"true","description":""},{"id":"$$config_django_superuser_email","name":"DJANGO_SUPERUSER_EMAIL","label":"Django Superuser Email","defaultValue":"noreply@example.com","description":""},{"id":"$$config_postgres_user","main":"$$id-postgresql","name":"POSTGRES_USER","label":"PostgreSQL User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_postgres_password","main":"$$id-postgresql","name":"POSTGRES_PASSWORD","label":"PostgreSQL Password","defaultValue":"$$generate_password","description":""},{"id":"$$config_postgres_db","main":"$$id-postgresql","name":"POSTGRES_DB","label":"PostgreSQL Database","defaultValue":"glitchtip","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"v2.13.0","documentation":"https://hasura.io/docs/latest/index/","type":"hasura","name":"Hasura","description":"Instant realtime GraphQL APIs on any Postgres application, existing or new.","labels":["graphql","database"],"services":{"$$id":{"name":"Hasura","depends_on":["$$id-postgresql"],"image":"hasura/graphql-engine:$$core_version","volumes":[],"environment":["HASURA_GRAPHQL_ENABLE_CONSOLE=$$config_hasura_graphql_enable_console","HASURA_GRAPHQL_METADATA_DATABASE_URL=$$secret_hasura_graphql_metadata_database_url","HASURA_GRAPHQL_ADMIN_SECRET=$$secret_hasura_graphql_admin_secret"],"ports":["8080"]},"$$id-postgresql":{"name":"PostgreSQL","depends_on":[],"image":"postgres:12-alpine","volumes":["$$id-postgresql-data:/var/lib/postgresql/data"],"environment":["POSTGRES_USER=$$config_postgres_user","POSTGRES_PASSWORD=$$secret_postgres_password","POSTGRES_DB=$$config_postgres_db"],"ports":[]}},"variables":[{"id":"$$config_hasura_graphql_enable_console","name":"HASURA_GRAPHQL_ENABLE_CONSOLE","label":"Enable Hasura Console","defaultValue":"true","description":""},{"id":"$$secret_hasura_graphql_metadata_database_url","name":"HASURA_GRAPHQL_METADATA_DATABASE_URL","label":"Hasura Metadata Database URL","defaultValue":"postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db","description":""},{"id":"$$secret_hasura_graphql_admin_secret","name":"HASURA_GRAPHQL_ADMIN_SECRET","label":"Hasura Admin Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true},{"id":"$$config_postgres_user","name":"POSTGRES_USER","label":"PostgreSQL User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_postgres_password","name":"POSTGRES_PASSWORD","label":"PostgreSQL Password","defaultValue":"$$generate_password","description":""},{"id":"$$config_postgres_db","name":"POSTGRES_DB","label":"PostgreSQL Database","defaultValue":"hasura","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"postgresql-v1.38.0","documentation":"https://umami.is/docs/getting-started","type":"umami-postgresql","name":"Umami","subname":"(PostgreSQL)","description":"A simple, easy to use, self-hosted web analytics solution.","services":{"$$id":{"name":"Umami","depends_on":["$$id-postgresql"],"image":"ghcr.io/umami-software/umami:$$core_version","volumes":[],"environment":["ADMIN_PASSWORD=$$secret_admin_password","DATABASE_URL=$$secret_database_url","DATABASE_TYPE=$$config_database_type","HASH_SALT=$$secret_hash_salt"],"ports":["3000"]},"$$id-postgresql":{"name":"PostgreSQL","depends_on":[],"image":"postgres:12-alpine","volumes":["$$id-postgresql-data:/var/lib/postgresql/data"],"environment":["POSTGRES_USER=$$config_postgres_user","POSTGRES_PASSWORD=$$secret_postgres_password","POSTGRES_DB=$$config_postgres_db"],"ports":[],"files":[{"location":"/docker-entrypoint-initdb.d/schema.postgresql.sql","content":"\n -- CreateTable\n CREATE TABLE \"account\" (\n \"user_id\" SERIAL NOT NULL,\n \"username\" VARCHAR(255) NOT NULL,\n \"password\" VARCHAR(60) NOT NULL,\n \"is_admin\" BOOLEAN NOT NULL DEFAULT false,\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \"updated_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \n PRIMARY KEY (\"user_id\")\n );\n \n -- CreateTable\n CREATE TABLE \"event\" (\n \"event_id\" SERIAL NOT NULL,\n \"website_id\" INTEGER NOT NULL,\n \"session_id\" INTEGER NOT NULL,\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \"url\" VARCHAR(500) NOT NULL,\n \"event_type\" VARCHAR(50) NOT NULL,\n \"event_value\" VARCHAR(50) NOT NULL,\n \n PRIMARY KEY (\"event_id\")\n );\n \n -- CreateTable\n CREATE TABLE \"pageview\" (\n \"view_id\" SERIAL NOT NULL,\n \"website_id\" INTEGER NOT NULL,\n \"session_id\" INTEGER NOT NULL,\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \"url\" VARCHAR(500) NOT NULL,\n \"referrer\" VARCHAR(500),\n \n PRIMARY KEY (\"view_id\")\n );\n \n -- CreateTable\n CREATE TABLE \"session\" (\n \"session_id\" SERIAL NOT NULL,\n \"session_uuid\" UUID NOT NULL,\n \"website_id\" INTEGER NOT NULL,\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \"hostname\" VARCHAR(100),\n \"browser\" VARCHAR(20),\n \"os\" VARCHAR(20),\n \"device\" VARCHAR(20),\n \"screen\" VARCHAR(11),\n \"language\" VARCHAR(35),\n \"country\" CHAR(2),\n \n PRIMARY KEY (\"session_id\")\n );\n \n -- CreateTable\n CREATE TABLE \"website\" (\n \"website_id\" SERIAL NOT NULL,\n \"website_uuid\" UUID NOT NULL,\n \"user_id\" INTEGER NOT NULL,\n \"name\" VARCHAR(100) NOT NULL,\n \"domain\" VARCHAR(500),\n \"share_id\" VARCHAR(64),\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \n PRIMARY KEY (\"website_id\")\n );\n \n -- CreateIndex\n CREATE UNIQUE INDEX \"account.username_unique\" ON \"account\"(\"username\");\n \n -- CreateIndex\n CREATE INDEX \"event_created_at_idx\" ON \"event\"(\"created_at\");\n \n -- CreateIndex\n CREATE INDEX \"event_session_id_idx\" ON \"event\"(\"session_id\");\n \n -- CreateIndex\n CREATE INDEX \"event_website_id_idx\" ON \"event\"(\"website_id\");\n \n -- CreateIndex\n CREATE INDEX \"pageview_created_at_idx\" ON \"pageview\"(\"created_at\");\n \n -- CreateIndex\n CREATE INDEX \"pageview_session_id_idx\" ON \"pageview\"(\"session_id\");\n \n -- CreateIndex\n CREATE INDEX \"pageview_website_id_created_at_idx\" ON \"pageview\"(\"website_id\", \"created_at\");\n \n -- CreateIndex\n CREATE INDEX \"pageview_website_id_idx\" ON \"pageview\"(\"website_id\");\n \n -- CreateIndex\n CREATE INDEX \"pageview_website_id_session_id_created_at_idx\" ON \"pageview\"(\"website_id\", \"session_id\", \"created_at\");\n \n -- CreateIndex\n CREATE UNIQUE INDEX \"session.session_uuid_unique\" ON \"session\"(\"session_uuid\");\n \n -- CreateIndex\n CREATE INDEX \"session_created_at_idx\" ON \"session\"(\"created_at\");\n \n -- CreateIndex\n CREATE INDEX \"session_website_id_idx\" ON \"session\"(\"website_id\");\n \n -- CreateIndex\n CREATE UNIQUE INDEX \"website.website_uuid_unique\" ON \"website\"(\"website_uuid\");\n \n -- CreateIndex\n CREATE UNIQUE INDEX \"website.share_id_unique\" ON \"website\"(\"share_id\");\n \n -- CreateIndex\n CREATE INDEX \"website_user_id_idx\" ON \"website\"(\"user_id\");\n \n -- AddForeignKey\n ALTER TABLE \"event\" ADD FOREIGN KEY (\"session_id\") REFERENCES \"session\"(\"session_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n \n -- AddForeignKey\n ALTER TABLE \"event\" ADD FOREIGN KEY (\"website_id\") REFERENCES \"website\"(\"website_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n \n -- AddForeignKey\n ALTER TABLE \"pageview\" ADD FOREIGN KEY (\"session_id\") REFERENCES \"session\"(\"session_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n \n -- AddForeignKey\n ALTER TABLE \"pageview\" ADD FOREIGN KEY (\"website_id\") REFERENCES \"website\"(\"website_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n \n -- AddForeignKey\n ALTER TABLE \"session\" ADD FOREIGN KEY (\"website_id\") REFERENCES \"website\"(\"website_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n \n -- AddForeignKey\n ALTER TABLE \"website\" ADD FOREIGN KEY (\"user_id\") REFERENCES \"account\"(\"user_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n \n insert into account (username, password, is_admin) values ('admin', '$$hashed$$secret_admin_password', true);"}]}},"variables":[{"id":"$$secret_database_url","name":"DATABASE_URL","label":"Database URL for PostgreSQL","defaultValue":"postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db","description":""},{"id":"$$secret_hash_salt","name":"HASH_SALT","label":"Hash Salt","defaultValue":"$$generate_hex(64)","description":""},{"id":"$$config_database_type","name":"DATABASE_TYPE","label":"Database Type","defaultValue":"postgresql","description":""},{"id":"$$config_postgres_user","name":"POSTGRES_USER","label":"PostgreSQL User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_postgres_password","name":"POSTGRES_PASSWORD","label":"PostgreSQL Password","defaultValue":"$$generate_password","description":""},{"id":"$$config_postgres_db","name":"POSTGRES_DB","label":"PostgreSQL Database","defaultValue":"umami","description":""},{"id":"$$secret_admin_password","name":"ADMIN_PASSWORD","label":"Initial Admin Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true}]},{"templateVersion":"1.0.0","ignore":true,"defaultVersion":"postgresql-v1.38.0","documentation":"https://umami.is/docs/getting-started","type":"umami","name":"Umami","subname":"(PostgreSQL)","description":"A simple, easy to use, self-hosted web analytics solution.","services":{"$$id":{"name":"Umami","depends_on":["$$id-postgresql"],"image":"ghcr.io/umami-software/umami:$$core_version","volumes":[],"environment":["ADMIN_PASSWORD=$$secret_admin_password","DATABASE_URL=$$secret_database_url","DATABASE_TYPE=$$config_database_type","HASH_SALT=$$secret_hash_salt"],"ports":["3000"]},"$$id-postgresql":{"name":"PostgreSQL","depends_on":[],"image":"postgres:12-alpine","volumes":["$$id-postgresql-data:/var/lib/postgresql/data"],"environment":["POSTGRES_USER=$$config_postgres_user","POSTGRES_PASSWORD=$$secret_postgres_password","POSTGRES_DB=$$config_postgres_db"],"ports":[],"files":[{"location":"/docker-entrypoint-initdb.d/schema.postgresql.sql","content":"\n -- CreateTable\n CREATE TABLE \"account\" (\n \"user_id\" SERIAL NOT NULL,\n \"username\" VARCHAR(255) NOT NULL,\n \"password\" VARCHAR(60) NOT NULL,\n \"is_admin\" BOOLEAN NOT NULL DEFAULT false,\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \"updated_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \n PRIMARY KEY (\"user_id\")\n );\n \n -- CreateTable\n CREATE TABLE \"event\" (\n \"event_id\" SERIAL NOT NULL,\n \"website_id\" INTEGER NOT NULL,\n \"session_id\" INTEGER NOT NULL,\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \"url\" VARCHAR(500) NOT NULL,\n \"event_type\" VARCHAR(50) NOT NULL,\n \"event_value\" VARCHAR(50) NOT NULL,\n \n PRIMARY KEY (\"event_id\")\n );\n \n -- CreateTable\n CREATE TABLE \"pageview\" (\n \"view_id\" SERIAL NOT NULL,\n \"website_id\" INTEGER NOT NULL,\n \"session_id\" INTEGER NOT NULL,\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \"url\" VARCHAR(500) NOT NULL,\n \"referrer\" VARCHAR(500),\n \n PRIMARY KEY (\"view_id\")\n );\n \n -- CreateTable\n CREATE TABLE \"session\" (\n \"session_id\" SERIAL NOT NULL,\n \"session_uuid\" UUID NOT NULL,\n \"website_id\" INTEGER NOT NULL,\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \"hostname\" VARCHAR(100),\n \"browser\" VARCHAR(20),\n \"os\" VARCHAR(20),\n \"device\" VARCHAR(20),\n \"screen\" VARCHAR(11),\n \"language\" VARCHAR(35),\n \"country\" CHAR(2),\n \n PRIMARY KEY (\"session_id\")\n );\n \n -- CreateTable\n CREATE TABLE \"website\" (\n \"website_id\" SERIAL NOT NULL,\n \"website_uuid\" UUID NOT NULL,\n \"user_id\" INTEGER NOT NULL,\n \"name\" VARCHAR(100) NOT NULL,\n \"domain\" VARCHAR(500),\n \"share_id\" VARCHAR(64),\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \n PRIMARY KEY (\"website_id\")\n );\n \n -- CreateIndex\n CREATE UNIQUE INDEX \"account.username_unique\" ON \"account\"(\"username\");\n \n -- CreateIndex\n CREATE INDEX \"event_created_at_idx\" ON \"event\"(\"created_at\");\n \n -- CreateIndex\n CREATE INDEX \"event_session_id_idx\" ON \"event\"(\"session_id\");\n \n -- CreateIndex\n CREATE INDEX \"event_website_id_idx\" ON \"event\"(\"website_id\");\n \n -- CreateIndex\n CREATE INDEX \"pageview_created_at_idx\" ON \"pageview\"(\"created_at\");\n \n -- CreateIndex\n CREATE INDEX \"pageview_session_id_idx\" ON \"pageview\"(\"session_id\");\n \n -- CreateIndex\n CREATE INDEX \"pageview_website_id_created_at_idx\" ON \"pageview\"(\"website_id\", \"created_at\");\n \n -- CreateIndex\n CREATE INDEX \"pageview_website_id_idx\" ON \"pageview\"(\"website_id\");\n \n -- CreateIndex\n CREATE INDEX \"pageview_website_id_session_id_created_at_idx\" ON \"pageview\"(\"website_id\", \"session_id\", \"created_at\");\n \n -- CreateIndex\n CREATE UNIQUE INDEX \"session.session_uuid_unique\" ON \"session\"(\"session_uuid\");\n \n -- CreateIndex\n CREATE INDEX \"session_created_at_idx\" ON \"session\"(\"created_at\");\n \n -- CreateIndex\n CREATE INDEX \"session_website_id_idx\" ON \"session\"(\"website_id\");\n \n -- CreateIndex\n CREATE UNIQUE INDEX \"website.website_uuid_unique\" ON \"website\"(\"website_uuid\");\n \n -- CreateIndex\n CREATE UNIQUE INDEX \"website.share_id_unique\" ON \"website\"(\"share_id\");\n \n -- CreateIndex\n CREATE INDEX \"website_user_id_idx\" ON \"website\"(\"user_id\");\n \n -- AddForeignKey\n ALTER TABLE \"event\" ADD FOREIGN KEY (\"session_id\") REFERENCES \"session\"(\"session_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n \n -- AddForeignKey\n ALTER TABLE \"event\" ADD FOREIGN KEY (\"website_id\") REFERENCES \"website\"(\"website_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n \n -- AddForeignKey\n ALTER TABLE \"pageview\" ADD FOREIGN KEY (\"session_id\") REFERENCES \"session\"(\"session_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n \n -- AddForeignKey\n ALTER TABLE \"pageview\" ADD FOREIGN KEY (\"website_id\") REFERENCES \"website\"(\"website_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n \n -- AddForeignKey\n ALTER TABLE \"session\" ADD FOREIGN KEY (\"website_id\") REFERENCES \"website\"(\"website_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n \n -- AddForeignKey\n ALTER TABLE \"website\" ADD FOREIGN KEY (\"user_id\") REFERENCES \"account\"(\"user_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n \n insert into account (username, password, is_admin) values ('admin', '$$hashed$$secret_admin_password', true);"}]}},"variables":[{"id":"$$secret_database_url","name":"DATABASE_URL","label":"Database URL for PostgreSQL","defaultValue":"postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db","description":""},{"id":"$$secret_hash_salt","name":"HASH_SALT","label":"Hash Salt","defaultValue":"$$generate_hex(64)","description":""},{"id":"$$config_database_type","name":"DATABASE_TYPE","label":"Database Type","defaultValue":"postgresql","description":""},{"id":"$$config_postgres_user","name":"POSTGRES_USER","label":"PostgreSQL User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_postgres_password","name":"POSTGRES_PASSWORD","label":"PostgreSQL Password","defaultValue":"$$generate_password","description":""},{"id":"$$config_postgres_db","name":"POSTGRES_DB","label":"PostgreSQL Database","defaultValue":"umami","description":""},{"id":"$$secret_admin_password","name":"ADMIN_PASSWORD","label":"Initial Admin Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true}]},{"templateVersion":"1.0.0","defaultVersion":"v0.29.1","documentation":"https://docs.meilisearch.com/learn/getting_started/quick_start.html","type":"meilisearch","name":"MeiliSearch","description":"A lightning Fast, Ultra Relevant, and Typo-Tolerant Search Engine.","services":{"$$id":{"name":"MeiliSearch","documentation":"https://docs.meilisearch.com/","depends_on":[],"image":"getmeili/meilisearch:$$core_version","volumes":["$$id-datams:/meili_data/data.ms","$$id-data:/meili_data","$$id-snapshot:/snapshot","$$id-dump:/dumps"],"environment":["MEILI_MASTER_KEY=$$secret_meili_master_key"],"ports":["7700"]}},"variables":[{"id":"$$secret_meili_master_key","name":"MEILI_MASTER_KEY","label":"Master Key","defaultValue":"$$generate_hex(64)","description":"","showOnConfiguration":true}]},{"templateVersion":"1.0.0","ignore":true,"defaultVersion":"latest","documentation":"https://docs.ghost.org","arch":"amd64","type":"ghost-mariadb","name":"Ghost","subname":"(MariaDB)","description":"Free and open source blogging platform.","labels":["cms","blog"],"services":{"$$id":{"name":"Ghost","depends_on":["$$id-mariadb"],"image":"bitnami/ghost:$$core_version","volumes":["$$id-ghost:/bitnami/ghost"],"environment":["url=$$config_url","GHOST_HOST=$$config_ghost_host","GHOST_ENABLE_HTTPS=$$config_ghost_enable_https","GHOST_EMAIL=$$config_ghost_email","GHOST_PASSWORD=$$secret_ghost_password","GHOST_DATABASE_HOST=$$config_ghost_database_host","GHOST_DATABASE_USER=$$config_mariadb_user","GHOST_DATABASE_PASSWORD=$$secret_ghost_database_password","GHOST_DATABASE_NAME=$$config_mariadb_database","GHOST_DATABASE_PORT_NUMBER=3306"],"ports":["2368"]},"$$id-mariadb":{"name":"MariaDB","depends_on":[],"image":"bitnami/mariadb:latest","volumes":["$$id-mariadb:/bitnami/mariadb"],"environment":["MARIADB_USER=$$config_mariadb_user","MARIADB_PASSWORD=$$secret_mariadb_password","MARIADB_DATABASE=$$config_mariadb_database","MARIADB_ROOT_USER=$$config_mariadb_root_user","MARIADB_ROOT_PASSWORD=$$secret_mariadb_root_password"],"ports":[]}},"variables":[{"id":"$$config_url","name":"url","label":"URL","defaultValue":"$$generate_fqdn","description":""},{"id":"$$config_ghost_host","name":"GHOST_HOST","label":"Ghost Host","defaultValue":"$$generate_domain","description":""},{"id":"$$config_ghost_enable_https","name":"GHOST_ENABLE_HTTPS","label":"Ghost Enable HTTPS","defaultValue":"no","description":""},{"id":"$$config_ghost_email","name":"GHOST_EMAIL","label":"Ghost Default Email","defaultValue":"admin@example.com","description":""},{"id":"$$secret_ghost_password","name":"GHOST_PASSWORD","label":"Ghost Default Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true},{"id":"$$config_ghost_database_host","name":"GHOST_DATABASE_HOST","label":"Ghost Database Host","defaultValue":"$$id-mariadb","description":""},{"id":"$$config_ghost_database_user","name":"GHOST_DATABASE_USER","label":"MariaDB User","defaultValue":"$$config_mariadb_user","description":""},{"id":"$$secret_ghost_database_password","name":"GHOST_DATABASE_PASSWORD","label":"MariaDB Password","defaultValue":"$$secret_mariadb_password","description":""},{"id":"$$config_ghost_database_name","name":"GHOST_DATABASE_NAME","label":"MariaDB Database","defaultValue":"$$config_mariadb_database","description":""},{"id":"$$config_mariadb_user","name":"MARIADB_USER","label":"MariaDB User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_mariadb_password","name":"MARIADB_PASSWORD","label":"MariaDB Password","defaultValue":"$$generate_password","description":""},{"id":"$$config_mariadb_database","name":"MARIADB_DATABASE","label":"MariaDB Database","defaultValue":"ghost","description":""},{"id":"$$config_mariadb_root_user","name":"MARIADB_ROOT_USER","label":"MariaDB Root User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_mariadb_root_password","name":"MARIADB_ROOT_PASSWORD","label":"MariaDB Root Password","defaultValue":"$$generate_password","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"5.22","documentation":"https://docs.ghost.org","type":"ghost-only","name":"Ghost","subname":"(without Database)","description":"Free and open source blogging platform.","services":{"$$id":{"name":"Ghost","image":"ghost:$$core_version","volumes":["$$id-ghost:/var/lib/ghost/content"],"environment":["url=$$config_url","database__client=$$config_database__client","database__connection__host=$$config_database__connection__host","database__connection__user=$$config_database__connection__user","database__connection__password=$$secret_database__connection__password","database__connection__database=$$config_database__connection__database"],"ports":["2368"]}},"variables":[{"id":"$$config_url","name":"url","label":"URL","defaultValue":"$$generate_fqdn","description":""},{"id":"$$config_database__client","name":"database__client","label":"Database Client","defaultValue":"mysql","description":"","required":true},{"id":"$$config_database__connection__host","name":"database__connection__host","label":"Database Host","defaultValue":"","description":"","required":true,"placeholder":"db.coolify.io"},{"id":"$$config_database__connection__user","name":"database__connection__user","label":"Database User","defaultValue":"","description":"","placeholder":"ghost","required":true},{"id":"$$secret_database__connection__password","name":"database__connection__password","label":"Database Password","defaultValue":"","description":"","placeholder":"superSecretP4ssword","showOnConfiguration":true,"required":true},{"id":"$$config_database__connection__database","name":"database__connection__database","label":"Database Name","defaultValue":"","description":"","placeholder":"ghost_db","required":true}]},{"templateVersion":"1.0.0","defaultVersion":"5.22","documentation":"https://docs.ghost.org","type":"ghost-mysql","name":"Ghost","subname":"(MySQL)","description":"Ghost is a free and open source blogging platform.","services":{"$$id":{"name":"Ghost","depends_on":["$$id-mysql"],"image":"ghost:$$core_version","volumes":["$$id-ghost:/var/lib/ghost/content"],"environment":["url=$$config_url","database__client=$$config_database__client","database__connection__host=$$config_database__connection__host","database__connection__user=$$config_mysql_user","database__connection__password=$$secret_mysql_password","database__connection__database=$$config_mysql_database"],"ports":["2368"]},"$$id-mysql":{"name":"MySQL","depends_on":[],"image":"mysql:8.0","volumes":["$$id-mysql:/var/lib/mysql"],"environment":["MYSQL_USER=$$config_mysql_user","MYSQL_PASSWORD=$$secret_mysql_password","MYSQL_DATABASE=$$config_mysql_database","MYSQL_ROOT_PASSWORD=$$secret_mysql_root_password"],"ports":[]}},"variables":[{"id":"$$config_url","name":"url","label":"URL","defaultValue":"$$generate_fqdn","description":""},{"id":"$$config_database__client","name":"database__client","label":"Database Client","defaultValue":"mysql","description":"","readOnly":true},{"id":"$$config_database__connection__host","name":"database__connection__host","label":"Database Host","defaultValue":"$$id-mysql","description":""},{"id":"$$config_mysql_user","main":"$$id-mysql","name":"MYSQL_USER","label":"MySQL User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_mysql_password","main":"$$id-mysql","name":"MYSQL_PASSWORD","label":"MySQL Password","defaultValue":"$$generate_password","description":""},{"id":"$$config_mysql_database","main":"$$id-mysql","name":"MYSQL_DATABASE","label":"MySQL Database","defaultValue":"ghost","description":""},{"id":"$$secret_mysql_root_password","name":"MYSQL_ROOT_PASSWORD","label":"MySQL Root Password","defaultValue":"$$generate_password","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"php8.1","documentation":"https://wordpress.org/","type":"wordpress","name":"WordPress","subname":"(MySQL)","description":"A content management system based on PHP.","labels":["wordpress","php","cms"],"services":{"$$id":{"name":"WordPress","depends_on":["$$id-mysql"],"image":"wordpress:$$core_version","volumes":["$$id-wordpress-data:/var/www/html"],"environment":["WORDPRESS_DB_HOST=$$config_wordpress_db_host","WORDPRESS_DB_USER=$$config_mysql_user","WORDPRESS_DB_PASSWORD=$$secret_mysql_password","WORDPRESS_DB_NAME=$$config_mysql_database","WORDPRESS_CONFIG_EXTRA=$$config_wordpress_config_extra"],"ports":["80"]},"$$id-mysql":{"name":"MySQL","depends_on":[],"image":"bitnami/mysql:5.7","imageArm":"mysql:8.0","volumes":["$$id-mysql-data:/bitnami/mysql/data"],"volumesArm":["$$id-mysql-data:/var/lib/mysql"],"environment":["MYSQL_ROOT_PASSWORD=$$secret_mysql_root_password","MYSQL_ROOT_USER=$$config_mysql_root_user","MYSQL_DATABASE=$$config_mysql_database","MYSQL_USER=$$config_mysql_user","MYSQL_PASSWORD=$$secret_mysql_password"]}},"variables":[{"id":"$$config_wordpress_db_host","name":"WORDPRESS_DB_HOST","label":"Database Host","defaultValue":"$$id-mysql","description":"","readOnly":true},{"id":"$$config_wordpress_config_extra","name":"WORDPRESS_CONFIG_EXTRA","label":"WordPress Config Extra","defaultValue":"","description":"","type":"textarea","placeholder":"define('WP_DEBUG', true);\ndefine('WP_DEBUG_LOG', true);\ndefine('WP_DEBUG_DISPLAY', false);\n@ini_set('display_errors', 0);\n"},{"id":"$$secret_mysql_root_password","name":"MYSQL_ROOT_PASSWORD","label":"MySQL Root Password","defaultValue":"$$generate_password","description":"","readOnly":true},{"id":"$$config_mysql_root_user","name":"MYSQL_ROOT_USER","label":"MySQL Root User","defaultValue":"$$generate_username","description":"","readOnly":true},{"id":"$$config_mysql_database","name":"MYSQL_DATABASE","label":"MySQL Database","defaultValue":"wordpress","description":"","readOnly":true},{"id":"$$config_mysql_user","name":"MYSQL_USER","label":"MySQL User","defaultValue":"$$generate_username","description":"","readOnly":true},{"id":"$$secret_mysql_password","name":"MYSQL_PASSWORD","label":"MySQL Password","defaultValue":"$$generate_password","description":"","readOnly":true}]},{"templateVersion":"1.0.0","defaultVersion":"php8.1","documentation":"https://wordpress.org/","type":"wordpress-only","name":"WordPress","subname":"(without DB)","description":"A content management system based on PHP.","labels":["wordpress","php","cms"],"services":{"$$id":{"name":"WordPress","image":"wordpress:$$core_version","volumes":["$$id-wordpress-data:/var/www/html"],"environment":["WORDPRESS_DB_HOST=$$config_wordpress_db_host","WORDPRESS_DB_PORT=$$config_wordpress_db_port","WORDPRESS_DB_USER=$$config_wordpress_db_user","WORDPRESS_DB_PASSWORD=$$secret_wordpress_db_password","WORDPRESS_DB_NAME=$$config_wordpress_db_name","WORDPRESS_CONFIG_EXTRA=$$config_wordpress_config_extra"],"ports":["80"]}},"variables":[{"id":"$$config_wordpress_db_host","name":"WORDPRESS_DB_HOST","label":"Database Host","defaultValue":"","description":"","placeholder":"db.coollabs.io","required":true},{"id":"$$config_wordpress_db_port","name":"WORDPRESS_DB_PORT","label":"Database Port","defaultValue":"","description":"","placeholder":"3306","required":true},{"id":"$$config_wordpress_db_user","name":"WORDPRESS_DB_USER","label":"Database User","defaultValue":"","description":"","placeholder":"wordpress","required":true},{"id":"$$secret_wordpress_db_password","name":"WORDPRESS_DB_PASSWORD","label":"Database Password","defaultValue":"","description":"","placeholder":"supers3cr3tpassw0rd!","required":true,"showOnConfiguration":true},{"id":"$$config_wordpress_db_name","name":"WORDPRESS_DB_NAME","label":"Database Name","defaultValue":"","description":"","placeholder":"wordpress","required":true},{"id":"$$config_wordpress_config_extra","name":"WORDPRESS_CONFIG_EXTRA","label":"Extra Config","defaultValue":"","description":"","type":"textarea","placeholder":"define('WP_DEBUG', true);\ndefine('WP_DEBUG_LOG', true);\ndefine('WP_DEBUG_DISPLAY', false);\n@ini_set('display_errors', 0);\n"}]},{"templateVersion":"1.0.0","defaultVersion":"4.7.1","documentation":"https://coder.com/docs/coder-oss/latest","type":"vscodeserver","name":"VSCode Server","description":"Visual Studio Code on a remote server, accessible through the browser.","labels":["vscode","ide"],"services":{"$$id":{"name":"VSCode Server","depends_on":[],"image":"codercom/code-server:$$core_version","volumes":["$$id-config-data:/home/coder/.local/share/code-server","$$id-vscodeserver-data:/home/coder","$$id-keys-directory:/root/.ssh","$$id-theme-and-plugin-directory:/root/.local/share/code-server"],"environment":["PASSWORD=$$secret_password"],"ports":["8080"]}},"variables":[{"id":"$$secret_password","name":"PASSWORD","label":"Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true}]},{"templateVersion":"1.0.0","defaultVersion":"RELEASE.2022-10-15T19-57-03Z","documentation":"https://min.io/docs/minio","type":"minio","name":"MinIO","description":"A cloud storage server compatible with Amazon S3.","labels":["storage","s3"],"services":{"$$id":{"name":"MinIO","command":"server /data --console-address :9001","depends_on":[],"image":"minio/minio:$$core_version","volumes":["$$id-minio-data:/data","$$id-data-write:/files"],"environment":["MINIO_SERVER_URL=$$config_coolify_fqdn_minio_console","MINIO_BROWSER_REDIRECT_URL=$$config_minio_browser_redirect_url","MINIO_DOMAIN=$$config_minio_domain","MINIO_ROOT_USER=$$config_minio_root_user","MINIO_ROOT_PASSWORD=$$secret_minio_root_password"],"ports":["9000","9001"],"proxy":[{"port":"9000","domain":"$$config_coolify_fqdn_minio_console"},{"port":"9001"}]}},"variables":[{"id":"$$config_coolify_fqdn_minio_console","name":"MINIO_SERVER_URL","label":"MinIO Server URL","defaultValue":"","description":"Specify the URL hostname the MinIO Console should use for connecting to the MinIO Server.","required":true},{"id":"$$config_minio_browser_redirect_url","name":"MINIO_BROWSER_REDIRECT_URL","label":"Browser Redirect URL","defaultValue":"$$generate_fqdn","description":""},{"id":"$$config_minio_domain","name":"MINIO_DOMAIN","label":"Domain","defaultValue":"$$generate_domain","description":""},{"id":"$$config_minio_root_user","name":"MINIO_ROOT_USER","label":"Root User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_minio_root_password","name":"MINIO_ROOT_PASSWORD","label":"Root User Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true}]},{"templateVersion":"1.0.0","defaultVersion":"0.21.1","documentation":"https://fider.io/docs","type":"fider","name":"Fider","description":"A platform to collect and organize customer feedback.","labels":["suggestion","feedback"],"services":{"$$id":{"name":"Fider","image":"getfider/fider:$$core_version","depends_on":["$$id-postgresql"],"environment":["BASE_URL=$$config_base_url","DATABASE_URL=$$secret_database_url","JWT_SECRET=$$secret_jwt_secret","EMAIL_NOREPLY=$$config_email_noreply","EMAIL_MAILGUN_API=$$secret_email_mailgun_api","EMAIL_MAILGUN_REGION=$$config_email_mailgun_region","EMAIL_MAILGUN_DOMAIN=$$config_email_mailgun_domain","EMAIL_SMTP_HOST=$$config_email_smtp_host","EMAIL_SMTP_PORT=$$config_email_smtp_port","EMAIL_SMTP_USER=$$config_email_smtp_user","EMAIL_SMTP_PASSWORD=$$secret_email_smtp_password","EMAIL_SMTP_ENABLE_STARTTLS=$$config_email_smtp_enable_starttls"],"ports":["3000"]},"$$id-postgresql":{"name":"PostgreSQL","depends_on":[],"image":"postgres:12-alpine","volumes":["$$id-postgresql-data:/var/lib/postgresql/data"],"environment":["POSTGRES_USER=$$config_postgres_user","POSTGRES_PASSWORD=$$secret_postgres_password","POSTGRES_DB=$$config_postgres_db"]}},"variables":[{"id":"$$config_base_url","name":"BASE_URL","label":"Base URL","defaultValue":"$$generate_fqdn","description":""},{"id":"$$secret_database_url","name":"DATABASE_URL","label":"Database URL for PostgreSQL","defaultValue":"postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db?sslmode=disable","description":""},{"id":"$$secret_jwt_secret","name":"JWT_SECRET","label":"JWT Secret","defaultValue":"$$generate_hex(64)","description":""},{"id":"$$config_email_noreply","name":"EMAIL_NOREPLY","label":"No Reply Email Address","defaultValue":"noreply@example.com","description":""},{"id":"$$secret_email_mailgun_api","name":"EMAIL_MAILGUN_API","label":"Mailgun API Key","defaultValue":"","description":"","showOnConfiguration":true},{"id":"$$config_email_mailgun_region","name":"EMAIL_MAILGUN_REGION","label":"Mailgun Region","defaultValue":"EU","description":""},{"id":"$$config_email_mailgun_domain","name":"EMAIL_MAILGUN_DOMAIN","label":"Mailgun Domain","defaultValue":"","description":""},{"id":"$$config_email_smtp_host","name":"EMAIL_SMTP_HOST","label":"SMTP Host","defaultValue":"","description":""},{"id":"$$config_email_smtp_port","name":"EMAIL_SMTP_PORT","label":"SMTP Port","defaultValue":"587","description":""},{"id":"$$config_email_smtp_user","name":"EMAIL_SMTP_USER","label":"SMTP User","defaultValue":"","description":""},{"id":"$$secret_email_smtp_password","name":"EMAIL_SMTP_PASSWORD","label":"SMTP Password","defaultValue":"","description":"","showOnConfiguration":true},{"id":"$$config_email_smtp_enable_starttls","name":"EMAIL_SMTP_ENABLE_STARTTLS","label":"SMTP Enable StartTLS","defaultValue":"false","description":""},{"id":"$$config_postgres_user","name":"POSTGRES_USER","label":"PostgreSQL User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_postgres_password","name":"POSTGRES_PASSWORD","label":"PostgreSQL Password","defaultValue":"$$generate_password","description":""},{"id":"$$config_postgres_db","name":"POSTGRES_DB","label":"PostgreSQL Database","defaultValue":"$$generate_username","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"0.198.1","documentation":"https://docs.n8n.io","type":"n8n","name":"n8n.io","description":"A free and open node based Workflow Automation Tool.","labels":["workflow","automation","ifttt","zapier","nodered"],"services":{"$$id":{"name":"N8n","depends_on":[],"image":"n8nio/n8n:$$core_version","volumes":["$$id-data:/root/.n8n","$$id-data-write:/files","/var/run/docker.sock:/var/run/docker.sock"],"environment":["WEBHOOK_URL=$$config_webhook_url"],"ports":["5678"]}},"variables":[{"id":"$$config_webhook_url","name":"WEBHOOK_URL","label":"Webhook URL","defaultValue":"$$generate_fqdn","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"stable","documentation":"https://plausible.io/doc/","arch":"amd64","type":"plausibleanalytics","name":"Plausible Analytics","description":"A lightweight and open-source website analytics tool.","labels":["analytics","statistics","plausible","gdpr","no-cookie","google analytics"],"services":{"$$id":{"name":"Plausible Analytics","command":"sh -c \"sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh db init-admin && /entrypoint.sh run\"","depends_on":["$$id-postgresql","$$id-clickhouse"],"image":"plausible/analytics:$$core_version","environment":["ADMIN_USER_EMAIL=$$config_admin_user_email","ADMIN_USER_NAME=$$config_admin_user_name","ADMIN_USER_PWD=$$secret_admin_user_pwd","BASE_URL=$$config_base_url","SECRET_KEY_BASE=$$secret_secret_key_base","DISABLE_AUTH=$$config_disable_auth","DISABLE_REGISTRATION=$$config_disable_registration","DATABASE_URL=$$secret_database_url","CLICKHOUSE_DATABASE_URL=$$secret_clickhouse_database_url"],"ports":["8000"]},"$$id-postgresql":{"name":"PostgreSQL","image":"bitnami/postgresql:13","volumes":["$$id-postgresql-data:/bitnami/postgresql"],"environment":["POSTGRESQL_PASSWORD=$$secret_postgresql_password","POSTGRESQL_USERNAME=$$config_postgresql_username","POSTGRESQL_DATABASE=$$config_postgresql_database"]},"$$id-clickhouse":{"name":"Clickhouse","volumes":["$$id-clickhouse-data:/var/lib/clickhouse"],"image":"clickhouse/clickhouse-server:22.6-alpine","ulimits":{"nofile":{"soft":262144,"hard":262144}},"files":[{"location":"/etc/clickhouse-server/users.d/logging.xml","content":"warning true "},{"location":"/etc/clickhouse-server/config.d/logging.xml","content":"0 0 "},{"location":"/docker-entrypoint-initdb.d/init.query","content":"CREATE DATABASE IF NOT EXISTS plausible;"},{"location":"/docker-entrypoint-initdb.d/init-db.sh","content":"clickhouse client --queries-file /docker-entrypoint-initdb.d/init.query"}]}},"variables":[{"id":"$$config_base_url","name":"BASE_URL","label":"Base URL","defaultValue":"$$generate_fqdn","description":"You must set this to the FQDN of the Plausible Analytics instance. This is used to generate the links to the Plausible Analytics instance."},{"id":"$$secret_database_url","name":"DATABASE_URL","label":"Database URL for PostgreSQL","defaultValue":"postgresql://$$config_postgresql_username:$$secret_postgresql_password@$$id-postgresql:5432/$$config_postgresql_database","description":""},{"id":"$$secret_clickhouse_database_url","name":"CLICKHOUSE_DATABASE_URL","label":"Database URL for Clickhouse","defaultValue":"http://$$id-clickhouse:8123/plausible","description":""},{"id":"$$config_admin_user_email","name":"ADMIN_USER_EMAIL","label":"Admin Email Address","defaultValue":"admin@example.com","description":"This is the admin email. Please change it."},{"id":"$$config_admin_user_name","name":"ADMIN_USER_NAME","label":"Admin User Name","defaultValue":"$$generate_username","description":"This is the admin username. Please change it."},{"id":"$$secret_admin_user_pwd","name":"ADMIN_USER_PWD","label":"Admin User Password","defaultValue":"$$generate_password","description":"This is the admin password. Please change it.","showOnConfiguration":true},{"id":"$$secret_secret_key_base","name":"SECRET_KEY_BASE","label":"Secret Key Base","defaultValue":"$$generate_hex(64)","description":""},{"id":"$$config_disable_auth","name":"DISABLE_AUTH","label":"Disable Authentication","defaultValue":"false","description":""},{"id":"$$config_disable_registration","name":"DISABLE_REGISTRATION","label":"Disable Registration","defaultValue":"true","description":""},{"id":"$$config_postgresql_username","main":"$$id-postgresql","name":"POSTGRESQL_USERNAME","label":"PostgreSQL Username","defaultValue":"postgresql","description":""},{"id":"$$secret_postgresql_password","main":"$$id-postgresql","name":"POSTGRESQL_PASSWORD","label":"PostgreSQL Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true},{"id":"$$config_postgresql_database","main":"$$id-postgresql","name":"POSTGRESQL_DATABASE","label":"PostgreSQL Database","defaultValue":"plausible","description":""},{"id":"$$config_scriptName","name":"SCRIPT_NAME","label":"Custom Script Name","defaultValue":"plausible.js","description":"This is the default script name."}]},{"templateVersion":"1.0.0","defaultVersion":"0.98.1","documentation":"https://docs.nocodb.com","type":"nocodb","name":"NocoDB","description":"Turns any MySQL, PostgreSQL, SQL Server, SQLite & MariaDB into a smart-spreadsheet.","labels":["database","airtable","spreadsheet"],"services":{"$$id":{"name":"NocoDB","image":"nocodb/nocodb:$$core_version","environment":["PORT=$$config_port","NC_DB=$$config_nc_db","DATABASE_URL=$$secret_database_url","NC_PUBLIC_URL=$$config_public_url","NC_AUTH_JWT_SECRET=$$secret_auth_jwt_secret","NC_SENTRY_DSN=$$secret_sentry_dsn","NC_CONNECT_TO_EXTERNAL_DB_DISABLED=$$config_connect_to_external_db_disabled","NC_DISABLE_TELE=$$config_disable_tele"],"volumes":["$$id-data:/usr/app/data"],"ports":["8080"]}},"variables":[{"id":"$$config_nc_db","name":"NC_DB","label":"Database","defaultValue":"","description":"MySQL, PostgreSQL and MSSQL connection urls supported. If absent: A local SQLite will be created in root folder."},{"id":"$$config_port","name":"PORT","label":"Port","defaultValue":"8080","description":""},{"id":"$$secret_database_url","name":"DATABASE_URL","label":"Database URL","defaultValue":"","description":"JDBC URL Format. Can be used instead of NC_DB. Used in 1-Click Heroku deployment."},{"id":"$$config_public_url","name":"NC_PUBLIC_URL","label":"Public URL","defaultValue":"","description":"Used for sending Email invitations. If absent: Best guess from http request params."},{"id":"$$secret_auth_jwt_secret","name":"NC_AUTH_JWT_SECRET","label":"Auth JWT Secret","defaultValue":"$$generate_hex(64)","description":"JWT secret used for auth and storing other secrets. If absent: A Random secret will be generated."},{"id":"$$secret_sentry_dsn","name":"NC_SENTRY_DSN","label":"Sentry DSN","defaultValue":"","description":"For Sentry monitoring."},{"id":"$$config_connect_to_external_db_disabled","name":"NC_CONNECT_TO_EXTERNAL_DB_DISABLED","label":"Disable External Database","defaultValue":"0","description":"Disable Project creation with external database. (Enter \"1\" to disable)."},{"id":"$$config_disable_tele","name":"NC_DISABLE_TELE","label":"NocoDB Disable Telemetry","defaultValue":"1","description":"Disable telemetry (Enter \"1\" to disable)."}]}]
\ No newline at end of file
diff --git a/apps/trpc-experimental/server/src/trpc/context.ts b/apps/trpc-experimental/server/src/trpc/context.ts
deleted file mode 100644
index c7a231a1c..000000000
--- a/apps/trpc-experimental/server/src/trpc/context.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import type { inferAsyncReturnType } from '@trpc/server';
-import type { CreateFastifyContextOptions } from '@trpc/server/adapters/fastify';
-import jwt from 'jsonwebtoken';
-import { env } from '../env';
-export interface User {
- userId: string;
- teamId: string;
- permission: string;
- isAdmin: boolean;
- iat: number;
-}
-
-export function createContext({ req }: CreateFastifyContextOptions) {
- const token = req.headers.authorization;
- let user: User | null = null;
- if (token) {
- user = jwt.verify(token, env.COOLIFY_SECRET_KEY) as User;
- }
- return { user, hostname: req.hostname };
-}
-
-export type Context = inferAsyncReturnType;
diff --git a/apps/trpc-experimental/server/src/trpc/index.ts b/apps/trpc-experimental/server/src/trpc/index.ts
deleted file mode 100644
index 259f0fe51..000000000
--- a/apps/trpc-experimental/server/src/trpc/index.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { router } from './trpc';
-import type { Permission } from '@prisma/client';
-
-import {
- settingsRouter,
- authRouter,
- dashboardRouter,
- applicationsRouter,
- servicesRouter,
- databasesRouter,
- sourcesRouter,
- destinationsRouter
-} from './routers';
-
-export const appRouter = router({
- settings: settingsRouter,
- auth: authRouter,
- dashboard: dashboardRouter,
- applications: applicationsRouter,
- services: servicesRouter,
- databases: databasesRouter,
- sources: sourcesRouter,
- destinations: destinationsRouter
-});
-
-export type AppRouter = typeof appRouter;
-export type PrismaPermission = Permission;
diff --git a/apps/trpc-experimental/server/src/trpc/routers/applications/index.ts b/apps/trpc-experimental/server/src/trpc/routers/applications/index.ts
deleted file mode 100644
index 38c13d9d1..000000000
--- a/apps/trpc-experimental/server/src/trpc/routers/applications/index.ts
+++ /dev/null
@@ -1,1388 +0,0 @@
-import { z } from 'zod';
-import fs from 'fs/promises';
-import yaml from 'js-yaml';
-import { privateProcedure, router } from '../../trpc';
-import { prisma } from '../../../prisma';
-import { executeCommand } from '../../../lib/executeCommand';
-import {
- checkContainer,
- defaultComposeConfiguration,
- formatLabelsOnDocker,
- removeContainer
-} from '../../../lib/docker';
-import {
- deployApplication,
- generateConfigHash,
- getApplicationFromDB,
- setDefaultBaseImage
-} from './lib';
-import cuid from 'cuid';
-import {
- checkDomainsIsValidInDNS,
- checkExposedPort,
- cleanupDB,
- createDirectories,
- decrypt,
- encrypt,
- generateSecrets,
- getContainerUsage,
- getDomain,
- isDev,
- isDomainConfigured,
- saveDockerRegistryCredentials,
- setDefaultConfiguration
-} from '../../../lib/common';
-import { day } from '../../../lib/dayjs';
-import csv from 'csvtojson';
-import { scheduler } from '../../../scheduler';
-
-export const applicationsRouter = router({
- deleteApplication: privateProcedure
- .input(
- z.object({
- id: z.string(),
- force: z.boolean().default(false)
- })
- )
- .mutation(async ({ input, ctx }) => {
- const { id, force } = input;
- const teamId = ctx.user.teamId;
- const application = await prisma.application.findUnique({
- where: { id },
- include: { destinationDocker: true }
- });
- if (!force && application?.destinationDockerId && application.destinationDocker?.network) {
- const { stdout: containers } = await 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 id = containerObj.ID;
- await removeContainer({ id, dockerId: application.destinationDocker.id });
- }
- }
- }
- await prisma.applicationSettings.deleteMany({ where: { application: { id } } });
- await prisma.buildLog.deleteMany({ where: { applicationId: id } });
- await prisma.build.deleteMany({ where: { applicationId: id } });
- await prisma.secret.deleteMany({ where: { applicationId: id } });
- await prisma.applicationPersistentStorage.deleteMany({ where: { applicationId: id } });
- await prisma.applicationConnectedDatabase.deleteMany({ where: { applicationId: id } });
- await prisma.previewApplication.deleteMany({ where: { applicationId: id } });
- if (teamId === '0') {
- await prisma.application.deleteMany({ where: { id } });
- } else {
- await prisma.application.deleteMany({ where: { id, teams: { some: { id: teamId } } } });
- }
- return {};
- }),
- restartPreview: privateProcedure
- .input(
- z.object({
- id: z.string(),
- pullmergeRequestId: z.string()
- })
- )
- .mutation(async ({ input, ctx }) => {
- const { id, pullmergeRequestId } = input;
- const teamId = ctx.user.teamId;
- let application: any = await getApplicationFromDB(id, teamId);
- if (application?.destinationDockerId) {
- const buildId = cuid();
- const { id: dockerId, network } = application.destinationDocker;
- const {
- secrets,
- port,
- repository,
- persistentStorage,
- id: applicationId,
- buildPack,
- exposePort
- } = application;
-
- let envs = [];
- if (secrets.length > 0) {
- envs = [...envs, ...generateSecrets(secrets, pullmergeRequestId, false, port)];
- }
- const { workdir } = await createDirectories({ repository, buildId });
- const labels = [];
- let image = null;
- const { stdout: container } = await executeCommand({
- dockerId,
- command: `docker container ls --filter 'label=com.docker.compose.service=${id}-${pullmergeRequestId}' --format '{{json .}}'`
- });
- const containersArray = container.trim().split('\n');
- for (const container of containersArray) {
- const containerObj = formatLabelsOnDocker(container);
- 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 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}`] } : {}),
- ...defaultComposeConfiguration(network)
- }
- },
- networks: {
- [network]: {
- external: true
- }
- },
- volumes: Object.assign({}, ...composeVolumes)
- };
- await fs.writeFile(`${workdir}/docker-compose.yml`, yaml.dump(composeFile));
- await executeCommand({ dockerId, command: `docker stop -t 0 ${id}-${pullmergeRequestId}` });
- await executeCommand({ dockerId, command: `docker rm ${id}-${pullmergeRequestId}` });
- await executeCommand({
- dockerId,
- command: `docker compose --project-directory ${workdir} -f ${workdir}/docker-compose.yml up -d`
- });
- }
- }),
- getPreviewStatus: privateProcedure
- .input(
- z.object({
- id: z.string(),
- pullmergeRequestId: 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: any = await getApplicationFromDB(id, teamId);
- if (application?.destinationDockerId) {
- const status = await 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 prisma.build.findMany({
- where: { applicationId: id, pullmergeRequestId, status: { in: ['queued', 'running'] } }
- });
- isBuilding = building.length > 0;
- }
- return {
- success: true,
- data: {
- isBuilding,
- isRunning,
- isRestarting,
- isExited
- }
- };
- }),
- loadPreviews: privateProcedure
- .input(
- z.object({
- id: z.string()
- })
- )
- .mutation(async ({ input, ctx }) => {
- const { id } = input;
- const application = await prisma.application.findUnique({
- where: { id },
- include: { destinationDocker: true }
- });
- const { stdout } = await 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 = 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 prisma.previewApplication.findMany({
- where: {
- applicationId: container.applicationId,
- pullmergeRequestId: container.pullmergeRequestId
- }
- });
- if (found.length === 0) {
- await prisma.previewApplication.create({
- data: {
- pullmergeRequestId: container.pullmergeRequestId,
- sourceBranch: container.branch,
- customDomain: container.fqdn,
- application: { connect: { id: container.applicationId } }
- }
- });
- }
- }
- return {
- success: true,
- data: {
- previews: await prisma.previewApplication.findMany({ where: { applicationId: id } })
- }
- };
- }),
- stopPreview: privateProcedure
- .input(
- z.object({
- id: z.string(),
- pullmergeRequestId: z.string()
- })
- )
- .mutation(async ({ input, ctx }) => {
- const { id, pullmergeRequestId } = input;
- const teamId = ctx.user.teamId;
- const application: any = await getApplicationFromDB(id, teamId);
- if (application?.destinationDockerId) {
- const container = `${id}-${pullmergeRequestId}`;
- const { id: dockerId } = application.destinationDocker;
- const { found } = await checkContainer({ dockerId, container });
- if (found) {
- await removeContainer({ id: container, dockerId: application.destinationDocker.id });
- }
- await prisma.previewApplication.deleteMany({
- where: { applicationId: application.id, pullmergeRequestId }
- });
- }
- return {};
- }),
- getUsage: privateProcedure
- .input(
- z.object({
- id: z.string(),
- containerId: z.string()
- })
- )
- .query(async ({ input, ctx }) => {
- const { id, containerId } = input;
- const teamId = ctx.user.teamId;
- let usage = {};
-
- const application: any = await getApplicationFromDB(id, teamId);
- if (application.destinationDockerId) {
- [usage] = await Promise.all([
- getContainerUsage(application.destinationDocker.id, containerId)
- ]);
- }
- return {
- success: true,
- data: {
- usage
- }
- };
- }),
- getLocalImages: privateProcedure
- .input(
- z.object({
- id: z.string()
- })
- )
- .query(async ({ input, ctx }) => {
- const { id } = input;
- const teamId = ctx.user.teamId;
- const application: any = await getApplicationFromDB(id, teamId);
- let imagesAvailables = [];
- const { stdout } = await executeCommand({
- dockerId: application.destinationDocker.id,
- command: `docker images --format '{{.Repository}}#{{.Tag}}#{{.CreatedAt}}'`
- });
- const { stdout: runningImage } = await 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: day(year + time).unix()
- });
- }
-
- imagesAvailables = imagesAvailables.sort((a, b) => b.tag - a.tag);
-
- return {
- success: true,
- data: {
- imagesAvailables,
- runningImage
- }
- };
- }),
- resetQueue: privateProcedure.mutation(async ({ ctx }) => {
- const teamId = ctx.user.teamId;
- if (teamId === '0') {
- await prisma.build.updateMany({
- where: { status: { in: ['queued', 'running'] } },
- data: { status: 'canceled' }
- });
- // scheduler.workers.get("").postMessage("cancel");
- }
- }),
- cancelBuild: privateProcedure
- .input(
- z.object({
- buildId: z.string(),
- applicationId: z.string()
- })
- )
- .mutation(async ({ input }) => {
- const { buildId, applicationId } = input;
- let count = 0;
- await new Promise(async (resolve, reject) => {
- const { destinationDockerId, status } = await prisma.build.findFirst({
- where: { id: buildId }
- });
- const { id: dockerId } = await 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);
- // if (scheduler.workers.has('deployApplication')) {
- // scheduler.workers.get('deployApplication').postMessage('cancel');
- // }
- await cleanupDB(buildId, applicationId);
- return reject(new Error('Canceled.'));
- }
- const { stdout: buildContainers } = await 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 removeContainer({ id, dockerId });
- clearInterval(interval);
- // if (scheduler.workers.has('deployApplication')) {
- // scheduler.workers.get('deployApplication').postMessage('cancel');
- // }
- await cleanupDB(buildId, applicationId);
- return resolve();
- }
- }
- }
- count++;
- } catch (error) {}
- }, 100);
- });
- }),
- getBuildLogs: privateProcedure
- .input(
- z.object({
- id: z.string(),
- buildId: z.string(),
- sequence: z.number()
- })
- )
- .query(async ({ input }) => {
- let { id, buildId, sequence } = input;
- let file = `/app/logs/${id}_buildlog_${buildId}.csv`;
- if (isDev) {
- file = `${process.cwd()}/../../logs/${id}_buildlog_${buildId}.csv`;
- }
- const data = await prisma.build.findFirst({ where: { id: buildId } });
- const createdAt = day(data.createdAt).utc();
- try {
- await fs.stat(file);
- } catch (error) {
- let logs = await prisma.buildLog.findMany({
- where: { buildId, time: { gt: sequence } },
- orderBy: { time: 'asc' }
- });
- const data = await prisma.build.findFirst({ where: { id: buildId } });
- const createdAt = day(data.createdAt).utc();
- return {
- logs: logs.map((log) => {
- log.time = Number(log.time);
- return log;
- }),
- fromDb: true,
- took: day().diff(createdAt) / 1000,
- status: data?.status || 'queued'
- };
- }
- let fileLogs = (await fs.readFile(file)).toString();
- let decryptedLogs = await csv({ noheader: true }).fromString(fileLogs);
- let logs = decryptedLogs
- .map((log) => {
- const parsed = {
- time: log['field1'],
- line: decrypt(log['field2'] + '","' + log['field3'])
- };
- return parsed;
- })
- .filter((log) => log.time > sequence);
- return {
- logs,
- fromDb: false,
- took: day().diff(createdAt) / 1000,
- status: data?.status || 'queued'
- };
- }),
- getBuilds: privateProcedure
- .input(
- z.object({
- id: z.string(),
- buildId: z.string().optional(),
- skip: z.number()
- })
- )
- .query(async ({ input }) => {
- let { id, buildId, skip } = input;
- let builds = [];
- const buildCount = await prisma.build.count({ where: { applicationId: id } });
- if (buildId) {
- builds = await prisma.build.findMany({ where: { applicationId: id, id: buildId } });
- } else {
- builds = await prisma.build.findMany({
- where: { applicationId: id },
- orderBy: { createdAt: 'desc' },
- take: 5 + skip
- });
- }
- builds = builds.map((build) => {
- if (build.status === 'running') {
- build.elapsed = (day().utc().diff(day(build.createdAt)) / 1000).toFixed(0);
- }
- return build;
- });
- return {
- builds,
- buildCount
- };
- }),
- loadLogs: privateProcedure
- .input(
- z.object({
- id: z.string(),
- containerId: z.string(),
- since: z.number()
- })
- )
- .query(async ({ input }) => {
- let { id, containerId, since } = input;
- if (since !== 0) {
- since = day(since).unix();
- }
- const {
- destinationDockerId,
- destinationDocker: { id: dockerId }
- } = await prisma.application.findUnique({
- where: { id },
- include: { destinationDocker: true }
- });
- if (destinationDockerId) {
- try {
- const { default: ansi } = await import('strip-ansi');
- const { stdout, stderr } = await 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);
- return { logs: stripLogsStderr.concat(stripLogsStdout) };
- } 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: privateProcedure
- .input(
- z.object({
- id: z.string()
- })
- )
- .query(async ({ input }) => {
- const { id } = input;
- const persistentStorages = await prisma.applicationPersistentStorage.findMany({
- where: { applicationId: id }
- });
-
- return {
- success: true,
- data: {
- persistentStorages
- }
- };
- }),
- deleteStorage: privateProcedure
- .input(
- z.object({
- id: z.string(),
- path: z.string()
- })
- )
- .mutation(async ({ input }) => {
- const { id, path } = input;
- await prisma.applicationPersistentStorage.deleteMany({ where: { applicationId: id, path } });
- }),
- updateStorage: privateProcedure
- .input(
- z.object({
- id: z.string(),
- path: z.string(),
- storageId: z.string(),
- newStorage: z.boolean().optional().default(false)
- })
- )
- .mutation(async ({ input }) => {
- const { id, path, newStorage, storageId } = input;
- if (newStorage) {
- await prisma.applicationPersistentStorage.create({
- data: { path, application: { connect: { id } } }
- });
- } else {
- await prisma.applicationPersistentStorage.update({
- where: { id: storageId },
- data: { path }
- });
- }
- }),
- deleteSecret: privateProcedure
- .input(
- z.object({
- id: z.string(),
- name: z.string()
- })
- )
- .mutation(async ({ input }) => {
- const { id, name } = input;
- await prisma.secret.deleteMany({ where: { applicationId: id, name } });
- }),
- updateSecret: privateProcedure
- .input(
- z.object({
- id: z.string(),
- name: z.string(),
- value: z.string(),
- isBuildSecret: z.boolean().optional().default(false),
- isPreview: z.boolean().optional().default(false)
- })
- )
- .mutation(async ({ input }) => {
- const { id, name, value, isBuildSecret, isPreview } = input;
- console.log({ isBuildSecret });
- await prisma.secret.updateMany({
- where: { applicationId: id, name, isPRMRSecret: isPreview },
- data: { value: encrypt(value.trim()), isBuildSecret }
- });
- }),
- newSecret: privateProcedure
- .input(
- z.object({
- id: z.string(),
- name: z.string(),
- value: z.string(),
- isBuildSecret: z.boolean().optional().default(false)
- })
- )
- .mutation(async ({ input }) => {
- const { id, name, value, isBuildSecret } = input;
- const found = await prisma.secret.findMany({ where: { applicationId: id, name } });
- if (found.length > 0) {
- throw { message: 'Secret already exists.' };
- }
- await prisma.secret.create({
- data: {
- name,
- value: encrypt(value.trim()),
- isBuildSecret,
- isPRMRSecret: false,
- application: { connect: { id } }
- }
- });
- await prisma.secret.create({
- data: {
- name,
- value: encrypt(value.trim()),
- isBuildSecret,
- isPRMRSecret: true,
- application: { connect: { id } }
- }
- });
- }),
- getSecrets: privateProcedure
- .input(
- z.object({
- id: z.string()
- })
- )
- .query(async ({ input }) => {
- const { id } = input;
- let secrets = await prisma.secret.findMany({
- where: { applicationId: id, isPRMRSecret: false },
- orderBy: { createdAt: 'asc' }
- });
- let previewSecrets = await prisma.secret.findMany({
- where: { applicationId: id, isPRMRSecret: true },
- orderBy: { createdAt: 'asc' }
- });
-
- secrets = secrets.map((secret) => {
- secret.value = decrypt(secret.value);
- return secret;
- });
- previewSecrets = previewSecrets.map((secret) => {
- secret.value = 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: privateProcedure
- .input(
- z.object({
- id: z.string(),
- domain: z.string()
- })
- )
- .query(async ({ input, ctx }) => {
- const { id, domain } = input;
- const {
- fqdn,
- settings: { dualCerts }
- } = await prisma.application.findUnique({ where: { id }, include: { settings: true } });
- return await checkDomainsIsValidInDNS({ hostname: domain, fqdn, dualCerts });
- }),
-
- checkDNS: privateProcedure
- .input(
- z.object({
- id: z.string(),
- fqdn: z.string(),
- forceSave: z.boolean(),
- dualCerts: z.boolean(),
- exposePort: 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 prisma.application.findUnique({
- where: { id },
- include: { destinationDocker: true }
- });
- const { isDNSCheckEnabled } = await prisma.setting.findFirst({});
-
- const found = await isDomainConfigured({ id, fqdn, remoteIpAddress });
- if (found) {
- throw {
- status: 500,
- message: `Domain ${getDomain(fqdn).replace('www.', '')} is already in use!`
- };
- }
- if (exposePort)
- await checkExposedPort({
- id,
- configuredPort,
- exposePort,
- engine,
- remoteEngine,
- remoteIpAddress
- });
- if (isDNSCheckEnabled && !isDev && !forceSave) {
- let hostname = ctx.hostname.split(':')[0];
- if (remoteEngine) hostname = remoteIpAddress;
- return await checkDomainsIsValidInDNS({ hostname, fqdn, dualCerts });
- }
- }),
- saveSettings: privateProcedure
- .input(
- z.object({
- id: z.string(),
- previews: z.boolean().optional(),
- debug: z.boolean().optional(),
- dualCerts: z.boolean().optional(),
- isBot: z.boolean().optional(),
- autodeploy: z.boolean().optional(),
- isDBBranching: z.boolean().optional(),
- isCustomSSL: z.boolean().optional(),
- isHttp2: z.boolean().optional()
- })
- )
- .mutation(async ({ ctx, input }) => {
- const { id, debug, previews, dualCerts, autodeploy, isBot, isDBBranching, isCustomSSL, isHttp2 } =
- input;
- await prisma.application.update({
- where: { id },
- data: {
- fqdn: isBot ? null : undefined,
- settings: {
- update: { debug, previews, dualCerts, autodeploy, isBot, isDBBranching, isCustomSSL, isHttp2 }
- }
- },
- include: { destinationDocker: true }
- });
- }),
- getImages: privateProcedure
- .input(z.object({ buildPack: z.string(), deploymentType: z.string().nullable() }))
- .query(async ({ ctx, input }) => {
- const { buildPack, deploymentType } = input;
- let publishDirectory = undefined;
- let port = undefined;
- const { baseImage, baseBuildImage, baseBuildImages, baseImages } = 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: privateProcedure
- .input(z.object({ id: z.string() }))
- .query(async ({ ctx, input }) => {
- const id: string = input.id;
- const teamId = ctx.user?.teamId;
- if (!teamId) {
- throw { status: 400, message: 'Team not found.' };
- }
- const application = await getApplicationFromDB(id, teamId);
- return {
- success: true,
- data: { ...application }
- };
- }),
- save: privateProcedure
- .input(
- z.object({
- id: z.string(),
- name: z.string(),
- buildPack: z.string(),
- fqdn: z.string().nullable().optional(),
- port: z.number(),
- exposePort: z.number().nullable().optional(),
- installCommand: z.string(),
- buildCommand: z.string(),
- startCommand: z.string(),
- baseDirectory: z.string().nullable().optional(),
- publishDirectory: z.string().nullable().optional(),
- pythonWSGI: z.string().nullable().optional(),
- pythonModule: z.string().nullable().optional(),
- pythonVariable: z.string().nullable().optional(),
- dockerFileLocation: z.string(),
- denoMainFile: z.string().nullable().optional(),
- denoOptions: z.string().nullable().optional(),
- gitCommitHash: z.string(),
- baseImage: z.string(),
- baseBuildImage: z.string(),
- deploymentType: z.string().nullable().optional(),
- baseDatabaseBranch: z.string().nullable().optional(),
- dockerComposeFile: z.string().nullable().optional(),
- dockerComposeFileLocation: z.string().nullable().optional(),
- dockerComposeConfiguration: z.string().nullable().optional(),
- simpleDockerfile: z.string().nullable().optional(),
- dockerRegistryImageName: 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 prisma.application.findUnique({
- where: { id },
- include: { destinationDocker: true }
- });
- if (exposePort)
- await checkExposedPort({
- id,
- configuredPort,
- exposePort,
- engine,
- remoteEngine,
- remoteIpAddress
- });
- if (denoOptions) denoOptions = denoOptions.trim();
- const defaultConfiguration = await setDefaultConfiguration({
- buildPack,
- port,
- installCommand,
- startCommand,
- buildCommand,
- publishDirectory,
- baseDirectory,
- dockerFileLocation,
- dockerComposeFileLocation,
- denoMainFile
- });
- if (baseDatabaseBranch) {
- await 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 prisma.application.update({
- where: { id },
- data: {
- name,
- fqdn,
- exposePort,
- pythonWSGI,
- pythonModule,
- gitCommitHash,
- pythonVariable,
- denoOptions,
- baseImage,
- baseBuildImage,
- deploymentType,
- dockerComposeFile,
- dockerComposeConfiguration,
- simpleDockerfile,
- dockerRegistryImageName,
- ...defaultConfiguration
- }
- });
- }
- }),
- status: privateProcedure.input(z.object({ id: z.string() })).query(async ({ ctx, input }) => {
- const id: string = input.id;
- const teamId = ctx.user?.teamId;
- if (!teamId) {
- throw { status: 400, message: 'Team not found.' };
- }
- let payload = [];
- const application: any = await getApplicationFromDB(id, teamId);
- if (application?.destinationDockerId) {
- if (application.buildPack === 'compose') {
- const { stdout: containers } = await 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 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: privateProcedure.query(async ({ ctx }) => {
- const teamId = ctx.user?.teamId;
- let applications = await prisma.application.findMany({
- where: { teams: { some: { id: teamId === '0' ? undefined : teamId } } },
- include: { settings: true, destinationDocker: true, teams: true }
- });
- for (const application of applications) {
- if (application?.buildPack === 'compose') {
- continue;
- }
- if (
- !application.buildPack ||
- !application.destinationDockerId ||
- !application.branch ||
- (!application.settings?.isBot && !application?.fqdn)
- ) {
- if (application?.destinationDockerId && application.destinationDocker?.network) {
- const { stdout: containers } = await 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 removeContainer({ id, dockerId: application.destinationDocker.id });
- }
- }
- }
- await prisma.applicationSettings.deleteMany({ where: { applicationId: application.id } });
- await prisma.buildLog.deleteMany({ where: { applicationId: application.id } });
- await prisma.build.deleteMany({ where: { applicationId: application.id } });
- await prisma.secret.deleteMany({ where: { applicationId: application.id } });
- await prisma.previewApplication.deleteMany({ where: { applicationId: id } });
- await prisma.applicationPersistentStorage.deleteMany({
- where: { applicationId: application.id }
- });
- await prisma.applicationConnectedDatabase.deleteMany({
- where: { applicationId: application.id }
- });
- await prisma.application.deleteMany({ where: { id: application.id } });
- }
- }
- return {};
- }),
- stop: privateProcedure.input(z.object({ id: z.string() })).mutation(async ({ ctx, input }) => {
- const { id } = input;
- const teamId = ctx.user?.teamId;
- const application: any = await getApplicationFromDB(id, teamId);
- if (application?.destinationDockerId) {
- const { id: dockerId } = application.destinationDocker;
- if (application.buildPack === 'compose') {
- const { stdout: containers } = await 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 removeContainer({
- id: containerObj.ID,
- dockerId: application.destinationDocker.id
- });
- }
- }
- return;
- }
- const { found } = await checkContainer({ dockerId, container: id });
- if (found) {
- await removeContainer({ id, dockerId: application.destinationDocker.id });
- }
- }
- return {};
- }),
- restart: privateProcedure
- .input(z.object({ id: z.string(), imageId: z.string().nullable() }))
- .mutation(async ({ ctx, input }) => {
- const { id, imageId } = input;
- const teamId = ctx.user?.teamId;
- let application = await getApplicationFromDB(id, teamId);
- if (application?.destinationDockerId) {
- const buildId = cuid();
- 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 createDirectories({ repository, buildId });
-
- if (imageId) {
- image = imageId;
- } else {
- const { stdout: container } = await executeCommand({
- dockerId,
- command: `docker container ls --filter 'label=com.docker.compose.service=${id}' --format '{{json .}}'`
- });
- const containersArray = container.trim().split('\n');
- for (const container of containersArray) {
- const containerObj = formatLabelsOnDocker(container);
- 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 saveDockerRegistryCredentials({ url, username, password, workdir });
- }
-
- let imageFoundLocally = false;
- try {
- await executeCommand({
- dockerId,
- command: `docker image inspect ${image}`
- });
- imageFoundLocally = true;
- } catch (error) {
- //
- }
- let imageFoundRemotely = false;
- try {
- await 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 fs.writeFile(`${workdir}/.env`, envs.join('\n'));
-
- let envFound = false;
- try {
- envFound = !!(await fs.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}`] } : {}),
- ...defaultComposeConfiguration(network)
- }
- },
- networks: {
- [network]: {
- external: true
- }
- },
- volumes: Object.assign({}, ...composeVolumes)
- };
- await fs.writeFile(`${workdir}/docker-compose.yml`, yaml.dump(composeFile));
- try {
- await executeCommand({ dockerId, command: `docker stop -t 0 ${id}` });
- await executeCommand({ dockerId, command: `docker rm ${id}` });
- } catch (error) {
- //
- }
-
- await executeCommand({
- dockerId,
- command: `docker compose --project-directory ${workdir} -f ${workdir}/docker-compose.yml up -d`
- });
- }
- return {};
- }),
- deploy: privateProcedure
- .input(
- z.object({
- id: z.string(),
- forceRebuild: z.boolean().default(false),
- pullmergeRequestId: z.string().nullable().optional(),
- branch: z.string().nullable().optional()
- })
- )
- .mutation(async ({ ctx, input }) => {
- const { id, pullmergeRequestId, branch, forceRebuild } = input;
- const teamId = ctx.user?.teamId;
- const buildId = await deployApplication(id, teamId, forceRebuild, pullmergeRequestId, branch);
- return {
- buildId
- };
- }),
- forceRedeploy: privateProcedure
- .input(
- z.object({
- id: z.string()
- })
- )
- .mutation(async ({ ctx, input }) => {
- const { id } = input;
- const teamId = ctx.user?.teamId;
- const buildId = await deployApplication(id, teamId, true);
- return {
- buildId
- };
- }),
- delete: privateProcedure
- .input(z.object({ force: z.boolean(), id: z.string() }))
- .mutation(async ({ ctx, input }) => {
- const { id, force } = input;
- const teamId = ctx.user?.teamId;
- const application = await prisma.application.findUnique({
- where: { id },
- include: { destinationDocker: true }
- });
- if (!force && application?.destinationDockerId && application.destinationDocker?.network) {
- const { stdout: containers } = await 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 id = containerObj.ID;
- await removeContainer({ id, dockerId: application.destinationDocker.id });
- }
- }
- }
- await prisma.applicationSettings.deleteMany({ where: { application: { id } } });
- await prisma.buildLog.deleteMany({ where: { applicationId: id } });
- await prisma.build.deleteMany({ where: { applicationId: id } });
- await prisma.secret.deleteMany({ where: { applicationId: id } });
- await prisma.applicationPersistentStorage.deleteMany({ where: { applicationId: id } });
- await prisma.applicationConnectedDatabase.deleteMany({ where: { applicationId: id } });
- await prisma.previewApplication.deleteMany({ where: { applicationId: id } });
- if (teamId === '0') {
- await prisma.application.deleteMany({ where: { id } });
- } else {
- await prisma.application.deleteMany({ where: { id, teams: { some: { id: teamId } } } });
- }
- return {};
- })
-});
diff --git a/apps/trpc-experimental/server/src/trpc/routers/applications/lib.ts b/apps/trpc-experimental/server/src/trpc/routers/applications/lib.ts
deleted file mode 100644
index ee4b9a809..000000000
--- a/apps/trpc-experimental/server/src/trpc/routers/applications/lib.ts
+++ /dev/null
@@ -1,533 +0,0 @@
-import cuid from 'cuid';
-import crypto from 'node:crypto';
-import { decrypt, isARM } from '../../../lib/common';
-
-import { prisma } from '../../../prisma';
-
-export async function deployApplication(
- id: string,
- teamId: string,
- forceRebuild: boolean,
- pullmergeRequestId: string | null = null,
- branch: string | null = null
-): Promise {
- const buildId = cuid();
- 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 prisma.application.update({ where: { id }, data: { updatedAt: new Date() } });
- if (application.gitSourceId) {
- await 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 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.' };
-}
-export async function generateConfigHash(
- id: string,
- buildPack: string,
- port: number,
- exposePort: number,
- installCommand: string,
- buildCommand: string,
- startCommand: string
-): Promise {
- const configHash = crypto
- .createHash('sha256')
- .update(
- JSON.stringify({
- buildPack,
- port,
- exposePort,
- installCommand,
- buildCommand,
- startCommand
- })
- )
- .digest('hex');
- return await prisma.application.update({ where: { id }, data: { configHash } });
-}
-export async function getApplicationFromDB(id: string, teamId: string) {
- let application = await prisma.application.findFirst({
- where: { id, teams: { some: { id: teamId === '0' ? undefined : 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);
-
- // Set default build images
- if (application && !application.baseImage) {
- application.baseImage = baseImage;
- }
- if (application && !application.baseBuildImage) {
- application.baseBuildImage = baseBuildImage;
- }
- return { ...application, baseBuildImages, baseImages };
-}
-function decryptApplication(application: any) {
- 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: any) => {
- s.value = 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'
-];
-export function setDefaultBaseImage(
- buildPack: string | null,
- deploymentType: string | null = 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: any = {
- baseImage: null,
- baseBuildImage: null,
- baseImages: [],
- baseBuildImages: []
- };
- if (nodeBased.includes(buildPack)) {
- if (deploymentType === 'static') {
- payload.baseImage = isARM(process.arch) ? 'nginx:alpine' : 'webdevops/nginx:alpine';
- payload.baseImages = 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 = isARM(process.arch) ? 'nginx:alpine' : 'webdevops/nginx:alpine';
- payload.baseImages = 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 = isARM(process.arch)
- ? 'php:8.1-fpm-alpine'
- : 'webdevops/php-apache:8.2-alpine';
- payload.baseImages = isARM(process.arch)
- ? phpVersions.filter((version) => !version.value.includes('webdevops'))
- : phpVersions;
- }
- if (buildPack === 'laravel') {
- payload.baseImage = isARM(process.arch)
- ? 'php:8.1-fpm-alpine'
- : 'webdevops/php-apache:8.2-alpine';
- payload.baseImages = 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;
-}
diff --git a/apps/trpc-experimental/server/src/trpc/routers/auth.ts b/apps/trpc-experimental/server/src/trpc/routers/auth.ts
deleted file mode 100644
index 1c431995c..000000000
--- a/apps/trpc-experimental/server/src/trpc/routers/auth.ts
+++ /dev/null
@@ -1,178 +0,0 @@
-import { z } from 'zod';
-import { publicProcedure, router } from '../trpc';
-import { TRPCError } from '@trpc/server';
-import { comparePassword, hashPassword, listSettings, uniqueName } from '../../lib/common';
-import { env } from '../../env';
-import jsonwebtoken from 'jsonwebtoken';
-import { prisma } from '../../prisma';
-import cuid from 'cuid';
-
-export const authRouter = router({
- register: publicProcedure
- .input(
- z.object({
- email: z.string(),
- password: z.string()
- })
- )
- .mutation(async ({ input }) => {
- const { email, password } = input;
- const userFound = await prisma.user.findUnique({
- where: { email },
- include: { teams: true, permission: true }
- });
-
- if (userFound) {
- throw new TRPCError({
- code: 'BAD_REQUEST',
- message: 'User already exists.'
- });
- }
- const settings = await listSettings();
- if (!settings?.isRegistrationEnabled) {
- throw new TRPCError({
- code: 'FORBIDDEN',
- message: 'Registration is disabled.'
- });
- }
- const usersCount = await prisma.user.count();
- const uid = usersCount === 0 ? '0' : cuid();
- const permission = 'owner';
- const isAdmin = true;
- const hashedPassword = await hashPassword(password);
-
- // Create the first user as the owner
- if (usersCount === 0) {
- await prisma.user.create({
- data: {
- id: uid,
- email,
- password: hashedPassword,
- type: 'email',
- teams: {
- create: {
- id: uid,
- name: uniqueName(),
- destinationDocker: { connect: { network: 'coolify' } }
- }
- },
- permission: { create: { teamId: uid, permission } }
- },
- include: { teams: true }
- });
- await prisma.setting.update({
- where: { id: '0' },
- data: { isRegistrationEnabled: false }
- });
- } else {
- // Create a new user and team
- await prisma.user.create({
- data: {
- id: uid,
- email,
- password: hashedPassword,
- type: 'email',
- teams: {
- create: {
- id: uid,
- name: uniqueName()
- }
- },
- permission: { create: { teamId: uid, permission } }
- },
- include: { teams: true }
- });
- }
- const payload = {
- userId: uid,
- teamId: uid,
- permission,
- isAdmin
- };
- return {
- ...payload,
- token: jsonwebtoken.sign(payload, env.COOLIFY_SECRET_KEY)
- };
- }),
- login: publicProcedure
- .input(
- z.object({
- email: z.string(),
- password: z.string()
- })
- )
- .mutation(async ({ input }) => {
- const { email, password } = input;
- const userFound = await prisma.user.findUnique({
- where: { email },
- include: { teams: true, permission: true }
- });
-
- if (!userFound) {
- throw new TRPCError({
- code: 'BAD_REQUEST',
- message: 'User already exists.'
- });
- }
- if (userFound.type === 'email') {
- if (userFound.password === 'RESETME') {
- const hashedPassword = await hashPassword(password);
- if (userFound.updatedAt < new Date(Date.now() - 1000 * 60 * 10)) {
- if (userFound.id === '0') {
- await prisma.user.update({
- where: { email: userFound.email },
- data: { password: 'RESETME' }
- });
- } else {
- await prisma.user.update({
- where: { email: userFound.email },
- data: { password: 'RESETTIMEOUT' }
- });
- }
- } else {
- await prisma.user.update({
- where: { email: userFound.email },
- data: { password: hashedPassword }
- });
- const payload = {
- userId: userFound.id,
- teamId: userFound.id,
- permission: userFound.permission,
- isAdmin: true
- };
- return {
- ...payload,
- token: jsonwebtoken.sign(payload, env.COOLIFY_SECRET_KEY)
- };
- }
- }
- if (!userFound.password) {
- throw new TRPCError({
- code: 'BAD_REQUEST',
- message: 'Something went wrong. Please try again later.'
- });
- }
- const passwordMatch = comparePassword(password, userFound.password);
- if (!passwordMatch) {
- throw new TRPCError({
- code: 'BAD_REQUEST',
- message: 'Incorrect password.'
- });
- }
- const payload = {
- userId: userFound.id,
- teamId: userFound.id,
- permission: userFound.permission,
- isAdmin: true
- };
- return {
- ...payload,
- token: jsonwebtoken.sign(payload, env.COOLIFY_SECRET_KEY)
- };
- }
- throw new TRPCError({
- code: 'BAD_REQUEST',
- message: 'Not implemented yet.'
- });
- })
-});
diff --git a/apps/trpc-experimental/server/src/trpc/routers/dashboard.ts b/apps/trpc-experimental/server/src/trpc/routers/dashboard.ts
deleted file mode 100644
index 273018dc1..000000000
--- a/apps/trpc-experimental/server/src/trpc/routers/dashboard.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import { privateProcedure, router } from '../trpc';
-import { listSettings } from '../../lib/common';
-import { prisma } from '../../prisma';
-
-export const dashboardRouter = router({
- resources: privateProcedure.query(async ({ ctx }) => {
- const id = ctx.user?.teamId === '0' ? undefined : ctx.user?.teamId;
- let applications = await prisma.application.findMany({
- where: { teams: { some: { id } } },
- include: { settings: true, destinationDocker: true, teams: true }
- });
- const databases = await prisma.database.findMany({
- where: { teams: { some: { id } } },
- include: { settings: true, destinationDocker: true, teams: true }
- });
- const services = await prisma.service.findMany({
- where: { teams: { some: { id } } },
- include: { destinationDocker: true, teams: true }
- });
- const gitSources = await prisma.gitSource.findMany({
- where: {
- OR: [{ teams: { some: { id } } }, { isSystemWide: true }]
- },
- include: { teams: true }
- });
- const destinations = await prisma.destinationDocker.findMany({
- where: { teams: { some: { id } } },
- include: { teams: true }
- });
- const settings = await 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
- };
- })
-});
diff --git a/apps/trpc-experimental/server/src/trpc/routers/databases/index.ts b/apps/trpc-experimental/server/src/trpc/routers/databases/index.ts
deleted file mode 100644
index 8851d975a..000000000
--- a/apps/trpc-experimental/server/src/trpc/routers/databases/index.ts
+++ /dev/null
@@ -1,379 +0,0 @@
-import { z } from 'zod';
-import fs from 'fs/promises';
-import { privateProcedure, router } from '../../trpc';
-import {
- createDirectories,
- decrypt,
- encrypt,
- getContainerUsage,
- listSettings,
- startTraefikTCPProxy
-} from '../../../lib/common';
-import { prisma } from '../../../prisma';
-import { executeCommand } from '../../../lib/executeCommand';
-import {
- defaultComposeConfiguration,
- stopDatabaseContainer,
- stopTcpHttpProxy
-} from '../../../lib/docker';
-import {
- generateDatabaseConfiguration,
- getDatabaseVersions,
- makeLabelForStandaloneDatabase,
- updatePasswordInDb
-} from './lib';
-import yaml from 'js-yaml';
-import { getFreePublicPort } from '../services/lib';
-
-export const databasesRouter = router({
- usage: privateProcedure
- .input(
- z.object({
- id: z.string()
- })
- )
- .query(async ({ ctx, input }) => {
- const teamId = ctx.user?.teamId;
- const { id } = input;
- let usage = {};
-
- const database = await prisma.database.findFirst({
- where: { id, teams: { some: { id: teamId === '0' ? undefined : teamId } } },
- include: { destinationDocker: true, settings: true }
- });
- if (database.dbUserPassword) database.dbUserPassword = decrypt(database.dbUserPassword);
- if (database.rootUserPassword) database.rootUserPassword = decrypt(database.rootUserPassword);
- if (database.destinationDockerId) {
- [usage] = await Promise.all([getContainerUsage(database.destinationDocker.id, id)]);
- }
- return {
- success: true,
- data: {
- usage
- }
- };
- }),
- save: privateProcedure
- .input(
- z.object({
- id: 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 prisma.database.findFirst({
- where: { id, teams: { some: { id: teamId === '0' ? undefined : teamId } } },
- include: { destinationDocker: true, settings: true }
- });
- if (database.dbUserPassword) database.dbUserPassword = decrypt(database.dbUserPassword);
- if (database.rootUserPassword) database.rootUserPassword = decrypt(database.rootUserPassword);
- if (isRunning) {
- if (database.dbUserPassword !== dbUserPassword) {
- await updatePasswordInDb(database, dbUser, dbUserPassword, false);
- } else if (database.rootUserPassword !== rootUserPassword) {
- await updatePasswordInDb(database, rootUser, rootUserPassword, true);
- }
- }
- const encryptedDbUserPassword = dbUserPassword && encrypt(dbUserPassword);
- const encryptedRootUserPassword = rootUserPassword && encrypt(rootUserPassword);
- await prisma.database.update({
- where: { id },
- data: {
- name,
- defaultDatabase,
- dbUser,
- dbUserPassword: encryptedDbUserPassword,
- rootUser,
- rootUserPassword: encryptedRootUserPassword,
- version
- }
- });
- }),
- saveSettings: privateProcedure
- .input(
- z.object({
- id: z.string(),
- isPublic: z.boolean(),
- appendOnly: 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 prisma.database.findUnique({ where: { id }, include: { destinationDocker: true } });
-
- if (isPublic) {
- publicPort = await getFreePublicPort({ id, remoteEngine, engine, remoteIpAddress });
- }
- await prisma.database.update({
- where: { id },
- data: {
- settings: {
- upsert: { update: { isPublic, appendOnly }, create: { isPublic, appendOnly } }
- }
- }
- });
- const database = await prisma.database.findFirst({
- where: { id, teams: { some: { id: teamId === '0' ? undefined : teamId } } },
- include: { destinationDocker: true, settings: true }
- });
- const { arch } = await listSettings();
- if (database.dbUserPassword) database.dbUserPassword = decrypt(database.dbUserPassword);
- if (database.rootUserPassword) database.rootUserPassword = decrypt(database.rootUserPassword);
-
- const { destinationDockerId, destinationDocker, publicPort: oldPublicPort } = database;
- const { privatePort } = generateDatabaseConfiguration(database, arch);
-
- if (destinationDockerId) {
- if (isPublic) {
- await prisma.database.update({ where: { id }, data: { publicPort } });
- await startTraefikTCPProxy(destinationDocker, id, publicPort, privatePort);
- } else {
- await prisma.database.update({ where: { id }, data: { publicPort: null } });
- await stopTcpHttpProxy(id, destinationDocker, oldPublicPort);
- }
- }
- return { publicPort };
- }),
- saveSecret: privateProcedure
- .input(
- z.object({
- id: z.string(),
- name: z.string(),
- value: z.string(),
- isNew: z.boolean().default(true)
- })
- )
- .mutation(async ({ ctx, input }) => {
- let { id, name, value, isNew } = input;
-
- if (isNew) {
- const found = await prisma.databaseSecret.findFirst({ where: { name, databaseId: id } });
- if (found) {
- throw `Secret ${name} already exists.`;
- } else {
- value = encrypt(value.trim());
- await prisma.databaseSecret.create({
- data: { name, value, database: { connect: { id } } }
- });
- }
- } else {
- value = encrypt(value.trim());
- const found = await prisma.databaseSecret.findFirst({ where: { databaseId: id, name } });
-
- if (found) {
- await prisma.databaseSecret.updateMany({
- where: { databaseId: id, name },
- data: { value }
- });
- } else {
- await prisma.databaseSecret.create({
- data: { name, value, database: { connect: { id } } }
- });
- }
- }
- }),
- start: privateProcedure.input(z.object({ id: z.string() })).mutation(async ({ ctx, input }) => {
- const { id } = input;
- const teamId = ctx.user?.teamId;
- const database = await prisma.database.findFirst({
- where: { id, teams: { some: { id: teamId === '0' ? undefined : teamId } } },
- include: { destinationDocker: true, settings: true, databaseSecret: true }
- });
- const { arch } = await listSettings();
- if (database.dbUserPassword) database.dbUserPassword = decrypt(database.dbUserPassword);
- if (database.rootUserPassword) database.rootUserPassword = decrypt(database.rootUserPassword);
- const {
- type,
- destinationDockerId,
- destinationDocker,
- publicPort,
- settings: { isPublic },
- databaseSecret
- } = database;
- const { privatePort, command, environmentVariables, image, volume, ulimits } =
- generateDatabaseConfiguration(database, arch);
-
- const network = destinationDockerId && destinationDocker.network;
- const volumeName = volume.split(':')[0];
- const labels = await makeLabelForStandaloneDatabase({ id, image, volume });
-
- const { workdir } = await createDirectories({ repository: type, buildId: id });
- if (databaseSecret.length > 0) {
- databaseSecret.forEach((secret) => {
- environmentVariables[secret.name] = decrypt(secret.value);
- });
- }
- const composeFile = {
- version: '3.8',
- services: {
- [id]: {
- container_name: id,
- image,
- command,
- environment: environmentVariables,
- volumes: [volume],
- ulimits,
- labels,
- ...defaultComposeConfiguration(network)
- }
- },
- networks: {
- [network]: {
- external: true
- }
- },
- volumes: {
- [volumeName]: {
- name: volumeName
- }
- }
- };
- const composeFileDestination = `${workdir}/docker-compose.yaml`;
- await fs.writeFile(composeFileDestination, yaml.dump(composeFile));
- await executeCommand({
- dockerId: destinationDocker.id,
- command: `docker compose -f ${composeFileDestination} up -d`
- });
- if (isPublic) await startTraefikTCPProxy(destinationDocker, id, publicPort, privatePort);
- }),
- stop: privateProcedure.input(z.object({ id: z.string() })).mutation(async ({ ctx, input }) => {
- const { id } = input;
- const teamId = ctx.user?.teamId;
- const database = await prisma.database.findFirst({
- where: { id, teams: { some: { id: teamId === '0' ? undefined : teamId } } },
- include: { destinationDocker: true, settings: true }
- });
- if (database.dbUserPassword) database.dbUserPassword = decrypt(database.dbUserPassword);
- if (database.rootUserPassword) database.rootUserPassword = decrypt(database.rootUserPassword);
- const everStarted = await stopDatabaseContainer(database);
- if (everStarted) await stopTcpHttpProxy(id, database.destinationDocker, database.publicPort);
- await prisma.database.update({
- where: { id },
- data: {
- settings: { upsert: { update: { isPublic: false }, create: { isPublic: false } } }
- }
- });
- await prisma.database.update({ where: { id }, data: { publicPort: null } });
- }),
- getDatabaseById: privateProcedure
- .input(z.object({ id: z.string() }))
- .query(async ({ ctx, input }) => {
- const { id } = input;
- const teamId = ctx.user?.teamId;
- const database = await prisma.database.findFirst({
- where: { id, teams: { some: { id: teamId === '0' ? undefined : teamId } } },
- include: { destinationDocker: true, settings: true }
- });
- if (!database) {
- throw { status: 404, message: 'Database not found.' };
- }
- const settings = await listSettings();
- if (database.dbUserPassword) database.dbUserPassword = decrypt(database.dbUserPassword);
- if (database.rootUserPassword) database.rootUserPassword = decrypt(database.rootUserPassword);
- const configuration = generateDatabaseConfiguration(database, settings.arch);
- return {
- success: true,
- data: {
- privatePort: configuration?.privatePort,
- database,
- versions: await getDatabaseVersions(database.type, settings.arch),
- settings
- }
- };
- }),
- status: privateProcedure.input(z.object({ id: z.string() })).query(async ({ ctx, input }) => {
- const id = input.id;
- const teamId = ctx.user?.teamId;
-
- let isRunning = false;
- const database = await prisma.database.findFirst({
- where: { id, teams: { some: { id: teamId === '0' ? undefined : teamId } } },
- include: { destinationDocker: true, settings: true }
- });
- if (database) {
- const { destinationDockerId, destinationDocker } = database;
- if (destinationDockerId) {
- try {
- const { stdout } = await 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: privateProcedure.query(async ({ ctx }) => {
- const teamId = ctx.user?.teamId;
- let databases = await prisma.database.findMany({
- where: { teams: { some: { id: teamId === '0' ? undefined : 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 stopDatabaseContainer(database);
- if (everStarted)
- await stopTcpHttpProxy(id, database.destinationDocker, database.publicPort);
- }
- await prisma.databaseSettings.deleteMany({ where: { databaseId: id } });
- await prisma.databaseSecret.deleteMany({ where: { databaseId: id } });
- await prisma.database.delete({ where: { id } });
- }
- }
- return {};
- }),
- delete: privateProcedure
- .input(z.object({ id: z.string(), force: z.boolean().default(false) }))
- .mutation(async ({ ctx, input }) => {
- const { id, force } = input;
- const teamId = ctx.user?.teamId;
- const database = await prisma.database.findFirst({
- where: { id, teams: { some: { id: teamId === '0' ? undefined : teamId } } },
- include: { destinationDocker: true, settings: true }
- });
- if (!force) {
- if (database.dbUserPassword) database.dbUserPassword = decrypt(database.dbUserPassword);
- if (database.rootUserPassword)
- database.rootUserPassword = decrypt(database.rootUserPassword);
- if (database.destinationDockerId) {
- const everStarted = await stopDatabaseContainer(database);
- if (everStarted)
- await stopTcpHttpProxy(id, database.destinationDocker, database.publicPort);
- }
- }
- await prisma.databaseSettings.deleteMany({ where: { databaseId: id } });
- await prisma.databaseSecret.deleteMany({ where: { databaseId: id } });
- await prisma.database.delete({ where: { id } });
- return {};
- })
-});
diff --git a/apps/trpc-experimental/server/src/trpc/routers/databases/lib.ts b/apps/trpc-experimental/server/src/trpc/routers/databases/lib.ts
deleted file mode 100644
index a1a7cd647..000000000
--- a/apps/trpc-experimental/server/src/trpc/routers/databases/lib.ts
+++ /dev/null
@@ -1,283 +0,0 @@
-import { base64Encode, isARM, version } from "../../../lib/common";
-import { executeCommand } from "../../../lib/executeCommand";
-import { prisma } from "../../../prisma";
-
-export 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']
- }
-];
-export function getDatabaseImage(type: string, arch: string): string {
- const found = supportedDatabaseTypesAndVersions.find((t) => t.name === type);
- if (found) {
- if (isARM(arch)) {
- return found.baseImageARM || found.baseImage;
- }
- return found.baseImage;
- }
- return '';
-}
-export function generateDatabaseConfiguration(database: any, arch: string) {
- const { id, dbUser, dbUserPassword, rootUser, rootUserPassword, defaultDatabase, version, 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}:${version}`,
- volume: `${id}-${type}-data:/bitnami/mysql/data`,
- ulimits: {}
- };
- if (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}:${version}`,
- volume: `${id}-${type}-data:/bitnami/mariadb`,
- ulimits: {}
- };
- if (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}:${version}`,
- volume: `${id}-${type}-data:/bitnami/mongodb`,
- ulimits: {}
- };
- if (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}:${version}`,
- volume: `${id}-${type}-data:/bitnami/postgresql`,
- ulimits: {}
- };
- if (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: undefined,
- environmentVariables: {
- REDIS_PASSWORD: dbUserPassword,
- REDIS_AOF_ENABLED: appendOnly ? 'yes' : 'no'
- },
- image: `${baseImage}:${version}`,
- volume: `${id}-${type}-data:/bitnami/redis/data`,
- ulimits: {}
- };
- if (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}:${version}`,
- volume: `${id}-${type}-data:/bitnami/couchdb`,
- ulimits: {}
- };
- if (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}:${version}`,
- volume: `${id}-${type}-data:/var/lib/edgedb/data`,
- ulimits: {}
- };
- return configuration;
- }
- return null;
-}
-export function getDatabaseVersions(type: string, arch: string): string[] {
- const found = supportedDatabaseTypesAndVersions.find((t) => t.name === type);
- if (found) {
- if (isARM(arch)) {
- return found.versionsARM || found.versions;
- }
- return found.versions;
- }
- return [];
-}
-export 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 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 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 executeCommand({
- dockerId,
- command: `docker exec ${id} psql postgresql://postgres:${rootUserPassword}@${id}:5432/${defaultDatabase} -c "ALTER role postgres WITH PASSWORD '${newPassword}'"`
- });
- } else {
- await 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 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 executeCommand({
- dockerId,
- command: `docker exec ${id} redis-cli -u redis://${dbUserPassword}@${id}:6379 --raw CONFIG SET requirepass ${newPassword}`
- });
- }
- }
-}
-export async function makeLabelForStandaloneDatabase({ id, image, volume }) {
- const database = await prisma.database.findFirst({ where: { id } });
- delete database.destinationDockerId;
- delete database.createdAt;
- delete database.updatedAt;
- return [
- 'coolify.managed=true',
- `coolify.version=${version}`,
- `coolify.type=standalone-database`,
- `coolify.name=${database.name}`,
- `coolify.configuration=${base64Encode(
- JSON.stringify({
- version,
- image,
- volume,
- ...database
- })
- )}`
- ];
-}
\ No newline at end of file
diff --git a/apps/trpc-experimental/server/src/trpc/routers/destinations/index.ts b/apps/trpc-experimental/server/src/trpc/routers/destinations/index.ts
deleted file mode 100644
index 21d7ee957..000000000
--- a/apps/trpc-experimental/server/src/trpc/routers/destinations/index.ts
+++ /dev/null
@@ -1,218 +0,0 @@
-import { z } from 'zod';
-import { privateProcedure, router } from '../../trpc';
-import {
- listSettings,
- startTraefikProxy,
- startTraefikTCPProxy,
- stopTraefikProxy
-} from '../../../lib/common';
-import { prisma } from '../../../prisma';
-
-import { executeCommand } from '../../../lib/executeCommand';
-import { checkContainer } from '../../../lib/docker';
-
-export const destinationsRouter = router({
- restartProxy: privateProcedure
- .input(
- z.object({
- id: z.string()
- })
- )
- .mutation(async ({ input, ctx }) => {
- const { id } = input;
- await stopTraefikProxy(id);
- await startTraefikProxy(id);
- await prisma.destinationDocker.update({
- where: { id },
- data: { isCoolifyProxyUsed: true }
- });
- }),
- startProxy: privateProcedure
- .input(
- z.object({
- id: z.string()
- })
- )
- .mutation(async ({ input, ctx }) => {
- const { id } = input;
- await startTraefikProxy(id);
- }),
- stopProxy: privateProcedure
- .input(
- z.object({
- id: z.string()
- })
- )
- .mutation(async ({ input, ctx }) => {
- const { id } = input;
- await stopTraefikProxy(id);
- }),
- saveSettings: privateProcedure
- .input(
- z.object({
- id: z.string(),
- engine: z.string(),
- isCoolifyProxyUsed: z.boolean()
- })
- )
- .mutation(async ({ input, ctx }) => {
- const { id, engine, isCoolifyProxyUsed } = input;
- await prisma.destinationDocker.updateMany({
- where: { engine },
- data: { isCoolifyProxyUsed }
- });
- }),
- status: privateProcedure.input(z.object({ id: z.string() })).query(async ({ input, ctx }) => {
- const { id } = input;
- const destination = await prisma.destinationDocker.findUnique({ where: { id } });
- const { found: isRunning } = await checkContainer({
- dockerId: destination.id,
- container: 'coolify-proxy',
- remove: true
- });
- return {
- isRunning
- };
- }),
- save: privateProcedure
- .input(
- z.object({
- id: z.string(),
- name: z.string(),
- htmlUrl: z.string(),
- apiUrl: z.string(),
- customPort: z.number(),
- customUser: z.string(),
- isSystemWide: 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 executeCommand({
- command: `docker network ls --filter 'name=^${network}$' --format '{{json .}}'`
- });
- if (stdout === '') {
- await await executeCommand({
- command: `docker network create --attachable ${network}`
- });
- }
- await prisma.destinationDocker.create({
- data: { name, teams: { connect: { id: teamId } }, engine, network, isCoolifyProxyUsed }
- });
- const destinations = await prisma.destinationDocker.findMany({ where: { engine } });
- const destination = destinations.find((destination) => destination.network === network);
- if (destinations.length > 0) {
- const proxyConfigured = destinations.find(
- (destination) =>
- destination.network !== network && destination.isCoolifyProxyUsed === true
- );
- if (proxyConfigured) {
- isCoolifyProxyUsed = !!proxyConfigured.isCoolifyProxyUsed;
- }
- await prisma.destinationDocker.updateMany({
- where: { engine },
- data: { isCoolifyProxyUsed }
- });
- }
- if (isCoolifyProxyUsed) {
- await startTraefikProxy(destination.id);
- }
- return { id: destination.id };
- } else {
- const destination = await 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 prisma.destinationDocker.update({ where: { id }, data: { name, engine, network } });
- return {};
- }
- }),
- check: privateProcedure
- .input(
- z.object({
- network: z.string()
- })
- )
- .query(async ({ input, ctx }) => {
- const { network } = input;
- const found = await prisma.destinationDocker.findFirst({ where: { network } });
- if (found) {
- throw {
- message: `Network already exists: ${network}`
- };
- }
- }),
- delete: privateProcedure
- .input(
- z.object({
- id: z.string()
- })
- )
- .mutation(async ({ input, ctx }) => {
- const { id } = input;
- const { network, remoteVerified, engine, isCoolifyProxyUsed } =
- await prisma.destinationDocker.findUnique({ where: { id } });
- if (isCoolifyProxyUsed) {
- if (engine || remoteVerified) {
- const { stdout: found } = await executeCommand({
- dockerId: id,
- command: `docker ps -a --filter network=${network} --filter name=coolify-proxy --format '{{.}}'`
- });
- if (found) {
- await executeCommand({
- dockerId: id,
- command: `docker network disconnect ${network} coolify-proxy`
- });
- await executeCommand({ dockerId: id, command: `docker network rm ${network}` });
- }
- }
- }
- await prisma.destinationDocker.delete({ where: { id } });
- }),
- getDestinationById: privateProcedure
- .input(
- z.object({
- id: z.string()
- })
- )
- .query(async ({ input, ctx }) => {
- const { id } = input;
- const { teamId } = ctx.user;
- const destination = await prisma.destinationDocker.findFirst({
- where: { id, teams: { some: { id: teamId === '0' ? undefined : teamId } } },
- include: { sshKey: true, application: true, service: true, database: true }
- });
- if (!destination && id !== 'new') {
- throw { status: 404, message: `Destination not found.` };
- }
- const settings = await listSettings();
- return {
- destination,
- settings
- };
- })
-});
diff --git a/apps/trpc-experimental/server/src/trpc/routers/index.ts b/apps/trpc-experimental/server/src/trpc/routers/index.ts
deleted file mode 100644
index 5bc9f108b..000000000
--- a/apps/trpc-experimental/server/src/trpc/routers/index.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-export * from './auth';
-export * from './dashboard';
-export * from './settings';
-export * from './applications';
-export * from './services';
-export * from './databases';
-export * from './sources';
-export * from './destinations';
diff --git a/apps/trpc-experimental/server/src/trpc/routers/services/index.ts b/apps/trpc-experimental/server/src/trpc/routers/services/index.ts
deleted file mode 100644
index c4c1e4b57..000000000
--- a/apps/trpc-experimental/server/src/trpc/routers/services/index.ts
+++ /dev/null
@@ -1,912 +0,0 @@
-import { z } from 'zod';
-import yaml from 'js-yaml';
-import fs from 'fs/promises';
-import path from 'path';
-import { privateProcedure, router } from '../../trpc';
-import {
- createDirectories,
- decrypt,
- encrypt,
- fixType,
- getTags,
- getTemplates,
- isARM,
- isDev,
- listSettings,
- makeLabelForServices,
- removeService
-} from '../../../lib/common';
-import { prisma } from '../../../prisma';
-import { executeCommand } from '../../../lib/executeCommand';
-import {
- generatePassword,
- getFreePublicPort,
- parseAndFindServiceTemplates,
- persistentVolumes,
- startServiceContainers,
- verifyAndDecryptServiceSecrets
-} from './lib';
-import { checkContainer, defaultComposeConfiguration, stopTcpHttpProxy } from '../../../lib/docker';
-import cuid from 'cuid';
-import { day } from '../../../lib/dayjs';
-
-export const servicesRouter = router({
- getLogs: privateProcedure
- .input(
- z.object({
- id: z.string(),
- containerId: z.string(),
- since: z.number().optional().default(0)
- })
- )
- .query(async ({ input, ctx }) => {
- let { id, containerId, since } = input;
- if (since !== 0) {
- since = day(since).unix();
- }
- const {
- destinationDockerId,
- destinationDocker: { id: dockerId }
- } = await prisma.service.findUnique({
- where: { id },
- include: { destinationDocker: true }
- });
- if (destinationDockerId) {
- try {
- const { default: ansi } = await import('strip-ansi');
- const { stdout, stderr } = await 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);
- return {
- data: {
- logs: stripLogsStderr.concat(stripLogsStdout)
- }
- };
- } 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: privateProcedure
- .input(
- z.object({
- storageId: z.string()
- })
- )
- .mutation(async ({ input, ctx }) => {
- const { storageId } = input;
- await prisma.servicePersistentStorage.deleteMany({ where: { id: storageId } });
- }),
- saveStorage: privateProcedure
- .input(
- z.object({
- id: z.string(),
- path: z.string(),
- isNewStorage: z.boolean(),
- storageId: z.string().optional().nullable(),
- containerId: z.string().optional()
- })
- )
- .mutation(async ({ input, ctx }) => {
- const { id, path, isNewStorage, storageId, containerId } = input;
-
- if (isNewStorage) {
- const volumeName = `${id}-custom${path.replace(/\//gi, '-')}`;
- const found = await prisma.servicePersistentStorage.findFirst({
- where: { path, containerId }
- });
- if (found) {
- throw {
- status: 500,
- message: 'Persistent storage already exists for this container and path.'
- };
- }
- await prisma.servicePersistentStorage.create({
- data: { path, volumeName, containerId, service: { connect: { id } } }
- });
- } else {
- await prisma.servicePersistentStorage.update({
- where: { id: storageId },
- data: { path, containerId }
- });
- }
- }),
- getStorages: privateProcedure
- .input(z.object({ id: z.string() }))
- .query(async ({ input, ctx }) => {
- const { id } = input;
- const persistentStorages = await prisma.servicePersistentStorage.findMany({
- where: { serviceId: id }
- });
- return {
- success: true,
- data: {
- persistentStorages
- }
- };
- }),
- deleteSecret: privateProcedure
- .input(z.object({ id: z.string(), name: z.string() }))
- .mutation(async ({ input, ctx }) => {
- const { id, name } = input;
- await prisma.serviceSecret.deleteMany({ where: { serviceId: id, name } });
- }),
- saveService: privateProcedure
- .input(
- z.object({
- id: z.string(),
- name: z.string(),
- fqdn: z.string().optional(),
- exposePort: z.string().optional(),
- type: z.string(),
- serviceSetting: z.any(),
- version: 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 = fixType(type);
-
- const data = {
- fqdn,
- name,
- exposePort,
- version
- };
- const templates = await getTemplates();
- const service = await prisma.service.findUnique({ where: { id } });
- const foundTemplate = templates.find((t) => fixType(t.type) === fixType(service.type));
- for (const setting of serviceSetting) {
- let { id: settingId, name, value, changed = false, isNew = false, variableName } = setting;
- if (value) {
- if (changed) {
- await prisma.serviceSetting.update({ where: { id: settingId }, data: { value } });
- }
- if (isNew) {
- if (!variableName) {
- variableName = foundTemplate?.variables.find((v) => v.name === name).id;
- }
- await prisma.serviceSetting.create({
- data: { name, value, variableName, service: { connect: { id } } }
- });
- }
- }
- }
- await prisma.service.update({
- where: { id },
- data
- });
- }),
- createSecret: privateProcedure
- .input(
- z.object({
- id: z.string(),
- name: z.string(),
- value: z.string(),
- isBuildSecret: z.boolean().optional(),
- isPRMRSecret: z.boolean().optional(),
- isNew: z.boolean().optional()
- })
- )
- .mutation(async ({ input }) => {
- let { id, name, value, isNew } = input;
- if (isNew) {
- const found = await prisma.serviceSecret.findFirst({ where: { name, serviceId: id } });
- if (found) {
- throw `Secret ${name} already exists.`;
- } else {
- value = encrypt(value.trim());
- await prisma.serviceSecret.create({
- data: { name, value, service: { connect: { id } } }
- });
- }
- } else {
- value = encrypt(value.trim());
- const found = await prisma.serviceSecret.findFirst({ where: { serviceId: id, name } });
-
- if (found) {
- await prisma.serviceSecret.updateMany({
- where: { serviceId: id, name },
- data: { value }
- });
- } else {
- await prisma.serviceSecret.create({
- data: { name, value, service: { connect: { id } } }
- });
- }
- }
- }),
- getSecrets: privateProcedure.input(z.object({ id: z.string() })).query(async ({ input, ctx }) => {
- const { id } = input;
- const teamId = ctx.user?.teamId;
- const service = await getServiceFromDB({ id, teamId });
- let secrets = await prisma.serviceSecret.findMany({
- where: { serviceId: id },
- orderBy: { createdAt: 'desc' }
- });
- const templates = await getTemplates();
- if (!templates) throw new Error('No templates found. Please contact support.');
- const foundTemplate = templates.find((t) => 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 = decrypt(secret.value);
- return secret;
- });
-
- return {
- success: true,
- data: {
- secrets
- }
- };
- }),
- wordpress: privateProcedure
- .input(z.object({ id: z.string(), ftpEnabled: z.boolean() }))
- .mutation(async ({ input, ctx }) => {
- const { id } = input;
- const teamId = ctx.user?.teamId;
- const {
- service: {
- destinationDocker: { engine, remoteEngine, remoteIpAddress }
- }
- } = await prisma.wordpress.findUnique({
- where: { serviceId: id },
- include: { service: { include: { destinationDocker: true } } }
- });
-
- const publicPort = await getFreePublicPort({ id, remoteEngine, engine, remoteIpAddress });
-
- let ftpUser = cuid();
- let ftpPassword = generatePassword({});
-
- const hostkeyDir = isDev ? '/tmp/hostkeys' : '/app/ssl/hostkeys';
- try {
- const data = await 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 } = destinationDocker;
- if (ftpEnabled) {
- if (user) ftpUser = user;
- if (savedPassword) ftpPassword = decrypt(savedPassword);
-
- // TODO: rewrite these to usable without shell
- const { stdout: password } = await executeCommand({
- command: `echo ${ftpPassword} | openssl passwd -1 -stdin`,
- shell: true
- });
- if (destinationDockerId) {
- try {
- await fs.stat(hostkeyDir);
- } catch (error) {
- await executeCommand({ command: `mkdir -p ${hostkeyDir}` });
- }
- if (!ftpHostKey) {
- await executeCommand({
- command: `ssh-keygen -t ed25519 -f ssh_host_ed25519_key -N "" -q -f ${hostkeyDir}/${id}.ed25519`
- });
- const { stdout: ftpHostKey } = await executeCommand({
- command: `cat ${hostkeyDir}/${id}.ed25519`
- });
- await prisma.wordpress.update({
- where: { serviceId: id },
- data: { ftpHostKey: encrypt(ftpHostKey) }
- });
- } else {
- await executeCommand({
- command: `echo "${decrypt(ftpHostKey)}" > ${hostkeyDir}/${id}.ed25519`,
- shell: true
- });
- }
- if (!ftpHostKeyPrivate) {
- await executeCommand({
- command: `ssh-keygen -t rsa -b 4096 -N "" -f ${hostkeyDir}/${id}.rsa`
- });
- const { stdout: ftpHostKeyPrivate } = await executeCommand({
- command: `cat ${hostkeyDir}/${id}.rsa`
- });
- await prisma.wordpress.update({
- where: { serviceId: id },
- data: { ftpHostKeyPrivate: encrypt(ftpHostKeyPrivate) }
- });
- } else {
- await executeCommand({
- command: `echo "${decrypt(ftpHostKeyPrivate)}" > ${hostkeyDir}/${id}.rsa`,
- shell: true
- });
- }
-
- await prisma.wordpress.update({
- where: { serviceId: id },
- data: {
- ftpPublicPort: publicPort,
- ftpUser: user ? undefined : ftpUser,
- ftpPassword: savedPassword ? undefined : encrypt(ftpPassword)
- }
- });
-
- try {
- const { found: isRunning } = await checkContainer({
- dockerId: destinationDocker.id,
- container: `${id}-ftp`
- });
- if (isRunning) {
- await 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`,
- `${
- isDev ? hostkeyDir : '/var/lib/docker/volumes/coolify-ssl-certs/_data/hostkeys'
- }/${id}.ed25519:/etc/ssh/ssh_host_ed25519_key`,
- `${
- isDev ? hostkeyDir : '/var/lib/docker/volumes/coolify-ssl-certs/_data/hostkeys'
- }/${id}.rsa:/etc/ssh/ssh_host_rsa_key`,
- `${
- 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 fs.writeFile(
- `${hostkeyDir}/${id}.sh`,
- `#!/bin/bash\nchmod 600 /etc/ssh/ssh_host_ed25519_key /etc/ssh/ssh_host_rsa_key\nuserdel -f xfs\nchown -R 33:33 /home/${ftpUser}/wordpress/`
- );
- await executeCommand({ command: `chmod +x ${hostkeyDir}/${id}.sh` });
- await fs.writeFile(`${hostkeyDir}/${id}-docker-compose.yml`, yaml.dump(compose));
- await executeCommand({
- dockerId: destinationDocker.id,
- command: `docker compose -f ${hostkeyDir}/${id}-docker-compose.yml up -d`
- });
- }
- return {
- publicPort,
- ftpUser,
- ftpPassword
- };
- } else {
- await prisma.wordpress.update({
- where: { serviceId: id },
- data: { ftpPublicPort: null }
- });
- try {
- await executeCommand({
- dockerId: destinationDocker.id,
- command: `docker stop -t 0 ${id}-ftp && docker rm ${id}-ftp`,
- shell: true
- });
- } catch (error) {
- //
- }
- await stopTcpHttpProxy(id, destinationDocker, ftpPublicPort);
- }
- } catch ({ status, message }) {
- throw message;
- } finally {
- try {
- await 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: privateProcedure.input(z.object({ id: z.string() })).mutation(async ({ input, ctx }) => {
- const { id } = input;
- const teamId = ctx.user?.teamId;
- const service = await getServiceFromDB({ id, teamId });
- const arm = isARM(service.arch);
- const { type, destinationDockerId, destinationDocker, persistentStorage, exposePort } = service;
-
- const { workdir } = await createDirectories({ repository: type, buildId: id });
- const template: any = await 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 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 prisma.servicePersistentStorage.findMany({
- where: { serviceId: id }
- });
- let volumes = 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));
- }
-
- // Workaround: old plausible analytics service wrong volume id name
- 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, containerId } = customVolume;
- if (
- volumes &&
- volumes.size > 0 &&
- !volumes.has(`${volumeName}:${path}`) &&
- containerId === service
- ) {
- volumes.add(`${volumeName}:${path}`);
- }
- }
- }
- 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 || undefined,
- command: template.services[s].command,
- entrypoint: template.services[s]?.entrypoint,
- image,
- expose: template.services[s].ports,
- ports: ports.length > 0 ? ports : undefined,
- 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: makeLabelForServices(type),
- ...defaultComposeConfiguration(network)
- };
- // Generate files for builds
- 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 = path.join(workdir, location);
- await fs.mkdir(path.dirname(source), { recursive: true });
- await fs.writeFile(source, content);
- Dockerfile += `
- COPY .${location} ${location}`;
- }
- await fs.writeFile(`${workdir}/Dockerfile.${s}`, Dockerfile);
- }
- }
- const { volumeMounts } = persistentVolumes(id, persistentStorage, config);
- const composeFile = {
- version: '3.8',
- services: config,
- networks: {
- [network]: {
- external: true
- }
- },
- volumes: volumeMounts
- };
- const composeFileDestination = `${workdir}/docker-compose.yaml`;
- await fs.writeFile(composeFileDestination, yaml.dump(composeFile));
- // TODO: TODO!
- let fastify = null;
- await startServiceContainers(fastify, id, teamId, destinationDocker.id, composeFileDestination);
-
- // Workaround: Stop old minio proxies
- if (service.type === 'minio') {
- try {
- const { stdout: containers } = await 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 executeCommand({
- dockerId: destinationDockerId,
- command: `docker stop -t 0 ${container}`
- });
- await executeCommand({
- dockerId: destinationDockerId,
- command: `docker rm --force ${container}`
- });
- }
- }
- }
- } catch (error) {}
- try {
- const { stdout: containers } = await 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 executeCommand({
- dockerId: destinationDockerId,
- command: `docker stop -t 0 ${container}`
- });
- await executeCommand({
- dockerId: destinationDockerId,
- command: `docker rm --force ${container}`
- });
- }
- }
- }
- } catch (error) {}
- }
- }),
- stop: privateProcedure.input(z.object({ id: 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 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 executeCommand({
- dockerId: destinationDockerId,
- command: `docker stop -t 0 ${container}`
- });
- await executeCommand({
- dockerId: destinationDockerId,
- command: `docker rm --force ${container}`
- });
- }
- }
- }
- return {};
- }
- }),
- getServices: privateProcedure
- .input(z.object({ id: 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 parseAndFindServiceTemplates(service);
- tags = await getTags(service.type);
- }
- return {
- success: true,
- data: {
- settings: await listSettings(),
- service,
- template,
- tags
- }
- };
- }),
- status: privateProcedure.input(z.object({ id: 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 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 getTemplates();
- let template = templates.find((t: { type: string }) => 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: privateProcedure.query(async ({ ctx }) => {
- const teamId = ctx.user?.teamId;
- let services = await prisma.service.findMany({
- where: { teams: { some: { id: teamId === '0' ? undefined : teamId } } },
- include: { destinationDocker: true, teams: true }
- });
- for (const service of services) {
- if (!service.fqdn) {
- if (service.destinationDockerId) {
- const { stdout: containers } = await 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 executeCommand({
- dockerId: service.destinationDockerId,
- command: `docker stop -t 0 ${container}`
- });
- await executeCommand({
- dockerId: service.destinationDockerId,
- command: `docker rm --force ${container}`
- });
- }
- }
- }
- }
- await removeService({ id: service.id });
- }
- }
- }),
- delete: privateProcedure
- .input(z.object({ force: z.boolean(), id: z.string() }))
- .mutation(async ({ input }) => {
- // todo: check if user is allowed to delete service
- const { id } = input;
- const teamId = ctx.user?.teamId;
- const { destinationDockerId } = await getServiceFromDB({ id, teamId });
- if (destinationDockerId) {
- const { stdout: containers } = await 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 executeCommand({
- dockerId: destinationDockerId,
- command: `docker stop -t 0 ${container}`
- });
- await executeCommand({
- dockerId: destinationDockerId,
- command: `docker rm --force ${container}`
- });
- }
- }
- }
- }
- await prisma.serviceSecret.deleteMany({ where: { serviceId: id } });
- await prisma.serviceSetting.deleteMany({ where: { serviceId: id } });
- await prisma.servicePersistentStorage.deleteMany({ where: { serviceId: id } });
- await prisma.meiliSearch.deleteMany({ where: { serviceId: id } });
- await prisma.fider.deleteMany({ where: { serviceId: id } });
- await prisma.ghost.deleteMany({ where: { serviceId: id } });
- await prisma.umami.deleteMany({ where: { serviceId: id } });
- await prisma.hasura.deleteMany({ where: { serviceId: id } });
- await prisma.plausibleAnalytics.deleteMany({ where: { serviceId: id } });
- await prisma.minio.deleteMany({ where: { serviceId: id } });
- await prisma.vscodeserver.deleteMany({ where: { serviceId: id } });
- await prisma.wordpress.deleteMany({ where: { serviceId: id } });
- await prisma.glitchTip.deleteMany({ where: { serviceId: id } });
- await prisma.moodle.deleteMany({ where: { serviceId: id } });
- await prisma.appwrite.deleteMany({ where: { serviceId: id } });
- await prisma.searxng.deleteMany({ where: { serviceId: id } });
- await prisma.weblate.deleteMany({ where: { serviceId: id } });
- await prisma.taiga.deleteMany({ where: { serviceId: id } });
-
- await prisma.service.delete({ where: { id } });
- return {};
- })
-});
-
-export async function getServiceFromDB({
- id,
- teamId
-}: {
- id: string;
- teamId: string;
-}): Promise {
- const settings = await prisma.setting.findFirst();
- const body = await prisma.service.findFirst({
- where: { id, teams: { some: { id: teamId === '0' ? undefined : teamId } } },
- include: {
- destinationDocker: true,
- persistentStorage: true,
- serviceSecret: true,
- serviceSetting: true,
- wordpress: true,
- plausibleAnalytics: true
- }
- });
- if (!body) {
- return null;
- }
- // body.type = fixType(body.type);
-
- if (body?.serviceSecret.length > 0) {
- body.serviceSecret = body.serviceSecret.map((s) => {
- s.value = decrypt(s.value);
- return s;
- });
- }
- if (body.wordpress) {
- body.wordpress.ftpPassword = decrypt(body.wordpress.ftpPassword);
- }
-
- return { ...body, settings };
-}
diff --git a/apps/trpc-experimental/server/src/trpc/routers/services/lib.ts b/apps/trpc-experimental/server/src/trpc/routers/services/lib.ts
deleted file mode 100644
index ad785e58e..000000000
--- a/apps/trpc-experimental/server/src/trpc/routers/services/lib.ts
+++ /dev/null
@@ -1,376 +0,0 @@
-import { asyncSleep, decrypt, fixType, generateRangeArray, getDomain, getTemplates } from '../../../lib/common';
-import bcrypt from 'bcryptjs';
-import { prisma } from '../../../prisma';
-import crypto from 'crypto';
-import { executeCommand } from '../../../lib/executeCommand';
-
-export async function parseAndFindServiceTemplates(
- service: any,
- workdir?: string,
- isDeploy: boolean = false
-) {
- const templates = await getTemplates();
- const foundTemplate = templates.find((t) => 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, label, description, defaultValue, required = false } = variable;
- const found = await prisma.serviceSetting.findFirst({
- where: { serviceId: service.id, variableName: proxyValue.domain }
- });
- parsedTemplate[realKey].fqdns.push({
- id,
- name,
- 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, label, description, defaultValue, required = false } = variable;
- const found = await prisma.serviceSetting.findFirst({
- where: { serviceId: service.id, variableName: proxyValue.hostPort }
- });
- parsedTemplate[realKey].hostPorts.push({
- id,
- name,
- value: found?.value || '',
- label,
- description,
- defaultValue,
- required
- });
- }
- }
- }
- }
- }
- } else {
- parsedTemplate = foundTemplate;
- }
- let strParsedTemplate = JSON.stringify(parsedTemplate);
-
- // replace $$id and $$workdir
- strParsedTemplate = strParsedTemplate.replaceAll('$$id', service.id);
- strParsedTemplate = strParsedTemplate.replaceAll(
- '$$core_version',
- service.version || foundTemplate.defaultVersion
- );
-
- // replace $$workdir
- if (workdir) {
- strParsedTemplate = strParsedTemplate.replaceAll('$$workdir', workdir);
- }
-
- // replace $$config
- 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, getDomain(service.fqdn) + '"');
- } else if (service.destinationDocker?.network && value === '$$generate_network') {
- strParsedTemplate = strParsedTemplate.replaceAll(
- regex,
- service.destinationDocker.network + '"'
- );
- } else {
- strParsedTemplate = strParsedTemplate.replaceAll(regex, value + '"');
- }
- }
- }
-
- // replace $$secret
- 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,
- bcrypt.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;
-}
-export function generatePassword({
- length = 24,
- symbols = false,
- isHex = false
-}: { length?: number; symbols?: boolean; isHex?: boolean } | null): string {
- if (isHex) {
- return crypto.randomBytes(length).toString('hex');
- }
- const password = generator.generate({
- length,
- numbers: true,
- strict: true,
- symbols
- });
-
- return password;
-}
-
-export async function getFreePublicPort({ id, remoteEngine, engine, remoteIpAddress }) {
- const { default: isReachable } = await import('is-port-reachable');
- const data = await prisma.setting.findFirst();
- const { minPort, maxPort } = data;
- if (remoteEngine) {
- const dbUsed = await (
- await prisma.database.findMany({
- where: {
- publicPort: { not: null },
- id: { not: id },
- destinationDocker: { remoteIpAddress }
- },
- select: { publicPort: true }
- })
- ).map((a) => a.publicPort);
- const wpFtpUsed = await (
- await prisma.wordpress.findMany({
- where: {
- ftpPublicPort: { not: null },
- id: { not: id },
- service: { destinationDocker: { remoteIpAddress } }
- },
- select: { ftpPublicPort: true }
- })
- ).map((a) => a.ftpPublicPort);
- const wpUsed = await (
- await prisma.wordpress.findMany({
- where: {
- mysqlPublicPort: { not: null },
- id: { not: id },
- service: { destinationDocker: { remoteIpAddress } }
- },
- select: { mysqlPublicPort: true }
- })
- ).map((a) => a.mysqlPublicPort);
- const minioUsed = await (
- await 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 = 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 prisma.database.findMany({
- where: { publicPort: { not: null }, id: { not: id }, destinationDocker: { engine } },
- select: { publicPort: true }
- })
- ).map((a) => a.publicPort);
- const wpFtpUsed = await (
- await prisma.wordpress.findMany({
- where: {
- ftpPublicPort: { not: null },
- id: { not: id },
- service: { destinationDocker: { engine } }
- },
- select: { ftpPublicPort: true }
- })
- ).map((a) => a.ftpPublicPort);
- const wpUsed = await (
- await prisma.wordpress.findMany({
- where: {
- mysqlPublicPort: { not: null },
- id: { not: id },
- service: { destinationDocker: { engine } }
- },
- select: { mysqlPublicPort: true }
- })
- ).map((a) => a.mysqlPublicPort);
- const minioUsed = await (
- await 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 = 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;
- }
-}
-
-export async function verifyAndDecryptServiceSecrets(id: string) {
- const secrets = await prisma.serviceSecret.findMany({ where: { serviceId: id } })
- let decryptedSecrets = secrets.map(secret => {
- const { name, value } = secret
- if (value) {
- let rawValue = decrypt(value)
- rawValue = rawValue.replaceAll(/\$/gi, '$$$')
- return { name, value: rawValue }
- }
- return { name, value }
-
- })
- return decryptedSecrets
-}
-
-export function persistentVolumes(id, persistentStorage, config) {
- let volumeSet = 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 };
-}
-
-export async function startServiceContainers(fastify, id, teamId, dockerId, composeFileDestination) {
- try {
- // fastify.io.to(teamId).emit(`start-service`, { serviceId: id, state: 'Pulling images...' })
- await executeCommand({ dockerId, command: `docker compose -f ${composeFileDestination} pull` })
- } catch (error) { }
- // fastify.io.to(teamId).emit(`start-service`, { serviceId: id, state: 'Building images...' })
- await executeCommand({ dockerId, command: `docker compose -f ${composeFileDestination} build --no-cache` })
- // fastify.io.to(teamId).emit(`start-service`, { serviceId: id, state: 'Creating containers...' })
- await executeCommand({ dockerId, command: `docker compose -f ${composeFileDestination} create` })
- // fastify.io.to(teamId).emit(`start-service`, { serviceId: id, state: 'Starting containers...' })
- await executeCommand({ dockerId, command: `docker compose -f ${composeFileDestination} start` })
- await asyncSleep(1000);
- await executeCommand({ dockerId, command: `docker compose -f ${composeFileDestination} up -d` })
- // fastify.io.to(teamId).emit(`start-service`, { serviceId: id, state: 0 })
-}
\ No newline at end of file
diff --git a/apps/trpc-experimental/server/src/trpc/routers/settings.ts b/apps/trpc-experimental/server/src/trpc/routers/settings.ts
deleted file mode 100644
index e06de54a9..000000000
--- a/apps/trpc-experimental/server/src/trpc/routers/settings.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-// import { z } from 'zod';
-import { publicProcedure, privateProcedure, router } from '../trpc';
-import { TRPCError } from '@trpc/server';
-import { getCurrentUser, getTeamInvitation, listSettings, version } from '../../lib/common';
-import { env } from '../../env';
-import type { Permission, TeamInvitation } from '@prisma/client';
-import jsonwebtoken from 'jsonwebtoken';
-
-export const settingsRouter = router({
- getBaseSettings: publicProcedure.query(async () => {
- const settings = await listSettings();
- return {
- success: true,
- data: {
- isRegistrationEnabled: settings?.isRegistrationEnabled
- }
- };
- }),
- getInstanceSettings: privateProcedure.query(async ({ ctx }) => {
- try {
- const settings = await listSettings();
-
- let isAdmin = false;
- let permission = null;
- let token = null;
- let pendingInvitations: TeamInvitation[] = [];
-
- if (!settings) {
- throw new TRPCError({
- code: 'INTERNAL_SERVER_ERROR',
- message: 'An unexpected error occurred, please try again later.'
- });
- }
- if (ctx.user) {
- const currentUser = await getCurrentUser(ctx.user.userId);
- if (currentUser) {
- const foundPermission = currentUser.permission.find(
- (p: Permission) => 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() / 1000)
- };
- token = jsonwebtoken.sign(payload, env.COOLIFY_SECRET_KEY);
- }
- pendingInvitations = await 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,
- whiteLabeled: env.COOLIFY_WHITE_LABELED === 'true',
- whiteLabeledIcon: env.COOLIFY_WHITE_LABELED_ICON,
- isRegistrationEnabled: settings.isRegistrationEnabled,
- pendingInvitations
- }
- };
- } catch (error) {
- throw new TRPCError({
- code: 'INTERNAL_SERVER_ERROR',
- message: 'An unexpected error occurred, please try again later.',
- cause: error
- });
- }
- })
-});
diff --git a/apps/trpc-experimental/server/src/trpc/routers/sources/index.ts b/apps/trpc-experimental/server/src/trpc/routers/sources/index.ts
deleted file mode 100644
index 05ff96b51..000000000
--- a/apps/trpc-experimental/server/src/trpc/routers/sources/index.ts
+++ /dev/null
@@ -1,223 +0,0 @@
-import { z } from 'zod';
-import { privateProcedure, router } from '../../trpc';
-import { decrypt, encrypt } from '../../../lib/common';
-import { prisma } from '../../../prisma';
-
-import cuid from 'cuid';
-
-export const sourcesRouter = router({
- save: privateProcedure
- .input(
- z.object({
- id: z.string(),
- name: z.string(),
- htmlUrl: z.string(),
- apiUrl: z.string(),
- customPort: z.number(),
- customUser: z.string(),
- isSystemWide: z.boolean().default(false)
- })
- )
- .mutation(async ({ input, ctx }) => {
- let { id, name, htmlUrl, apiUrl, customPort, customUser, isSystemWide } = input;
- if (customPort) customPort = Number(customPort);
- await prisma.gitSource.update({
- where: { id },
- data: { name, htmlUrl, apiUrl, customPort, customUser, isSystemWide }
- });
- }),
- newGitHubApp: privateProcedure
- .input(
- z.object({
- id: z.string(),
- name: z.string(),
- htmlUrl: z.string(),
- apiUrl: z.string(),
- organization: z.string(),
- customPort: z.number(),
- isSystemWide: 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 = cuid();
- await prisma.gitSource.create({
- data: {
- id: newId,
- name,
- htmlUrl,
- apiUrl,
- organization,
- customPort,
- isSystemWide,
- type: 'github',
- teams: { connect: { id: teamId } }
- }
- });
- return {
- id: newId
- };
- }
- return null;
- }),
- newGitLabApp: privateProcedure
- .input(
- z.object({
- id: z.string(),
- type: z.string(),
- name: z.string(),
- htmlUrl: z.string(),
- apiUrl: z.string(),
- oauthId: z.number(),
- appId: z.string(),
- appSecret: z.string(),
- groupName: z.string().optional().nullable(),
- customPort: z.number().optional().nullable(),
- customUser: 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 = encrypt(appSecret);
-
- if (id === 'new') {
- const newId = cuid();
- await prisma.gitSource.create({
- data: {
- id: newId,
- type,
- apiUrl,
- htmlUrl,
- name,
- customPort,
- customUser,
- teams: { connect: { id: teamId } }
- }
- });
- await prisma.gitlabApp.create({
- data: {
- teams: { connect: { id: teamId } },
- appId,
- oauthId,
- groupName,
- appSecret: encryptedAppSecret,
- gitSource: { connect: { id: newId } }
- }
- });
- return {
- status: 201,
- id: newId
- };
- } else {
- await prisma.gitSource.update({
- where: { id },
- data: { type, apiUrl, htmlUrl, name, customPort, customUser }
- });
- await prisma.gitlabApp.update({
- where: { id },
- data: {
- appId,
- oauthId,
- groupName,
- appSecret: encryptedAppSecret
- }
- });
- }
- }),
- delete: privateProcedure
- .input(
- z.object({
- id: z.string()
- })
- )
- .mutation(async ({ input, ctx }) => {
- const { id } = input;
- const source = await prisma.gitSource.delete({
- where: { id },
- include: { githubApp: true, gitlabApp: true }
- });
- if (source.githubAppId) {
- await prisma.githubApp.delete({ where: { id: source.githubAppId } });
- }
- if (source.gitlabAppId) {
- await prisma.gitlabApp.delete({ where: { id: source.gitlabAppId } });
- }
- }),
- getSourceById: privateProcedure
- .input(
- z.object({
- id: z.string()
- })
- )
- .query(async ({ input, ctx }) => {
- const { id } = input;
- const { teamId } = ctx.user;
- const settings = await 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 prisma.gitSource.findFirst({
- where: {
- id,
- OR: [
- { teams: { some: { id: teamId === '0' ? undefined : teamId } } },
- { isSystemWide: true }
- ]
- },
- include: { githubApp: true, gitlabApp: true }
- });
- if (!source) {
- throw { status: 404, message: 'Source not found.' };
- }
-
- if (source?.githubApp?.clientSecret)
- source.githubApp.clientSecret = decrypt(source.githubApp.clientSecret);
- if (source?.githubApp?.webhookSecret)
- source.githubApp.webhookSecret = decrypt(source.githubApp.webhookSecret);
- if (source?.githubApp?.privateKey)
- source.githubApp.privateKey = decrypt(source.githubApp.privateKey);
- if (source?.gitlabApp?.appSecret)
- source.gitlabApp.appSecret = decrypt(source.gitlabApp.appSecret);
-
- return {
- success: true,
- data: {
- source,
- settings
- }
- };
- })
-});
diff --git a/apps/trpc-experimental/server/src/trpc/trpc.ts b/apps/trpc-experimental/server/src/trpc/trpc.ts
deleted file mode 100644
index 79c7c5781..000000000
--- a/apps/trpc-experimental/server/src/trpc/trpc.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { initTRPC, TRPCError } from '@trpc/server';
-import superjson from 'superjson';
-import type { Context } from './context';
-
-const t = initTRPC.context().create({
- transformer: superjson,
- 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 TRPCError({ code: 'UNAUTHORIZED' });
- }
- return next({
- ctx: {
- user: ctx.user
- }
- });
-});
-export const router = t.router;
-export const privateProcedure = t.procedure.use(isAdmin);
-export const publicProcedure = t.procedure;
diff --git a/apps/trpc-experimental/server/tags.json b/apps/trpc-experimental/server/tags.json
deleted file mode 100644
index 5d4ef05cd..000000000
--- a/apps/trpc-experimental/server/tags.json
+++ /dev/null
@@ -1,1013 +0,0 @@
-[
- { "name": "directus-postgresql", "image": "directus/directus", "tags": ["9.22"] },
- { "name": "whoogle", "image": "benbusby/whoogle-search", "tags": ["0.8.1"] },
- { "name": "libretranslate", "image": "libretranslate/libretranslate", "tags": ["v1.3.8"] },
- {
- "name": "appsmith",
- "image": "appsmith/appsmith-ce",
- "tags": [
- "v1.9.1",
- "v1.8.15",
- "v1.8.12",
- "v1.8.10",
- "v1.8.9",
- "v1.8.7",
- "v1.8.5",
- "v1.8.3",
- "v1.8.0",
- "v1.7.13",
- "v1.7.11",
- "v1.7.8",
- "v1.7.6",
- "v1.7.4",
- "v1.7.2",
- "v1.7.1",
- "v1.6.22",
- "v1.6.20",
- "v1.6.19",
- "v1.6.17",
- "v1.6.15",
- "v1.6.13",
- "v1.6.11",
- "v1.6.9",
- "v1.6.7",
- "v1.6.5",
- "v1.6.3",
- "v1.6.1",
- "v1.5.30",
- "v1.5.28"
- ]
- },
- {
- "name": "appwrite",
- "image": "appwrite/appwrite",
- "tags": [
- "1.2.0",
- "1.1.2",
- "1.1.0",
- "1.0.3",
- "1.0.1",
- "1.0.0",
- "0.15.2",
- "0.15.0",
- "0.14.2",
- "0.14.0",
- "0.13.4",
- "0.13.2",
- "0.13.0",
- "0.12.3",
- "0.12.1",
- "0.12.0",
- "0.11.2",
- "0.11.0",
- "0.10.4",
- "0.10.2",
- "0.10.0",
- "0.9.3",
- "0.9.1",
- "0.8.0",
- "0.7.1",
- "0.6.2",
- "0.6.0",
- "0.5.2",
- "0.5.0",
- "0.3.1"
- ]
- },
- {
- "name": "fider",
- "image": "getfider/fider",
- "tags": [
- "stable",
- "master",
- "main",
- "dev",
- "SHA_ee6e83cfaadadaa56ab76e089e01f5631af3506f",
- "SHA_deb4f9b4f561d890d8a80e6872fea9a98a265cc6",
- "SHA_d5cc307909d43447200483d76b5db74d8ed8349e",
- "SHA_d1674476577a7fd3c88fc29f91c3f35f5bd6a260",
- "SHA_d107cbb157abca6576110080736213efe0955cff",
- "SHA_c9c55b2f5b33a76015241b97e03cfac1254b42a7",
- "SHA_bcf451a3cb02d5c8a489fd30309249296057b084",
- "SHA_bbfe419639514f949a042807addf0fde7d4de225",
- "SHA_adc3afc4c7bcf96931a5f90cab65c282d860dbfd",
- "SHA_ab5283ae95334f10b5041402dce79e333c472015",
- "SHA_a3f4cb5ed0a4ee2d726705fc426636364aac17a1",
- "SHA_a18224142bf51bc6463c3d22f45f62287902e9a6",
- "SHA_8e5cff30d95963eaee2587488d351e0d658c8195",
- "SHA_8cabe2817ce7ccaf2f0a9fdbb1b5d3411de87f81",
- "SHA_7851f9da566132d87fa2a63004e78c3bc9c09c6c",
- "SHA_6c0f2bed1754e9d579eb9575129a6e3dbc529c32",
- "SHA_603508c8790d6a6fb1e852df1a58ead8e5b3ea6c",
- "SHA_55efacf164a4749b50ee68ae8925e7dc9dfa3a0c",
- "SHA_4bdd291ce61e5f5dfc063fa1b2d9be8c9ff1d4c4",
- "SHA_3fba9cb6a9ceab0c78c6cff3220610f591f657cb",
- "SHA_3d635b57606a9885babe91fe975b11429e0f2c38",
- "SHA_3b794edbd9789a8aa38ecd3714bc536a675d3058",
- "SHA_3570c454ad3252b690608f7bf8051737d8519f8a",
- "SHA_263e2709fd145f3ea511e5557e170102899995b0",
- "SHA_255c30ed012fc4c39ffc97efc1d3b00425b17c72",
- "SHA_17f92b16ef790003338f0926fc8d791a9a61333c"
- ]
- },
- {
- "name": "ghost-mariadb",
- "image": "bitnami/ghost",
- "tags": [
- "5.28.0",
- "5.27.0",
- "5.26.4",
- "5.26.3",
- "5.26.2",
- "5.26.1",
- "5.26.0",
- "5.25.5",
- "5.25.4",
- "5.25.3",
- "5.25.2",
- "5.25.1",
- "5.25.0",
- "5.24.2",
- "5.24.1",
- "5.24.0",
- "5.23.0",
- "5.22.11",
- "5.22.10",
- "5.22.9",
- "5.22.8",
- "5.22.7",
- "5.22.6",
- "5.22.5",
- "5.22.4",
- "5.22.3",
- "5.22.2",
- "5.22.1",
- "5.22.0",
- "5.21.0",
- "4.48.8"
- ]
- },
- {
- "name": "ghost-mysql",
- "image": "library/ghost",
- "tags": [
- "5.28.0",
- "5.27.0",
- "5.26.4",
- "5.26.3",
- "5.26.2",
- "5.26.1",
- "5.25.5",
- "5.25.3",
- "5.25.2",
- "5.25.1",
- "5.25.0",
- "5.24.2",
- "5.24.1",
- "5.23.0",
- "5.22.11",
- "5.22.10",
- "5.22.9",
- "5.22.8",
- "5.22.4",
- "5.22.1",
- "5.20.0",
- "5.19.3",
- "5.19.0",
- "5.18.0",
- "5.17.2",
- "5.17.1",
- "5.17.0",
- "5.16.2",
- "5.14.2",
- "5.14.1"
- ]
- },
- {
- "name": "ghost-only",
- "image": "library/ghost",
- "tags": [
- "5.28.0",
- "5.27.0",
- "5.26.4",
- "5.26.3",
- "5.26.2",
- "5.26.1",
- "5.25.5",
- "5.25.3",
- "5.25.2",
- "5.25.1",
- "5.25.0",
- "5.24.2",
- "5.24.1",
- "5.23.0",
- "5.22.11",
- "5.22.10",
- "5.22.9",
- "5.22.8",
- "5.22.4",
- "5.22.1",
- "5.20.0",
- "5.19.3",
- "5.19.0",
- "5.18.0",
- "5.17.2",
- "5.17.1",
- "5.17.0",
- "5.16.2",
- "5.14.2",
- "5.14.1"
- ]
- },
- {
- "name": "gitea",
- "image": "gitea/gitea",
- "tags": [
- "1.18.0",
- "1.17.4",
- "1.17.3",
- "1.17.2",
- "1.17.1",
- "1.17.0",
- "1.16.9",
- "1.16.8",
- "1.16.7",
- "1.16.6",
- "1.16.5",
- "1.16.4",
- "1.16.3",
- "1.16.2",
- "1.16.1",
- "1.16.0",
- "1.15.11",
- "1.15.10",
- "1.15.9",
- "1.15.8",
- "1.15.7",
- "1.15.6",
- "1.15.5",
- "1.15.4",
- "1.15.3",
- "1.15.2",
- "1.15.1",
- "1.15.0",
- "1.14.7",
- "1.14.6"
- ]
- },
- {
- "name": "glitchtip",
- "image": "glitchtip/glitchtip",
- "tags": [
- "v3.0.2",
- "v3.0.0",
- "v2.0.7",
- "v2.0.5",
- "v2.0.2",
- "v2.0.0",
- "v1.12.4",
- "v1.12.2",
- "v1.12.0",
- "v1.10.3",
- "v1.10.1",
- "v1.9.2",
- "v1.9.0",
- "v1.8.4",
- "v1.8.2",
- "v1.8.0",
- "v1.7.1",
- "v1.6.4",
- "v1.6.2",
- "v1.6.0",
- "v1.5.3",
- "v1.5.1",
- "v1.4.1",
- "v1.3.3",
- "v1.3.1",
- "v1.2.6",
- "v1.2.4",
- "v1.2.2",
- "v1.2.0",
- "v1.1.2"
- ]
- },
- {
- "name": "grafana",
- "image": "grafana/grafana",
- "tags": [
- "9.3.2",
- "9.3.1",
- "9.3.0",
- "9.2.8",
- "9.2.7",
- "9.2.6",
- "9.2.5",
- "9.2.4",
- "9.2.3",
- "9.2.2",
- "9.2.1",
- "9.2.0",
- "9.1.8",
- "9.1.7",
- "9.1.6",
- "9.1.5",
- "9.1.4",
- "9.1.3",
- "9.1.2",
- "9.1.1",
- "9.1.0",
- "9.0.9",
- "9.0.8",
- "9.0.7",
- "9.0.6",
- "9.0.5",
- "9.0.4",
- "9.0.3",
- "9.0.2",
- "9.0.1"
- ]
- },
- {
- "name": "hasura",
- "image": "hasura/graphql-engine",
- "tags": [
- "v2.16.1",
- "v2.16.0",
- "v2.15.2",
- "v2.14.1",
- "v2.13.2",
- "v2.12.1",
- "v2.11.3",
- "v2.10.2",
- "v2.9.0",
- "v2.8.4",
- "v2.8.3",
- "v2.8.2",
- "v2.8.1",
- "v2.8.0",
- "v2.7.0",
- "v2.6.2",
- "v2.6.1",
- "v2.6.0",
- "v2.5.2",
- "v2.5.1",
- "v2.5.0",
- "v2.4.0",
- "v2.3.1",
- "v2.3.0",
- "v2.2.2",
- "v2.2.1",
- "v2.2.0",
- "v2.1.1",
- "v2.1.0",
- "v2.0.10"
- ]
- },
- {
- "name": "keycloak",
- "image": "quay.io/keycloak/keycloak",
- "tags": [
- "9.0.3",
- "9.0.0",
- "8.0.1",
- "7.0.0",
- "6.0.1",
- "6.0.0",
- "20.0.2",
- "20.0.1",
- "20.0.0",
- "19.0.3",
- "19.0.1",
- "19.0.0",
- "18.0.1",
- "18.0.0",
- "17.0.1",
- "17.0.0",
- "16.1.0",
- "15.1.1",
- "15.0.2",
- "15.0.0",
- "13.0.1",
- "12.0.4",
- "12.0.2",
- "12.0.0",
- "11.0.2",
- "11.0.0",
- "10.0.1"
- ]
- },
- {
- "name": "languagetool",
- "image": "silviof/docker-languagetool",
- "tags": ["latest", "6.0", "5.8", "5.7", "5.6", "5.5", "5.4", "5.3"]
- },
- {
- "name": "lavalink",
- "image": "fredboat/lavalink",
- "tags": [
- "v3.7",
- "v3.6",
- "v3-vda0b3a4b3916a7b1a2b79702de1143c3a6939810-SNAPSHOT",
- "v3-vc92690c425390bd20f6c51643c67ba79ab85b7e0-SNAPSHOT",
- "v3-vab81dcd46adf3e8a961dd57eacd2a1bde1233e6c-SNAPSHOT",
- "v3-v9c9432704d6a4badfcbd06a57597c54bed8f4326-SNAPSHOT",
- "v3-v3.0",
- "v3-v3",
- "v3-v124f8fae7dab299f9cdf1cb4c1715be455497286-SNAPSHOT",
- "v3-",
- "v3",
- "v2.0.1",
- "v2.0",
- "v2",
- "update-udpqueue-vb4a439d6147dbd8641ea4f265e8efc9f1e16e2d3-SNAPSHOT",
- "update-udpqueue-",
- "update-udpqueue",
- "revert-713-fix-error-for-loading-jda-nas",
- "refactor-github-actions",
- "patch-update-lp",
- "patch-update-github-actions",
- "patch-more-configurable-github-actions",
- "patch-lavaplayer-update",
- "patch-lavaplayer-bump",
- "patch-build-number",
- "next-api-vd4db194cac7a839a3899857f1f6d7b910369309d-SNAPSHOT",
- "next-api-vc2e018d5ffef54b2d17244b3d213e31723a084d6-SNAPSHOT",
- "next-api-v42cb5f7c58e98d1911e87bffb35aee0a235b85f8-SNAPSHOT",
- "next-api-v31a243bda80badbd7d643f68fc1f87e99639060f-SNAPSHOT",
- "next-api-v17f6884434c2d70d1704b2322a951d9f07af8865-SNAPSHOT"
- ]
- },
- {
- "name": "meilisearch",
- "image": "getmeili/meilisearch",
- "tags": [
- "v0.30.5",
- "v0.30.3",
- "v0.30.1",
- "v0.30.0",
- "v0.29.3",
- "v0.29.1",
- "v0.29.0",
- "v0.28.1",
- "v0.28.0",
- "v0.27.1",
- "v0.27.0",
- "v0.26.1",
- "v0.26.0",
- "v0.25.1",
- "v0.25.0",
- "v0.23.1",
- "v0.23.0",
- "v0.21.1",
- "v0.21.0",
- "v0.20.0",
- "v0.19.0",
- "v0.18.1",
- "v0.18.0",
- "v0.17.0",
- "v0.16.0",
- "0.14.1",
- "v0.14.1",
- "v0.14.0",
- "v0.12.0",
- "v0.11.0"
- ]
- },
- {
- "name": "minio",
- "image": "minio/minio",
- "tags": [
- "RELEASE.2023-01-06T18-11-18Z",
- "RELEASE.2023-01-02T09-40-09Z",
- "RELEASE.2022-12-12T19-27-27Z",
- "RELEASE.2022-12-07T00-56-37Z",
- "RELEASE.2022-12-02T19-19-22Z",
- "RELEASE.2022-11-29T23-40-49Z",
- "RELEASE.2022-11-26T22-43-32Z",
- "RELEASE.2022-11-17T23-20-09Z",
- "RELEASE.2022-11-11T03-44-20Z",
- "RELEASE.2022-11-10T18-20-21Z",
- "RELEASE.2022-11-08T05-27-07Z",
- "RELEASE.2022-10-29T06-21-33Z",
- "RELEASE.2022-10-24T18-35-07Z.hotfix.7906ac5be",
- "RELEASE.2022-10-24T18-35-07Z",
- "RELEASE.2022-10-21T22-37-48Z",
- "RELEASE.2022-10-20T00-55-09Z",
- "RELEASE.2022-10-15T19-57-03Z",
- "RELEASE.2022-10-08T20-11-00Z",
- "RELEASE.2022-10-05T14-58-27Z",
- "RELEASE.2022-10-02T19-29-29Z",
- "RELEASE.2022-09-25T15-44-53Z",
- "RELEASE.2022-09-22T18-57-27Z",
- "RELEASE.2022-09-17T00-09-45Z.hotfix.f76e5da9f",
- "RELEASE.2022-09-17T00-09-45Z.fips",
- "RELEASE.2022-09-07T22-25-02Z.fips",
- "RELEASE.2022-09-01T23-53-36Z.fips",
- "RELEASE.2022-08-26T19-53-15Z.fips",
- "RELEASE.2022-08-25T07-17-05Z.fips",
- "RELEASE.2022-08-22T23-53-06Z.hotfix.5fa3967bb",
- "RELEASE.2022-08-22T23-53-06Z"
- ]
- },
- {
- "name": "n8n",
- "image": "n8nio/n8n",
- "tags": [
- "0.210.1",
- "0.210.0",
- "0.209.4",
- "0.209.3",
- "0.209.2",
- "0.209.1",
- "0.209.0",
- "0.208.1",
- "0.208.0",
- "0.207.1",
- "0.207.0",
- "0.206.1",
- "0.205.0",
- "0.204.0",
- "0.203.1",
- "0.202.1",
- "0.202.0",
- "0.201.0",
- "0.200.1",
- "0.199.0",
- "0.198.1",
- "0.198.0",
- "0.197.1",
- "0.197.0",
- "0.196.0",
- "0.195.5",
- "0.195.4",
- "0.195.3",
- "0.195.2",
- "0.195.1"
- ]
- },
- {
- "name": "nocodb",
- "image": "nocodb/nocodb",
- "tags": [
- "0.100.1",
- "0.99.1",
- "0.98.4",
- "0.98.2",
- "0.98.0",
- "0.96.4",
- "0.96.2",
- "0.96.0",
- "0.92.3",
- "0.91.10",
- "0.91.9",
- "0.91.7",
- "0.91.0",
- "0.90.10",
- "0.90.7",
- "0.90.4",
- "0.90.2",
- "0.90.0",
- "0.84.15",
- "0.84.12",
- "0.84.8",
- "0.84.6",
- "0.84.2",
- "0.84.1",
- "0.83.6",
- "0.83.3",
- "0.83.1",
- "0.82.0",
- "0.81.0",
- "0.11.46"
- ]
- },
- {
- "name": "openblocks",
- "image": "openblocksdev/openblocks-ce",
- "tags": ["latest", "heroku", "beta", "1.1.3", "1.1.2", "1.1.1", "1.1.0", "1.0.21"]
- },
- {
- "name": "plausibleanalytics-arm",
- "image": "plausible/analytics",
- "tags": [
- "v1.5.1",
- "v1.5.0-rc.2",
- "v1.5.0-rc.1",
- "v1.5.0",
- "v1.5",
- "v1.4.4",
- "v1.4.3",
- "v1.4.2",
- "v1.4.1",
- "v1.4.0.rc.0",
- "v1.4.0-rc.0",
- "v1.4.0",
- "v1.4",
- "v1.3.0-rc.1",
- "v1.3.0-rc.0",
- "v1.3.0",
- "v1.3",
- "v1.2.1",
- "v1.2.0",
- "v1.2-rc.1",
- "v1.2-rc.0",
- "v1.2",
- "v1.1.1",
- "v1.1.0",
- "v1.1",
- "v1.0.0",
- "v1.0",
- "v1",
- "stable",
- "master"
- ]
- },
- {
- "name": "plausibleanalytics",
- "image": "plausible/analytics",
- "tags": [
- "v1.5.1",
- "v1.5.0-rc.2",
- "v1.5.0-rc.1",
- "v1.5.0",
- "v1.5",
- "v1.4.4",
- "v1.4.3",
- "v1.4.2",
- "v1.4.1",
- "v1.4.0.rc.0",
- "v1.4.0-rc.0",
- "v1.4.0",
- "v1.4",
- "v1.3.0-rc.1",
- "v1.3.0-rc.0",
- "v1.3.0",
- "v1.3",
- "v1.2.1",
- "v1.2.0",
- "v1.2-rc.1",
- "v1.2-rc.0",
- "v1.2",
- "v1.1.1",
- "v1.1.0",
- "v1.1",
- "v1.0.0",
- "v1.0",
- "v1",
- "stable",
- "master"
- ]
- },
- {
- "name": "pocketbase",
- "image": "coollabsio/pocketbase",
- "tags": [
- "0.8.0-arm64",
- "0.8.0-amd64",
- "0.8.0-aarch64",
- "0.8.0",
- "0.10.2-arm64",
- "0.10.2-amd64",
- "0.10.2-aarch64",
- "0.10.2"
- ]
- },
- {
- "name": "searxng",
- "image": "searxng/searxng",
- "tags": [
- "2023.01.09-afd71a6c",
- "2023.01.09-a90ed481",
- "2023.01.08-54e63839",
- "2023.01.08-4e735b28",
- "2023.01.08-217395b8",
- "2023.01.08-0c429d70",
- "2023.01.07-cb7b0916",
- "2023.01.07-a98c5156",
- "2023.01.07-633ba8b1",
- "2023.01.07-4e355564",
- "2023.01.06-b241015e",
- "2023.01.06-269a72ee",
- "2023.01.05-aba969cc",
- "2022.12.30-b6d98be7",
- "2022.12.30-647a0aa9",
- "2022.12.30-17516290",
- "2022.12.29-d531f893",
- "2022.12.29-9b31976c",
- "2022.12.29-76cd808a",
- "2022.12.29-3ec58b06",
- "2022.12.29-174e6851",
- "2022.12.26-0d489617",
- "2022.12.23-e8f72d70",
- "2022.12.23-a2d506d4",
- "2022.12.22-d75ae7c8",
- "2022.12.16-f5bd73d9",
- "2022.12.16-b9274821",
- "2022.12.16-42ca37a6",
- "2022.12.16-2a51c856",
- "2022.12.16-0dac581c"
- ]
- },
- {
- "name": "trilium",
- "image": "zadam/trilium",
- "tags": [
- "0.57.4",
- "0.57.2",
- "0.56.1",
- "0.55.1",
- "0.54.2",
- "0.53.2",
- "0.52.4",
- "0.52.2",
- "0.51.2",
- "0.50.3",
- "0.50.1",
- "0.49.5",
- "0.49.3",
- "0.48.9",
- "0.48.7",
- "0.48.4",
- "0.48.2",
- "0.47.8",
- "0.47.6",
- "0.47.4",
- "0.47.2",
- "0.46.7",
- "0.46.5",
- "0.45.10",
- "0.45.9",
- "0.45.7",
- "0.45.5",
- "0.45.3",
- "0.44.8",
- "0.44.6"
- ]
- },
- {
- "name": "umami-postgresql",
- "image": "ghcr.io/umami-software/umami",
- "tags": [
- "postgresql-v1.39.5",
- "postgresql-v1.39.4",
- "postgresql-v1.39.3",
- "postgresql-v1.39.2",
- "postgresql-v1.39.1",
- "postgresql-v1.39.0",
- "postgresql-v1.38.0",
- "postgresql-v1.37.0",
- "postgresql-v1.36.1",
- "postgresql-v1.36.0",
- "postgresql-v1.35.0",
- "postgresql-v1.34.0",
- "postgresql-v1.33.3",
- "postgresql-latest",
- "mysql-v1.39.5",
- "mysql-v1.39.4",
- "mysql-v1.39.3",
- "mysql-v1.39.2",
- "mysql-v1.39.1",
- "mysql-v1.39.0",
- "mysql-v1.38.0",
- "mysql-v1.37.0",
- "mysql-v1.36.1",
- "mysql-v1.36.0",
- "mysql-v1.35.0",
- "mysql-v1.34.0",
- "mysql-v1.33.3",
- "mysql-latest"
- ]
- },
- {
- "name": "umami",
- "image": "ghcr.io/umami-software/umami",
- "tags": [
- "postgresql-v1.39.5",
- "postgresql-v1.39.4",
- "postgresql-v1.39.3",
- "postgresql-v1.39.2",
- "postgresql-v1.39.1",
- "postgresql-v1.39.0",
- "postgresql-v1.38.0",
- "postgresql-v1.37.0",
- "postgresql-v1.36.1",
- "postgresql-v1.36.0",
- "postgresql-v1.35.0",
- "postgresql-v1.34.0",
- "postgresql-v1.33.3",
- "postgresql-latest",
- "mysql-v1.39.5",
- "mysql-v1.39.4",
- "mysql-v1.39.3",
- "mysql-v1.39.2",
- "mysql-v1.39.1",
- "mysql-v1.39.0",
- "mysql-v1.38.0",
- "mysql-v1.37.0",
- "mysql-v1.36.1",
- "mysql-v1.36.0",
- "mysql-v1.35.0",
- "mysql-v1.34.0",
- "mysql-v1.33.3",
- "mysql-latest"
- ]
- },
- {
- "name": "uptimekuma",
- "image": "louislam/uptime-kuma",
- "tags": [
- "1.19.4",
- "1.19.3",
- "1.19.2",
- "1.19.1",
- "1.19.0",
- "1.18.5",
- "1.18.4",
- "1.18.3",
- "1.18.2",
- "1.18.1",
- "1.18.0",
- "1.17.1",
- "1.17.0",
- "1.16.1",
- "1.16.0",
- "1.15.1",
- "1.15.0",
- "1.14.1",
- "1.14.0",
- "1.13.2",
- "1.13.1",
- "1.13.0",
- "1.12.1",
- "1.11.4",
- "1.11.3",
- "1.11.2",
- "1.11.1",
- "1.11.0",
- "1.10.2",
- "1.10.1"
- ]
- },
- {
- "name": "vaultwarden",
- "image": "vaultwarden/server",
- "tags": [
- "1.27.0",
- "1.26.0",
- "1.25.2",
- "1.25.1",
- "1.25.0",
- "1.24.0",
- "1.23.1",
- "1.23.0",
- "1.22.2",
- "1.22.1",
- "1.22.0",
- "1.21.0"
- ]
- },
- {
- "name": "vscodeserver",
- "image": "codercom/code-server",
- "tags": [
- "4.9.1",
- "4.9.0",
- "4.8.3",
- "4.8.2",
- "4.8.1",
- "4.8.0",
- "4.7.0",
- "4.6.0",
- "4.5.1",
- "4.4.0",
- "4.2.0",
- "4.0.2",
- "3.11.1",
- "3.10.2",
- "3.10.0",
- "3.9.3",
- "3.9.1",
- "3.8.1",
- "3.7.4",
- "3.7.2",
- "3.7.0",
- "3.6.1",
- "3.5.0",
- "3.4.0",
- "3.3.0",
- "3.2.0",
- "3.1.1",
- "3.1.0",
- "3.0.2",
- "3.0.0"
- ]
- },
- {
- "name": "weblate",
- "image": "weblate/weblate",
- "tags": [
- "latest",
- "edge-2023-01-10-1df5c9dd96a6d8650f6881942fecbe33e1884295",
- "edge-2023-01-09-7029b7b6c630be7cdac07d1629573dd2b81bc05f",
- "edge-2023-01-09-4b05a878aa25b2c544a4e77027769b5934ec561f",
- "edge-2023-01-07-df50259ff209720b0fd3c983bd7a5d01b564149c",
- "edge-2023-01-07-719b3034de0ed369cd63554ea652f11142b9a540",
- "edge-2023-01-07-14d4aec6cd8e1e6e0b7c1dc3a9cf4a74ccfc5e37",
- "edge-2023-01-07-00f2d980c4388d799ba0df3a27c10bf941b7edd3",
- "edge-2023-01-04-e92fe933b22e36e92f6de57a0ecb16752852d815",
- "edge-2023-01-04-4c413c6ba33c39a6b7f3238f255bc09c69e96345",
- "edge-2023-01-02-fd57652cce9dd2a12c7ff1dc644f5a969e57ea76",
- "edge-2023-01-02-738d270784bca0cfaaef59e6cfb8c307f68a9939",
- "edge-2023-01-02-3f6a7a183bbda4dc2e8d7e468370adc6f9e50527",
- "edge-2023-01-01-5580a7a4755bf71403c85999fb4dff2078293403",
- "edge-2022-12-29-8f422f23930880809a26d1207f9e43315ef54ad2",
- "edge-2022-12-28-375fd99195711641246ccd09e3ce394d6928eaef",
- "edge-2022-12-25-358c8ce6071f2781ae027bbc3a46d906ce08d9e7",
- "edge-2022-12-24-3e1503494ce06ad6ff32f02db1a7d59224e5c860",
- "edge-2022-12-21-cac4b09f943fe97700e3a33b7caf23277d2fcc11",
- "edge-2022-12-21-3a8dd1bf66a7295f3512346bc1c97d55c5649dcf",
- "edge-2022-12-16-e93caa3b014543b716b946f2c7fbf4a8f9be6099",
- "edge-2022-12-16-318a467d2e529a081e9ea9dbad993c1736ff1a00",
- "edge-2022-12-16-1af41ec4bd3838f967d88b68dec8195419e01e6f",
- "edge-2022-12-16-02e9d020b01d004655c3af20c68a30f6c4645c1a",
- "edge-2022-12-15-a6af1384a0831b17c43da7262f80d0cfbc766835",
- "edge-2022-12-15-a1c9f77b301a9e23fc05ef2adc4694cceb632c25",
- "edge-2022-12-15-1305f7115ef79b75e638b097772680d9cadbd4d0",
- "edge-2022-12-14-b400145f05687e647bd4c8192be99f7f04373fb5",
- "edge-2022-12-12-c0db193a3baacd107c5f2c28c6e0af89c3d5afa3",
- "edge-2022-12-09-647d40c67cf405870ba71a01584a42cfaec5915f"
- ]
- },
- {
- "name": "wordpress-only",
- "image": "library/wordpress",
- "tags": [
- "php8.2-fpm-alpine",
- "php8.2-fpm",
- "php8.2-apache",
- "php8.2",
- "php8.1-fpm-alpine",
- "php8.1-fpm",
- "php8.1-apache",
- "php8.1",
- "php8.0-fpm-alpine",
- "php8.0-fpm",
- "php8.0-apache",
- "php8.0",
- "php7.4-fpm-alpine",
- "php7.4-fpm",
- "php7.4-apache",
- "php7.4",
- "php7.3-fpm-alpine",
- "php7.3-fpm",
- "php7.3-apache",
- "php7.3",
- "php7.2-fpm-alpine",
- "php7.2-fpm",
- "php7.2-apache",
- "php7.2",
- "php7.1-fpm-alpine",
- "php7.1-fpm",
- "php7.1-apache",
- "php7.1",
- "php7.0-fpm-alpine",
- "php7.0-fpm"
- ]
- },
- {
- "name": "wordpress",
- "image": "library/wordpress",
- "tags": [
- "php8.2-fpm-alpine",
- "php8.2-fpm",
- "php8.2-apache",
- "php8.2",
- "php8.1-fpm-alpine",
- "php8.1-fpm",
- "php8.1-apache",
- "php8.1",
- "php8.0-fpm-alpine",
- "php8.0-fpm",
- "php8.0-apache",
- "php8.0",
- "php7.4-fpm-alpine",
- "php7.4-fpm",
- "php7.4-apache",
- "php7.4",
- "php7.3-fpm-alpine",
- "php7.3-fpm",
- "php7.3-apache",
- "php7.3",
- "php7.2-fpm-alpine",
- "php7.2-fpm",
- "php7.2-apache",
- "php7.2",
- "php7.1-fpm-alpine",
- "php7.1-fpm",
- "php7.1-apache",
- "php7.1",
- "php7.0-fpm-alpine",
- "php7.0-fpm"
- ]
- }
-]
diff --git a/apps/trpc-experimental/server/templates.json b/apps/trpc-experimental/server/templates.json
deleted file mode 100644
index fc378ecb0..000000000
--- a/apps/trpc-experimental/server/templates.json
+++ /dev/null
@@ -1 +0,0 @@
-[{"templateVersion":"1.0.0","defaultVersion":"9.22","documentation":"https://docs.directus.io/getting-started/introduction.html","type":"directus-postgresql","name":"Directus","subname":"(PostgreSQL)","description":"Directus is a free and open-source headless CMS framework for managing custom SQL-based databases.","labels":["CMS","headless"],"services":{"$$id":{"name":"Directus","depends_on":["$$id-postgresql","$$id-redis"],"image":"directus/directus:$$core_version","volumes":["$$id-uploads:/directus/uploads","$$id-database:/directus/database","$$id-extensions:/directus/extensions"],"environment":["KEY=$$secret_key","SECRET=$$secret_secret","DB_CLIENT=pg","DB_CONNECTION_STRING=$$secret_db_connection_string","CACHE_ENABLED=true","CACHE_STORE=redis","CACHE_REDIS=$$secret_cache_redis","ADMIN_EMAIL=$$config_admin_email","ADMIN_PASSWORD=$$secret_admin_password","CACHE_AUTO_PURGE=true","PUBLIC_URL=$$config_public_url"],"ports":["8055"]},"$$id-postgresql":{"name":"Directus PostgreSQL","depends_on":[],"image":"postgres:14-alpine","volumes":["$$id-postgresql-data:/var/lib/postgresql/data"],"environment":["POSTGRES_USER=$$config_postgres_user","POSTGRES_PASSWORD=$$secret_postgres_password","POSTGRES_DB=$$config_postgres_db"],"ports":[]},"$$id-redis":{"name":"Directus Redis","depends_on":[],"image":"redis:7.0.4-alpine","command":"--maxmemory 512mb --maxmemory-policy allkeys-lru --maxmemory-samples 5","volumes":["$$id-redis:/data"],"environment":[]}},"variables":[{"id":"$$config_public_url","name":"PUBLIC_URL","label":"Public URL","defaultValue":"$$generate_fqdn","description":""},{"id":"$$secret_db_connection_string","name":"DB_CONNECTION_STRING","label":"Directus Database Url","defaultValue":"postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db","description":""},{"id":"$$config_postgres_db","main":"$$id-postgresql","name":"POSTGRES_DB","label":"Database","defaultValue":"directus","description":""},{"id":"$$config_postgres_user","main":"$$id-postgresql","name":"POSTGRES_USER","label":"User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_postgres_password","main":"$$id-postgresql","name":"POSTGRES_PASSWORD","label":"Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true},{"id":"$$secret_cache_redis","name":"CACHE_REDIS","label":"Redis Url","defaultValue":"redis://$$id-redis:6379","description":""},{"id":"$$config_admin_email","name":"ADMIN_EMAIL","label":"Initial Admin Email","defaultValue":"admin@example.com","description":"The email address of the first user that is automatically created. You can change it later in Directus."},{"id":"$$secret_admin_password","name":"ADMIN_PASSWORD","label":"Initial Admin Password","defaultValue":"$$generate_password","description":"The password of the first user that is automatically created.","showOnConfiguration":true},{"id":"$$secret_key","name":"KEY","label":"Key","defaultValue":"$$generate_password","description":"Unique identifier for the project.","showOnConfiguration":true},{"id":"$$secret_secret","name":"SECRET","label":"Secret","defaultValue":"$$generate_password","description":"Secret string for the project.","showOnConfiguration":true}]},{"templateVersion":"1.0.0","defaultVersion":"v1.3.8","documentation":"https://github.com/LibreTranslate/LibreTranslate","description":"Free and Open Source Machine Translation API. 100% self-hosted, offline capable and easy to setup.","type":"libretranslate","name":"Libretranslate","labels":["translator","argos","python","libretranslate"],"services":{"$$id":{"name":"Libretranslate","image":"libretranslate/libretranslate:$$core_version","environment":["LT_HOST=0.0.0.0","LT_SUGGESTIONS=true","LT_CHAR_LIMIT=$$config_lt_char_limit","LT_REQ_LIMIT=$$config_lt_req_limit","LT_BATCH_LIMIT=$$config_lt_batch_limit","LT_GA_ID=$$config_lt_ga_id","LT_DISABLE_WEB_UI=$$config_lt_web_ui"],"volumes":["$$id-libretranslate:/libretranslate"],"ports":["5000"]}},"variables":[{"id":"$$config_lt_char_limit","name":"LT_CHAR_LIMIT","label":"Char limit","defaultValue":"5000","description":"Set character limit."},{"id":"$$config_lt_req_limit","name":"LT_REQ_LIMIT","label":"Request limit","defaultValue":"5000","description":"Set maximum number of requests per minute per client."},{"id":"$$config_lt_batch_limit","name":"LT_BATCH_LIMIT","label":"Batch Limit","defaultValue":"5000","description":"Set maximum number of texts to translate in a batch request."},{"id":"$$config_lt_ga_id","name":"LT_GA_ID","label":"Google Analytics ID","defaultValue":"","description":"Enable Google Analytics on the API client page by providing an ID"},{"id":"$$config_lt_web_ui","name":"LT_DISABLE_WEB_UI","label":"Web UI","defaultValue":"false","description":"Disable or enable web ui. True or false."}]},{"templateVersion":"1.0.0","defaultVersion":"0.8.1","documentation":"https://github.com/benbusby/whoogle-search","type":"whoogle","name":"Whoogle Search","description":"A self-hosted, ad-free, privacy-respecting metasearch engine","labels":["search","google"],"services":{"$$id":{"name":"Whoogle Search","documentation":"https://github.com/benbusby/whoogle-search","depends_on":[],"image":"benbusby/whoogle-search:$$core_version","cap_drop":["ALL"],"environment":["WHOOGLE_USER=$$config_whoogle_username","WHOOGLE_PASS=$$secret_whoogle_password","WHOOGLE_CONFIG_PREFERENCES_KEY=$$secret_whoogle_preferences_key"],"ulimits":{"nofile":{"soft":262144,"hard":262144}},"ports":["5000"]}},"variables":[{"id":"$$config_whoogle_username","name":"WHOOGLE_USER","label":"Whoogle User","defaultValue":"$$generate_username","description":"Username to log into Whoogle"},{"id":"$$secret_whoogle_password","name":"WHOOGLE_PASSWORD","label":"Whoogle Password","defaultValue":"$$generate_password","description":"Password to log into Whoogle","showOnConfiguration":true},{"id":"$$secret_whoogle_preferences_key","name":"WHOOGLE_CONFIG_PREFERENCES_KEY","label":"Whoogle preferences key","defaultValue":"$$generate_password","description":"password to encrypt preferences"}]},{"templateVersion":"1.0.0","defaultVersion":"1.1.3","documentation":"https://docs.openblocks.dev/","type":"openblocks","name":"Openblocks","description":"The Open Source Retool Alternative","services":{"$$id":{"image":"openblocksdev/openblocks-ce:$$core_version","volumes":["$$id-stacks-data:/openblocks-stacks"],"ports":["3000"]}}},{"templateVersion":"1.0.0","defaultVersion":"0.10.2","documentation":"https://pocketbase.io/docs/","type":"pocketbase","name":"Pocketbase","description":"Open Source realtime backend in 1 file","services":{"$$id":{"image":"coollabsio/pocketbase:$$core_version","volumes":["$$id-data:/app/pb_data"],"ports":["8080"]}}},{"templateVersion":"1.0.0","defaultVersion":"v1.5.1","documentation":"https://plausible.io/doc/","type":"plausibleanalytics-arm","name":"Plausible Analytics (ARM)","description":"A lightweight and open-source website analytics tool.","labels":["analytics","statistics","plausible","gdpr","no-cookie","google analytics"],"services":{"$$id":{"name":"Plausible Analytics","command":"sh -c \"sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh db init-admin && /entrypoint.sh run\"","depends_on":["$$id-postgresql","$$id-clickhouse"],"image":"plausible/analytics:$$core_version","environment":["ADMIN_USER_EMAIL=$$config_admin_user_email","ADMIN_USER_NAME=$$config_admin_user_name","ADMIN_USER_PWD=$$secret_admin_user_pwd","BASE_URL=$$config_base_url","SECRET_KEY_BASE=$$secret_secret_key_base","DISABLE_AUTH=$$config_disable_auth","DISABLE_REGISTRATION=$$config_disable_registration","DATABASE_URL=$$secret_database_url","CLICKHOUSE_DATABASE_URL=$$secret_clickhouse_database_url"],"ports":["8000"]},"$$id-postgresql":{"name":"PostgreSQL","image":"postgres:14-alpine","volumes":["$$id-postgresql-data:/var/lib/postgresql/data"],"environment":["POSTGRES_PASSWORD=$$secret_postgres_password","POSTGRES_USER=$$config_postgres_user","POSTGRES_DB=$$config_postgres_db"]},"$$id-clickhouse":{"name":"Clickhouse","volumes":["$$id-clickhouse-data:/var/lib/clickhouse"],"image":"clickhouse/clickhouse-server:22.6-alpine","ulimits":{"nofile":{"soft":262144,"hard":262144}},"files":[{"location":"/etc/clickhouse-server/users.d/logging.xml","content":"warning true "},{"location":"/etc/clickhouse-server/config.d/logging.xml","content":"0 0 "},{"location":"/docker-entrypoint-initdb.d/init.query","content":"CREATE DATABASE IF NOT EXISTS plausible;"},{"location":"/docker-entrypoint-initdb.d/init-db.sh","content":"clickhouse client --queries-file /docker-entrypoint-initdb.d/init.query"}]}},"variables":[{"id":"$$config_base_url","name":"BASE_URL","label":"Base URL","defaultValue":"$$generate_fqdn","description":"You must set this to the FQDN of the Plausible Analytics instance. This is used to generate the links to the Plausible Analytics instance."},{"id":"$$secret_database_url","name":"DATABASE_URL","label":"Database URL for PostgreSQL","defaultValue":"postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db","description":""},{"id":"$$secret_clickhouse_database_url","name":"CLICKHOUSE_DATABASE_URL","label":"Database URL for Clickhouse","defaultValue":"http://$$id-clickhouse:8123/plausible","description":""},{"id":"$$config_admin_user_email","name":"ADMIN_USER_EMAIL","label":"Admin Email Address","defaultValue":"admin@example.com","description":"This is the admin email. Please change it."},{"id":"$$config_admin_user_name","name":"ADMIN_USER_NAME","label":"Admin User Name","defaultValue":"$$generate_username","description":"This is the admin username. Please change it."},{"id":"$$secret_admin_user_pwd","name":"ADMIN_USER_PWD","label":"Admin User Password","defaultValue":"$$generate_password","description":"This is the admin password. Please change it.","showOnConfiguration":true},{"id":"$$secret_secret_key_base","name":"SECRET_KEY_BASE","label":"Secret Key Base","defaultValue":"$$generate_hex(64)","description":""},{"id":"$$config_disable_auth","name":"DISABLE_AUTH","label":"Authentication","defaultValue":"false","description":""},{"id":"$$config_disable_registration","name":"DISABLE_REGISTRATION","label":"Registration","defaultValue":"true","description":""},{"id":"$$config_postgres_user","main":"$$id-postgresql","name":"POSTGRES_USER","label":"PostgreSQL Username","defaultValue":"postgresql","description":""},{"id":"$$secret_postgres_password","main":"$$id-postgresql","name":"POSTGRES_PASSWORD","label":"PostgreSQL Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true},{"id":"$$config_postgres_db","main":"$$id-postgresql","name":"POSTGRES_DB","label":"PostgreSQL Database","defaultValue":"plausible","description":""},{"id":"$$config_scriptName","name":"SCRIPT_NAME","label":"Custom Script Name","defaultValue":"plausible.js","description":"This is the default script name."}]},{"templateVersion":"1.0.0","defaultVersion":"1.17","documentation":"https://docs.gitea.io","type":"gitea","name":"Gitea","description":"Gitea is a community managed lightweight code hosting solution written in Go.","labels":["storage","git"],"services":{"$$id":{"name":"Gitea","documentation":"https://docs.gitea.io","image":"gitea/gitea:$$core_version","volumes":["$$id-data:/data","/etc/timezone:/etc/timezone:ro","/etc/localtime:/etc/localtime:ro"],"environment":["USER_UID=1000","USER_GID=1000","DOMAIN=$$config_domain","SSH_DOMAIN=$$config_ssh_domain","ROOT_URL=$$config_root_url","SECRET_KEY=$$secret_secret_key","INTERNAL_TOKEN=$$secret_internal_token","SSH_PORT=22","START_SSH_SERVER=$$config_start_ssh_server"],"ports":["3000","22"],"proxy":[{"port":"22","hostPort":"$$config_hostport_ssh"}]}},"variables":[{"id":"$$config_hostport_ssh","name":"SSH_PORT","label":"SSH Port","defaultValue":"8022","description":"","required":true},{"id":"$$config_domain","name":"DOMAIN","label":"Domain","defaultValue":"$$generate_domain","description":""},{"id":"$$config_ssh_domain","name":"SSH_DOMAIN","label":"SSH Domain","defaultValue":"$$generate_domain","description":""},{"id":"$$config_start_ssh_server","name":"START_SSH_SERVER","label":"Start SSH Server","defaultValue":"true","description":""},{"id":"$$config_root_url","name":"ROOT_URL","label":"Root URL of Gitea","defaultValue":"$$generate_fqdn_slash","description":""},{"id":"$$secret_secret_key","name":"SECRET_KEY","label":"Secret Key","defaultValue":"$$generate_hex(32)","description":""},{"id":"$$secret_internal_token","name":"INTERNAL_TOKEN","label":"Internal JWT Token","defaultValue":"$$generate_token","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"20.0","documentation":"https://www.keycloak.org/documentation","type":"keycloak","name":"Keycloak","description":"Keycloak provides user federation, strong authentication, user management, fine-grained authorization, and more.","labels":["authentication","authorization","oidconnect","saml2"],"services":{"$$id":{"name":"Keycloak","command":"start --db=postgres --features=token-exchange --import-realm","depends_on":["$$id-postgresql"],"image":"quay.io/keycloak/keycloak:$$core_version","volumes":["$$id-import:/opt/keycloak/data/import"],"environment":["KC_HEALTH_ENABLED=true","KC_PROXY=edge","KC_DB=postgres","KC_HOSTNAME=$$config_keycloak_domain","KEYCLOAK_ADMIN=$$config_admin_user","KEYCLOAK_ADMIN_PASSWORD=$$secret_keycloak_admin_password","KC_DB_PASSWORD=$$secret_postgres_password","KC_DB_USERNAME=$$config_postgres_user","KC_DB_URL=$$secret_keycloak_database_url"],"ports":["8080"]},"$$id-postgresql":{"name":"PostgreSQL","depends_on":[],"image":"postgres:14-alpine","volumes":["$$id-postgresql-data:/var/lib/postgresql/data"],"environment":["POSTGRES_USER=$$config_postgres_user","POSTGRES_PASSWORD=$$secret_postgres_password","POSTGRES_DB=$$config_postgres_db"],"ports":[]}},"variables":[{"id":"$$config_keycloak_domain","name":"KEYCLOAK_DOMAIN","label":"Keycloak Domain","defaultValue":"$$generate_domain","description":""},{"id":"$$secret_keycloak_database_url","name":"KEYCLOAK_DATABASE_URL","label":"Keycloak Database Url","defaultValue":"jdbc:postgresql://$$id-postgresql:5432/$$config_postgres_db","description":""},{"id":"$$config_admin_user","name":"KEYCLOAK_ADMIN","label":"Keycloak Admin User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_keycloak_admin_password","name":"KEYCLOAK_ADMIN_PASSWORD","label":"Keycloak Admin Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true},{"id":"$$config_postgres_user","main":"$$id-postgresql","name":"POSTGRES_USER","label":"PostgreSQL User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_postgres_password","main":"$$id-postgresql","name":"POSTGRES_PASSWORD","label":"PostgreSQL Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true},{"id":"$$config_postgres_db","main":"$$id-postgresql","name":"POSTGRES_DB","label":"PostgreSQL Database","defaultValue":"keycloak","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"v3.7","documentation":"https://github.com/freyacodes/Lavalink","description":"Standalone audio sending node based on Lavaplayer.","type":"lavalink","name":"Lavalink","labels":["discord","discord bot","audio","lavalink","jda"],"services":{"$$id":{"name":"Lavalink","image":"fredboat/lavalink:$$core_version","environment":[],"volumes":["$$id-lavalink:/lavalink"],"ports":["$$config_port"],"files":[{"location":"/opt/Lavalink/application.yml","content":"server:\n port: 2333\n address: 0.0.0.0\nlavalink:\n server:\n password: \"$$secret_password\"\n sources:\n youtube: true\n bandcamp: true\n soundcloud: true\n twitch: true\n vimeo: true\n http: true\n local: false\n\nlogging:\n file:\n path: ./logs/\n\n level:\n root: INFO\n lavalink: INFO\n\n logback:\n rollingpolicy:\n max-file-size: 1GB\n max-history: 30"}]}},"variables":[{"id":"$$secret_password","name":"PASSWORD","label":"Password","defaultValue":"$$generate_password","required":true}]},{"templateVersion":"1.0.0","defaultVersion":"v1.8.9","documentation":"https://docs.appsmith.com/getting-started/setup/instance-configuration/","type":"appsmith","name":"Appsmith","description":"Fastest way to build internal apps over any database or API.","services":{"$$id":{"image":"appsmith/appsmith-ce:$$core_version","environment":["APPSMITH_MAIL_ENABLED=$$config_appsmith_mail_enabled","APPSMITH_DISABLE_TELEMETRY=$$config_appsmith_disable_telemetry","APPSMITH_DISABLE_INTERCOM=$$config_appsmith_disable_intercom"],"volumes":["$$id-stacks-data:/appsmith-stacks"],"ports":["80"]}},"variables":[{"id":"$$config_appsmith_mail_enabled","name":"APPSMITH_MAIL_ENABLED","label":"Enable Mail","defaultValue":"false","description":""},{"id":"$$config_appsmith_disable_telemetry","name":"APPSMITH_DISABLE_TELEMETRY","label":"Disable Telemetry","defaultValue":"true","description":""},{"id":"$$config_appsmith_disable_intercom","name":"APPSMITH_DISABLE_INTERCOM","label":"Disable Intercom","defaultValue":"true","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"0.57.4","documentation":"https://hub.docker.com/r/zadam/trilium","description":"A hierarchical note taking application with focus on building large personal knowledge bases.","labels":["personal","knowledge","notes","wiki"],"type":"trilium","name":"Trilium Notes","services":{"$$id":{"image":"zadam/trilium:$$core_version","environment":[],"volumes":["$$id-trilium:/home/node/trilium-data"],"ports":["8080"]}},"variables":[]},{"templateVersion":"1.0.0","defaultVersion":"1.18.5","documentation":"https://hub.docker.com/r/louislam/uptime-kuma","description":"A free & fancy self-hosted monitoring tool.","labels":["uptime"],"type":"uptimekuma","name":"UptimeKuma","services":{"$$id":{"image":"louislam/uptime-kuma:$$core_version","environment":[],"volumes":["$$id-uptimekuma:/app/data"],"ports":["3001"]}},"variables":[]},{"templateVersion":"1.0.0","defaultVersion":"5.8","documentation":"https://hub.docker.com/r/silviof/docker-languagetool","description":"A multilingual grammar, style and spell checker.","type":"languagetool","name":"LanguageTool","services":{"$$id":{"image":"silviof/docker-languagetool:$$core_version","environment":[],"volumes":["$$id-ngrams:/ngrams"],"ports":["8010"]}},"variables":[]},{"templateVersion":"1.0.0","defaultVersion":"1.26.0","documentation":"https://hub.docker.com/r/vaultwarden/server","description":"Bitwarden compatible server written in Rust.","type":"vaultwarden","name":"VaultWarden","labels":["bitwarden","password manager"],"services":{"$$id":{"image":"vaultwarden/server:$$core_version","environment":[],"volumes":["$$id-data:/data"],"ports":["80"]}},"variables":[]},{"templateVersion":"1.0.0","defaultVersion":"9.3.1","documentation":"https://hub.docker.com/r/grafana/grafana","type":"grafana","name":"Grafana","description":"Grafana allows you to query, visualize, alert on and understand your metrics.","labels":["monitoring","metrics","dashboard"],"services":{"$$id":{"image":"grafana/grafana:$$core_version","environment":[],"volumes":["$$id-config:/etc/grafana","$$id-grafana:/var/lib/grafana"],"ports":["3000"]}},"variables":[]},{"templateVersion":"1.0.0","defaultVersion":"1.1.2","documentation":"https://appwrite.io/docs","type":"appwrite","name":"Appwrite","description":"Secure Backend Server for Web, Mobile & Flutter Developers.","labels":["serverless","backend","storage","api"],"services":{"$$id":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_WORKER_PER_CORE=$$config__app_worker_per_core","_APP_LOCALE=$$config__app_locale","_APP_CONSOLE_WHITELIST_ROOT=$$config__app_console_whitelist_root","_APP_CONSOLE_WHITELIST_EMAILS=$$config__app_console_whitelist_emails","_APP_CONSOLE_WHITELIST_IPS=$$config__app_console_whitelist_ips","_APP_SYSTEM_EMAIL_NAME=$$config__app_system_email_name","_APP_SYSTEM_EMAIL_ADDRESS=$$config__app_system_email_address","_APP_SYSTEM_SECURITY_EMAIL_ADDRESS=$$config__app_system_security_email_address","_APP_SYSTEM_RESPONSE_FORMAT=$$config__app_system_response_format","_APP_OPTIONS_ABUSE=$$config__app_options_abuse","_APP_OPTIONS_FORCE_HTTPS=$$config__app_options_force_https","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_DOMAIN=$$config__app_domain","_APP_DOMAIN_TARGET=$$config__app_domain_target","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_SMTP_HOST=$$config__app_smtp_host","_APP_SMTP_PORT=$$config__app_smtp_port","_APP_SMTP_SECURE=$$config__app_smtp_secure","_APP_SMTP_USERNAME=$$config__app_smtp_username","_APP_SMTP_PASSWORD=$$secret__app_smtp_password","_APP_USAGE_STATS=$$config__app_usage_stats","_APP_INFLUXDB_HOST=$$config__app_influxdb_host","_APP_INFLUXDB_PORT=$$config__app_influxdb_port","_APP_STORAGE_LIMIT=$$config__app_storage_limit","_APP_STORAGE_PREVIEW_LIMIT=$$config__app_storage_preview_limit","_APP_STORAGE_ANTIVIRUS=$$config__app_storage_antivirus_enabled","_APP_STORAGE_ANTIVIRUS_HOST=$$config__app_storage_antivirus_host","_APP_STORAGE_ANTIVIRUS_PORT=$$config__app_storage_antivirus_port","_APP_STORAGE_DEVICE=$$config__app_storage_device","_APP_STORAGE_S3_ACCESS_KEY=$$secret__app_storage_s3_access_key","_APP_STORAGE_S3_SECRET=$$secret__app_storage_s3_secret","_APP_STORAGE_S3_REGION=$$config__app_storage_s3_region","_APP_STORAGE_S3_BUCKET=$$config__app_storage_s3_bucket","_APP_STORAGE_DO_SPACES_ACCESS_KEY=$$secret__app_storage_do_spaces_access_key","_APP_STORAGE_DO_SPACES_SECRET=$$secret__app_storage_do_spaces_secret","_APP_STORAGE_DO_SPACES_REGION=$$config__app_storage_do_spaces_region","_APP_STORAGE_DO_SPACES_BUCKET=$$config__app_storage_do_spaces_bucket","_APP_STORAGE_BACKBLAZE_ACCESS_KEY=$$secret__app_storage_backblaze_access_key","_APP_STORAGE_BACKBLAZE_SECRET=$$secret__app_storage_backblaze_secret","_APP_STORAGE_BACKBLAZE_REGION=$$config__app_storage_backblaze_region","_APP_STORAGE_BACKBLAZE_BUCKET=$$config__app_storage_backblaze_bucket","_APP_STORAGE_LINODE_ACCESS_KEY=$$secret__app_storage_linode_access_key","_APP_STORAGE_LINODE_SECRET=$$secret__app_storage_linode_secret","_APP_STORAGE_LINODE_REGION=$$config__app_storage_linode_region","_APP_STORAGE_LINODE_BUCKET=$$config__app_storage_linode_bucket","_APP_STORAGE_WASABI_ACCESS_KEY=$$secret__app_storage_wasabi_access_key","_APP_STORAGE_WASABI_SECRET=$$secret__app_storage_wasabi_secret","_APP_STORAGE_WASABI_REGION=$$config__app_storage_wasabi_region","_APP_STORAGE_WASABI_BUCKET=$$config__app_storage_wasabi_bucket","_APP_FUNCTIONS_SIZE_LIMIT=$$config__app_functions_size_limit","_APP_FUNCTIONS_TIMEOUT=$$config__app_functions_timeout","_APP_FUNCTIONS_BUILD_TIMEOUT=$$config__app_functions_build_timeout","_APP_FUNCTIONS_CONTAINERS=$$config__app_functions_containers","_APP_FUNCTIONS_CPUS=$$config__app_functions_cpus","_APP_FUNCTIONS_MEMORY=$$config__app_functions_memory_allocated","_APP_FUNCTIONS_MEMORY_SWAP=$$config__app_functions_memory_swap","_APP_FUNCTIONS_RUNTIMES=$$config__app_functions_runtimes","_APP_EXECUTOR_SECRET=$$secret__app_executor_secret","_APP_EXECUTOR_HOST=$$config__app_executor_host","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","_APP_STATSD_HOST=$$config__app_statsd_host","_APP_STATSD_PORT=$$config__app_statsd_port","_APP_MAINTENANCE_INTERVAL=$$config__app_maintenance_interval","_APP_MAINTENANCE_RETENTION_EXECUTION=$$config__app_maintenance_retention_execution","_APP_MAINTENANCE_RETENTION_CACHE=$$config__app_maintenance_retention_cache","_APP_MAINTENANCE_RETENTION_ABUSE=$$config__app_maintenance_retention_abuse","_APP_MAINTENANCE_RETENTION_AUDIT=$$config__app_maintenance_retention_audit","_APP_SMS_PROVIDER=$$config__app_sms_provider","_APP_SMS_FROM=$$config__app_sms_from","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":["$$id-uploads:/storage/uploads","$$id-cache:/storage/cache","$$id-config:/storage/config","$$id-certificates:/storage/certificates","$$id-functions:/storage/functions"],"ports":["80"],"proxy":[{"port":"80"}]},"$$id-executor":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_FUNCTIONS_TIMEOUT=$$config__app_functions_timeout","_APP_FUNCTIONS_BUILD_TIMEOUT=$$config__app_functions_build_timeout","_APP_FUNCTIONS_CONTAINERS=$$config__app_functions_containers","_APP_FUNCTIONS_RUNTIMES=$$config__app_functions_runtimes","_APP_FUNCTIONS_CPUS=$$config__app_functions_cpus","_APP_FUNCTIONS_MEMORY=$$config__app_functions_memory_allocated","_APP_FUNCTIONS_MEMORY_SWAP=$$config__app_functions_memory_swap","_APP_FUNCTIONS_INACTIVE_THRESHOLD=$$config__app_functions_inactive_threshold","_APP_EXECUTOR_SECRET=$$secret__app_executor_secret","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","_APP_STORAGE_DEVICE=$$config__app_storage_device","_APP_STORAGE_S3_ACCESS_KEY=$$secret__app_storage_s3_access_key","_APP_STORAGE_S3_SECRET=$$secret__app_storage_s3_secret","_APP_STORAGE_S3_REGION=$$config__app_storage_s3_region","_APP_STORAGE_S3_BUCKET=$$config__app_storage_s3_bucket","_APP_STORAGE_DO_SPACES_ACCESS_KEY=$$secret__app_storage_do_spaces_access_key","_APP_STORAGE_DO_SPACES_SECRET=$$secret__app_storage_do_spaces_secret","_APP_STORAGE_DO_SPACES_REGION=$$config__app_storage_do_spaces_region","_APP_STORAGE_DO_SPACES_BUCKET=$$config__app_storage_do_spaces_bucket","_APP_STORAGE_BACKBLAZE_ACCESS_KEY=$$secret__app_storage_backblaze_access_key","_APP_STORAGE_BACKBLAZE_SECRET=$$secret__app_storage_backblaze_secret","_APP_STORAGE_BACKBLAZE_REGION=$$config__app_storage_backblaze_region","_APP_STORAGE_BACKBLAZE_BUCKET=$$config__app_storage_backblaze_bucket","_APP_STORAGE_LINODE_ACCESS_KEY=$$secret__app_storage_linode_access_key","_APP_STORAGE_LINODE_SECRET=$$secret__app_storage_linode_secret","_APP_STORAGE_LINODE_REGION=$$config__app_storage_linode_region","_APP_STORAGE_LINODE_BUCKET=$$config__app_storage_linode_bucket","_APP_STORAGE_WASABI_ACCESS_KEY=$$secret__app_storage_wasabi_access_key","_APP_STORAGE_WASABI_SECRET=$$secret__app_storage_wasabi_secret","_APP_STORAGE_WASABI_REGION=$$config__app_storage_wasabi_region","_APP_STORAGE_WASABI_BUCKET=$$config__app_storage_wasabi_bucket","DOCKERHUB_PULL_USERNAME=$$config_dockerhub_pull_username","DOCKERHUB_PULL_PASSWORD=$$secret_dockerhub_pull_password","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":["$$id-functions:/storage/functions","$$id-builds:/storage/builds","/var/run/docker.sock:/var/run/docker.sock","/tmp:/tmp:rw"],"entrypoint":"executor"},"$$id-influxdb":{"image":"appwrite/influxdb:1.5.0","environment":[],"volumes":["$$id-influxdb:/var/lib/influxdb"]},"$$id-maintenance":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_DOMAIN=$$config__app_domain","_APP_DOMAIN_TARGET=$$config__app_domain_target","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_MAINTENANCE_INTERVAL=$$config__app_maintenance_interval","_APP_MAINTENANCE_RETENTION_EXECUTION=$$config__app_maintenance_retention_execution","_APP_MAINTENANCE_RETENTION_CACHE=$$config__app_maintenance_retention_cache","_APP_MAINTENANCE_RETENTION_ABUSE=$$config__app_maintenance_retention_abuse","_APP_MAINTENANCE_RETENTION_AUDIT=$$config__app_maintenance_retention_audit","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"maintenance"},"$$id-mariadb":{"image":"mariadb:10.7","command":"--innodb-flush-method fsync","environment":["MARIADB_ROOT_PASSWORD=$$secret__app_db_root_pass","MARIADB_DATABASE=$$config__app_db_schema","MARIADB_USER=$$config__app_db_user","MARIADB_PASSWORD=$$secret__app_db_pass","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":["$$id-mariadb:/var/lib/mysql"]},"$$id-realtime":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_WORKER_PER_CORE=$$config__app_worker_per_core","_APP_OPTIONS_ABUSE=$$config__app_options_abuse","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_USAGE_STATS=$$config__app_usage_stats","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"realtime","proxy":[{"port":"80","pathPrefix":"/v1/realtime"}]},"$$id-redis":{"image":"redis:7.0.4-alpine","command":"--maxmemory 512mb --maxmemory-policy allkeys-lru --maxmemory-samples 5","environment":[],"volumes":["$$id-redis:/data"]},"$$id-schedule":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"schedule"},"$$id-telegraf":{"image":"appwrite/telegraf:1.4.0","environment":["_APP_INFLUXDB_HOST=$$config__app_influxdb_host","_APP_INFLUXDB_PORT=$$config__app_influxdb_port","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":["$$id-influxdb:/var/lib/influxdb"]},"$$id-usage-database":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_INFLUXDB_HOST=$$config__app_influxdb_host","_APP_INFLUXDB_PORT=$$config__app_influxdb_port","_APP_USAGE_TIMESERIES_INTERVAL=$$config__app_usage_timeseries_interval","_APP_USAGE_DATABASE_INTERVAL=$$config__app_usage_database_interval","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"usage --type database"},"$$id-usage":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_INFLUXDB_HOST=$$config__app_influxdb_host","_APP_INFLUXDB_PORT=$$config__app_influxdb_port","_APP_USAGE_TIMESERIES_INTERVAL=$$config__app_usage_timeseries_interval","_APP_USAGE_DATABASE_INTERVAL=$$config__app_usage_database_interval","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"usage --type timeseries"},"$$id-worker-audits":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"worker-audits"},"$$id-worker-builds":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_EXECUTOR_SECRET=$$secret__app_executor_secret","_APP_EXECUTOR_HOST=$$config__app_executor_host","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"worker-builds"},"$$id-worker-certificates":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_DOMAIN=$$config__app_domain","_APP_DOMAIN_TARGET=$$config__app_domain_target","_APP_SYSTEM_SECURITY_EMAIL_ADDRESS=$$config__app_system_security_email_address","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":["$$id-config:/storage/config","$$id-certificates:/storage/certificates"],"entrypoint":"worker-certificates"},"$$id-worker-databases":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"worker-databases"},"$$id-worker-deletes":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_STORAGE_DEVICE=$$config__app_storage_device","_APP_STORAGE_S3_ACCESS_KEY=$$secret__app_storage_s3_access_key","_APP_STORAGE_S3_SECRET=$$secret__app_storage_s3_secret","_APP_STORAGE_S3_REGION=$$config__app_storage_s3_region","_APP_STORAGE_S3_BUCKET=$$config__app_storage_s3_bucket","_APP_STORAGE_DO_SPACES_ACCESS_KEY=$$secret__app_storage_do_spaces_access_key","_APP_STORAGE_DO_SPACES_SECRET=$$secret__app_storage_do_spaces_secret","_APP_STORAGE_DO_SPACES_REGION=$$config__app_storage_do_spaces_region","_APP_STORAGE_DO_SPACES_BUCKET=$$config__app_storage_do_spaces_bucket","_APP_STORAGE_BACKBLAZE_ACCESS_KEY=$$secret__app_storage_backblaze_access_key","_APP_STORAGE_BACKBLAZE_SECRET=$$secret__app_storage_backblaze_secret","_APP_STORAGE_BACKBLAZE_REGION=$$config__app_storage_backblaze_region","_APP_STORAGE_BACKBLAZE_BUCKET=$$config__app_storage_backblaze_bucket","_APP_STORAGE_LINODE_ACCESS_KEY=$$secret__app_storage_linode_access_key","_APP_STORAGE_LINODE_SECRET=$$secret__app_storage_linode_secret","_APP_STORAGE_LINODE_REGION=$$config__app_storage_linode_region","_APP_STORAGE_LINODE_BUCKET=$$config__app_storage_linode_bucket","_APP_STORAGE_WASABI_ACCESS_KEY=$$secret__app_storage_wasabi_access_key","_APP_STORAGE_WASABI_SECRET=$$secret__app_storage_wasabi_secret","_APP_STORAGE_WASABI_REGION=$$config__app_storage_wasabi_region","_APP_STORAGE_WASABI_BUCKET=$$config__app_storage_wasabi_bucket","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","_APP_EXECUTOR_SECRET=$$secret__app_executor_secret","_APP_EXECUTOR_HOST=$$config__app_executor_host","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":["$$id-uploads:/storage/uploads","$$id-cache:/storage/cache","$$id-functions:/storage/functions","$$id-builds:/storage/builds","$$id-certificates:/storage/certificates"],"entrypoint":"worker-deletes"},"$$id-worker-functions":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_DB_HOST=$$config__app_db_host","_APP_DB_PORT=$$config__app_db_port","_APP_DB_SCHEMA=$$config__app_db_schema","_APP_DB_USER=$$config__app_db_user","_APP_DB_PASS=$$secret__app_db_pass","_APP_FUNCTIONS_TIMEOUT=$$config__app_functions_timeout","_APP_EXECUTOR_SECRET=$$secret__app_executor_secret","_APP_EXECUTOR_HOST=$$config__app_executor_host","_APP_USAGE_STATS=$$config__app_usage_stats","DOCKERHUB_PULL_USERNAME=$$config_dockerhub_pull_username","DOCKERHUB_PULL_PASSWORD=$$secret_dockerhub_pull_password","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"worker-functions"},"$$id-worker-mails":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_SYSTEM_EMAIL_NAME=$$config__app_system_email_name","_APP_SYSTEM_EMAIL_ADDRESS=$$config__app_system_email_address","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_SMTP_HOST=$$config__app_smtp_host","_APP_SMTP_PORT=$$config__app_smtp_port","_APP_SMTP_SECURE=$$config__app_smtp_secure","_APP_SMTP_USERNAME=$$config__app_smtp_username","_APP_SMTP_PASSWORD=$$secret__app_smtp_password","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"worker-mails"},"$$id-worker-messaging":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_SMS_PROVIDER=$$config__app_sms_provider","_APP_SMS_FROM=$$config__app_sms_from","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"worker-messaging"},"$$id-worker-webhooks":{"image":"appwrite/appwrite:$$core_version","environment":["_APP_ENV=$$config__app_env","_APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1","_APP_SYSTEM_SECURITY_EMAIL_ADDRESS=$$config__app_system_security_email_address","_APP_REDIS_HOST=$$config__app_redis_host","_APP_REDIS_PORT=$$config__app_redis_port","_APP_REDIS_USER=$$config__app_redis_user","_APP_REDIS_PASS=$$secret__app_redis_pass","_APP_LOGGING_PROVIDER=$$config__app_logging_provider","_APP_LOGGING_CONFIG=$$config__app_logging_config","OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network"],"volumes":[],"entrypoint":"worker-webhooks"}},"variables":[{"id":"$$config__app_influxdb_host","name":"_APP_INFLUXDB_HOST","label":"InfluxDB | _APP_INFLUXDB_HOST","defaultValue":"$$id-influxdb","description":""},{"id":"$$config__app_influxdb_port","name":"_APP_INFLUXDB_PORT","label":"InfluxDB | _APP_INFLUXDB_PORT","defaultValue":"8086","description":"InfluxDB server TCP port."},{"id":"$$config__app_env","name":"_APP_ENV","label":"General | _APP_ENV","defaultValue":"production","description":"Set your server running environment."},{"id":"$$config__app_worker_per_core","name":"_APP_WORKER_PER_CORE","label":"General | _APP_WORKER_PER_CORE","defaultValue":"6","description":"Internal Worker per core for the API, Realtime and Executor containers. Can be configured to optimize performance."},{"id":"$$config__app_locale","name":"_APP_LOCALE","label":"General | _APP_LOCALE","defaultValue":"en","description":"Set your Appwrite's locale. By default, the locale is set to 'en'."},{"id":"$$config__app_console_whitelist_root","name":"_APP_CONSOLE_WHITELIST_ROOT","label":"General | _APP_CONSOLE_WHITELIST_ROOT","defaultValue":"enabled","description":"This option allows you to disable the creation of new users on the Appwrite console. When enabled only 1 user will be able to use the registration form. New users can be added by inviting them to your project. By default this option is enabled."},{"id":"$$config__app_console_whitelist_emails","name":"_APP_CONSOLE_WHITELIST_EMAILS","label":"General | _APP_CONSOLE_WHITELIST_EMAILS","defaultValue":"","description":"This option allows you to limit creation of new users on the Appwrite console. This option is very useful for small teams or sole developers. To enable it, pass a list of allowed email addresses separated by a comma."},{"id":"$$config__app_console_whitelist_ips","name":"_APP_CONSOLE_WHITELIST_IPS","label":"General | _APP_CONSOLE_WHITELIST_IPS","defaultValue":"","description":"This last option allows you to limit creation of users in Appwrite console for users sharing the same set of IP addresses. This option is very useful for team working with a VPN service or a company IP.\\n\\nTo enable/activate this option, pass a list of allowed IP addresses separated by a comma."},{"id":"$$config__app_system_email_name","name":"_APP_SYSTEM_EMAIL_NAME","label":"General | _APP_SYSTEM_EMAIL_NAME","defaultValue":"Appwrite","description":"This is the sender name value that will appear on email messages sent to developers from the Appwrite console. You can use url encoded strings for spaces and special chars."},{"id":"$$config__app_system_email_address","name":"_APP_SYSTEM_EMAIL_ADDRESS","label":"General | _APP_SYSTEM_EMAIL_ADDRESS","defaultValue":"team@appwrite.io","description":"This is the sender email address that will appear on email messages sent to developers from the Appwrite console. You should choose an email address that is allowed to be used from your SMTP server to avoid the server email ending in the users' SPAM folders."},{"id":"$$config__app_system_security_email_address","name":"_APP_SYSTEM_SECURITY_EMAIL_ADDRESS","label":"General | _APP_SYSTEM_SECURITY_EMAIL_ADDRESS","defaultValue":"certs@appwrite.io","description":"This is the email address used to issue SSL certificates for custom domains or the user agent in your webhooks payload."},{"id":"$$config__app_system_response_format","name":"_APP_SYSTEM_RESPONSE_FORMAT","label":"General | _APP_SYSTEM_RESPONSE_FORMAT","defaultValue":"","description":"Use this environment variable to set the default Appwrite HTTP response format to support an older version of Appwrite. This option is useful to overcome breaking changes between versions. You can also use the X-Appwrite-Response-Format HTTP request header to overwrite the response for a specific request. This variable accepts any valid Appwrite version. To use the current version format, leave the value of the variable empty."},{"id":"$$config__app_options_abuse","name":"_APP_OPTIONS_ABUSE","label":"General | _APP_OPTIONS_ABUSE","defaultValue":"enabled","description":"Allows you to disable abuse checks and API rate limiting. By default, set to 'enabled'. To cancel the abuse checking, set to 'disabled'. It is not recommended to disable this check-in a production environment."},{"id":"$$config__app_options_force_https","name":"_APP_OPTIONS_FORCE_HTTPS","label":"General | _APP_OPTIONS_FORCE_HTTPS","defaultValue":"disabled","description":"Allows you to force HTTPS connection to your API. This feature redirects any HTTP call to HTTPS and adds the 'Strict-Transport-Security' header to all HTTP responses."},{"id":"$$secret__app_openssl_key_v1","name":"_APP_OPENSSL_KEY_V1","label":"General | _APP_OPENSSL_KEY_V1","defaultValue":"$$generate_hex(256)","description":"This is your server private secret key that is used to encrypt all sensitive data on your server. Appwrite server encrypts all secret data on your server like webhooks, HTTP passwords, user sessions, and storage files. Keep it a secret and have a backup for it."},{"id":"$$config__app_domain","name":"_APP_DOMAIN","label":"General | _APP_DOMAIN","defaultValue":"$$generate_domain","description":"Your Appwrite domain address. When setting a public suffix domain, Appwrite will attempt to issue a valid SSL certificate automatically. When used with a dev domain, Appwrite will assign a self-signed SSL certificate. The default value is 'localhost'."},{"id":"$$config__app_domain_target","name":"_APP_DOMAIN_TARGET","label":"General | _APP_DOMAIN_TARGET","defaultValue":"$$generate_fqdn","description":"A DNS A record hostname to serve as a CNAME target for your Appwrite custom domains. You can use the same value as used for the Appwrite '_APP_DOMAIN' variable. The default value is 'localhost'."},{"id":"$$config__app_redis_host","name":"_APP_REDIS_HOST","label":"Redis | _APP_REDIS_HOST","defaultValue":"$$id-redis","description":""},{"id":"$$config__app_redis_port","name":"_APP_REDIS_PORT","label":"Redis | _APP_REDIS_PORT","defaultValue":"6379","description":"Redis server TCP port."},{"id":"$$config__app_redis_user","name":"_APP_REDIS_USER","label":"Redis | _APP_REDIS_USER","defaultValue":"","description":"Redis server user. This is an optional variable. Default value is an empty string."},{"id":"$$secret__app_redis_pass","name":"_APP_REDIS_PASS","label":"Redis | _APP_REDIS_PASS","defaultValue":"","description":"Redis server password. This is an optional variable. Default value is an empty string."},{"id":"$$config__app_db_host","name":"_APP_DB_HOST","label":"MariaDB | _APP_DB_HOST","defaultValue":"$$id-mariadb","description":""},{"id":"$$config__app_db_port","name":"_APP_DB_PORT","label":"MariaDB | _APP_DB_PORT","defaultValue":"3306","description":"MariaDB server TCP port."},{"id":"$$config__app_db_schema","name":"_APP_DB_SCHEMA","label":"MariaDB | _APP_DB_SCHEMA","defaultValue":"appwrite","description":"MariaDB server database schema."},{"id":"$$config__app_db_user","name":"_APP_DB_USER","label":"MariaDB | _APP_DB_USER","defaultValue":"user","description":"MariaDB server user name."},{"id":"$$secret__app_db_root_pass","name":"MARIADB_ROOT_PASSWORD","label":"MariaDB | MARIADB_ROOT_PASSWORD","defaultValue":"$$generate_hex(16)","description":"MariaDB server root user password."},{"id":"$$secret__app_db_pass","name":"_APP_DB_PASS","label":"MariaDB | _APP_DB_PASS","defaultValue":"$$generate_hex(16)","description":"MariaDB server user password."},{"id":"$$config__app_smtp_host","name":"_APP_SMTP_HOST","label":"SMTP | _APP_SMTP_HOST","defaultValue":"","description":"SMTP server host name address. Use an empty string to disable all mail sending from the server. The default value for this variable is an empty string."},{"id":"$$config__app_smtp_port","name":"_APP_SMTP_PORT","label":"SMTP | _APP_SMTP_PORT","defaultValue":"","description":"SMTP server TCP port. Empty by default."},{"id":"$$config__app_smtp_secure","name":"_APP_SMTP_SECURE","label":"SMTP | _APP_SMTP_SECURE","defaultValue":"","description":"SMTP secure connection protocol. Empty by default, change to 'tls' if running on a secure connection."},{"id":"$$config__app_smtp_username","name":"_APP_SMTP_USERNAME","label":"SMTP | _APP_SMTP_USERNAME","defaultValue":"","description":"SMTP server user name. Empty by default."},{"id":"$$secret__app_smtp_password","name":"_APP_SMTP_PASSWORD","label":"SMTP | _APP_SMTP_PASSWORD","defaultValue":"","description":"SMTP server user password. Empty by default."},{"id":"$$config__app_usage_stats","name":"_APP_USAGE_STATS","label":"General | _APP_USAGE_STATS","defaultValue":"enabled","description":"This variable allows you to disable the collection and displaying of usage stats. This value is set to 'enabled' by default, to disable the usage stats set the value to 'disabled'. When disabled, it's recommended to turn off the Worker Usage, Influxdb and Telegraf containers for better resource usage."},{"id":"$$config__app_storage_limit","name":"_APP_STORAGE_LIMIT","label":"Storage | _APP_STORAGE_LIMIT","defaultValue":"30000000","description":"Maximum file size allowed for file upload. The default value is 30MB. You should pass your size limit value in bytes."},{"id":"$$config__app_storage_preview_limit","name":"_APP_STORAGE_PREVIEW_LIMIT","label":"Storage | _APP_STORAGE_PREVIEW_LIMIT","defaultValue":"20000000","description":"Maximum file size allowed for file image preview. The default value is 20MB. You should pass your size limit value in bytes."},{"id":"$$config__app_storage_antivirus_enabled","name":"_APP_STORAGE_ANTIVIRUS","label":"Storage | _APP_STORAGE_ANTIVIRUS","defaultValue":"disabled","description":"This variable allows you to disable the internal anti-virus scans. This value is set to 'disabled' by default, to enable the scans set the value to 'enabled'. Before enabling, you must add the ClamAV service and depend on it on main Appwrite service."},{"id":"$$config__app_storage_antivirus_host","name":"_APP_STORAGE_ANTIVIRUS_HOST","label":"Storage | _APP_STORAGE_ANTIVIRUS_HOST","defaultValue":"clamav","description":"ClamAV server host name address."},{"id":"$$config__app_storage_antivirus_port","name":"_APP_STORAGE_ANTIVIRUS_PORT","label":"Storage | _APP_STORAGE_ANTIVIRUS_PORT","defaultValue":"3310","description":"ClamAV server TCP port."},{"id":"$$config__app_storage_device","name":"_APP_STORAGE_DEVICE","label":"Storage | _APP_STORAGE_DEVICE","defaultValue":"Local","description":"Select default storage device. The default value is 'Local'. List of supported adapters are 'Local', 'S3', 'DOSpaces', 'Backblaze', 'Linode' and 'Wasabi'."},{"id":"$$secret__app_storage_s3_access_key","name":"_APP_STORAGE_S3_ACCESS_KEY","label":"Storage | _APP_STORAGE_S3_ACCESS_KEY","defaultValue":"","description":"AWS S3 storage access key. Required when the storage adapter is set to S3. You can get your access key from your AWS console."},{"id":"$$secret__app_storage_s3_secret","name":"_APP_STORAGE_S3_SECRET","label":"Storage | _APP_STORAGE_S3_SECRET","defaultValue":"","description":"AWS S3 storage secret key. Required when the storage adapter is set to S3. You can get your secret key from your AWS console."},{"id":"$$config__app_storage_s3_region","name":"_APP_STORAGE_S3_REGION","label":"Storage | _APP_STORAGE_S3_REGION","defaultValue":"us-east-1","description":"AWS S3 storage region. Required when storage adapter is set to S3. You can find your region info for your bucket from AWS console."},{"id":"$$config__app_storage_s3_bucket","name":"_APP_STORAGE_S3_BUCKET","label":"Storage | _APP_STORAGE_S3_BUCKET","defaultValue":"","description":"AWS S3 storage bucket. Required when storage adapter is set to S3. You can create buckets in your AWS console."},{"id":"$$secret__app_storage_do_spaces_access_key","name":"_APP_STORAGE_DO_SPACES_ACCESS_KEY","label":"Storage | _APP_STORAGE_DO_SPACES_ACCESS_KEY","defaultValue":"","description":"DigitalOcean spaces access key. Required when the storage adapter is set to DOSpaces. You can get your access key from your DigitalOcean console."},{"id":"$$secret__app_storage_do_spaces_secret","name":"_APP_STORAGE_DO_SPACES_SECRET","label":"Storage | _APP_STORAGE_DO_SPACES_SECRET","defaultValue":"","description":"DigitalOcean spaces secret key. Required when the storage adapter is set to DOSpaces. You can get your secret key from your DigitalOcean console."},{"id":"$$config__app_storage_do_spaces_region","name":"_APP_STORAGE_DO_SPACES_REGION","label":"Storage | _APP_STORAGE_DO_SPACES_REGION","defaultValue":"us-east-1","description":"DigitalOcean spaces region. Required when storage adapter is set to DOSpaces. You can find your region info for your space from DigitalOcean console."},{"id":"$$config__app_storage_do_spaces_bucket","name":"_APP_STORAGE_DO_SPACES_BUCKET","label":"Storage | _APP_STORAGE_DO_SPACES_BUCKET","defaultValue":"","description":"DigitalOcean spaces bucket. Required when storage adapter is set to DOSpaces. You can create spaces in your DigitalOcean console."},{"id":"$$secret__app_storage_backblaze_access_key","name":"_APP_STORAGE_BACKBLAZE_ACCESS_KEY","label":"Storage | _APP_STORAGE_BACKBLAZE_ACCESS_KEY","defaultValue":"","description":"Backblaze access key. Required when the storage adapter is set to Backblaze. Your Backblaze keyID will be your access key. You can get your keyID from your Backblaze console."},{"id":"$$secret__app_storage_backblaze_secret","name":"_APP_STORAGE_BACKBLAZE_SECRET","label":"Storage | _APP_STORAGE_BACKBLAZE_SECRET","defaultValue":"","description":"Backblaze secret key. Required when the storage adapter is set to Backblaze. Your Backblaze applicationKey will be your secret key. You can get your applicationKey from your Backblaze console."},{"id":"$$config__app_storage_backblaze_region","name":"_APP_STORAGE_BACKBLAZE_REGION","label":"Storage | _APP_STORAGE_BACKBLAZE_REGION","defaultValue":"us-west-004","description":"Backblaze region. Required when storage adapter is set to Backblaze. You can find your region info from your Backblaze console."},{"id":"$$config__app_storage_backblaze_bucket","name":"_APP_STORAGE_BACKBLAZE_BUCKET","label":"Storage | _APP_STORAGE_BACKBLAZE_BUCKET","defaultValue":"","description":"Backblaze bucket. Required when storage adapter is set to Backblaze. You can create your bucket from your Backblaze console."},{"id":"$$secret__app_storage_linode_access_key","name":"_APP_STORAGE_LINODE_ACCESS_KEY","label":"Storage | _APP_STORAGE_LINODE_ACCESS_KEY","defaultValue":"","description":"Linode object storage access key. Required when the storage adapter is set to Linode. You can get your access key from your Linode console."},{"id":"$$secret__app_storage_linode_secret","name":"_APP_STORAGE_LINODE_SECRET","label":"Storage | _APP_STORAGE_LINODE_SECRET","defaultValue":"","description":"Linode object storage secret key. Required when the storage adapter is set to Linode. You can get your secret key from your Linode console."},{"id":"$$config__app_storage_linode_region","name":"_APP_STORAGE_LINODE_REGION","label":"Storage | _APP_STORAGE_LINODE_REGION","defaultValue":"eu-central-1","description":"Linode object storage region. Required when storage adapter is set to Linode. You can find your region info from your Linode console."},{"id":"$$config__app_storage_linode_bucket","name":"_APP_STORAGE_LINODE_BUCKET","label":"Storage | _APP_STORAGE_LINODE_BUCKET","defaultValue":"","description":"Linode object storage bucket. Required when storage adapter is set to Linode. You can create buckets in your Linode console."},{"id":"$$secret__app_storage_wasabi_access_key","name":"_APP_STORAGE_WASABI_ACCESS_KEY","label":"Storage | _APP_STORAGE_WASABI_ACCESS_KEY","defaultValue":"","description":"Wasabi access key. Required when the storage adapter is set to Wasabi. You can get your access key from your Wasabi console."},{"id":"$$secret__app_storage_wasabi_secret","name":"_APP_STORAGE_WASABI_SECRET","label":"Storage | _APP_STORAGE_WASABI_SECRET","defaultValue":"","description":"Wasabi secret key. Required when the storage adapter is set to Wasabi. You can get your secret key from your Wasabi console."},{"id":"$$config__app_storage_wasabi_region","name":"_APP_STORAGE_WASABI_REGION","label":"Storage | _APP_STORAGE_WASABI_REGION","defaultValue":"eu-central-1","description":"Wasabi region. Required when storage adapter is set to Wasabi. You can find your region info from your Wasabi console."},{"id":"$$config__app_storage_wasabi_bucket","name":"_APP_STORAGE_WASABI_BUCKET","label":"Storage | _APP_STORAGE_WASABI_BUCKET","defaultValue":"","description":"Wasabi bucket. Required when storage adapter is set to Wasabi. You can create buckets in your Wasabi console."},{"id":"$$config__app_functions_size_limit","name":"_APP_FUNCTIONS_SIZE_LIMIT","label":"Functions | _APP_FUNCTIONS_SIZE_LIMIT","defaultValue":"30000000","description":"The maximum size deployment in bytes. The default value is 30MB."},{"id":"$$config__app_functions_timeout","name":"_APP_FUNCTIONS_TIMEOUT","label":"Functions | _APP_FUNCTIONS_TIMEOUT","defaultValue":"900","description":"The maximum number of seconds allowed as a timeout value when creating a new function. The default value is 900 seconds."},{"id":"$$config__app_functions_build_timeout","name":"_APP_FUNCTIONS_BUILD_TIMEOUT","label":"Functions | _APP_FUNCTIONS_BUILD_TIMEOUT","defaultValue":"900","description":"The maximum number of seconds allowed as a timeout value when building a new function. The default value is 900 seconds."},{"id":"$$config__app_functions_containers","name":"_APP_FUNCTIONS_CONTAINERS","label":"Functions | _APP_FUNCTIONS_CONTAINERS","defaultValue":"10","description":"The maximum number of containers Appwrite is allowed to keep alive in the background for function environments. Running containers allow faster execution time as there is no need to recreate each container every time a function gets executed. The default value is 10."},{"id":"$$config__app_functions_cpus","name":"_APP_FUNCTIONS_CPUS","label":"Functions | _APP_FUNCTIONS_CPUS","defaultValue":"","description":"The maximum number of CPU core a single cloud function is allowed to use. Please note that setting a value higher than available cores will result in a function error, which might result in an error. The default value is empty. When it's empty, CPU limit will be disabled."},{"id":"$$config__app_functions_memory_allocated","name":"_APP_FUNCTIONS_MEMORY","label":"Functions | _APP_FUNCTIONS_MEMORY","defaultValue":"","description":"The maximum amount of memory a single cloud function is allowed to use in megabytes. The default value is empty. When it's empty, memory limit will be disabled."},{"id":"$$config__app_functions_memory_swap","name":"_APP_FUNCTIONS_MEMORY_SWAP","label":"Functions | _APP_FUNCTIONS_MEMORY_SWAP","defaultValue":"","description":"The maximum amount of swap memory a single cloud function is allowed to use in megabytes. The default value is empty. When it's empty, swap memory limit will be disabled."},{"id":"$$config__app_functions_runtimes","name":"_APP_FUNCTIONS_RUNTIMES","label":"Functions | _APP_FUNCTIONS_RUNTIMES","defaultValue":"node-18.0","description":"This option allows you to limit the available environments for cloud functions. This option is very useful for low-cost servers to safe disk space.\nTo enable/activate this option, pass a list of allowed environments separated by a comma.\nCurrently, supported environments are: node-14.5, node-16.0, node-18.0, php-8.0, php-8.1, ruby-3.0, ruby-3.1, python-3.8, python-3.9, python-3.10, deno-1.21, deno-1.24, dart-2.15, dart-2.16, dart-2.17, dotnet-3.1, dotnet-6.0, java-8.0, java-11.0, java-17.0, java-18.0, swift-5.5, kotlin-1.6, cpp-17.0"},{"id":"$$secret__app_executor_secret","name":"_APP_EXECUTOR_SECRET","label":"Functions | _APP_EXECUTOR_SECRET","defaultValue":"$$generate_hex(16)","description":"The secret key used by Appwrite to communicate with the function executor."},{"id":"$$config__app_executor_host","name":"_APP_EXECUTOR_HOST","label":"","defaultValue":"http://$$id-executor/v1","description":""},{"id":"$$config__app_logging_provider","name":"_APP_LOGGING_PROVIDER","label":"General | _APP_LOGGING_PROVIDER","defaultValue":"","description":"This variable allows you to enable logging errors to 3rd party providers. This value is empty by default, to enable the logger set the value to one of 'sentry', 'raygun', 'appsignal', 'logowl'"},{"id":"$$config__app_logging_config","name":"_APP_LOGGING_CONFIG","label":"General | _APP_LOGGING_CONFIG","defaultValue":"","description":"This variable configures authentication to 3rd party error logging providers. If using Sentry, this should be 'SENTRY_API_KEY;SENTRY_APP_ID'. If using Raygun, this should be Raygun API key. If using AppSignal, this should be AppSignal API key. If using LogOwl, this should be LogOwl Service Ticket."},{"id":"$$config__app_statsd_host","name":"_APP_STATSD_HOST","label":"","defaultValue":"$$id-telegraf","description":""},{"id":"$$config__app_statsd_port","name":"_APP_STATSD_PORT","label":"StatsD | _APP_STATSD_PORT","defaultValue":"8125","description":"StatsD server TCP port."},{"id":"$$config__app_maintenance_interval","name":"_APP_MAINTENANCE_INTERVAL","label":"Functions | _APP_MAINTENANCE_INTERVAL","defaultValue":"86400","description":"Interval value containing the number of seconds that the Appwrite maintenance process should wait before executing system cleanups and optimizations. The default value is 86400 seconds (1 day)."},{"id":"$$config__app_maintenance_retention_execution","name":"_APP_MAINTENANCE_RETENTION_EXECUTION","label":"Functions | _APP_MAINTENANCE_RETENTION_EXECUTION","defaultValue":"1209600","description":"The maximum duration (in seconds) upto which to retain execution logs. The default value is 1209600 seconds (14 days)."},{"id":"$$config__app_maintenance_retention_cache","name":"_APP_MAINTENANCE_RETENTION_CACHE","label":"Functions | _APP_MAINTENANCE_RETENTION_CACHE","defaultValue":"2592000","description":"The maximum duration (in seconds) upto which to retain cached files. The default value is 2592000 seconds (30 days)."},{"id":"$$config__app_maintenance_retention_abuse","name":"_APP_MAINTENANCE_RETENTION_ABUSE","label":"Functions | _APP_MAINTENANCE_RETENTION_ABUSE","defaultValue":"86400","description":"The maximum duration (in seconds) upto which to retain abuse logs. The default value is 86400 seconds (1 day)."},{"id":"$$config__app_maintenance_retention_audit","name":"_APP_MAINTENANCE_RETENTION_AUDIT","label":"Functions | _APP_MAINTENANCE_RETENTION_AUDIT","defaultValue":"1209600","description":"The maximum duration (in seconds) upto which to retain audit logs. The default value is 1209600 seconds (14 days)."},{"id":"$$config__app_sms_provider","name":"_APP_SMS_PROVIDER","label":"Phone | _APP_SMS_PROVIDER","defaultValue":"","description":"Provider used for delivering SMS for Phone authentication. Use the following format: 'sms://[USER]:[SECRET]@[PROVIDER]'. Available providers are twilio, text-magic, telesign, msg91, and vonage."},{"id":"$$config__app_sms_from","name":"_APP_SMS_FROM","label":"Phone | _APP_SMS_FROM","defaultValue":"","description":"Phone number used for sending out messages. Must start with a leading '+' and maximum of 15 digits without spaces (+123456789)."},{"id":"$$config__app_functions_inactive_threshold","name":"_APP_FUNCTIONS_INACTIVE_THRESHOLD","label":"Functions | _APP_FUNCTIONS_INACTIVE_THRESHOLD","defaultValue":"60","description":"The minimum time a function can be inactive before it's container is shutdown and put to sleep. The default value is 60 seconds"},{"id":"$$config_open_runtimes_network","name":"OPEN_RUNTIMES_NETWORK","label":"","defaultValue":"$$generate_network","description":""},{"id":"$$config_dockerhub_pull_username","name":"DOCKERHUB_PULL_USERNAME","label":"Functions | DOCKERHUB_PULL_USERNAME","defaultValue":"","description":"The username for hub.docker.com. This variable is used to pull images from hub.docker.com."},{"id":"$$secret_dockerhub_pull_password","name":"DOCKERHUB_PULL_PASSWORD","label":"Functions | DOCKERHUB_PULL_PASSWORD","defaultValue":"","description":"The password for hub.docker.com. This variable is used to pull images from hub.docker.com."},{"id":"$$config__app_usage_timeseries_interval","name":"_APP_USAGE_TIMESERIES_INTERVAL","label":"General | _APP_USAGE_TIMESERIES_INTERVAL","defaultValue":"30","description":"Interval value containing the number of seconds that the Appwrite usage process should wait before aggregating stats and syncing it to mariadb from InfluxDB. The default value is 30 seconds."},{"id":"$$config__app_usage_database_interval","name":"_APP_USAGE_DATABASE_INTERVAL","label":"General | _APP_USAGE_DATABASE_INTERVAL","defaultValue":"900","description":"Interval value containing the number of seconds that the Appwrite usage process should wait before aggregating stats from data in Appwrite Database. The default value is 15 minutes."}]},{"templateVersion":"1.0.0","defaultVersion":"latest","documentation":"https://docs.weblate.org/en/latest/admin/install/docker.html","description":"A copylefted libre software web-based continuous localization system.","type":"weblate","name":"Weblate","labels":["translate","localization"],"services":{"$$id":{"name":"Weblate","depends_on":["$$id-postgresql","$$id-redis"],"image":"weblate/weblate:$$core_version","volumes":["$$id-data:/app/data"],"environment":["WEBLATE_SITE_DOMAIN=$$config_weblate_site_domain","WEBLATE_ADMIN_PASSWORD=$$secret_weblate_admin_password","POSTGRES_PASSWORD=$$secret_postgres_password","POSTGRES_USER=$$config_postgres_user","POSTGRES_DATABASE=$$config_postgres_db","POSTGRES_HOST=$$id-postgresql","POSTGRES_PORT=5432","REDIS_HOST=$$id-redis"],"ports":["8080"]},"$$id-postgresql":{"name":"PostgreSQL","depends_on":[],"image":"postgres:14-alpine","volumes":["$$id-postgresql-data:/var/lib/postgresql/data"],"environment":["POSTGRES_USER=$$config_postgres_user","POSTGRES_PASSWORD=$$secret_postgres_password","POSTGRES_DB=$$config_postgres_db"],"ports":[]},"$$id-redis":{"name":"Redis","depends_on":[],"image":"redis:7-alpine","volumes":["$$id-redis-data:/data"],"environment":[],"ports":[]}},"variables":[{"id":"$$config_weblate_site_domain","name":"WEBLATE_SITE_DOMAIN","label":"Weblate Domain","defaultValue":"$$generate_domain","description":""},{"id":"$$secret_weblate_admin_password","name":"WEBLATE_ADMIN_PASSWORD","label":"Weblate Admin Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true},{"id":"$$config_postgres_user","main":"$$id-postgresql","name":"POSTGRES_USER","label":"PostgreSQL User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_postgres_password","main":"$$id-postgresql","name":"POSTGRES_PASSWORD","label":"PostgreSQL Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true},{"id":"$$config_postgres_db","main":"$$id-postgresql","name":"POSTGRES_DB","label":"PostgreSQL Database","defaultValue":"weblate","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"2022.12.12-966e9c3c","documentation":"https://docs.searxng.org/","type":"searxng","name":"SearXNG","description":"Free internet metasearch engine which aggregates results from more than 70 search services.","services":{"$$id":{"name":"SearXNG","depends_on":["$$id-redis"],"image":"searxng/searxng:$$core_version","volumes":["$$id-searxng:/etc/searxng"],"environment":["SEARXNG_BASE_URL=$$config_searxng_base_url"],"ports":["8080"],"cap_drop":["ALL"],"cap_add":["CHOWN","SETGID","SETUID","DAC_OVERRIDE"],"files":[{"location":"/etc/searxng/settings.yml","content":"\n # see https://docs.searxng.org/admin/engines/settings.html#use-default-settings\n use_default_settings: true\n server:\n secret_key: $$secret_secret_key\n limiter: true\n image_proxy: true\n ui:\n static_use_hash: true\n redis:\n url: redis://:$$secret_redis_password@$$id-redis:6379/0"}]},"$$id-redis":{"name":"Redis","command":"redis-server --requirepass $$secret_redis_password --save \"\" --appendonly \"no\"","depends_on":[],"image":"redis:7-alpine","volumes":["$$id-redis-data:/data"],"environment":["REDIS_PASSWORD=$$secret_redis_password"],"ports":[],"cap_drop":["ALL"],"cap_add":["SETGID","SETUID","DAC_OVERRIDE"]}},"variables":[{"id":"$$config_searxng_base_url","name":"SEARXNG_BASE_URL","label":"SearXNG Base URL","defaultValue":"$$generate_fqdn","description":""},{"id":"$$secret_secret_key","name":"SECRET_KEY","label":"Secret Key","defaultValue":"$$generate_hex(64)","description":""},{"id":"$$secret_redis_password","name":"REDIS_PASSWORD","label":"Redis Password","defaultValue":"$$generate_password","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"v3.0.0","documentation":"https://glitchtip.com/documentation","type":"glitchtip","name":"GlitchTip","description":"Simple, open source error tracking.","labels":["sentry","bugsnag"],"services":{"$$id":{"name":"GlitchTip","depends_on":["$$id-postgresql","$$id-redis"],"image":"glitchtip/glitchtip:$$core_version","volumes":[],"environment":["PORT=$$config_port","GLITCHTIP_DOMAIN=$$config_glitchtip_domain","SECRET_KEY=$$secret_secret_key","DATABASE_URL=$$secret_database_url","REDIS_URL=$$secret_redis_url","DEFAULT_FROM_EMAIL=$$config_default_from_email","EMAIL_URL=$$secret_email_url","EMAIL_HOST=$$config_email_host","EMAIL_PORT=$$config_email_port","EMAIL_HOST_USER=$$config_email_host_user","EMAIL_HOST_PASSWORD=$$secret_email_host_password","EMAIL_USE_TLS=$$config_email_use_tls","EMAIL_USE_SSL=$$config_email_use_ssl","EMAIL_BACKEND=$$config_email_backend","MAILGUN_API_KEY=$$secret_mailgun_api_key","SENDGRID_API_KEY=$$secret_sendgrid_api_key","ENABLE_OPEN_USER_REGISTRATION=$$config_enable_open_user_registration","DJANGO_SUPERUSER_EMAIL=$$config_django_superuser_email","DJANGO_SUPERUSER_PASSWORD=$$secret_django_superuser_password","DJANGO_SUPERUSER_USERNAME=$$config_django_superuser_username","CELERY_WORKER_CONCURRENCY=$$config_celery_worker_concurrency"],"ports":["8000"]},"$$id-worker":{"name":"Celery Worker","command":"./bin/run-celery-with-beat.sh","depends_on":["$$id-postgresql","$$id-redis"],"image":"glitchtip/glitchtip:$$core_version","environment":["GLITCHTIP_DOMAIN=$$config_glitchtip_domain","SECRET_KEY=$$secret_secret_key","DATABASE_URL=$$secret_database_url","REDIS_URL=$$secret_redis_url","DEFAULT_FROM_EMAIL=$$config_default_from_email","EMAIL_URL=$$secret_email_url","CELERY_WORKER_CONCURRENCY=$$config_celery_worker_concurrency"],"ports":[]},"$$id-migrate":{"exclude":true,"name":"Migrate","command":"./manage.py migrate","depends_on":["$$id-postgresql","$$id-redis"],"image":"glitchtip/glitchtip:$$core_version","environment":["GLITCHTIP_DOMAIN=$$config_glitchtip_domain","SECRET_KEY=$$secret_secret_key","DATABASE_URL=$$secret_database_url","REDIS_URL=$$secret_redis_url","DEFAULT_FROM_EMAIL=$$config_default_from_email","EMAIL_URL=$$secret_email_url"],"ports":[]},"$$id-postgresql":{"name":"PostgreSQL","depends_on":[],"image":"postgres:14-alpine","volumes":["$$id-postgresql-data:/var/lib/postgresql/data"],"environment":["POSTGRES_USER=$$config_postgres_user","POSTGRES_PASSWORD=$$secret_postgres_password","POSTGRES_DB=$$config_postgres_db"],"ports":[]},"$$id-redis":{"name":"Redis","depends_on":[],"image":"redis:7-alpine","volumes":["$$id-postgresql-redis-data:/data"],"environment":[],"ports":[]}},"variables":[{"id":"$$config_django_superuser_username","name":"DJANGO_SUPERUSER_USERNAME","label":"Django Superuser Username","defaultValue":"$$generate_username","description":""},{"id":"$$secret_django_superuser_password","name":"DJANGO_SUPERUSER_PASSWORD","label":"Django Superuser Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true},{"id":"$$config_port","name":"PORT","label":"GlitchTip Port","defaultValue":"8000","description":""},{"id":"$$config_celery_worker_concurrency","main":"$$id-worker","name":"CELERY_WORKER_CONCURRENCY","label":"Celery Worker Concurrency","defaultValue":"2","description":""},{"id":"$$config_glitchtip_domain","name":"GLITCHTIP_DOMAIN","label":"GlitchTip Domain","defaultValue":"$$generate_fqdn","description":""},{"id":"$$secret_email_url","name":"EMAIL_URL","label":"SMTP Email URL","defaultValue":"smtp://$$config_email_host_user:$$secret_email_host_password@$$config_email_host:$$config_email_port","description":""},{"id":"$$secret_database_url","name":"DATABASE_URL","label":"Database URL for PostgreSQL","defaultValue":"postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db","description":""},{"id":"$$secret_redis_url","name":"REDIS_URL","label":"Redis URL","defaultValue":"redis://$$id-redis:6379/0","description":""},{"id":"$$config_default_from_email","name":"DEFAULT_FROM_EMAIL","label":"Default Email Address","defaultValue":"noreply@example.com","description":""},{"id":"$$config_email_host","name":"EMAIL_HOST","label":"Email SMTP Host","defaultValue":"","description":""},{"id":"$$config_email_port","name":"EMAIL_PORT","label":"Email SMTP Port","defaultValue":"25","description":""},{"id":"$$config_email_host_user","name":"EMAIL_HOST_USER","label":"Email SMTP User","defaultValue":"","description":""},{"id":"$$secret_email_host_password","name":"EMAIL_HOST_PASSWORD","label":"Email SMTP Password","defaultValue":"","description":""},{"id":"$$config_email_use_tls","name":"EMAIL_USE_TLS","label":"Email Use TLS","defaultValue":"false","description":""},{"id":"$$config_email_use_ssl","name":"EMAIL_USE_SSL","label":"Email Use SSL","defaultValue":"false","description":""},{"id":"$$secret_email_smtp_password","name":"EMAIL_SMTP_PASSWORD","label":"SMTP Password","defaultValue":"","description":""},{"id":"$$config_email_backend","name":"EMAIL_BACKEND","label":"Email Backend","defaultValue":"","description":""},{"id":"$$secret_mailgun_api_key","name":"MAILGUN_API_KEY","label":"Mailgun API Key","defaultValue":"","description":"","showOnConfiguration":true},{"id":"$$secret_sendgrid_api_key","name":"SENDGRID_API_KEY","label":"Sendgrid API Key","defaultValue":"","description":"","showOnConfiguration":true},{"id":"$$config_enable_open_user_registration","name":"ENABLE_OPEN_USER_REGISTRATION","label":"Enable Open User Registration","defaultValue":"true","description":""},{"id":"$$config_django_superuser_email","name":"DJANGO_SUPERUSER_EMAIL","label":"Django Superuser Email","defaultValue":"noreply@example.com","description":""},{"id":"$$config_postgres_user","main":"$$id-postgresql","name":"POSTGRES_USER","label":"PostgreSQL User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_postgres_password","main":"$$id-postgresql","name":"POSTGRES_PASSWORD","label":"PostgreSQL Password","defaultValue":"$$generate_password","description":""},{"id":"$$config_postgres_db","main":"$$id-postgresql","name":"POSTGRES_DB","label":"PostgreSQL Database","defaultValue":"glitchtip","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"v2.16.0","documentation":"https://hasura.io/docs/latest/index/","type":"hasura","name":"Hasura","description":"Instant realtime GraphQL APIs on any Postgres application, existing or new.","labels":["graphql","database"],"services":{"$$id":{"name":"Hasura","depends_on":["$$id-postgresql"],"image":"hasura/graphql-engine:$$core_version","volumes":[],"environment":["HASURA_GRAPHQL_ENABLE_CONSOLE=$$config_hasura_graphql_enable_console","HASURA_GRAPHQL_METADATA_DATABASE_URL=$$secret_hasura_graphql_metadata_database_url","HASURA_GRAPHQL_ADMIN_SECRET=$$secret_hasura_graphql_admin_secret"],"ports":["8080"]},"$$id-postgresql":{"name":"PostgreSQL","depends_on":[],"image":"postgres:12-alpine","volumes":["$$id-postgresql-data:/var/lib/postgresql/data"],"environment":["POSTGRES_USER=$$config_postgres_user","POSTGRES_PASSWORD=$$secret_postgres_password","POSTGRES_DB=$$config_postgres_db"],"ports":[]}},"variables":[{"id":"$$config_hasura_graphql_enable_console","name":"HASURA_GRAPHQL_ENABLE_CONSOLE","label":"Enable Hasura Console","defaultValue":"true","description":""},{"id":"$$secret_hasura_graphql_metadata_database_url","name":"HASURA_GRAPHQL_METADATA_DATABASE_URL","label":"Hasura Metadata Database URL","defaultValue":"postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db","description":""},{"id":"$$secret_hasura_graphql_admin_secret","name":"HASURA_GRAPHQL_ADMIN_SECRET","label":"Hasura Admin Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true},{"id":"$$config_postgres_user","name":"POSTGRES_USER","label":"PostgreSQL User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_postgres_password","name":"POSTGRES_PASSWORD","label":"PostgreSQL Password","defaultValue":"$$generate_password","description":""},{"id":"$$config_postgres_db","name":"POSTGRES_DB","label":"PostgreSQL Database","defaultValue":"hasura","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"postgresql-v1.39.5","documentation":"https://umami.is/docs/getting-started","type":"umami-postgresql","name":"Umami","subname":"(PostgreSQL)","description":"A simple, easy to use, self-hosted web analytics solution.","services":{"$$id":{"name":"Umami","depends_on":["$$id-postgresql"],"image":"ghcr.io/umami-software/umami:$$core_version","volumes":[],"environment":["ADMIN_PASSWORD=$$secret_admin_password","DATABASE_URL=$$secret_database_url","DATABASE_TYPE=$$config_database_type","HASH_SALT=$$secret_hash_salt"],"ports":["3000"]},"$$id-postgresql":{"name":"PostgreSQL","depends_on":[],"image":"postgres:12-alpine","volumes":["$$id-postgresql-data:/var/lib/postgresql/data"],"environment":["POSTGRES_USER=$$config_postgres_user","POSTGRES_PASSWORD=$$secret_postgres_password","POSTGRES_DB=$$config_postgres_db"],"ports":[],"files":[{"location":"/docker-entrypoint-initdb.d/schema.postgresql.sql","content":"\n -- CreateTable\n CREATE TABLE \"account\" (\n \"user_id\" SERIAL NOT NULL,\n \"username\" VARCHAR(255) NOT NULL,\n \"password\" VARCHAR(60) NOT NULL,\n \"is_admin\" BOOLEAN NOT NULL DEFAULT false,\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \"updated_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n\n PRIMARY KEY (\"user_id\")\n );\n\n -- CreateTable\n CREATE TABLE \"event\" (\n \"event_id\" SERIAL NOT NULL,\n \"website_id\" INTEGER NOT NULL,\n \"session_id\" INTEGER NOT NULL,\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \"url\" VARCHAR(500) NOT NULL,\n \"event_type\" VARCHAR(50) NOT NULL,\n \"event_value\" VARCHAR(50) NOT NULL,\n\n PRIMARY KEY (\"event_id\")\n );\n\n -- CreateTable\n CREATE TABLE \"pageview\" (\n \"view_id\" SERIAL NOT NULL,\n \"website_id\" INTEGER NOT NULL,\n \"session_id\" INTEGER NOT NULL,\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \"url\" VARCHAR(500) NOT NULL,\n \"referrer\" VARCHAR(500),\n\n PRIMARY KEY (\"view_id\")\n );\n\n -- CreateTable\n CREATE TABLE \"session\" (\n \"session_id\" SERIAL NOT NULL,\n \"session_uuid\" UUID NOT NULL,\n \"website_id\" INTEGER NOT NULL,\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \"hostname\" VARCHAR(100),\n \"browser\" VARCHAR(20),\n \"os\" VARCHAR(20),\n \"device\" VARCHAR(20),\n \"screen\" VARCHAR(11),\n \"language\" VARCHAR(35),\n \"country\" CHAR(2),\n\n PRIMARY KEY (\"session_id\")\n );\n\n -- CreateTable\n CREATE TABLE \"website\" (\n \"website_id\" SERIAL NOT NULL,\n \"website_uuid\" UUID NOT NULL,\n \"user_id\" INTEGER NOT NULL,\n \"name\" VARCHAR(100) NOT NULL,\n \"domain\" VARCHAR(500),\n \"share_id\" VARCHAR(64),\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n\n PRIMARY KEY (\"website_id\")\n );\n\n -- CreateIndex\n CREATE UNIQUE INDEX \"account.username_unique\" ON \"account\"(\"username\");\n\n -- CreateIndex\n CREATE INDEX \"event_created_at_idx\" ON \"event\"(\"created_at\");\n\n -- CreateIndex\n CREATE INDEX \"event_session_id_idx\" ON \"event\"(\"session_id\");\n\n -- CreateIndex\n CREATE INDEX \"event_website_id_idx\" ON \"event\"(\"website_id\");\n\n -- CreateIndex\n CREATE INDEX \"pageview_created_at_idx\" ON \"pageview\"(\"created_at\");\n\n -- CreateIndex\n CREATE INDEX \"pageview_session_id_idx\" ON \"pageview\"(\"session_id\");\n\n -- CreateIndex\n CREATE INDEX \"pageview_website_id_created_at_idx\" ON \"pageview\"(\"website_id\", \"created_at\");\n\n -- CreateIndex\n CREATE INDEX \"pageview_website_id_idx\" ON \"pageview\"(\"website_id\");\n\n -- CreateIndex\n CREATE INDEX \"pageview_website_id_session_id_created_at_idx\" ON \"pageview\"(\"website_id\", \"session_id\", \"created_at\");\n\n -- CreateIndex\n CREATE UNIQUE INDEX \"session.session_uuid_unique\" ON \"session\"(\"session_uuid\");\n\n -- CreateIndex\n CREATE INDEX \"session_created_at_idx\" ON \"session\"(\"created_at\");\n\n -- CreateIndex\n CREATE INDEX \"session_website_id_idx\" ON \"session\"(\"website_id\");\n\n -- CreateIndex\n CREATE UNIQUE INDEX \"website.website_uuid_unique\" ON \"website\"(\"website_uuid\");\n\n -- CreateIndex\n CREATE UNIQUE INDEX \"website.share_id_unique\" ON \"website\"(\"share_id\");\n\n -- CreateIndex\n CREATE INDEX \"website_user_id_idx\" ON \"website\"(\"user_id\");\n\n -- AddForeignKey\n ALTER TABLE \"event\" ADD FOREIGN KEY (\"session_id\") REFERENCES \"session\"(\"session_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n\n -- AddForeignKey\n ALTER TABLE \"event\" ADD FOREIGN KEY (\"website_id\") REFERENCES \"website\"(\"website_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n\n -- AddForeignKey\n ALTER TABLE \"pageview\" ADD FOREIGN KEY (\"session_id\") REFERENCES \"session\"(\"session_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n\n -- AddForeignKey\n ALTER TABLE \"pageview\" ADD FOREIGN KEY (\"website_id\") REFERENCES \"website\"(\"website_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n\n -- AddForeignKey\n ALTER TABLE \"session\" ADD FOREIGN KEY (\"website_id\") REFERENCES \"website\"(\"website_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n\n -- AddForeignKey\n ALTER TABLE \"website\" ADD FOREIGN KEY (\"user_id\") REFERENCES \"account\"(\"user_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n\n insert into account (username, password, is_admin) values ('admin', '$$hashed$$secret_admin_password', true);"}]}},"variables":[{"id":"$$secret_database_url","name":"DATABASE_URL","label":"Database URL for PostgreSQL","defaultValue":"postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db","description":""},{"id":"$$secret_hash_salt","name":"HASH_SALT","label":"Hash Salt","defaultValue":"$$generate_hex(64)","description":""},{"id":"$$config_database_type","name":"DATABASE_TYPE","label":"Database Type","defaultValue":"postgresql","description":""},{"id":"$$config_postgres_user","name":"POSTGRES_USER","label":"PostgreSQL User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_postgres_password","name":"POSTGRES_PASSWORD","label":"PostgreSQL Password","defaultValue":"$$generate_password","description":""},{"id":"$$config_postgres_db","name":"POSTGRES_DB","label":"PostgreSQL Database","defaultValue":"umami","description":""},{"id":"$$secret_admin_password","name":"ADMIN_PASSWORD","label":"Initial Admin Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true}]},{"templateVersion":"1.0.0","ignore":true,"defaultVersion":"postgresql-v1.39.5","documentation":"https://umami.is/docs/getting-started","type":"umami","name":"Umami","subname":"(PostgreSQL)","description":"A simple, easy to use, self-hosted web analytics solution.","services":{"$$id":{"name":"Umami","depends_on":["$$id-postgresql"],"image":"ghcr.io/umami-software/umami:$$core_version","volumes":[],"environment":["ADMIN_PASSWORD=$$secret_admin_password","DATABASE_URL=$$secret_database_url","DATABASE_TYPE=$$config_database_type","HASH_SALT=$$secret_hash_salt"],"ports":["3000"]},"$$id-postgresql":{"name":"PostgreSQL","depends_on":[],"image":"postgres:12-alpine","volumes":["$$id-postgresql-data:/var/lib/postgresql/data"],"environment":["POSTGRES_USER=$$config_postgres_user","POSTGRES_PASSWORD=$$secret_postgres_password","POSTGRES_DB=$$config_postgres_db"],"ports":[],"files":[{"location":"/docker-entrypoint-initdb.d/schema.postgresql.sql","content":"\n -- CreateTable\n CREATE TABLE \"account\" (\n \"user_id\" SERIAL NOT NULL,\n \"username\" VARCHAR(255) NOT NULL,\n \"password\" VARCHAR(60) NOT NULL,\n \"is_admin\" BOOLEAN NOT NULL DEFAULT false,\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \"updated_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n\n PRIMARY KEY (\"user_id\")\n );\n\n -- CreateTable\n CREATE TABLE \"event\" (\n \"event_id\" SERIAL NOT NULL,\n \"website_id\" INTEGER NOT NULL,\n \"session_id\" INTEGER NOT NULL,\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \"url\" VARCHAR(500) NOT NULL,\n \"event_type\" VARCHAR(50) NOT NULL,\n \"event_value\" VARCHAR(50) NOT NULL,\n\n PRIMARY KEY (\"event_id\")\n );\n\n -- CreateTable\n CREATE TABLE \"pageview\" (\n \"view_id\" SERIAL NOT NULL,\n \"website_id\" INTEGER NOT NULL,\n \"session_id\" INTEGER NOT NULL,\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \"url\" VARCHAR(500) NOT NULL,\n \"referrer\" VARCHAR(500),\n\n PRIMARY KEY (\"view_id\")\n );\n\n -- CreateTable\n CREATE TABLE \"session\" (\n \"session_id\" SERIAL NOT NULL,\n \"session_uuid\" UUID NOT NULL,\n \"website_id\" INTEGER NOT NULL,\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n \"hostname\" VARCHAR(100),\n \"browser\" VARCHAR(20),\n \"os\" VARCHAR(20),\n \"device\" VARCHAR(20),\n \"screen\" VARCHAR(11),\n \"language\" VARCHAR(35),\n \"country\" CHAR(2),\n\n PRIMARY KEY (\"session_id\")\n );\n\n -- CreateTable\n CREATE TABLE \"website\" (\n \"website_id\" SERIAL NOT NULL,\n \"website_uuid\" UUID NOT NULL,\n \"user_id\" INTEGER NOT NULL,\n \"name\" VARCHAR(100) NOT NULL,\n \"domain\" VARCHAR(500),\n \"share_id\" VARCHAR(64),\n \"created_at\" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,\n\n PRIMARY KEY (\"website_id\")\n );\n\n -- CreateIndex\n CREATE UNIQUE INDEX \"account.username_unique\" ON \"account\"(\"username\");\n\n -- CreateIndex\n CREATE INDEX \"event_created_at_idx\" ON \"event\"(\"created_at\");\n\n -- CreateIndex\n CREATE INDEX \"event_session_id_idx\" ON \"event\"(\"session_id\");\n\n -- CreateIndex\n CREATE INDEX \"event_website_id_idx\" ON \"event\"(\"website_id\");\n\n -- CreateIndex\n CREATE INDEX \"pageview_created_at_idx\" ON \"pageview\"(\"created_at\");\n\n -- CreateIndex\n CREATE INDEX \"pageview_session_id_idx\" ON \"pageview\"(\"session_id\");\n\n -- CreateIndex\n CREATE INDEX \"pageview_website_id_created_at_idx\" ON \"pageview\"(\"website_id\", \"created_at\");\n\n -- CreateIndex\n CREATE INDEX \"pageview_website_id_idx\" ON \"pageview\"(\"website_id\");\n\n -- CreateIndex\n CREATE INDEX \"pageview_website_id_session_id_created_at_idx\" ON \"pageview\"(\"website_id\", \"session_id\", \"created_at\");\n\n -- CreateIndex\n CREATE UNIQUE INDEX \"session.session_uuid_unique\" ON \"session\"(\"session_uuid\");\n\n -- CreateIndex\n CREATE INDEX \"session_created_at_idx\" ON \"session\"(\"created_at\");\n\n -- CreateIndex\n CREATE INDEX \"session_website_id_idx\" ON \"session\"(\"website_id\");\n\n -- CreateIndex\n CREATE UNIQUE INDEX \"website.website_uuid_unique\" ON \"website\"(\"website_uuid\");\n\n -- CreateIndex\n CREATE UNIQUE INDEX \"website.share_id_unique\" ON \"website\"(\"share_id\");\n\n -- CreateIndex\n CREATE INDEX \"website_user_id_idx\" ON \"website\"(\"user_id\");\n\n -- AddForeignKey\n ALTER TABLE \"event\" ADD FOREIGN KEY (\"session_id\") REFERENCES \"session\"(\"session_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n\n -- AddForeignKey\n ALTER TABLE \"event\" ADD FOREIGN KEY (\"website_id\") REFERENCES \"website\"(\"website_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n\n -- AddForeignKey\n ALTER TABLE \"pageview\" ADD FOREIGN KEY (\"session_id\") REFERENCES \"session\"(\"session_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n\n -- AddForeignKey\n ALTER TABLE \"pageview\" ADD FOREIGN KEY (\"website_id\") REFERENCES \"website\"(\"website_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n\n -- AddForeignKey\n ALTER TABLE \"session\" ADD FOREIGN KEY (\"website_id\") REFERENCES \"website\"(\"website_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n\n -- AddForeignKey\n ALTER TABLE \"website\" ADD FOREIGN KEY (\"user_id\") REFERENCES \"account\"(\"user_id\") ON DELETE CASCADE ON UPDATE CASCADE;\n\n insert into account (username, password, is_admin) values ('admin', '$$hashed$$secret_admin_password', true);"}]}},"variables":[{"id":"$$secret_database_url","name":"DATABASE_URL","label":"Database URL for PostgreSQL","defaultValue":"postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db","description":""},{"id":"$$secret_hash_salt","name":"HASH_SALT","label":"Hash Salt","defaultValue":"$$generate_hex(64)","description":""},{"id":"$$config_database_type","name":"DATABASE_TYPE","label":"Database Type","defaultValue":"postgresql","description":""},{"id":"$$config_postgres_user","name":"POSTGRES_USER","label":"PostgreSQL User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_postgres_password","name":"POSTGRES_PASSWORD","label":"PostgreSQL Password","defaultValue":"$$generate_password","description":""},{"id":"$$config_postgres_db","name":"POSTGRES_DB","label":"PostgreSQL Database","defaultValue":"umami","description":""},{"id":"$$secret_admin_password","name":"ADMIN_PASSWORD","label":"Initial Admin Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true}]},{"templateVersion":"1.0.0","defaultVersion":"v0.30.1","documentation":"https://docs.meilisearch.com/learn/getting_started/quick_start.html","type":"meilisearch","name":"MeiliSearch","description":"A lightning Fast, Ultra Relevant, and Typo-Tolerant Search Engine.","services":{"$$id":{"name":"MeiliSearch","documentation":"https://docs.meilisearch.com/","depends_on":[],"image":"getmeili/meilisearch:$$core_version","volumes":["$$id-datams:/meili_data/data.ms","$$id-data:/meili_data","$$id-snapshot:/snapshot","$$id-dump:/dumps"],"environment":["MEILI_MASTER_KEY=$$secret_meili_master_key"],"ports":["7700"]}},"variables":[{"id":"$$secret_meili_master_key","name":"MEILI_MASTER_KEY","label":"Master Key","defaultValue":"$$generate_hex(64)","description":"","showOnConfiguration":true}]},{"templateVersion":"1.0.0","ignore":true,"defaultVersion":"latest","documentation":"https://docs.ghost.org","arch":"amd64","type":"ghost-mariadb","name":"Ghost","subname":"(MariaDB)","description":"Free and open source blogging platform.","labels":["cms","blog"],"services":{"$$id":{"name":"Ghost","depends_on":["$$id-mariadb"],"image":"bitnami/ghost:$$core_version","volumes":["$$id-ghost:/bitnami/ghost"],"environment":["url=$$config_url","GHOST_HOST=$$config_ghost_host","GHOST_ENABLE_HTTPS=$$config_ghost_enable_https","GHOST_EMAIL=$$config_ghost_email","GHOST_PASSWORD=$$secret_ghost_password","GHOST_DATABASE_HOST=$$config_ghost_database_host","GHOST_DATABASE_USER=$$config_mariadb_user","GHOST_DATABASE_PASSWORD=$$secret_ghost_database_password","GHOST_DATABASE_NAME=$$config_mariadb_database","GHOST_DATABASE_PORT_NUMBER=3306"],"ports":["2368"]},"$$id-mariadb":{"name":"MariaDB","depends_on":[],"image":"bitnami/mariadb:latest","volumes":["$$id-mariadb:/bitnami/mariadb"],"environment":["MARIADB_USER=$$config_mariadb_user","MARIADB_PASSWORD=$$secret_mariadb_password","MARIADB_DATABASE=$$config_mariadb_database","MARIADB_ROOT_USER=$$config_mariadb_root_user","MARIADB_ROOT_PASSWORD=$$secret_mariadb_root_password"],"ports":[]}},"variables":[{"id":"$$config_url","name":"url","label":"URL","defaultValue":"$$generate_fqdn","description":""},{"id":"$$config_ghost_host","name":"GHOST_HOST","label":"Ghost Host","defaultValue":"$$generate_domain","description":""},{"id":"$$config_ghost_enable_https","name":"GHOST_ENABLE_HTTPS","label":"Ghost Enable HTTPS","defaultValue":"no","description":""},{"id":"$$config_ghost_email","name":"GHOST_EMAIL","label":"Ghost Default Email","defaultValue":"admin@example.com","description":""},{"id":"$$secret_ghost_password","name":"GHOST_PASSWORD","label":"Ghost Default Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true},{"id":"$$config_ghost_database_host","name":"GHOST_DATABASE_HOST","label":"Ghost Database Host","defaultValue":"$$id-mariadb","description":""},{"id":"$$config_ghost_database_user","name":"GHOST_DATABASE_USER","label":"MariaDB User","defaultValue":"$$config_mariadb_user","description":""},{"id":"$$secret_ghost_database_password","name":"GHOST_DATABASE_PASSWORD","label":"MariaDB Password","defaultValue":"$$secret_mariadb_password","description":""},{"id":"$$config_ghost_database_name","name":"GHOST_DATABASE_NAME","label":"MariaDB Database","defaultValue":"$$config_mariadb_database","description":""},{"id":"$$config_mariadb_user","name":"MARIADB_USER","label":"MariaDB User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_mariadb_password","name":"MARIADB_PASSWORD","label":"MariaDB Password","defaultValue":"$$generate_password","description":""},{"id":"$$config_mariadb_database","name":"MARIADB_DATABASE","label":"MariaDB Database","defaultValue":"ghost","description":""},{"id":"$$config_mariadb_root_user","name":"MARIADB_ROOT_USER","label":"MariaDB Root User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_mariadb_root_password","name":"MARIADB_ROOT_PASSWORD","label":"MariaDB Root Password","defaultValue":"$$generate_password","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"5.25.3","documentation":"https://docs.ghost.org","type":"ghost-only","name":"Ghost","subname":"(without Database)","description":"Free and open source blogging platform.","services":{"$$id":{"name":"Ghost","image":"ghost:$$core_version","volumes":["$$id-ghost:/var/lib/ghost/content"],"environment":["url=$$config_url","database__client=$$config_database__client","database__connection__host=$$config_database__connection__host","database__connection__user=$$config_database__connection__user","database__connection__password=$$secret_database__connection__password","database__connection__database=$$config_database__connection__database"],"ports":["2368"]}},"variables":[{"id":"$$config_url","name":"url","label":"URL","defaultValue":"$$generate_fqdn","description":""},{"id":"$$config_database__client","name":"database__client","label":"Database Client","defaultValue":"mysql","description":"","required":true},{"id":"$$config_database__connection__host","name":"database__connection__host","label":"Database Host","defaultValue":"","description":"","required":true,"placeholder":"db.coolify.io"},{"id":"$$config_database__connection__user","name":"database__connection__user","label":"Database User","defaultValue":"","description":"","placeholder":"ghost","required":true},{"id":"$$secret_database__connection__password","name":"database__connection__password","label":"Database Password","defaultValue":"","description":"","placeholder":"superSecretP4ssword","showOnConfiguration":true,"required":true},{"id":"$$config_database__connection__database","name":"database__connection__database","label":"Database Name","defaultValue":"","description":"","placeholder":"ghost_db","required":true}]},{"templateVersion":"1.0.0","defaultVersion":"5.25.3","documentation":"https://docs.ghost.org","type":"ghost-mysql","name":"Ghost","subname":"(MySQL)","description":"Ghost is a free and open source blogging platform.","services":{"$$id":{"name":"Ghost","depends_on":["$$id-mysql"],"image":"ghost:$$core_version","volumes":["$$id-ghost:/var/lib/ghost/content"],"environment":["url=$$config_url","database__client=$$config_database__client","database__connection__host=$$config_database__connection__host","database__connection__user=$$config_mysql_user","database__connection__password=$$secret_mysql_password","database__connection__database=$$config_mysql_database"],"ports":["2368"]},"$$id-mysql":{"name":"MySQL","depends_on":[],"image":"mysql:8.0","volumes":["$$id-mysql:/var/lib/mysql"],"environment":["MYSQL_USER=$$config_mysql_user","MYSQL_PASSWORD=$$secret_mysql_password","MYSQL_DATABASE=$$config_mysql_database","MYSQL_ROOT_PASSWORD=$$secret_mysql_root_password"],"ports":[]}},"variables":[{"id":"$$config_url","name":"url","label":"URL","defaultValue":"$$generate_fqdn","description":""},{"id":"$$config_database__client","name":"database__client","label":"Database Client","defaultValue":"mysql","description":"","readOnly":true},{"id":"$$config_database__connection__host","name":"database__connection__host","label":"Database Host","defaultValue":"$$id-mysql","description":""},{"id":"$$config_mysql_user","main":"$$id-mysql","name":"MYSQL_USER","label":"MySQL User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_mysql_password","main":"$$id-mysql","name":"MYSQL_PASSWORD","label":"MySQL Password","defaultValue":"$$generate_password","description":""},{"id":"$$config_mysql_database","main":"$$id-mysql","name":"MYSQL_DATABASE","label":"MySQL Database","defaultValue":"ghost","description":""},{"id":"$$secret_mysql_root_password","name":"MYSQL_ROOT_PASSWORD","label":"MySQL Root Password","defaultValue":"$$generate_password","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"php8.1","documentation":"https://wordpress.org/","type":"wordpress","name":"WordPress","subname":"(MySQL)","description":"A content management system based on PHP.","labels":["wordpress","php","cms"],"services":{"$$id":{"name":"WordPress","depends_on":["$$id-mysql"],"image":"wordpress:$$core_version","volumes":["$$id-wordpress-data:/var/www/html"],"environment":["WORDPRESS_DB_HOST=$$config_wordpress_db_host","WORDPRESS_DB_USER=$$config_mysql_user","WORDPRESS_DB_PASSWORD=$$secret_mysql_password","WORDPRESS_DB_NAME=$$config_mysql_database","WORDPRESS_CONFIG_EXTRA=$$config_wordpress_config_extra"],"ports":["80"]},"$$id-mysql":{"name":"MySQL","depends_on":[],"image":"bitnami/mysql:5.7","imageArm":"mysql:8.0","volumes":["$$id-mysql-data:/bitnami/mysql/data"],"volumesArm":["$$id-mysql-data:/var/lib/mysql"],"environment":["MYSQL_ROOT_PASSWORD=$$secret_mysql_root_password","MYSQL_ROOT_USER=$$config_mysql_root_user","MYSQL_DATABASE=$$config_mysql_database","MYSQL_USER=$$config_mysql_user","MYSQL_PASSWORD=$$secret_mysql_password"]}},"variables":[{"id":"$$config_wordpress_db_host","name":"WORDPRESS_DB_HOST","label":"Database Host","defaultValue":"$$id-mysql","description":"","readOnly":true},{"id":"$$config_wordpress_config_extra","name":"WORDPRESS_CONFIG_EXTRA","label":"WordPress Config Extra","defaultValue":"","description":"","type":"textarea","placeholder":"define('WP_DEBUG', true);\ndefine('WP_DEBUG_LOG', true);\ndefine('WP_DEBUG_DISPLAY', false);\n@ini_set('display_errors', 0);\n"},{"id":"$$secret_mysql_root_password","name":"MYSQL_ROOT_PASSWORD","label":"MySQL Root Password","defaultValue":"$$generate_password","description":"","readOnly":true},{"id":"$$config_mysql_root_user","name":"MYSQL_ROOT_USER","label":"MySQL Root User","defaultValue":"$$generate_username","description":"","readOnly":true},{"id":"$$config_mysql_database","name":"MYSQL_DATABASE","label":"MySQL Database","defaultValue":"wordpress","description":"","readOnly":true},{"id":"$$config_mysql_user","name":"MYSQL_USER","label":"MySQL User","defaultValue":"$$generate_username","description":"","readOnly":true},{"id":"$$secret_mysql_password","name":"MYSQL_PASSWORD","label":"MySQL Password","defaultValue":"$$generate_password","description":"","readOnly":true}]},{"templateVersion":"1.0.0","defaultVersion":"php8.1","documentation":"https://wordpress.org/","type":"wordpress-only","name":"WordPress","subname":"(without DB)","description":"A content management system based on PHP.","labels":["wordpress","php","cms"],"services":{"$$id":{"name":"WordPress","image":"wordpress:$$core_version","volumes":["$$id-wordpress-data:/var/www/html"],"environment":["WORDPRESS_DB_HOST=$$config_wordpress_db_host","WORDPRESS_DB_PORT=$$config_wordpress_db_port","WORDPRESS_DB_USER=$$config_wordpress_db_user","WORDPRESS_DB_PASSWORD=$$secret_wordpress_db_password","WORDPRESS_DB_NAME=$$config_wordpress_db_name","WORDPRESS_CONFIG_EXTRA=$$config_wordpress_config_extra"],"ports":["80"]}},"variables":[{"id":"$$config_wordpress_db_host","name":"WORDPRESS_DB_HOST","label":"Database Host","defaultValue":"","description":"","placeholder":"db.coollabs.io","required":true},{"id":"$$config_wordpress_db_port","name":"WORDPRESS_DB_PORT","label":"Database Port","defaultValue":"","description":"","placeholder":"3306","required":true},{"id":"$$config_wordpress_db_user","name":"WORDPRESS_DB_USER","label":"Database User","defaultValue":"","description":"","placeholder":"wordpress","required":true},{"id":"$$secret_wordpress_db_password","name":"WORDPRESS_DB_PASSWORD","label":"Database Password","defaultValue":"","description":"","placeholder":"supers3cr3tpassw0rd!","required":true,"showOnConfiguration":true},{"id":"$$config_wordpress_db_name","name":"WORDPRESS_DB_NAME","label":"Database Name","defaultValue":"","description":"","placeholder":"wordpress","required":true},{"id":"$$config_wordpress_config_extra","name":"WORDPRESS_CONFIG_EXTRA","label":"Extra Config","defaultValue":"","description":"","type":"textarea","placeholder":"define('WP_DEBUG', true);\ndefine('WP_DEBUG_LOG', true);\ndefine('WP_DEBUG_DISPLAY', false);\n@ini_set('display_errors', 0);\n"}]},{"templateVersion":"1.0.0","defaultVersion":"4.9.0","documentation":"https://coder.com/docs/coder-oss/latest","type":"vscodeserver","name":"VSCode Server","description":"Visual Studio Code on a remote server, accessible through the browser.","labels":["vscode","ide"],"services":{"$$id":{"name":"VSCode Server","depends_on":[],"image":"codercom/code-server:$$core_version","volumes":["$$id-config-data:/home/coder/.local/share/code-server","$$id-vscodeserver-data:/home/coder","$$id-keys-directory:/root/.ssh","$$id-theme-and-plugin-directory:/root/.local/share/code-server"],"environment":["PASSWORD=$$secret_password"],"ports":["8080"]}},"variables":[{"id":"$$secret_password","name":"PASSWORD","label":"Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true}]},{"templateVersion":"1.0.0","defaultVersion":"RELEASE.2022-12-12T19-27-27Z","documentation":"https://min.io/docs/minio","type":"minio","name":"MinIO","description":"A cloud storage server compatible with Amazon S3.","labels":["storage","s3"],"services":{"$$id":{"name":"MinIO","command":"server /data --console-address :9001","depends_on":[],"image":"minio/minio:$$core_version","volumes":["$$id-minio-data:/data","$$id-data-write:/files"],"environment":["MINIO_SERVER_URL=$$config_coolify_fqdn_minio_console","MINIO_BROWSER_REDIRECT_URL=$$config_minio_browser_redirect_url","MINIO_DOMAIN=$$config_minio_domain","MINIO_ROOT_USER=$$config_minio_root_user","MINIO_ROOT_PASSWORD=$$secret_minio_root_password"],"ports":["9000","9001"],"proxy":[{"port":"9000","domain":"$$config_coolify_fqdn_minio_console"},{"port":"9001"}]}},"variables":[{"id":"$$config_coolify_fqdn_minio_console","name":"MINIO_SERVER_URL","label":"MinIO Server URL","defaultValue":"","description":"Specify the URL hostname the MinIO Console should use for connecting to the MinIO Server.","required":true},{"id":"$$config_minio_browser_redirect_url","name":"MINIO_BROWSER_REDIRECT_URL","label":"Browser Redirect URL","defaultValue":"$$generate_fqdn","description":""},{"id":"$$config_minio_domain","name":"MINIO_DOMAIN","label":"Domain","defaultValue":"$$generate_domain","description":""},{"id":"$$config_minio_root_user","name":"MINIO_ROOT_USER","label":"Root User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_minio_root_password","name":"MINIO_ROOT_PASSWORD","label":"Root User Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true}]},{"templateVersion":"1.0.0","defaultVersion":"0.21.1","documentation":"https://fider.io/docs","type":"fider","name":"Fider","description":"A platform to collect and organize customer feedback.","labels":["suggestion","feedback"],"services":{"$$id":{"name":"Fider","image":"getfider/fider:$$core_version","depends_on":["$$id-postgresql"],"environment":["BASE_URL=$$config_base_url","DATABASE_URL=$$secret_database_url","JWT_SECRET=$$secret_jwt_secret","EMAIL_NOREPLY=$$config_email_noreply","EMAIL_MAILGUN_API=$$secret_email_mailgun_api","EMAIL_MAILGUN_REGION=$$config_email_mailgun_region","EMAIL_MAILGUN_DOMAIN=$$config_email_mailgun_domain","EMAIL_SMTP_HOST=$$config_email_smtp_host","EMAIL_SMTP_PORT=$$config_email_smtp_port","EMAIL_SMTP_USER=$$config_email_smtp_user","EMAIL_SMTP_PASSWORD=$$secret_email_smtp_password","EMAIL_SMTP_ENABLE_STARTTLS=$$config_email_smtp_enable_starttls"],"ports":["3000"]},"$$id-postgresql":{"name":"PostgreSQL","depends_on":[],"image":"postgres:12-alpine","volumes":["$$id-postgresql-data:/var/lib/postgresql/data"],"environment":["POSTGRES_USER=$$config_postgres_user","POSTGRES_PASSWORD=$$secret_postgres_password","POSTGRES_DB=$$config_postgres_db"]}},"variables":[{"id":"$$config_base_url","name":"BASE_URL","label":"Base URL","defaultValue":"$$generate_fqdn","description":""},{"id":"$$secret_database_url","name":"DATABASE_URL","label":"Database URL for PostgreSQL","defaultValue":"postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db?sslmode=disable","description":""},{"id":"$$secret_jwt_secret","name":"JWT_SECRET","label":"JWT Secret","defaultValue":"$$generate_hex(64)","description":""},{"id":"$$config_email_noreply","name":"EMAIL_NOREPLY","label":"No Reply Email Address","defaultValue":"noreply@example.com","description":""},{"id":"$$secret_email_mailgun_api","name":"EMAIL_MAILGUN_API","label":"Mailgun API Key","defaultValue":"","description":"","showOnConfiguration":true},{"id":"$$config_email_mailgun_region","name":"EMAIL_MAILGUN_REGION","label":"Mailgun Region","defaultValue":"EU","description":""},{"id":"$$config_email_mailgun_domain","name":"EMAIL_MAILGUN_DOMAIN","label":"Mailgun Domain","defaultValue":"","description":""},{"id":"$$config_email_smtp_host","name":"EMAIL_SMTP_HOST","label":"SMTP Host","defaultValue":"","description":""},{"id":"$$config_email_smtp_port","name":"EMAIL_SMTP_PORT","label":"SMTP Port","defaultValue":"587","description":""},{"id":"$$config_email_smtp_user","name":"EMAIL_SMTP_USER","label":"SMTP User","defaultValue":"","description":""},{"id":"$$secret_email_smtp_password","name":"EMAIL_SMTP_PASSWORD","label":"SMTP Password","defaultValue":"","description":"","showOnConfiguration":true},{"id":"$$config_email_smtp_enable_starttls","name":"EMAIL_SMTP_ENABLE_STARTTLS","label":"SMTP Enable StartTLS","defaultValue":"false","description":""},{"id":"$$config_postgres_user","name":"POSTGRES_USER","label":"PostgreSQL User","defaultValue":"$$generate_username","description":""},{"id":"$$secret_postgres_password","name":"POSTGRES_PASSWORD","label":"PostgreSQL Password","defaultValue":"$$generate_password","description":""},{"id":"$$config_postgres_db","name":"POSTGRES_DB","label":"PostgreSQL Database","defaultValue":"$$generate_username","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"0.207.0","documentation":"https://docs.n8n.io","type":"n8n","name":"n8n.io","description":"A free and open node based Workflow Automation Tool.","labels":["workflow","automation","ifttt","zapier","nodered"],"services":{"$$id":{"name":"N8n","depends_on":[],"image":"n8nio/n8n:$$core_version","volumes":["$$id-data:/root/.n8n","$$id-data-write:/files","/var/run/docker.sock:/var/run/docker.sock"],"environment":["WEBHOOK_URL=$$config_webhook_url"],"ports":["5678"]}},"variables":[{"id":"$$config_webhook_url","name":"WEBHOOK_URL","label":"Webhook URL","defaultValue":"$$generate_fqdn","description":""}]},{"templateVersion":"1.0.0","defaultVersion":"stable","documentation":"https://plausible.io/doc/","arch":"amd64","type":"plausibleanalytics","name":"Plausible Analytics","description":"A lightweight and open-source website analytics tool.","labels":["analytics","statistics","plausible","gdpr","no-cookie","google analytics"],"services":{"$$id":{"name":"Plausible Analytics","command":"sh -c \"sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh db init-admin && /entrypoint.sh run\"","depends_on":["$$id-postgresql","$$id-clickhouse"],"image":"plausible/analytics:$$core_version","environment":["ADMIN_USER_EMAIL=$$config_admin_user_email","ADMIN_USER_NAME=$$config_admin_user_name","ADMIN_USER_PWD=$$secret_admin_user_pwd","BASE_URL=$$config_base_url","SECRET_KEY_BASE=$$secret_secret_key_base","DISABLE_AUTH=$$config_disable_auth","DISABLE_REGISTRATION=$$config_disable_registration","DATABASE_URL=$$secret_database_url","CLICKHOUSE_DATABASE_URL=$$secret_clickhouse_database_url"],"ports":["8000"]},"$$id-postgresql":{"name":"PostgreSQL","image":"bitnami/postgresql:13","volumes":["$$id-postgresql-data:/bitnami/postgresql"],"environment":["POSTGRESQL_PASSWORD=$$secret_postgresql_password","POSTGRESQL_USERNAME=$$config_postgresql_username","POSTGRESQL_DATABASE=$$config_postgresql_database"]},"$$id-clickhouse":{"name":"Clickhouse","volumes":["$$id-clickhouse-data:/var/lib/clickhouse"],"image":"clickhouse/clickhouse-server:22.6-alpine","ulimits":{"nofile":{"soft":262144,"hard":262144}},"files":[{"location":"/etc/clickhouse-server/users.d/logging.xml","content":"warning true "},{"location":"/etc/clickhouse-server/config.d/logging.xml","content":"0 0 "},{"location":"/docker-entrypoint-initdb.d/init.query","content":"CREATE DATABASE IF NOT EXISTS plausible;"},{"location":"/docker-entrypoint-initdb.d/init-db.sh","content":"clickhouse client --queries-file /docker-entrypoint-initdb.d/init.query"}]}},"variables":[{"id":"$$config_base_url","name":"BASE_URL","label":"Base URL","defaultValue":"$$generate_fqdn","description":"You must set this to the FQDN of the Plausible Analytics instance. This is used to generate the links to the Plausible Analytics instance."},{"id":"$$secret_database_url","name":"DATABASE_URL","label":"Database URL for PostgreSQL","defaultValue":"postgresql://$$config_postgresql_username:$$secret_postgresql_password@$$id-postgresql:5432/$$config_postgresql_database","description":""},{"id":"$$secret_clickhouse_database_url","name":"CLICKHOUSE_DATABASE_URL","label":"Database URL for Clickhouse","defaultValue":"http://$$id-clickhouse:8123/plausible","description":""},{"id":"$$config_admin_user_email","name":"ADMIN_USER_EMAIL","label":"Admin Email Address","defaultValue":"admin@example.com","description":"This is the admin email. Please change it."},{"id":"$$config_admin_user_name","name":"ADMIN_USER_NAME","label":"Admin User Name","defaultValue":"$$generate_username","description":"This is the admin username. Please change it."},{"id":"$$secret_admin_user_pwd","name":"ADMIN_USER_PWD","label":"Admin User Password","defaultValue":"$$generate_password","description":"This is the admin password. Please change it.","showOnConfiguration":true},{"id":"$$secret_secret_key_base","name":"SECRET_KEY_BASE","label":"Secret Key Base","defaultValue":"$$generate_hex(64)","description":""},{"id":"$$config_disable_auth","name":"DISABLE_AUTH","label":"Authentication","defaultValue":"false","description":""},{"id":"$$config_disable_registration","name":"DISABLE_REGISTRATION","label":"Registration","defaultValue":"true","description":""},{"id":"$$config_postgresql_username","main":"$$id-postgresql","name":"POSTGRESQL_USERNAME","label":"PostgreSQL Username","defaultValue":"postgresql","description":""},{"id":"$$secret_postgresql_password","main":"$$id-postgresql","name":"POSTGRESQL_PASSWORD","label":"PostgreSQL Password","defaultValue":"$$generate_password","description":"","showOnConfiguration":true},{"id":"$$config_postgresql_database","main":"$$id-postgresql","name":"POSTGRESQL_DATABASE","label":"PostgreSQL Database","defaultValue":"plausible","description":""},{"id":"$$config_scriptName","name":"SCRIPT_NAME","label":"Custom Script Name","defaultValue":"plausible.js","description":"This is the default script name."}]},{"templateVersion":"1.0.0","defaultVersion":"0.99.1","documentation":"https://docs.nocodb.com","type":"nocodb","name":"NocoDB","description":"Turns any MySQL, PostgreSQL, SQL Server, SQLite & MariaDB into a smart-spreadsheet.","labels":["database","airtable","spreadsheet"],"services":{"$$id":{"name":"NocoDB","image":"nocodb/nocodb:$$core_version","environment":["PORT=$$config_port","NC_DB=$$config_nc_db","DATABASE_URL=$$secret_database_url","NC_PUBLIC_URL=$$config_public_url","NC_AUTH_JWT_SECRET=$$secret_auth_jwt_secret","NC_SENTRY_DSN=$$secret_sentry_dsn","NC_CONNECT_TO_EXTERNAL_DB_DISABLED=$$config_connect_to_external_db_disabled","NC_DISABLE_TELE=$$config_disable_tele"],"volumes":["$$id-data:/usr/app/data"],"ports":["8080"]}},"variables":[{"id":"$$config_nc_db","name":"NC_DB","label":"Database","defaultValue":"","description":"MySQL, PostgreSQL and MSSQL connection urls supported. If absent: A local SQLite will be created in root folder."},{"id":"$$config_port","name":"PORT","label":"Port","defaultValue":"8080","description":""},{"id":"$$secret_database_url","name":"DATABASE_URL","label":"Database URL","defaultValue":"","description":"JDBC URL Format. Can be used instead of NC_DB. Used in 1-Click Heroku deployment."},{"id":"$$config_public_url","name":"NC_PUBLIC_URL","label":"Public URL","defaultValue":"","description":"Used for sending Email invitations. If absent: Best guess from http request params."},{"id":"$$secret_auth_jwt_secret","name":"NC_AUTH_JWT_SECRET","label":"Auth JWT Secret","defaultValue":"$$generate_hex(64)","description":"JWT secret used for auth and storing other secrets. If absent: A Random secret will be generated."},{"id":"$$secret_sentry_dsn","name":"NC_SENTRY_DSN","label":"Sentry DSN","defaultValue":"","description":"For Sentry monitoring."},{"id":"$$config_connect_to_external_db_disabled","name":"NC_CONNECT_TO_EXTERNAL_DB_DISABLED","label":"Disable External Database","defaultValue":"0","description":"Disable Project creation with external database. (Enter \"1\" to disable)."},{"id":"$$config_disable_tele","name":"NC_DISABLE_TELE","label":"NocoDB Disable Telemetry","defaultValue":"1","description":"Disable telemetry (Enter \"1\" to disable)."}]}]
\ No newline at end of file
diff --git a/apps/trpc-experimental/server/tsconfig.json b/apps/trpc-experimental/server/tsconfig.json
deleted file mode 100644
index c0c231b4e..000000000
--- a/apps/trpc-experimental/server/tsconfig.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "include": ["src", "server/src/config.ts"],
- "exclude": ["node_modules"],
- "compilerOptions": {
- "module": "commonjs",
- "target": "esnext",
- "outDir": "dist",
-
- // [ Basics ]
- "strict": true,
- "checkJs": true,
- "sourceMap": true,
- "importHelpers": true,
- "removeComments": true,
- // "rootDir": "./",
- // "declaration": true,
- // "declarationMap": true,
- // "declarationDir": "types",
-
- // [ Additional Checks ]
- "noUnusedLocals": true,
- "noImplicitReturns": true,
- "noUnusedParameters": true,
- "noImplicitOverride": true,
- "allowUnreachableCode": false,
- "noUncheckedIndexedAccess": true,
- "noFallthroughCasesInSwitch": true,
- "noPropertyAccessFromIndexSignature": true,
-
- // [ Module Resolution ]
- "esModuleInterop": true,
- "resolveJsonModule": true,
- "moduleResolution": "node",
-
- // [ Advanced ]
- // "skipLibCheck": true,
- "forceConsistentCasingInFileNames": true,
-
- // [ Build ]
- "listFiles": false,
- "listEmittedFiles": true
- }
-}
diff --git a/apps/ui/src/lib/components/CopyVolumeField.svelte b/apps/ui/src/lib/components/CopyVolumeField.svelte
new file mode 100644
index 000000000..4491f312f
--- /dev/null
+++ b/apps/ui/src/lib/components/CopyVolumeField.svelte
@@ -0,0 +1,51 @@
+
+
+
+
{value}
+
+ {#if isHttps}
+
+ {/if}
+
+
+
+
diff --git a/apps/ui/src/lib/components/svg/services/ServiceIcons.svelte b/apps/ui/src/lib/components/svg/services/ServiceIcons.svelte
index 568e5b956..bf241753a 100644
--- a/apps/ui/src/lib/components/svg/services/ServiceIcons.svelte
+++ b/apps/ui/src/lib/components/svg/services/ServiceIcons.svelte
@@ -1,25 +1,14 @@
{#if name}
diff --git a/apps/ui/src/routes/applications/[id]/_Storage.svelte b/apps/ui/src/routes/applications/[id]/_Storage.svelte
index 6e91c7d8f..0e0e13b8b 100644
--- a/apps/ui/src/routes/applications/[id]/_Storage.svelte
+++ b/apps/ui/src/routes/applications/[id]/_Storage.svelte
@@ -7,12 +7,23 @@
import { del, post } from '$lib/api';
import { page } from '$app/stores';
import { createEventDispatcher } from 'svelte';
-
+ import { browser } from '$app/env';
import { t } from '$lib/translations';
import { errorNotification } from '$lib/common';
import { addToast } from '$lib/store';
+ import CopyVolumeField from '$lib/components/CopyVolumeField.svelte';
const { id } = $page.params;
-
+ let isHttps = browser && window.location.protocol === 'https:';
+ export let value: string;
+ function copyToClipboard() {
+ if (isHttps && navigator.clipboard) {
+ navigator.clipboard.writeText(value);
+ addToast({
+ message: 'Copied to clipboard.',
+ type: 'success'
+ });
+ }
+ }
const dispatch = createEventDispatcher();
async function saveStorage(newStorage = false) {
try {
@@ -69,18 +80,14 @@
{#if storage.applicationId}
{#if storage.oldPath}
-
+ />
{:else}
-
{/if}
{/if}
diff --git a/apps/ui/src/routes/applications/[id]/configuration/_GitlabRepositories.svelte b/apps/ui/src/routes/applications/[id]/configuration/_GitlabRepositories.svelte
index 8f2c09ea0..737fc426f 100644
--- a/apps/ui/src/routes/applications/[id]/configuration/_GitlabRepositories.svelte
+++ b/apps/ui/src/routes/applications/[id]/configuration/_GitlabRepositories.svelte
@@ -56,6 +56,10 @@
Authorization: `Bearer ${$appSession.tokens.gitlab}`
});
username = user.username;
+ groups.push({
+ full_name: username,
+ name: username
+ });
await loadGroups();
} catch (error) {
loading.base = false;
diff --git a/apps/ui/src/routes/applications/[id]/configuration/source.svelte b/apps/ui/src/routes/applications/[id]/configuration/source.svelte
index 25c1ad7f0..20db4c7bb 100644
--- a/apps/ui/src/routes/applications/[id]/configuration/source.svelte
+++ b/apps/ui/src/routes/applications/[id]/configuration/source.svelte
@@ -105,7 +105,7 @@
{#if ownSources.length > 0 || otherSources.length > 0}
Integrated with Git App
{/if}
- {#if ownSources.length > 0}
+ {#if ownSources.length > 0 || otherSources.length > 0}
{#each ownSources as source}
diff --git a/apps/ui/src/routes/applications/[id]/logs/index.svelte b/apps/ui/src/routes/applications/[id]/logs/index.svelte
index 48922e660..c52e1d0cf 100644
--- a/apps/ui/src/routes/applications/[id]/logs/index.svelte
+++ b/apps/ui/src/routes/applications/[id]/logs/index.svelte
@@ -111,7 +111,7 @@
Application Logs
-
+
{#each services as service}
selectService(service, true)}
diff --git a/apps/ui/src/routes/databases/[id]/_Databases/_CouchDb.svelte b/apps/ui/src/routes/databases/[id]/_Databases/_CouchDb.svelte
index b6abcf736..4d507bb71 100644
--- a/apps/ui/src/routes/databases/[id]/_Databases/_CouchDb.svelte
+++ b/apps/ui/src/routes/databases/[id]/_Databases/_CouchDb.svelte
@@ -2,6 +2,8 @@
export let database: any;
import CopyPasswordField from '$lib/components/CopyPasswordField.svelte';
import { t } from '$lib/translations';
+ import { status } from '$lib/store';
+ import Explainer from '$lib/components/Explainer.svelte';
@@ -9,11 +11,13 @@
- {$t('database.default_database')}
+ {$t('database.default_database')}
+
+
- {$t('forms.user')}
+ {$t('forms.user')}
+
+
- {$t('forms.password')}
+ {$t('forms.password')}
+
+
- {$t('forms.root_user')}
+ {$t('forms.root_user')}
+
+
- {$t('forms.roots_password')}
+ {$t('forms.roots_password')}
+
+
diff --git a/apps/ui/src/routes/databases/[id]/_Databases/_EdgeDB.svelte b/apps/ui/src/routes/databases/[id]/_Databases/_EdgeDB.svelte
index 9c08e18fc..c9ab78a70 100644
--- a/apps/ui/src/routes/databases/[id]/_Databases/_EdgeDB.svelte
+++ b/apps/ui/src/routes/databases/[id]/_Databases/_EdgeDB.svelte
@@ -11,11 +11,12 @@
- {$t('database.default_database')}
+ {$t('database.default_database')}
+
-
{$t('forms.root_user')}
+
{$t('forms.root_user')}
+
Root Password Root Password
diff --git a/apps/ui/src/routes/databases/[id]/_Databases/_MariaDB.svelte b/apps/ui/src/routes/databases/[id]/_Databases/_MariaDB.svelte
index 95389a6aa..eda6abf41 100644
--- a/apps/ui/src/routes/databases/[id]/_Databases/_MariaDB.svelte
+++ b/apps/ui/src/routes/databases/[id]/_Databases/_MariaDB.svelte
@@ -12,12 +12,12 @@
{$t('database.default_database')} {$t('database.default_database')}
- {$t('forms.user')}
+ {$t('forms.user')}
{$t('forms.password')}
-
- {$t('forms.root_user')}
+ {$t('forms.root_user')}
{$t('forms.roots_password')}
-
- {$t('forms.root_user')}
+ {$t('forms.root_user')}
+
{$t('forms.roots_password')}
-
- {$t('database.default_database')}
+ {$t('database.default_database')}
- {$t('forms.user')}
+ {$t('forms.user')}
{$t('forms.password')}
-
- {$t('forms.root_user')}
+ {$t('forms.root_user')}
+
+
{$t('forms.roots_password')}
-
-
{$t('database.default_database')}
+
{$t('database.default_database')}
Postgres User Password Postgres User Password
{/if}
- {$t('forms.user')}
+ {$t('forms.user')}
{$t('forms.password')}
-
{$t('forms.password')}
-
-
-
-
diff --git a/apps/ui/static/icons/fider.png b/apps/ui/static/icons/fider.png
deleted file mode 100644
index 6e34acafe..000000000
Binary files a/apps/ui/static/icons/fider.png and /dev/null differ
diff --git a/apps/ui/static/icons/ghost.png b/apps/ui/static/icons/ghost.png
deleted file mode 100644
index f4e300654..000000000
Binary files a/apps/ui/static/icons/ghost.png and /dev/null differ
diff --git a/apps/ui/static/icons/gitea.svg b/apps/ui/static/icons/gitea.svg
deleted file mode 100644
index 87c7c82db..000000000
--- a/apps/ui/static/icons/gitea.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/ui/static/icons/glitchtip.svg b/apps/ui/static/icons/glitchtip.svg
deleted file mode 100644
index 2ae389aae..000000000
--- a/apps/ui/static/icons/glitchtip.svg
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/apps/ui/static/icons/grafana.png b/apps/ui/static/icons/grafana.png
deleted file mode 100644
index c8659494f..000000000
Binary files a/apps/ui/static/icons/grafana.png and /dev/null differ
diff --git a/apps/ui/static/icons/hasura.png b/apps/ui/static/icons/hasura.png
deleted file mode 100644
index 30490401e..000000000
Binary files a/apps/ui/static/icons/hasura.png and /dev/null differ
diff --git a/apps/ui/static/icons/keycloak.png b/apps/ui/static/icons/keycloak.png
deleted file mode 100644
index 8f29f7af7..000000000
Binary files a/apps/ui/static/icons/keycloak.png and /dev/null differ
diff --git a/apps/ui/static/icons/languagetool.svg b/apps/ui/static/icons/languagetool.svg
deleted file mode 100644
index fc8cab02f..000000000
--- a/apps/ui/static/icons/languagetool.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
\ No newline at end of file
diff --git a/apps/ui/static/icons/lavalink.png b/apps/ui/static/icons/lavalink.png
deleted file mode 100644
index 114458bf2..000000000
Binary files a/apps/ui/static/icons/lavalink.png and /dev/null differ
diff --git a/apps/ui/static/icons/libretranslate.png b/apps/ui/static/icons/libretranslate.png
deleted file mode 100644
index b22316b68..000000000
Binary files a/apps/ui/static/icons/libretranslate.png and /dev/null differ
diff --git a/apps/ui/static/icons/mattermost.svg b/apps/ui/static/icons/mattermost.svg
deleted file mode 100644
index e71900c57..000000000
--- a/apps/ui/static/icons/mattermost.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/apps/ui/static/icons/meilisearch.svg b/apps/ui/static/icons/meilisearch.svg
deleted file mode 100644
index 72a8f30e1..000000000
--- a/apps/ui/static/icons/meilisearch.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-
diff --git a/apps/ui/static/icons/minio.png b/apps/ui/static/icons/minio.png
deleted file mode 100644
index d1b32be9e..000000000
Binary files a/apps/ui/static/icons/minio.png and /dev/null differ
diff --git a/apps/ui/static/icons/moodle.png b/apps/ui/static/icons/moodle.png
deleted file mode 100644
index a5cec5be7..000000000
Binary files a/apps/ui/static/icons/moodle.png and /dev/null differ
diff --git a/apps/ui/static/icons/n8n.svg b/apps/ui/static/icons/n8n.svg
deleted file mode 100644
index 262a6e7a6..000000000
--- a/apps/ui/static/icons/n8n.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/apps/ui/static/icons/nocodb.png b/apps/ui/static/icons/nocodb.png
deleted file mode 100644
index dec31a6dd..000000000
Binary files a/apps/ui/static/icons/nocodb.png and /dev/null differ
diff --git a/apps/ui/static/icons/openblocks.png b/apps/ui/static/icons/openblocks.png
deleted file mode 100644
index b64d1bab3..000000000
Binary files a/apps/ui/static/icons/openblocks.png and /dev/null differ
diff --git a/apps/ui/static/icons/plausibleanalytics.png b/apps/ui/static/icons/plausibleanalytics.png
deleted file mode 100644
index c02e68d63..000000000
Binary files a/apps/ui/static/icons/plausibleanalytics.png and /dev/null differ
diff --git a/apps/ui/static/icons/pocketbase.svg b/apps/ui/static/icons/pocketbase.svg
deleted file mode 100644
index 5b5de956b..000000000
--- a/apps/ui/static/icons/pocketbase.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/apps/ui/static/icons/repman.png b/apps/ui/static/icons/repman.png
deleted file mode 100644
index ff04ecda7..000000000
Binary files a/apps/ui/static/icons/repman.png and /dev/null differ
diff --git a/apps/ui/static/icons/searxng.svg b/apps/ui/static/icons/searxng.svg
deleted file mode 100644
index c0dd11b43..000000000
--- a/apps/ui/static/icons/searxng.svg
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/ui/static/icons/soketi.png b/apps/ui/static/icons/soketi.png
deleted file mode 100644
index aec5a79a2..000000000
Binary files a/apps/ui/static/icons/soketi.png and /dev/null differ
diff --git a/apps/ui/static/icons/trilium.png b/apps/ui/static/icons/trilium.png
deleted file mode 100644
index 249aceef3..000000000
Binary files a/apps/ui/static/icons/trilium.png and /dev/null differ
diff --git a/apps/ui/static/icons/umami.svg b/apps/ui/static/icons/umami.svg
deleted file mode 100644
index b9d1abca3..000000000
--- a/apps/ui/static/icons/umami.svg
+++ /dev/null
@@ -1,78 +0,0 @@
-
- Created by potrace 1.11, written by Peter Selinger 2001-2013
-
-
-
-
diff --git a/apps/ui/static/icons/uptimekuma.svg b/apps/ui/static/icons/uptimekuma.svg
deleted file mode 100644
index e67bc836a..000000000
--- a/apps/ui/static/icons/uptimekuma.svg
+++ /dev/null
@@ -1,154 +0,0 @@
-
diff --git a/apps/ui/static/icons/vaultwarden.svg b/apps/ui/static/icons/vaultwarden.svg
deleted file mode 100644
index 15433d8ed..000000000
--- a/apps/ui/static/icons/vaultwarden.svg
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
diff --git a/apps/ui/static/icons/vscodeserver.png b/apps/ui/static/icons/vscodeserver.png
deleted file mode 100644
index 37a084767..000000000
Binary files a/apps/ui/static/icons/vscodeserver.png and /dev/null differ
diff --git a/apps/ui/static/icons/weblate.svg b/apps/ui/static/icons/weblate.svg
deleted file mode 100644
index 99c6ac483..000000000
--- a/apps/ui/static/icons/weblate.svg
+++ /dev/null
@@ -1,56 +0,0 @@
-
diff --git a/apps/ui/static/icons/whoogle.png b/apps/ui/static/icons/whoogle.png
deleted file mode 100644
index 590875748..000000000
Binary files a/apps/ui/static/icons/whoogle.png and /dev/null differ
diff --git a/apps/ui/static/icons/wordpress.svg b/apps/ui/static/icons/wordpress.svg
deleted file mode 100644
index 31149e2ba..000000000
--- a/apps/ui/static/icons/wordpress.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/docs/dev_setup/GitPod.md b/docs/dev_setup/GitPod.md
index 3293154f9..21a92e111 100644
--- a/docs/dev_setup/GitPod.md
+++ b/docs/dev_setup/GitPod.md
@@ -1,6 +1,6 @@
### Gitpod
-#### Option 1 - Prefered:
+#### Option 1 - Preferred:
Follow the same steps as [container based development flow](./Container.md)
@@ -16,4 +16,4 @@ All the required dependencies and packages has been configured for you already.
> Some packages, just `pack` are not installed in this way.
You cannot test all the features.
- Please use the [container based development flow](./Container.md).
\ No newline at end of file
+ Please use the [container based development flow](./Container.md).
diff --git a/others/logo/ccc-logo.webp b/others/logo/ccc-logo.webp
new file mode 100644
index 000000000..e7066e301
Binary files /dev/null and b/others/logo/ccc-logo.webp differ
diff --git a/others/pocketbase/Dockerfile b/others/pocketbase/Dockerfile
index c8d8bdb7b..392e8fd53 100644
--- a/others/pocketbase/Dockerfile
+++ b/others/pocketbase/Dockerfile
@@ -1,6 +1,6 @@
FROM alpine:3.17
-ARG BUILDARCH
-ARG PB_VERSION=0.11.0
+ARG BUILDARCH
+ARG PB_VERSION=0.12.3
RUN apk add --no-cache \
unzip \
ca-certificates
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index e19fab50f..1c199b79d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -20,7 +20,7 @@ importers:
'@fastify/cors': 8.2.0
'@fastify/env': 4.2.0
'@fastify/jwt': 6.5.0
- '@fastify/multipart': 7.3.0
+ '@fastify/multipart': 7.4.1
'@fastify/static': 6.6.0
'@iarna/toml': 2.2.5
'@ladjs/graceful': 3.2.1
@@ -82,7 +82,7 @@ importers:
'@fastify/cors': 8.2.0
'@fastify/env': 4.2.0
'@fastify/jwt': 6.5.0
- '@fastify/multipart': 7.3.0
+ '@fastify/multipart': 7.4.1
'@fastify/static': 6.6.0
'@iarna/toml': 2.2.5
'@ladjs/graceful': 3.2.1
@@ -139,220 +139,6 @@ importers:
types-fastify-socket.io: 0.0.1
typescript: 4.9.4
- apps/backup:
- specifiers:
- '@aws-sdk/client-s3': ^3.222.0
- '@aws-sdk/lib-storage': ^3.222.0
- cuid: 2.1.8
- dotenv: 16.0.3
- zx: 7.1.1
- dependencies:
- '@aws-sdk/client-s3': 3.222.0
- '@aws-sdk/lib-storage': 3.222.0_@aws-sdk+client-s3@3.222.0
- cuid: 2.1.8
- dotenv: 16.0.3
- zx: 7.1.1
-
- apps/client:
- specifiers:
- '@playwright/test': 1.28.1
- '@sveltejs/adapter-static': 1.0.0-next.48
- '@sveltejs/kit': 1.0.0-next.572
- '@trpc/client': 10.1.0
- '@trpc/server': 10.1.0
- '@types/js-cookie': 3.0.2
- '@typescript-eslint/eslint-plugin': 5.44.0
- '@typescript-eslint/parser': 5.44.0
- autoprefixer: 10.4.13
- cuid: 2.1.8
- daisyui: 2.41.0
- dayjs: 1.11.6
- eslint: 8.28.0
- eslint-config-prettier: 8.5.0
- eslint-plugin-svelte3: 4.0.0
- flowbite-svelte: 0.28.0
- js-cookie: 3.0.1
- js-yaml: 4.1.0
- p-limit: 4.0.0
- postcss: 8.4.19
- postcss-load-config: 4.0.1
- prettier: 2.8.0
- prettier-plugin-svelte: 2.8.1
- server: workspace:*
- superjson: 1.11.0
- svelte: 3.53.1
- svelte-check: 2.9.2
- svelte-preprocess: ^4.10.7
- svelte-select: 4.4.7
- tailwindcss: 3.2.4
- tslib: 2.4.1
- typescript: 4.9.3
- vite: 3.2.4
- dependencies:
- '@trpc/client': 10.1.0_@trpc+server@10.1.0
- '@trpc/server': 10.1.0
- cuid: 2.1.8
- daisyui: 2.41.0_2lwn2upnx27dqeg6hqdu7sq75m
- dayjs: 1.11.6
- flowbite-svelte: 0.28.0
- js-cookie: 3.0.1
- js-yaml: 4.1.0
- p-limit: 4.0.0
- server: link:../server
- superjson: 1.11.0
- svelte-select: 4.4.7
- devDependencies:
- '@playwright/test': 1.28.1
- '@sveltejs/adapter-static': 1.0.0-next.48
- '@sveltejs/kit': 1.0.0-next.572_svelte@3.53.1+vite@3.2.4
- '@types/js-cookie': 3.0.2
- '@typescript-eslint/eslint-plugin': 5.44.0_fnsv2sbzcckq65bwfk7a5xwslu
- '@typescript-eslint/parser': 5.44.0_hsf322ms6xhhd4b5ne6lb74y4a
- autoprefixer: 10.4.13_postcss@8.4.19
- eslint: 8.28.0
- eslint-config-prettier: 8.5.0_eslint@8.28.0
- eslint-plugin-svelte3: 4.0.0_xgu65rlhscpnxffotiaicv6m5i
- postcss: 8.4.19
- postcss-load-config: 4.0.1_postcss@8.4.19
- prettier: 2.8.0
- prettier-plugin-svelte: 2.8.1_3ndnxlh52lolrqe4kgjgbxb3xa
- svelte: 3.53.1
- svelte-check: 2.9.2_g7z2chviobwh5b53nr2x4mtdq4
- svelte-preprocess: 4.10.7_jgeygver3mevbte7srfft5qwby
- tailwindcss: 3.2.4_postcss@8.4.19
- tslib: 2.4.1
- typescript: 4.9.3
- vite: 3.2.4
-
- apps/i18n:
- specifiers:
- dotenv: 16.0.2
- gettext-parser: 6.0.0
- got: 12.3.1
- node-gettext: 3.0.0
- dependencies:
- dotenv: 16.0.2
- gettext-parser: 6.0.0
- got: 12.3.1
- node-gettext: 3.0.0
-
- apps/server:
- specifiers:
- '@breejs/ts-worker': 2.0.0
- '@fastify/autoload': 5.6.0
- '@fastify/cors': 8.2.0
- '@fastify/env': 4.1.0
- '@fastify/jwt': 6.5.0
- '@fastify/static': 6.6.0
- '@fastify/websocket': 7.1.1
- '@iarna/toml': 2.2.5
- '@ladjs/graceful': 3.0.2
- '@prisma/client': 4.6.1
- '@trpc/client': 10.1.0
- '@trpc/server': 10.1.0
- '@types/bcryptjs': ^2.4.2
- '@types/js-yaml': ^4.0.5
- '@types/jsonwebtoken': ^8.5.9
- '@types/node': 18.11.9
- '@types/node-fetch': 2.6.2
- '@types/shell-quote': ^1.7.1
- '@types/ws': 8.5.3
- abort-controller: 3.0.0
- axe: 11.0.0
- bcryptjs: 2.4.3
- bree: 9.1.2
- cabin: 11.0.1
- csvtojson: 2.0.10
- cuid: 2.1.8
- dayjs: 1.11.6
- dotenv: ^16.0.3
- esbuild: 0.15.15
- execa: 6.1.0
- fastify: 4.10.2
- fastify-plugin: 4.4.0
- got: ^12.5.3
- is-ip: 5.0.0
- is-port-reachable: 4.0.0
- js-yaml: 4.1.0
- jsonwebtoken: 9.0.0
- node-fetch: 3.3.0
- nodemon: 2.0.20
- npm-run-all: 4.1.5
- p-all: 4.0.0
- p-throttle: 5.0.0
- prisma: 4.6.1
- rimraf: 3.0.2
- shell-quote: ^1.7.4
- ssh-config: 4.1.6
- start-server-and-test: 1.14.0
- strip-ansi: 7.0.1
- superjson: 1.11.0
- tslib: 2.4.1
- tsx: 3.12.1
- typescript: 4.9.3
- unique-names-generator: 4.7.1
- wait-port: 1.0.4
- ws: 8.11.0
- zod: 3.19.1
- dependencies:
- '@breejs/ts-worker': 2.0.0_7ja7ufy2vbczkqoi6dab6h7sdi
- '@fastify/autoload': 5.6.0
- '@fastify/cors': 8.2.0
- '@fastify/env': 4.1.0
- '@fastify/jwt': 6.5.0
- '@fastify/static': 6.6.0
- '@fastify/websocket': 7.1.1
- '@iarna/toml': 2.2.5
- '@ladjs/graceful': 3.0.2
- '@prisma/client': 4.6.1_prisma@4.6.1
- '@trpc/client': 10.1.0_@trpc+server@10.1.0
- '@trpc/server': 10.1.0
- abort-controller: 3.0.0
- axe: 11.0.0
- bcryptjs: 2.4.3
- bree: 9.1.2
- cabin: 11.0.1_axe@11.0.0
- csvtojson: 2.0.10
- cuid: 2.1.8
- dayjs: 1.11.6
- dotenv: 16.0.3
- execa: 6.1.0
- fastify: 4.10.2
- fastify-plugin: 4.4.0
- got: 12.5.3
- is-ip: 5.0.0
- is-port-reachable: 4.0.0
- js-yaml: 4.1.0
- jsonwebtoken: 9.0.0
- node-fetch: 3.3.0
- p-all: 4.0.0
- p-throttle: 5.0.0
- prisma: 4.6.1
- shell-quote: 1.7.4
- ssh-config: 4.1.6
- strip-ansi: 7.0.1
- superjson: 1.11.0
- tslib: 2.4.1
- unique-names-generator: 4.7.1
- ws: 8.11.0
- zod: 3.19.1
- devDependencies:
- '@types/bcryptjs': 2.4.2
- '@types/js-yaml': 4.0.5
- '@types/jsonwebtoken': 8.5.9
- '@types/node': 18.11.9
- '@types/node-fetch': 2.6.2
- '@types/shell-quote': 1.7.1
- '@types/ws': 8.5.3
- esbuild: 0.15.15
- nodemon: 2.0.20
- npm-run-all: 4.1.5
- rimraf: 3.0.2
- start-server-and-test: 1.14.0
- tsx: 3.12.1
- typescript: 4.9.3
- wait-port: 1.0.4
-
apps/ui:
specifiers:
'@floating-ui/dom': 1.0.6
@@ -436,983 +222,6 @@ importers:
packages:
- /@aws-crypto/crc32/2.0.0:
- resolution: {integrity: sha512-TvE1r2CUueyXOuHdEigYjIZVesInd9KN+K/TFFNfkkxRThiNxO6i4ZqqAVMoEjAamZZ1AA8WXJkjCz7YShHPQA==}
- dependencies:
- '@aws-crypto/util': 2.0.2
- '@aws-sdk/types': 3.222.0
- tslib: 1.14.1
- dev: false
-
- /@aws-crypto/crc32c/2.0.0:
- resolution: {integrity: sha512-vF0eMdMHx3O3MoOXUfBZry8Y4ZDtcuskjjKgJz8YfIDjLStxTZrYXk+kZqtl6A0uCmmiN/Eb/JbC/CndTV1MHg==}
- dependencies:
- '@aws-crypto/util': 2.0.2
- '@aws-sdk/types': 3.222.0
- tslib: 1.14.1
- dev: false
-
- /@aws-crypto/ie11-detection/2.0.2:
- resolution: {integrity: sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==}
- dependencies:
- tslib: 1.14.1
- dev: false
-
- /@aws-crypto/sha1-browser/2.0.0:
- resolution: {integrity: sha512-3fIVRjPFY8EG5HWXR+ZJZMdWNRpwbxGzJ9IH9q93FpbgCH8u8GHRi46mZXp3cYD7gealmyqpm3ThZwLKJjWJhA==}
- dependencies:
- '@aws-crypto/ie11-detection': 2.0.2
- '@aws-crypto/supports-web-crypto': 2.0.2
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/util-locate-window': 3.208.0
- '@aws-sdk/util-utf8-browser': 3.188.0
- tslib: 1.14.1
- dev: false
-
- /@aws-crypto/sha256-browser/2.0.0:
- resolution: {integrity: sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==}
- dependencies:
- '@aws-crypto/ie11-detection': 2.0.2
- '@aws-crypto/sha256-js': 2.0.0
- '@aws-crypto/supports-web-crypto': 2.0.2
- '@aws-crypto/util': 2.0.2
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/util-locate-window': 3.208.0
- '@aws-sdk/util-utf8-browser': 3.188.0
- tslib: 1.14.1
- dev: false
-
- /@aws-crypto/sha256-js/2.0.0:
- resolution: {integrity: sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==}
- dependencies:
- '@aws-crypto/util': 2.0.2
- '@aws-sdk/types': 3.222.0
- tslib: 1.14.1
- dev: false
-
- /@aws-crypto/supports-web-crypto/2.0.2:
- resolution: {integrity: sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==}
- dependencies:
- tslib: 1.14.1
- dev: false
-
- /@aws-crypto/util/2.0.2:
- resolution: {integrity: sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==}
- dependencies:
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/util-utf8-browser': 3.188.0
- tslib: 1.14.1
- dev: false
-
- /@aws-sdk/abort-controller/3.222.0:
- resolution: {integrity: sha512-Ric2vJQEWrzz915wBeZlYLWAnIsnywOcZpzroPVTY/TNKRvM0GcSPVuD9vv1lOwybVnDHsipukzwQBAZXkNWVA==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/chunked-blob-reader-native/3.208.0:
- resolution: {integrity: sha512-JeOZ95PW+fJ6bbuqPySYqLqHk1n4+4ueEEraJsiUrPBV0S1ZtyvOGHcnGztKUjr2PYNaiexmpWuvUve9K12HRA==}
- dependencies:
- '@aws-sdk/util-base64': 3.208.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/chunked-blob-reader/3.188.0:
- resolution: {integrity: sha512-zkPRFZZPL3eH+kH86LDYYXImiClA1/sW60zYOjse9Pgka+eDJlvBN6hcYxwDEKjcwATYiSRR1aVQHcfCinlGXg==}
- dependencies:
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/client-s3/3.222.0:
- resolution: {integrity: sha512-QHTZ6vt6t0gsX5lM/ylybj2FKtfJsjV9nbx1Q9QhLfAe6e3vb7mOpMS8eTVAs6al+OaweCV0+blgPT8dhEXI3g==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-crypto/sha1-browser': 2.0.0
- '@aws-crypto/sha256-browser': 2.0.0
- '@aws-crypto/sha256-js': 2.0.0
- '@aws-sdk/client-sts': 3.222.0
- '@aws-sdk/config-resolver': 3.222.0
- '@aws-sdk/credential-provider-node': 3.222.0
- '@aws-sdk/eventstream-serde-browser': 3.222.0
- '@aws-sdk/eventstream-serde-config-resolver': 3.222.0
- '@aws-sdk/eventstream-serde-node': 3.222.0
- '@aws-sdk/fetch-http-handler': 3.222.0
- '@aws-sdk/hash-blob-browser': 3.222.0
- '@aws-sdk/hash-node': 3.222.0
- '@aws-sdk/hash-stream-node': 3.222.0
- '@aws-sdk/invalid-dependency': 3.222.0
- '@aws-sdk/md5-js': 3.222.0
- '@aws-sdk/middleware-bucket-endpoint': 3.222.0
- '@aws-sdk/middleware-content-length': 3.222.0
- '@aws-sdk/middleware-endpoint': 3.222.0
- '@aws-sdk/middleware-expect-continue': 3.222.0
- '@aws-sdk/middleware-flexible-checksums': 3.222.0
- '@aws-sdk/middleware-host-header': 3.222.0
- '@aws-sdk/middleware-location-constraint': 3.222.0
- '@aws-sdk/middleware-logger': 3.222.0
- '@aws-sdk/middleware-recursion-detection': 3.222.0
- '@aws-sdk/middleware-retry': 3.222.0
- '@aws-sdk/middleware-sdk-s3': 3.222.0
- '@aws-sdk/middleware-serde': 3.222.0
- '@aws-sdk/middleware-signing': 3.222.0
- '@aws-sdk/middleware-ssec': 3.222.0
- '@aws-sdk/middleware-stack': 3.222.0
- '@aws-sdk/middleware-user-agent': 3.222.0
- '@aws-sdk/node-config-provider': 3.222.0
- '@aws-sdk/node-http-handler': 3.222.0
- '@aws-sdk/protocol-http': 3.222.0
- '@aws-sdk/signature-v4-multi-region': 3.222.0
- '@aws-sdk/smithy-client': 3.222.0
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/url-parser': 3.222.0
- '@aws-sdk/util-base64': 3.208.0
- '@aws-sdk/util-body-length-browser': 3.188.0
- '@aws-sdk/util-body-length-node': 3.208.0
- '@aws-sdk/util-defaults-mode-browser': 3.222.0
- '@aws-sdk/util-defaults-mode-node': 3.222.0
- '@aws-sdk/util-endpoints': 3.222.0
- '@aws-sdk/util-retry': 3.222.0
- '@aws-sdk/util-stream-browser': 3.222.0
- '@aws-sdk/util-stream-node': 3.222.0
- '@aws-sdk/util-user-agent-browser': 3.222.0
- '@aws-sdk/util-user-agent-node': 3.222.0
- '@aws-sdk/util-utf8-browser': 3.188.0
- '@aws-sdk/util-utf8-node': 3.208.0
- '@aws-sdk/util-waiter': 3.222.0
- '@aws-sdk/xml-builder': 3.201.0
- fast-xml-parser: 4.0.11
- tslib: 2.4.1
- transitivePeerDependencies:
- - '@aws-sdk/signature-v4-crt'
- - aws-crt
- dev: false
-
- /@aws-sdk/client-sso-oidc/3.222.0:
- resolution: {integrity: sha512-qC4SOKojOWCixvtma3/pwumRzkqHd19FL17ImR+p3C6J0CsSIzjBsKOxLjQMfaE0usAdqStxjULxJDAvWLElJA==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-crypto/sha256-browser': 2.0.0
- '@aws-crypto/sha256-js': 2.0.0
- '@aws-sdk/config-resolver': 3.222.0
- '@aws-sdk/fetch-http-handler': 3.222.0
- '@aws-sdk/hash-node': 3.222.0
- '@aws-sdk/invalid-dependency': 3.222.0
- '@aws-sdk/middleware-content-length': 3.222.0
- '@aws-sdk/middleware-endpoint': 3.222.0
- '@aws-sdk/middleware-host-header': 3.222.0
- '@aws-sdk/middleware-logger': 3.222.0
- '@aws-sdk/middleware-recursion-detection': 3.222.0
- '@aws-sdk/middleware-retry': 3.222.0
- '@aws-sdk/middleware-serde': 3.222.0
- '@aws-sdk/middleware-stack': 3.222.0
- '@aws-sdk/middleware-user-agent': 3.222.0
- '@aws-sdk/node-config-provider': 3.222.0
- '@aws-sdk/node-http-handler': 3.222.0
- '@aws-sdk/protocol-http': 3.222.0
- '@aws-sdk/smithy-client': 3.222.0
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/url-parser': 3.222.0
- '@aws-sdk/util-base64': 3.208.0
- '@aws-sdk/util-body-length-browser': 3.188.0
- '@aws-sdk/util-body-length-node': 3.208.0
- '@aws-sdk/util-defaults-mode-browser': 3.222.0
- '@aws-sdk/util-defaults-mode-node': 3.222.0
- '@aws-sdk/util-endpoints': 3.222.0
- '@aws-sdk/util-retry': 3.222.0
- '@aws-sdk/util-user-agent-browser': 3.222.0
- '@aws-sdk/util-user-agent-node': 3.222.0
- '@aws-sdk/util-utf8-browser': 3.188.0
- '@aws-sdk/util-utf8-node': 3.208.0
- tslib: 2.4.1
- transitivePeerDependencies:
- - aws-crt
- dev: false
-
- /@aws-sdk/client-sso/3.222.0:
- resolution: {integrity: sha512-ISJRxT7DLaBwUJSdQoLS/7rWLoYGv6b3C7vTm4hQwDz83+JcdfDODir4iR0REhZfisce8Er6S06WtwAIyokzpQ==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-crypto/sha256-browser': 2.0.0
- '@aws-crypto/sha256-js': 2.0.0
- '@aws-sdk/config-resolver': 3.222.0
- '@aws-sdk/fetch-http-handler': 3.222.0
- '@aws-sdk/hash-node': 3.222.0
- '@aws-sdk/invalid-dependency': 3.222.0
- '@aws-sdk/middleware-content-length': 3.222.0
- '@aws-sdk/middleware-endpoint': 3.222.0
- '@aws-sdk/middleware-host-header': 3.222.0
- '@aws-sdk/middleware-logger': 3.222.0
- '@aws-sdk/middleware-recursion-detection': 3.222.0
- '@aws-sdk/middleware-retry': 3.222.0
- '@aws-sdk/middleware-serde': 3.222.0
- '@aws-sdk/middleware-stack': 3.222.0
- '@aws-sdk/middleware-user-agent': 3.222.0
- '@aws-sdk/node-config-provider': 3.222.0
- '@aws-sdk/node-http-handler': 3.222.0
- '@aws-sdk/protocol-http': 3.222.0
- '@aws-sdk/smithy-client': 3.222.0
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/url-parser': 3.222.0
- '@aws-sdk/util-base64': 3.208.0
- '@aws-sdk/util-body-length-browser': 3.188.0
- '@aws-sdk/util-body-length-node': 3.208.0
- '@aws-sdk/util-defaults-mode-browser': 3.222.0
- '@aws-sdk/util-defaults-mode-node': 3.222.0
- '@aws-sdk/util-endpoints': 3.222.0
- '@aws-sdk/util-retry': 3.222.0
- '@aws-sdk/util-user-agent-browser': 3.222.0
- '@aws-sdk/util-user-agent-node': 3.222.0
- '@aws-sdk/util-utf8-browser': 3.188.0
- '@aws-sdk/util-utf8-node': 3.208.0
- tslib: 2.4.1
- transitivePeerDependencies:
- - aws-crt
- dev: false
-
- /@aws-sdk/client-sts/3.222.0:
- resolution: {integrity: sha512-CZ2eY6aM5YnMzNIvy8t03tr2/iMljkWA4YbMV4lc8HN9qGEh/zUQcNQU2og8nVuo8KjL/4fXXllyUCS8odPnDQ==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-crypto/sha256-browser': 2.0.0
- '@aws-crypto/sha256-js': 2.0.0
- '@aws-sdk/config-resolver': 3.222.0
- '@aws-sdk/credential-provider-node': 3.222.0
- '@aws-sdk/fetch-http-handler': 3.222.0
- '@aws-sdk/hash-node': 3.222.0
- '@aws-sdk/invalid-dependency': 3.222.0
- '@aws-sdk/middleware-content-length': 3.222.0
- '@aws-sdk/middleware-endpoint': 3.222.0
- '@aws-sdk/middleware-host-header': 3.222.0
- '@aws-sdk/middleware-logger': 3.222.0
- '@aws-sdk/middleware-recursion-detection': 3.222.0
- '@aws-sdk/middleware-retry': 3.222.0
- '@aws-sdk/middleware-sdk-sts': 3.222.0
- '@aws-sdk/middleware-serde': 3.222.0
- '@aws-sdk/middleware-signing': 3.222.0
- '@aws-sdk/middleware-stack': 3.222.0
- '@aws-sdk/middleware-user-agent': 3.222.0
- '@aws-sdk/node-config-provider': 3.222.0
- '@aws-sdk/node-http-handler': 3.222.0
- '@aws-sdk/protocol-http': 3.222.0
- '@aws-sdk/smithy-client': 3.222.0
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/url-parser': 3.222.0
- '@aws-sdk/util-base64': 3.208.0
- '@aws-sdk/util-body-length-browser': 3.188.0
- '@aws-sdk/util-body-length-node': 3.208.0
- '@aws-sdk/util-defaults-mode-browser': 3.222.0
- '@aws-sdk/util-defaults-mode-node': 3.222.0
- '@aws-sdk/util-endpoints': 3.222.0
- '@aws-sdk/util-retry': 3.222.0
- '@aws-sdk/util-user-agent-browser': 3.222.0
- '@aws-sdk/util-user-agent-node': 3.222.0
- '@aws-sdk/util-utf8-browser': 3.188.0
- '@aws-sdk/util-utf8-node': 3.208.0
- fast-xml-parser: 4.0.11
- tslib: 2.4.1
- transitivePeerDependencies:
- - aws-crt
- dev: false
-
- /@aws-sdk/config-resolver/3.222.0:
- resolution: {integrity: sha512-rG/Yh0R+GQe86ofEb24QAjQ19tHb4HMCyCuMZUZCsIdgNmUfcaH21Ug5s7pJrAfEy/F2gwxs+VfBeXKjT0MqSQ==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/signature-v4': 3.222.0
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/util-config-provider': 3.208.0
- '@aws-sdk/util-middleware': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/credential-provider-env/3.222.0:
- resolution: {integrity: sha512-xV6cmJ9zMi8nWySqBv1ze/EFlzXEfazu3i/T/5MpOufPvuGpXTQ3/PDEbC6mKBtvomoQ0fonc/cZrix7YcJV0Q==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/property-provider': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/credential-provider-imds/3.222.0:
- resolution: {integrity: sha512-n090ouw5AFhb0EfzRElUTmqCNOQ1zjlxau30oVM7+qKtXH85hEGMQOoRQAl9ch/pXcbjKLh1mbUhmonR97/Kvw==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/node-config-provider': 3.222.0
- '@aws-sdk/property-provider': 3.222.0
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/url-parser': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/credential-provider-ini/3.222.0:
- resolution: {integrity: sha512-KtOYx0nGwu8466G7oWtFU2u3uKZziwV14xeoYNysnMn77nPE7PtlC3WOzE2p3tSGwfVnaGlmYqWEN4+QrY1zpQ==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/credential-provider-env': 3.222.0
- '@aws-sdk/credential-provider-imds': 3.222.0
- '@aws-sdk/credential-provider-sso': 3.222.0
- '@aws-sdk/credential-provider-web-identity': 3.222.0
- '@aws-sdk/property-provider': 3.222.0
- '@aws-sdk/shared-ini-file-loader': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- transitivePeerDependencies:
- - aws-crt
- dev: false
-
- /@aws-sdk/credential-provider-node/3.222.0:
- resolution: {integrity: sha512-aWolcqDLgxL7ugyF5954/DrqcAl81PzwZ+ik2IMPCHOGWmsIWoecxMmXXbukrhzIegmVc7DwmN1qmT8KsURj0Q==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/credential-provider-env': 3.222.0
- '@aws-sdk/credential-provider-imds': 3.222.0
- '@aws-sdk/credential-provider-ini': 3.222.0
- '@aws-sdk/credential-provider-process': 3.222.0
- '@aws-sdk/credential-provider-sso': 3.222.0
- '@aws-sdk/credential-provider-web-identity': 3.222.0
- '@aws-sdk/property-provider': 3.222.0
- '@aws-sdk/shared-ini-file-loader': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- transitivePeerDependencies:
- - aws-crt
- dev: false
-
- /@aws-sdk/credential-provider-process/3.222.0:
- resolution: {integrity: sha512-IgEk8Tne1b2v2k/wVjuddKi+HEAFJWUoEcvLCnYRdlVX5l+Nnatw8vGYb+gTi9X7nKNqEGfMbifKCFoePKjC0Q==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/property-provider': 3.222.0
- '@aws-sdk/shared-ini-file-loader': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/credential-provider-sso/3.222.0:
- resolution: {integrity: sha512-2bl4lapUNDk95tVyTvbaYYSczxpC5WCFW7mmf8HGxTau4a6oELRsFaKeNzyuaL/IQ8hYhaVWR7nUCxIEqVngWw==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/client-sso': 3.222.0
- '@aws-sdk/property-provider': 3.222.0
- '@aws-sdk/shared-ini-file-loader': 3.222.0
- '@aws-sdk/token-providers': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- transitivePeerDependencies:
- - aws-crt
- dev: false
-
- /@aws-sdk/credential-provider-web-identity/3.222.0:
- resolution: {integrity: sha512-dImqTEWt38nVcDe/wQqHWJ+R2zyNqVKwejfslgbH2YilUnDU43xq2KJhNe4s+YhCB6tHOTkbNnpZo7vPV5Zxog==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/property-provider': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/eventstream-codec/3.222.0:
- resolution: {integrity: sha512-sxLpo3NYrvj8CnTkpLsb2uXvUU8jnAG5q22HIBxBrpeFzgvUA9uIfPD7yPZhe4+/C7v+ER19ysXetKjiAOrQMA==}
- dependencies:
- '@aws-crypto/crc32': 2.0.0
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/util-hex-encoding': 3.201.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/eventstream-serde-browser/3.222.0:
- resolution: {integrity: sha512-owwgmkpuLM7UtNPRZjvCOp5fo6MKY8avygQA0VMsbQSCq1DJFpmDsk7yTRB+n7jQuoDGn8uVxER3S0oS/Y/xVQ==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/eventstream-serde-universal': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/eventstream-serde-config-resolver/3.222.0:
- resolution: {integrity: sha512-zb8vMSbBEjUrHKpA2bZdAqfYp8oCsWgeBPOt0XJx+y6lzy67zyADs97Grl+lyZAoswao/zc2sxgm9yqcMDt7lQ==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/eventstream-serde-node/3.222.0:
- resolution: {integrity: sha512-rfDrTxcsYL0ZKc5MnoqbDTa0oQFiK7qTJOnQ7sASooexqoKTn3wVq68J7TZddbImmH/ENpkU+O0hcGuiwE9Ucg==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/eventstream-serde-universal': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/eventstream-serde-universal/3.222.0:
- resolution: {integrity: sha512-+/Fc7+ZPuD6SwphYcuLJ/GU0RmVzG/M0dUYs1JL/JQJ8dkJ0AlH1fH3L5Fhm2RO/ACkE28kXAuyZ40TLeRLRNA==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/eventstream-codec': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/fetch-http-handler/3.222.0:
- resolution: {integrity: sha512-0PWnOp47mNfwBFEZhuBpz5A+66jbvb2ySidnM5vWHRxu5yN7rCJEdEMSJKDzR6nH3GLZ9dHoOxTzQy21NoDTtA==}
- dependencies:
- '@aws-sdk/protocol-http': 3.222.0
- '@aws-sdk/querystring-builder': 3.222.0
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/util-base64': 3.208.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/hash-blob-browser/3.222.0:
- resolution: {integrity: sha512-Z6y3JZPNp+os9vZdvsNkM6mIjDzeZNr9MYkQslANhGZ9WgQrzuI7xZN6XAyR83OGRCrDCorZdX+nnl5mzY1VwQ==}
- dependencies:
- '@aws-sdk/chunked-blob-reader': 3.188.0
- '@aws-sdk/chunked-blob-reader-native': 3.208.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/hash-node/3.222.0:
- resolution: {integrity: sha512-Fw0acblG0LQT9tfD2/4j98QHNq+Crotig/M1/zPDcVoGb8OBHd2442zpeA0fYYjGnGGhy9psRHdJrjZGj1vDUw==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/util-buffer-from': 3.208.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/hash-stream-node/3.222.0:
- resolution: {integrity: sha512-PO/N0PsgJjRiH9WKSOnGjDP9tWNjwSvUezicT8ItWgkk7npd278MAe7G692TLACgf6sJr2jGQbs6xzZHq0/3Zg==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/invalid-dependency/3.222.0:
- resolution: {integrity: sha512-tWJWWTcL7DrhFiDmPBvLaw2lopHJMsF4Uj52yIQJskwd2IeBOxjl30zLo/oidmk73IFUB7TCObc85zJrtt/KcQ==}
- dependencies:
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/is-array-buffer/3.201.0:
- resolution: {integrity: sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==}
- engines: {node: '>=14.0.0'}
- dependencies:
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/lib-storage/3.222.0_@aws-sdk+client-s3@3.222.0:
- resolution: {integrity: sha512-f5bAtkT+FqPrYNAT6ZcVj8yXEFdCY6/Pf9buOz/3xqICn5oJzFotkXel7lrFptKfnzVtbwZvrti38h/tl89Erg==}
- engines: {node: '>=14.0.0'}
- peerDependencies:
- '@aws-sdk/abort-controller': ^3.0.0
- '@aws-sdk/client-s3': ^3.0.0
- dependencies:
- '@aws-sdk/client-s3': 3.222.0
- '@aws-sdk/middleware-endpoint': 3.222.0
- '@aws-sdk/smithy-client': 3.222.0
- buffer: 5.6.0
- events: 3.3.0
- stream-browserify: 3.0.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/md5-js/3.222.0:
- resolution: {integrity: sha512-LI44dy+ECCL+vsIYJ/Ot4rNOl3Vpa4Nv8zxireKcQGmn547Cb6i3n/bEi/DkcfgHv6R84qOtOXsxt/ILuWNQ/g==}
- dependencies:
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/util-utf8-browser': 3.188.0
- '@aws-sdk/util-utf8-node': 3.208.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/middleware-bucket-endpoint/3.222.0:
- resolution: {integrity: sha512-TP4mjEWsQ/JsACAFDUlltl/0sAe5dxqdhBDAPO6LHRHvROz2oYVjZwvcaK4F9x8QLWh09H0Sw501SndFK2+o3w==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/protocol-http': 3.222.0
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/util-arn-parser': 3.208.0
- '@aws-sdk/util-config-provider': 3.208.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/middleware-content-length/3.222.0:
- resolution: {integrity: sha512-Wlah+nrPhcq5qcwHiK1ymVRAvcKjV2py2RXhJsNZWgYwphdt5RHaZHPDKoodI27alrDJVyBBQWGzIm/Ag1bypQ==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/protocol-http': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/middleware-endpoint/3.222.0:
- resolution: {integrity: sha512-e1bM+CvuUWmBdydQpV5sF8cxZrXQ++0G5s1M7pLimKdWXQvCQ1ZEwA3LLi2IWomXmS9a3BaH3iKAf87RTWjIXw==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/middleware-serde': 3.222.0
- '@aws-sdk/protocol-http': 3.222.0
- '@aws-sdk/signature-v4': 3.222.0
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/url-parser': 3.222.0
- '@aws-sdk/util-config-provider': 3.208.0
- '@aws-sdk/util-middleware': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/middleware-expect-continue/3.222.0:
- resolution: {integrity: sha512-/nTCLXrau8jEyehsD7QM49gJQ6kmzQGw7plPDJzdFakfAwb2b/jLJ/Hj/ZSaaLWWEXAtZBiPzVXUJltPDoXv5g==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/protocol-http': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/middleware-flexible-checksums/3.222.0:
- resolution: {integrity: sha512-P900+KLMUg0eOf75FK/wH/Gjz3rkNtB6iBfAG2Xg4DY5+78qh40deG0y0ZvtkHQP8YOqjLF3QMbEA90YXo4x9Q==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-crypto/crc32': 2.0.0
- '@aws-crypto/crc32c': 2.0.0
- '@aws-sdk/is-array-buffer': 3.201.0
- '@aws-sdk/protocol-http': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/middleware-host-header/3.222.0:
- resolution: {integrity: sha512-R4STwHkWgdxMRqOy6riYfXepsQURR5YhK6psPFZHkBYByIRc9JxJdLA0qZcfLRriQIAGmqEO2WWsqRmr8nkbBw==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/protocol-http': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/middleware-location-constraint/3.222.0:
- resolution: {integrity: sha512-srrAkOHuvpXeaMG9a6kvfYrhzFFX/plBaZATy8iW6ethgvG1qdPeFj4ZVS9Eisx+13NbGFtydc1WkBZfx2nUWg==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/middleware-logger/3.222.0:
- resolution: {integrity: sha512-eAxGCcNXl1APMOFbkUaAC6pNBPUbajyGqsDf6GLdlrYHrMVAtJdYd988ov6C52h7k6iDZ+OPHwv8dwUz+PRfpw==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/middleware-recursion-detection/3.222.0:
- resolution: {integrity: sha512-4JRVs7y5JDXXjc5fkz0FCZJt/0HTP2vh3QyZsWRbCYesw2cWVqQlp/fUXp8w5KGqm5nYkTF4e5SQ7Ca8powJNA==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/protocol-http': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/middleware-retry/3.222.0:
- resolution: {integrity: sha512-8FZpGuJDtntjXZ/mfJ9EdP5mYiUunQHEmk6OERk3h4XW3D/e97denwDAcBBIK8iYYGic5PoWF4KgTFJWs1YOcw==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/protocol-http': 3.222.0
- '@aws-sdk/service-error-classification': 3.222.0
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/util-middleware': 3.222.0
- tslib: 2.4.1
- uuid: 8.3.2
- dev: false
-
- /@aws-sdk/middleware-sdk-s3/3.222.0:
- resolution: {integrity: sha512-GCgbzWy3Dn9+dz/ZZjS5OiJ+feighHfMt461r1zjHNUXnb2tEf5kU+P80d3WqG8er4RRQg+Ao49SatOKgPcrlA==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/middleware-bucket-endpoint': 3.222.0
- '@aws-sdk/protocol-http': 3.222.0
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/util-arn-parser': 3.208.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/middleware-sdk-sts/3.222.0:
- resolution: {integrity: sha512-YbL4lTBFgqyL2Ob+dMyw/UNd5K9IOnZHHxjpwWlYKMrfT+pp2bvrr7XUbRHnxSoDsOg9bf6IyTSRVnVxP4psJg==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/middleware-signing': 3.222.0
- '@aws-sdk/property-provider': 3.222.0
- '@aws-sdk/protocol-http': 3.222.0
- '@aws-sdk/signature-v4': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/middleware-serde/3.222.0:
- resolution: {integrity: sha512-UoeLbgCJB07dX8tRByR0KzZaOwCoIyXj/SfFTuOhBUjkpKwqFCam/hofDlK3FR6kvl+xiURv57W/FtKV/9TDHg==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/middleware-signing/3.222.0:
- resolution: {integrity: sha512-MwMw2Lz7SBOniAc0slWXt65ocqL+E956bdW+LOvBin6OgkVWaLRbWI9nOzA6B2d8b65fCGEc+N15i0UdrEf+MQ==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/property-provider': 3.222.0
- '@aws-sdk/protocol-http': 3.222.0
- '@aws-sdk/signature-v4': 3.222.0
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/util-middleware': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/middleware-ssec/3.222.0:
- resolution: {integrity: sha512-WThCx/+UG4gIyqx0G3QKD1RM71+adh9Jv3Sh/KiS07Jjm+pb71wW+RRzBuNyhdjwB3aoKC/YKW8eFQg6M7eaQg==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/middleware-stack/3.222.0:
- resolution: {integrity: sha512-ASKbstAKbOBUZhFhst6/NCr11x94BDBiQn2zDs2Lvjo89n2efMeb4wEr17VCMZVeKI6ojtPFa1ZVLsH8AOn4Yw==}
- engines: {node: '>=14.0.0'}
- dependencies:
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/middleware-user-agent/3.222.0:
- resolution: {integrity: sha512-fjdxCRIAhOTsI9OcEKwJp4lhsvyCSXoeYV49mO/bdG6pFyFRm3Jezx7TNVNeLTGuMHTTTvRrCTF8sgE5t17Pzw==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/protocol-http': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/node-config-provider/3.222.0:
- resolution: {integrity: sha512-hrbw90LlVa4xJJc4WiyAfaPMY/sJubSeTwuxTChLsFOavr6hSMCwLASrWmOiKRIj5hKdSfEA87n/q+DnKHlA8A==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/property-provider': 3.222.0
- '@aws-sdk/shared-ini-file-loader': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/node-http-handler/3.222.0:
- resolution: {integrity: sha512-k3WqxUgZzGbiCQt1HyzDGlRzq8muGIOWZs9T3HtCa5LtACvl0qlNmiwCc+C/o7GRLyC9FuWkP3lOW6MiAFQUcA==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/abort-controller': 3.222.0
- '@aws-sdk/protocol-http': 3.222.0
- '@aws-sdk/querystring-builder': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/property-provider/3.222.0:
- resolution: {integrity: sha512-rEqAgQ7itmB7GB+WWLgyT7/YWJkjEBCfggxycccChWAeqg+gjpstIiGX2BjP2K/wnzwE0D91JsozSXcQIDOtNQ==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/protocol-http/3.222.0:
- resolution: {integrity: sha512-Zj+ytEgrOagCE7yczjdDan7W+1a0OL5DPAx69Z00NxGoBI2h0GRZD28dRYb3Pzs5/Ft4KbCedH/RUnyaYjaZxw==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/querystring-builder/3.222.0:
- resolution: {integrity: sha512-qrNUGDyDp9yVQMnBbz1T5YBQkA/u6D5o0PPzSwfZ9azdAcBLjHOEfsBrKhxP+K92L/nilbnmY89KrjMR8+BNtw==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/util-uri-escape': 3.201.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/querystring-parser/3.222.0:
- resolution: {integrity: sha512-3KfkCA/753PlF5QqhGuQ7u+NOgLyiBFeV8R8ut/pfBmG8fF6l3RKrkbcu+87QpqXntRzG+RLHDqS7ryT3B2ICg==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/service-error-classification/3.222.0:
- resolution: {integrity: sha512-Dn/WGtm+v5nney0CaYZjdOtJmdEuI8EQiQ5J3eQ3G0jjT6mr1/tCajsNpq3ZqHXiwLtydwaVvsL3AKXn+oxFVA==}
- engines: {node: '>=14.0.0'}
- dev: false
-
- /@aws-sdk/shared-ini-file-loader/3.222.0:
- resolution: {integrity: sha512-2dowzMXjvIf5gwX5gNCwpv/TzAbbXxrId3zYJgPdEtApsa7NxyFs5MfnHt1zZI6P3YORGheRnNUK9RUYOPKHgA==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/signature-v4-multi-region/3.222.0:
- resolution: {integrity: sha512-SF6Qi0KW69OzgLbA9q6AsZNFQCA+DI66SnAjW774sAE6aQyJmCbUsxETk37XodSymXzDOEDDC6QoY64HUoSoVw==}
- engines: {node: '>=14.0.0'}
- peerDependencies:
- '@aws-sdk/signature-v4-crt': ^3.118.0
- peerDependenciesMeta:
- '@aws-sdk/signature-v4-crt':
- optional: true
- dependencies:
- '@aws-sdk/protocol-http': 3.222.0
- '@aws-sdk/signature-v4': 3.222.0
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/util-arn-parser': 3.208.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/signature-v4/3.222.0:
- resolution: {integrity: sha512-2qQZuKqx56b2uN2rdjdKL6u0Cvk82uTGNtIuetmySY9xPEAljSBdriaxTqNqK9Gs3M4obG22alUK4a85uwqS3g==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/is-array-buffer': 3.201.0
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/util-hex-encoding': 3.201.0
- '@aws-sdk/util-middleware': 3.222.0
- '@aws-sdk/util-uri-escape': 3.201.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/smithy-client/3.222.0:
- resolution: {integrity: sha512-4dnU7TvwKxVuOWduvFGClYe0EgNov5Ke1ef7O1bdKaj5MmlH6wBDgGJM4NKREBFapC2dUXkoPtwsihtYBci1Bw==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/middleware-stack': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/token-providers/3.222.0:
- resolution: {integrity: sha512-VlLQDWjwKm6WezheyZ+wxfEw+X05s1NSZLY5N5HYE6+MSPcqllKCp0ArLcK1MUs68s/4TIOVKQrNeeJm/bLEPw==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/client-sso-oidc': 3.222.0
- '@aws-sdk/property-provider': 3.222.0
- '@aws-sdk/shared-ini-file-loader': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- transitivePeerDependencies:
- - aws-crt
- dev: false
-
- /@aws-sdk/types/3.222.0:
- resolution: {integrity: sha512-yXRYptInkfEFaOvWFxlRXsRh9jWOmQc1sZeKqjfx2UCtzNJ7ebedN0VfCz4SaDotcw9Q4JWuN66qhRMJjDx7/w==}
- engines: {node: '>=14.0.0'}
- dev: false
-
- /@aws-sdk/url-parser/3.222.0:
- resolution: {integrity: sha512-1+QbVdT/phYDb5JDQRJWoZeCujkXaI5m8z3bIiPxcRRY3NPuluDGrfX3kfnFen5s9QGByLvJxWKWZS+i+iUFRg==}
- dependencies:
- '@aws-sdk/querystring-parser': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-arn-parser/3.208.0:
- resolution: {integrity: sha512-QV4af+kscova9dv4VuHOgH8wEr/IIYHDGcnyVtkUEqahCejWr1Kuk+SBK0xMwnZY5LSycOtQ8aeqHOn9qOjZtA==}
- engines: {node: '>=14.0.0'}
- dependencies:
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-base64/3.208.0:
- resolution: {integrity: sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/util-buffer-from': 3.208.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-body-length-browser/3.188.0:
- resolution: {integrity: sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==}
- dependencies:
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-body-length-node/3.208.0:
- resolution: {integrity: sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==}
- engines: {node: '>=14.0.0'}
- dependencies:
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-buffer-from/3.208.0:
- resolution: {integrity: sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/is-array-buffer': 3.201.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-config-provider/3.208.0:
- resolution: {integrity: sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==}
- engines: {node: '>=14.0.0'}
- dependencies:
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-defaults-mode-browser/3.222.0:
- resolution: {integrity: sha512-+dGsp59lrEkDmK7OO5ecMYasrTGIKacFHjqZ6aqmbn1xtcUd/o3Qe7g5YSRXMGwtZ6xhvBD+NJLkEERI7U7cMw==}
- engines: {node: '>= 10.0.0'}
- dependencies:
- '@aws-sdk/property-provider': 3.222.0
- '@aws-sdk/types': 3.222.0
- bowser: 2.11.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-defaults-mode-node/3.222.0:
- resolution: {integrity: sha512-W/duYMtmCCWdzHP+yscBB6yrARgAqWpFdxgBvMSlT8TjOTrh/F+aj4NPamiNMeUfqfMFGnboYfyWRr1avkcAGQ==}
- engines: {node: '>= 10.0.0'}
- dependencies:
- '@aws-sdk/config-resolver': 3.222.0
- '@aws-sdk/credential-provider-imds': 3.222.0
- '@aws-sdk/node-config-provider': 3.222.0
- '@aws-sdk/property-provider': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-endpoints/3.222.0:
- resolution: {integrity: sha512-qujJQv8lFysAr1lOlBTJhz7949NZyq5cj74Q9dR99AcAMXXeI9CQayPKH7477AnXRGOTMahZ3mV0HZ1bCJoNTw==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-hex-encoding/3.201.0:
- resolution: {integrity: sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==}
- engines: {node: '>=14.0.0'}
- dependencies:
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-locate-window/3.208.0:
- resolution: {integrity: sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==}
- engines: {node: '>=14.0.0'}
- dependencies:
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-middleware/3.222.0:
- resolution: {integrity: sha512-Y4BPtSa+6+qvg6OVW6RrdDx0OADfWa2Uxsxqdozpdnx2OQY0q+1diqsNgFMV+FIvdXqffE147KG7roG+/AfPeA==}
- engines: {node: '>=14.0.0'}
- dependencies:
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-retry/3.222.0:
- resolution: {integrity: sha512-poiWqhiTjExUYKxgN5tRAvKNN23lGHn9ZJAGOu8sY2GHb6gatMfj46k31om3KrM3YGRuyXAo8YXRhA+QZ5CX0g==}
- engines: {node: '>= 14.0.0'}
- dependencies:
- '@aws-sdk/service-error-classification': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-stream-browser/3.222.0:
- resolution: {integrity: sha512-GW9Y1/pLHS7WYHHdswcDd4vaM9mzxDwewcDVujCd/L9MRbG1nA/wfCL7hAAXT1AN2GbGfbfT+jjHQqzexpKBnA==}
- dependencies:
- '@aws-sdk/fetch-http-handler': 3.222.0
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/util-base64': 3.208.0
- '@aws-sdk/util-hex-encoding': 3.201.0
- '@aws-sdk/util-utf8-browser': 3.188.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-stream-node/3.222.0:
- resolution: {integrity: sha512-iMwKG+RaGVAjzXDuzmMl63SnN6qVc+0VbbfaKW1eIK9Ihr5mko3GuYAFqKaECSQ+XdMNuMSVXzphveKw6t2zwg==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/node-http-handler': 3.222.0
- '@aws-sdk/types': 3.222.0
- '@aws-sdk/util-buffer-from': 3.208.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-uri-escape/3.201.0:
- resolution: {integrity: sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==}
- engines: {node: '>=14.0.0'}
- dependencies:
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-user-agent-browser/3.222.0:
- resolution: {integrity: sha512-DREMeL0XHl4QIS2GVSHFwVH4mJZ+Dr04R3U8WfiMktXdA93j5tDMJpU3+PNaCZPeaqz2QNwrVSBWKwbwA357zQ==}
- dependencies:
- '@aws-sdk/types': 3.222.0
- bowser: 2.11.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-user-agent-node/3.222.0:
- resolution: {integrity: sha512-BMRMrPXL/HS3dSha9vcABkoANluKjB0pH78bc659EY2WUj9wCZdbUNQpACiYx8bwm7xKSxugCkmPd6NLWXUURw==}
- engines: {node: '>=14.0.0'}
- peerDependencies:
- aws-crt: '>=1.0.0'
- peerDependenciesMeta:
- aws-crt:
- optional: true
- dependencies:
- '@aws-sdk/node-config-provider': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-utf8-browser/3.188.0:
- resolution: {integrity: sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==}
- dependencies:
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-utf8-node/3.208.0:
- resolution: {integrity: sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/util-buffer-from': 3.208.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/util-waiter/3.222.0:
- resolution: {integrity: sha512-/07RkfxvDncsMeQ+GhigPdiSRd2v/1FJoCV4a5e9XDI1ZSMvUKm36wFqw5Bzts+AUY8f4HOPpGI9ZQeNb7u27Q==}
- engines: {node: '>=14.0.0'}
- dependencies:
- '@aws-sdk/abort-controller': 3.222.0
- '@aws-sdk/types': 3.222.0
- tslib: 2.4.1
- dev: false
-
- /@aws-sdk/xml-builder/3.201.0:
- resolution: {integrity: sha512-brRdB1wwMgjWEnOQsv7zSUhIQuh7DEicrfslAqHop4S4FtSI3GQAShpQqgOpMTNFYcpaWKmE/Y1MJmNY7xLCnw==}
- engines: {node: '>=14.0.0'}
- dependencies:
- tslib: 2.4.1
- dev: false
-
/@babel/code-frame/7.18.6:
resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==}
engines: {node: '>=6.9.0'}
@@ -1450,22 +259,6 @@ packages:
engines: {node: '>= 10'}
dev: false
- /@breejs/ts-worker/2.0.0_7ja7ufy2vbczkqoi6dab6h7sdi:
- resolution: {integrity: sha512-6anHRcmgYlF7mrm/YVRn6rx2cegLuiY3VBxkkimOTWC/dVQeH336imVSuIKEGKTwiuNTPr2hswVdDSneNuXg3A==}
- engines: {node: '>= 12.11'}
- peerDependencies:
- bree: '>=9.0.0'
- dependencies:
- bree: 9.1.2
- ts-node: 10.8.2_wup25etrarvlqkprac7h35hj7u
- tsconfig-paths: 4.1.2
- transitivePeerDependencies:
- - '@swc/core'
- - '@swc/wasm'
- - '@types/node'
- - typescript
- dev: false
-
/@breejs/ts-worker/2.0.0_tb2zv7uvvsbdrpzpw5lxnvx3z4:
resolution: {integrity: sha512-6anHRcmgYlF7mrm/YVRn6rx2cegLuiY3VBxkkimOTWC/dVQeH336imVSuIKEGKTwiuNTPr2hswVdDSneNuXg3A==}
engines: {node: '>= 12.11'}
@@ -1490,27 +283,6 @@ packages:
'@jridgewell/trace-mapping': 0.3.9
dev: false
- /@esbuild-kit/cjs-loader/2.4.1:
- resolution: {integrity: sha512-lhc/XLith28QdW0HpHZvZKkorWgmCNT7sVelMHDj3HFdTfdqkwEKvT+aXVQtNAmCC39VJhunDkWhONWB7335mg==}
- dependencies:
- '@esbuild-kit/core-utils': 3.0.0
- get-tsconfig: 4.2.0
- dev: true
-
- /@esbuild-kit/core-utils/3.0.0:
- resolution: {integrity: sha512-TXmwH9EFS3DC2sI2YJWJBgHGhlteK0Xyu1VabwetMULfm3oYhbrsWV5yaSr2NTWZIgDGVLHbRf0inxbjXqAcmQ==}
- dependencies:
- esbuild: 0.15.15
- source-map-support: 0.5.21
- dev: true
-
- /@esbuild-kit/esm-loader/2.5.4:
- resolution: {integrity: sha512-afmtLf6uqxD5IgwCzomtqCYIgz/sjHzCWZFvfS5+FzeYxOURPUo4QcHtqJxbxWOMOogKriZanN/1bJQE/ZL93A==}
- dependencies:
- '@esbuild-kit/core-utils': 3.0.0
- get-tsconfig: 4.2.0
- dev: true
-
/@esbuild/android-arm/0.15.15:
resolution: {integrity: sha512-JJjZjJi2eBL01QJuWjfCdZxcIgot+VoK6Fq7eKF9w4YHm9hwl7nhBR1o2Wnt/WcANk5l9SkpvrldW1PLuXxcbw==}
engines: {node: '>=12'}
@@ -1774,12 +546,6 @@ packages:
fast-uri: 2.1.0
dev: false
- /@fastify/autoload/5.6.0:
- resolution: {integrity: sha512-WvIPDfhpMmWlZxUkIB7ncIw+y0BVrRanFncx/llRnPjDqyHMSPlNEnu48l22biQ/2W02PUS2TLihhH6faBZAQw==}
- dependencies:
- pkg-up: 3.1.0
- dev: false
-
/@fastify/autoload/5.7.0:
resolution: {integrity: sha512-RQ3g5zZnvdhq7yQJAPJq+D73lg/ZFZoPriaQ3Ul0BiJKAZhtLZSefll/kxgwEj0/rp705OUwvQMQTLgXBBMdGQ==}
dependencies:
@@ -1803,7 +569,7 @@ packages:
/@fastify/cors/8.2.0:
resolution: {integrity: sha512-qDgwpmg6C4D0D3nh8MTMuRXWyEwPnDZDBODaJv90FP2o9ukbahJByW4FtrM5Bpod5KbTf1oIExBmpItbUTQmHg==}
dependencies:
- fastify-plugin: 4.3.0
+ fastify-plugin: 4.4.0
mnemonist: 0.39.5
dev: false
@@ -1811,13 +577,6 @@ packages:
resolution: {integrity: sha512-E8Hfdvs1bG6u0N4vN5Nty6JONUfTdOciyD5rn8KnEsLKIenvOVcr210BQR9t34PRkNyjqnMLGk3e0BsaxRdL+g==}
dev: false
- /@fastify/env/4.1.0:
- resolution: {integrity: sha512-9l+JTUiFWSwb9dGSeR46aDWBjrAg8lJeqMjbotG5/8Ho90+qzRbt8kdSnVhLm5k6HcqXcBaBAT/6cImRhRq0VQ==}
- dependencies:
- env-schema: 5.0.0
- fastify-plugin: 4.4.0
- dev: false
-
/@fastify/env/4.2.0:
resolution: {integrity: sha512-sj1ehQZPD6tty+6bhzZw1uS2K2s6eOB46maJ2fE+AuTYxdHKVVW/AHXqCYGu3nH9kgzdXsheu3/148ZoBeoQOw==}
dependencies:
@@ -1845,14 +604,14 @@ packages:
steed: 1.1.3
dev: false
- /@fastify/multipart/7.3.0:
- resolution: {integrity: sha512-tbzQiRFxoADCn0G10CqiQ/nDWWcfegtwg826Pfz2h7+XvuqJhGnko0TbafrWIY7hnGD+sNCGMdiTVsxxs6zigA==}
+ /@fastify/multipart/7.4.1:
+ resolution: {integrity: sha512-PgBJIg/1krx1nWIXGZSUFQMPHXeFv559TmpaswzmNkK6V/yn1xi4nkATqBetv7s5XbXhxzc75uaJgXWdUefxvQ==}
dependencies:
'@fastify/busboy': 1.1.0
'@fastify/deepmerge': 1.1.0
'@fastify/error': 3.0.0
end-of-stream: 1.4.4
- fastify-plugin: 4.3.0
+ fastify-plugin: 4.4.0
hexoid: 1.0.0
secure-json-parse: 2.5.0
stream-wormhole: 1.1.0
@@ -1872,16 +631,6 @@ packages:
- supports-color
dev: false
- /@fastify/websocket/7.1.1:
- resolution: {integrity: sha512-8lvB/E6p/o3MlmHzM2NJ19ixteI6Ckw0xOebLfoHoORPmpvCWqSp8+HLz4Gc6HrChH4vM9VcSWAK8jYuTT08hQ==}
- dependencies:
- fastify-plugin: 4.4.0
- ws: 8.11.0
- transitivePeerDependencies:
- - bufferutil
- - utf-8-validate
- dev: false
-
/@floating-ui/core/1.0.2:
resolution: {integrity: sha512-Skfy0YS3NJ5nV9us0uuPN0HDk1Q4edljaOhRBJGDWs9EBa7ZVMYBHRFlhLvvmwEoaIM9BlH6QJFn9/uZg0bACg==}
dev: true
@@ -1892,16 +641,6 @@ packages:
'@floating-ui/core': 1.0.2
dev: true
- /@hapi/hoek/9.3.0:
- resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==}
- dev: true
-
- /@hapi/topo/5.1.0:
- resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==}
- dependencies:
- '@hapi/hoek': 9.3.0
- dev: true
-
/@humanwhocodes/config-array/0.11.6:
resolution: {integrity: sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==}
engines: {node: '>=10.10.0'}
@@ -1954,14 +693,6 @@ packages:
resolution: {integrity: sha512-hZere0rUga8kTzSTFbHREXpD9E/jwi94+B5RyLAmMIzl/w/EK1z7rFEnMHzPkU4AZkL42JWSsGXoV8LXMihybg==}
dev: false
- /@ladjs/graceful/3.0.2:
- resolution: {integrity: sha512-T4Z+0R0zgZfR32KIs3FEuH7oFSnhj3c+00wVtp07aeIl8PDfQGcXGB3C8SfOZ2EzPMRuIpIul5kHkVBdSTULXw==}
- engines: {node: '>=14'}
- dependencies:
- lil-http-terminator: 1.2.2
- p-is-promise: 3.0.0
- dev: false
-
/@ladjs/graceful/3.2.1:
resolution: {integrity: sha512-jv81FnxIwQT+nHAq7Ty7kd0ccxflk7IUYhnCbt8hfzWT3pGpkMENlMpe99Re3DO78//sHUA5V+sk+iPxwEaHYw==}
engines: {node: '>=14'}
@@ -2006,35 +737,9 @@ packages:
playwright-core: 1.28.0
dev: true
- /@playwright/test/1.28.1:
- resolution: {integrity: sha512-xN6spdqrNlwSn9KabIhqfZR7IWjPpFK1835tFNgjrlysaSezuX8PYUwaz38V/yI8TJLG9PkAMEXoHRXYXlpTPQ==}
- engines: {node: '>=14'}
- hasBin: true
- dependencies:
- '@types/node': 18.11.18
- playwright-core: 1.28.1
- dev: true
-
- /@polka/url/1.0.0-next.21:
- resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==}
- dev: true
-
/@popperjs/core/2.11.6:
resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==}
-
- /@prisma/client/4.6.1_prisma@4.6.1:
- resolution: {integrity: sha512-M1+NNrMzqaOIxT7PBGcTs3IZo7d1EW/+gVQd4C4gUgWBDGgD9AcIeZnUSidgWClmpMSgVUdnVORjsWWGUameYA==}
- engines: {node: '>=14.17'}
- requiresBuild: true
- peerDependencies:
- prisma: '*'
- peerDependenciesMeta:
- prisma:
- optional: true
- dependencies:
- '@prisma/engines-version': 4.6.1-3.694eea289a8462c80264df36757e4fdc129b1b32
- prisma: 4.6.1
- dev: false
+ dev: true
/@prisma/client/4.8.1_prisma@4.8.1:
resolution: {integrity: sha512-d4xhZhETmeXK/yZ7K0KcVOzEfI5YKGGEr4F5SBV04/MU4ncN/HcE28sy3e4Yt8UFW0ZuImKFQJE+9rWt9WbGSQ==}
@@ -2050,19 +755,10 @@ packages:
prisma: 4.8.1
dev: false
- /@prisma/engines-version/4.6.1-3.694eea289a8462c80264df36757e4fdc129b1b32:
- resolution: {integrity: sha512-HUCmkXAU2jqp2O1RvNtbE+seLGLyJGEABZS/R38rZjSAafAy0WzBuHq+tbZMnD+b5OSCsTVtIPVcuvx1ySxcWQ==}
- dev: false
-
/@prisma/engines-version/4.8.0-61.d6e67a83f971b175a593ccc12e15c4a757f93ffe:
resolution: {integrity: sha512-MHSOSexomRMom8QN4t7bu87wPPD+pa+hW9+71JnVcF3DqyyO/ycCLhRL1we3EojRpZxKvuyGho2REQsMCvxcJw==}
dev: false
- /@prisma/engines/4.6.1:
- resolution: {integrity: sha512-3u2/XxvxB+Q7cMXHnKU0CpBiUK1QWqpgiBv28YDo1zOIJE3FCF8DI2vrp6vuwjGt5h0JGXDSvmSf4D4maVjJdw==}
- requiresBuild: true
- dev: false
-
/@prisma/engines/4.8.1:
resolution: {integrity: sha512-93tctjNXcIS+i/e552IO6tqw17sX8liivv8WX9lDMCpEEe3ci+nT9F+1oHtAafqruXLepKF80i/D20Mm+ESlOw==}
requiresBuild: true
@@ -2171,20 +867,6 @@ packages:
tslib: 1.14.1
dev: false
- /@sideway/address/4.1.4:
- resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==}
- dependencies:
- '@hapi/hoek': 9.3.0
- dev: true
-
- /@sideway/formula/3.0.0:
- resolution: {integrity: sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==}
- dev: true
-
- /@sideway/pinpoint/2.0.0:
- resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==}
- dev: true
-
/@sindresorhus/is/5.3.0:
resolution: {integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==}
engines: {node: '>=14.16'}
@@ -2206,6 +888,7 @@ packages:
/@sveltejs/adapter-static/1.0.0-next.48:
resolution: {integrity: sha512-Z5Z+QZOav6D0KDeU3ReksGERJg/sX1k5OKWWXyQ11OwGErEEwSXHYRUyjaBmZEPeGzpVVGwwMUK8YWJlG/MKeA==}
+ dev: false
/@sveltejs/kit/1.0.0-next.405_svelte@3.53.1+vite@3.2.4:
resolution: {integrity: sha512-jHSa74F7k+hC+0fof75g/xm/+1M5sM66Qt6v8eLLMSgjkp36Lb5xOioBhbl6w0NYoE5xysLsBWuu+yHytfvCBA==}
@@ -2227,33 +910,6 @@ packages:
- supports-color
dev: true
- /@sveltejs/kit/1.0.0-next.572_svelte@3.53.1+vite@3.2.4:
- resolution: {integrity: sha512-PiKEr55L/uJyMKvDPdyoa5MlAYQwdgs8HLMbr28YcCBmhw/v6V7gutKOKdqeXc3YwKEFVS3z7TvW6c7eDokJdQ==}
- engines: {node: '>=16.14'}
- hasBin: true
- requiresBuild: true
- peerDependencies:
- svelte: ^3.44.0
- vite: ^3.2.0
- dependencies:
- '@sveltejs/vite-plugin-svelte': 1.4.0_svelte@3.53.1+vite@3.2.4
- '@types/cookie': 0.5.1
- cookie: 0.5.0
- devalue: 4.2.0
- kleur: 4.1.5
- magic-string: 0.27.0
- mime: 3.0.0
- sade: 1.8.1
- set-cookie-parser: 2.5.1
- sirv: 2.0.2
- svelte: 3.53.1
- tiny-glob: 0.2.9
- undici: 5.13.0
- vite: 3.2.4
- transitivePeerDependencies:
- - supports-color
- dev: true
-
/@sveltejs/vite-plugin-svelte/1.1.0_svelte@3.53.1+vite@3.2.4:
resolution: {integrity: sha512-cFRfEdztubtj1c/rYh7ArK7XCfFJn6wG6+J8/e9amFsKtEJILovoBrK0/mxt1AjPQg0vaX+fHPKvhx+q8mTPaQ==}
engines: {node: ^14.18.0 || >= 16}
@@ -2276,25 +932,6 @@ packages:
- supports-color
dev: true
- /@sveltejs/vite-plugin-svelte/1.4.0_svelte@3.53.1+vite@3.2.4:
- resolution: {integrity: sha512-6QupI/jemMfK+yI2pMtJcu5iO2gtgTfcBdGwMZZt+lgbFELhszbDl6Qjh000HgAV8+XUA+8EY8DusOFk8WhOIg==}
- engines: {node: ^14.18.0 || >= 16}
- peerDependencies:
- svelte: ^3.44.0
- vite: ^3.0.0
- dependencies:
- debug: 4.3.4
- deepmerge: 4.2.2
- kleur: 4.1.5
- magic-string: 0.26.7
- svelte: 3.53.1
- svelte-hmr: 0.15.1_svelte@3.53.1
- vite: 3.2.4
- vitefu: 0.2.3_vite@3.2.4
- transitivePeerDependencies:
- - supports-color
- dev: true
-
/@sveltekit-i18n/base/1.2.1_svelte@3.53.1:
resolution: {integrity: sha512-F8gqG2+KAOeT0o2wYlUrW3TRCX7zaD7rBy/1CEVNw0irfw9TgFf/ODmhubkHHT3+6Zk+SMz8RNgeuffBfAMbJw==}
peerDependencies:
@@ -2328,18 +965,6 @@ packages:
tailwindcss: 3.2.4_postcss@8.4.19
dev: false
- /@trpc/client/10.1.0_@trpc+server@10.1.0:
- resolution: {integrity: sha512-E7L9l2OTa5lIdM0NYvQLJf/GLapskfiVLv0Jv7t6GVxEOFd+O4THWsWQgJVUUAz9iq805iMNkY3uqSvf4GJaWg==}
- peerDependencies:
- '@trpc/server': 10.1.0
- dependencies:
- '@trpc/server': 10.1.0
- dev: false
-
- /@trpc/server/10.1.0:
- resolution: {integrity: sha512-UiRZPApLruhi1UKukTNsB9igFBEhEA0aMxy86Xp1OvbzuY00yoFcvDUYsBdBjp9mzIHR3yNjqrlfS/RNpPhZEw==}
- dev: false
-
/@tsconfig/node10/1.0.8:
resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==}
dev: false
@@ -2356,37 +981,14 @@ packages:
resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==}
dev: false
- /@types/bcryptjs/2.4.2:
- resolution: {integrity: sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==}
- dev: true
-
- /@types/cacheable-request/6.0.2:
- resolution: {integrity: sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==}
- dependencies:
- '@types/http-cache-semantics': 4.0.1
- '@types/keyv': 3.1.4
- '@types/node': 18.7.15
- '@types/responselike': 1.0.0
- dev: false
-
/@types/cookie/0.4.1:
resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==}
dev: false
- /@types/cookie/0.5.1:
- resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==}
- dev: true
-
/@types/cors/2.8.12:
resolution: {integrity: sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==}
dev: false
- /@types/fs-extra/9.0.13:
- resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==}
- dependencies:
- '@types/node': 18.11.18
- dev: false
-
/@types/http-cache-semantics/4.0.1:
resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==}
dev: false
@@ -2395,45 +997,14 @@ packages:
resolution: {integrity: sha512-6+0ekgfusHftJNYpihfkMu8BWdeHs9EOJuGcSofErjstGPfPGEu9yTu4t460lTzzAMl2cM5zngQJqPMHbbnvYA==}
dev: true
- /@types/js-yaml/4.0.5:
- resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==}
- dev: true
-
- /@types/json-buffer/3.0.0:
- resolution: {integrity: sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==}
- dev: false
-
/@types/json-schema/7.0.11:
resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==}
dev: true
- /@types/jsonwebtoken/8.5.9:
- resolution: {integrity: sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==}
- dependencies:
- '@types/node': 18.11.18
- dev: true
-
- /@types/keyv/3.1.4:
- resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
- dependencies:
- '@types/node': 18.7.15
- dev: false
-
/@types/lodash/4.14.182:
resolution: {integrity: sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==}
dev: false
- /@types/minimist/1.2.2:
- resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==}
- dev: false
-
- /@types/node-fetch/2.6.2:
- resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==}
- dependencies:
- '@types/node': 18.11.18
- form-data: 3.0.1
- dev: true
-
/@types/node-os-utils/1.3.0:
resolution: {integrity: sha512-XwVteWQx/XkfRPyaGkw8dEbrCAkoRZ73pI3XznUYIpzbCfpQB3UnDlR5TnmdhetlT889tUJGF8QWo9xrgTpsiA==}
dev: true
@@ -2441,31 +1012,14 @@ packages:
/@types/node/18.11.18:
resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==}
- /@types/node/18.11.9:
- resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==}
-
- /@types/node/18.7.15:
- resolution: {integrity: sha512-XnjpaI8Bgc3eBag2Aw4t2Uj/49lLBSStHWfqKvIuXD7FIrZyMLWp8KuAFHAqxMZYTF9l08N1ctUn9YNybZJVmQ==}
- dev: false
-
/@types/normalize-package-data/2.4.1:
resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
dev: false
- /@types/ps-tree/1.1.2:
- resolution: {integrity: sha512-ZREFYlpUmPQJ0esjxoG1fMvB2HNaD3z+mjqdSosZvd3RalncI9NEur73P8ZJz4YQdL64CmV1w0RuqoRUlhQRBw==}
- dev: false
-
/@types/pug/2.0.6:
resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==}
dev: true
- /@types/responselike/1.0.0:
- resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
- dependencies:
- '@types/node': 18.7.15
- dev: false
-
/@types/sass/1.43.1:
resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==}
dependencies:
@@ -2476,20 +1030,6 @@ packages:
resolution: {integrity: sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==}
dev: true
- /@types/shell-quote/1.7.1:
- resolution: {integrity: sha512-SWZ2Nom1pkyXCDohRSrkSKvDh8QOG9RfAsrt5/NsPQC4UQJ55eG0qClA40I+Gkez4KTQ0uDUT8ELRXThf3J5jw==}
- dev: true
-
- /@types/which/2.0.1:
- resolution: {integrity: sha512-Jjakcv8Roqtio6w1gr0D7y6twbhx6gGgFGF5BLwajPpnOIOxFkakFhCq+LmyyeAz7BX6ULrjBOxdKaCDy+4+dQ==}
- dev: false
-
- /@types/ws/8.5.3:
- resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==}
- dependencies:
- '@types/node': 18.11.18
- dev: true
-
/@typescript-eslint/eslint-plugin/5.44.0_fnsv2sbzcckq65bwfk7a5xwslu:
resolution: {integrity: sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -2940,10 +1480,6 @@ packages:
safer-buffer: 2.1.2
dev: false
- /asynckit/0.4.0:
- resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
- dev: true
-
/atomic-sleep/1.0.0:
resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
engines: {node: '>=8.0.0'}
@@ -2980,26 +1516,6 @@ packages:
- supports-color
dev: false
- /axe/11.0.0:
- resolution: {integrity: sha512-BKqI28hcuoIqXKkUbgkUVQigxxgijzt1YwZOeUkuQ06geKUAAzUa2orG06Sg3KaGOp/KnC9lb0DDPhefyAHSAQ==}
- engines: {node: '>=14'}
- dependencies:
- '@ladjs/format-util': 1.0.4
- '@strikeentco/get': 1.0.1
- '@strikeentco/set': 1.0.2
- boolean: 3.2.0
- console-polyfill: 0.3.0
- format-specifiers: 1.0.0
- iserror: 0.0.2
- maybe-combine-errors: 1.0.0
- merge-options: 3.0.4
- p-map-series: 2.1.0
- parse-app-info: 4.0.3
- parse-err: 0.0.12
- pick-deep: 1.0.0
- unset-value: 2.0.1
- dev: false
-
/axe/11.2.1:
resolution: {integrity: sha512-uQfGfqtZON++xHaG+CnQB7sTBhgYkqf2P0HLcbSdeHhM7mg+0cr3pBrcWbmuWbZYcQGoRZu8INTiYUEcwMZhlg==}
engines: {node: '>=14'}
@@ -3021,14 +1537,6 @@ packages:
unset-value: 2.0.1
dev: false
- /axios/0.21.4_debug@4.3.2:
- resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==}
- dependencies:
- follow-redirects: 1.15.2_debug@4.3.2
- transitivePeerDependencies:
- - debug
- dev: true
-
/babel-code-frame/6.26.0:
resolution: {integrity: sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==}
dependencies:
@@ -3740,6 +2248,7 @@ packages:
/bluebird/3.7.2:
resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
+ dev: false
/bn.js/4.12.0:
resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==}
@@ -3749,10 +2258,6 @@ packages:
resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==}
dev: false
- /bowser/2.11.0:
- resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==}
- dev: false
-
/brace-expansion/1.1.11:
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
dependencies:
@@ -3772,22 +2277,6 @@ packages:
dependencies:
fill-range: 7.0.1
- /bree/9.1.2:
- resolution: {integrity: sha512-qwAiwPz7Ba2WvhtQl+qI7mARmVK2GG6P7qHV6IQcblYb5TCZXhFNugpp2JOGAdgc9GU4SzR/PjiDUHLVg/CvzQ==}
- engines: {node: '>=12.17.0 <13.0.0-0||>=13.2.0'}
- dependencies:
- '@breejs/later': 4.1.0
- boolean: 3.2.0
- combine-errors: 3.0.3
- cron-validate: 1.4.3
- human-interval: 2.0.1
- is-string-and-not-blank: 0.0.2
- is-valid-path: 0.1.1
- ms: 2.1.3
- p-wait-for: 3.2.0
- safe-timers: 1.1.0
- dev: false
-
/bree/9.1.3:
resolution: {integrity: sha512-oqto4iG7MG2xdRKU0MhFNPTq7ZSztKvalohO3nyu4EIyy3SKpLDX92LkptcGTl6BE2RpQLrzgBP3HoPtWlWBaA==}
engines: {node: '>=12.17.0 <13.0.0-0||>=13.2.0'}
@@ -3830,17 +2319,6 @@ packages:
resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
dev: false
- /buffer-from/1.1.2:
- resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
- dev: true
-
- /buffer/5.6.0:
- resolution: {integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==}
- dependencies:
- base64-js: 1.5.1
- ieee754: 1.2.1
- dev: false
-
/buffer/5.7.1:
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
dependencies:
@@ -3854,32 +2332,6 @@ packages:
dev: false
optional: true
- /busboy/1.6.0:
- resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
- engines: {node: '>=10.16.0'}
- dependencies:
- streamsearch: 1.1.0
- dev: true
-
- /cabin/11.0.1_axe@11.0.0:
- resolution: {integrity: sha512-RCnLTeaK3vmrMkgEE2mQLj+zfzotGrV/1BrKvkw7paZLZ/GCodPx+B8kpa0sjHiKRLR0fMfdE+ZvA1Qj+BQXpg==}
- engines: {node: '>=14'}
- peerDependencies:
- axe: '>= 10.0.0'
- dependencies:
- ansi-colors: 4.1.3
- axe: 11.0.0
- clf-date: 0.2.1
- iserror: 0.0.2
- merge-options: 3.0.4
- ms: 2.1.3
- on-finished: 2.4.1
- parse-err: 0.0.12
- parse-request: 5.0.2
- transitivePeerDependencies:
- - supports-color
- dev: false
-
/cabin/11.1.1_axe@11.2.1:
resolution: {integrity: sha512-8XjDgltMiP2BlFP2+72Mc6gcRnrLQ3tU9sbH/Ub4wzaATz05/e3yJSZGfzZeWMaSHwlEZEwIBGgaZ/wJY2UORw==}
engines: {node: '>=14'}
@@ -3899,11 +2351,6 @@ packages:
- supports-color
dev: false
- /cacheable-lookup/6.0.4:
- resolution: {integrity: sha512-mbcDEZCkv2CZF4G01kr8eBd/5agkt9oCqz75tJMSIsquvRZ2sL6Hi5zGVKi/0OSC9oO1GHfJ2AV0ZIOY9vye0A==}
- engines: {node: '>=10.6.0'}
- dev: false
-
/cacheable-lookup/7.0.0:
resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==}
engines: {node: '>=14.16'}
@@ -3922,19 +2369,6 @@ packages:
responselike: 3.0.0
dev: false
- /cacheable-request/7.0.2:
- resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==}
- engines: {node: '>=8'}
- dependencies:
- clone-response: 1.0.2
- get-stream: 5.2.0
- http-cache-semantics: 4.1.0
- keyv: 4.3.0
- lowercase-keys: 2.0.0
- normalize-url: 6.1.0
- responselike: 2.0.0
- dev: false
-
/call-bind/1.0.2:
resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
dependencies:
@@ -3985,20 +2419,10 @@ packages:
supports-color: 7.2.0
dev: true
- /chalk/5.1.2:
- resolution: {integrity: sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==}
- engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
- dev: false
-
/chardet/0.7.0:
resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
dev: true
- /check-more-types/2.24.0:
- resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==}
- engines: {node: '>= 0.8.0'}
- dev: true
-
/chokidar/3.5.3:
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
engines: {node: '>= 8.10.0'}
@@ -4019,6 +2443,7 @@ packages:
/classnames/2.3.2:
resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==}
+ dev: true
/clean-stack/4.2.0:
resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==}
@@ -4050,12 +2475,6 @@ packages:
is-regexp: 3.1.0
dev: false
- /clone-response/1.0.2:
- resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==}
- dependencies:
- mimic-response: 1.0.1
- dev: false
-
/color-convert/1.9.3:
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
dependencies:
@@ -4095,30 +2514,10 @@ packages:
lodash.uniqby: 4.5.0
dev: false
- /combined-stream/1.0.8:
- resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
- engines: {node: '>= 0.8'}
- dependencies:
- delayed-stream: 1.0.0
- dev: true
-
- /commander/9.4.1:
- resolution: {integrity: sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==}
- engines: {node: ^12.20.0 || >=14}
- dev: true
-
/compare-versions/5.0.1:
resolution: {integrity: sha512-v8Au3l0b+Nwkp4G142JcgJFh1/TUhdxut7wzD1Nq1dyp5oa3tXaqb03EXOAB6jS4gMlalkjAUPZBMiAfKUixHQ==}
dev: false
- /compress-brotli/1.3.8:
- resolution: {integrity: sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==}
- engines: {node: '>= 12'}
- dependencies:
- '@types/json-buffer': 3.0.0
- json-buffer: 3.0.1
- dev: false
-
/concat-map/0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
dev: true
@@ -4163,12 +2562,6 @@ packages:
/cookie/0.5.0:
resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
engines: {node: '>= 0.6'}
-
- /copy-anything/3.0.3:
- resolution: {integrity: sha512-fpW2W/BqEzqPp29QS+MwwfisHCQZtiduTe/m8idFo0xbti9fIZ2WVhAsCv4ggFVH3AgCkVdpoOCtQC6gBrdhjw==}
- engines: {node: '>=12.13'}
- dependencies:
- is-what: 4.1.8
dev: false
/core-js/2.6.12:
@@ -4299,11 +2692,6 @@ packages:
- ts-node
dev: false
- /data-uri-to-buffer/4.0.0:
- resolution: {integrity: sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==}
- engines: {node: '>= 12'}
- dev: false
-
/dayjs/1.11.6:
resolution: {integrity: sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ==}
dev: false
@@ -4346,18 +2734,6 @@ packages:
ms: 2.1.3
dev: true
- /debug/4.3.2:
- resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==}
- engines: {node: '>=6.0'}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
- dependencies:
- ms: 2.1.2
- dev: true
-
/debug/4.3.4:
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
engines: {node: '>=6.0'}
@@ -4400,11 +2776,6 @@ packages:
/defined/1.0.0:
resolution: {integrity: sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==}
- /delayed-stream/1.0.0:
- resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
- engines: {node: '>=0.4.0'}
- dev: true
-
/depd/2.0.0:
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
engines: {node: '>= 0.8'}
@@ -4441,10 +2812,6 @@ packages:
defined: 1.0.0
minimist: 1.2.7
- /devalue/4.2.0:
- resolution: {integrity: sha512-mbjoAaCL2qogBKgeFxFPOXAUsZchircF+B/79LD4sHH0+NHfYm8gZpQrskKDn5gENGt35+5OI1GUF7hLVnkPDw==}
- dev: true
-
/didyoumean/1.2.2:
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
@@ -4458,6 +2825,7 @@ packages:
engines: {node: '>=8'}
dependencies:
path-type: 4.0.0
+ dev: true
/dlv/1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
@@ -4522,11 +2890,6 @@ packages:
dotenv: 8.6.0
dev: false
- /dotenv/16.0.2:
- resolution: {integrity: sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA==}
- engines: {node: '>=12'}
- dev: false
-
/dotenv/16.0.3:
resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==}
engines: {node: '>=12'}
@@ -4543,9 +2906,6 @@ packages:
ini: 1.3.8
dev: false
- /duplexer/0.1.2:
- resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
-
/ecdsa-sig-formatter/1.0.11:
resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
dependencies:
@@ -4568,12 +2928,6 @@ packages:
engines: {node: '>= 0.8'}
dev: false
- /encoding/0.1.13:
- resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==}
- dependencies:
- iconv-lite: 0.6.3
- dev: false
-
/end-of-stream/1.4.4:
resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
dependencies:
@@ -5166,42 +3520,11 @@ packages:
engines: {node: '>= 0.6'}
dev: false
- /event-stream/3.3.4:
- resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==}
- dependencies:
- duplexer: 0.1.2
- from: 0.1.7
- map-stream: 0.1.0
- pause-stream: 0.0.11
- split: 0.3.3
- stream-combiner: 0.0.4
- through: 2.3.8
-
/event-target-shim/5.0.1:
resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
engines: {node: '>=6'}
dev: false
- /events/3.3.0:
- resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
- engines: {node: '>=0.8.x'}
- dev: false
-
- /execa/5.1.1:
- resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
- engines: {node: '>=10'}
- dependencies:
- cross-spawn: 7.0.3
- get-stream: 6.0.1
- human-signals: 2.1.0
- is-stream: 2.0.1
- merge-stream: 2.0.0
- npm-run-path: 4.0.1
- onetime: 5.1.2
- signal-exit: 3.0.7
- strip-final-newline: 2.0.0
- dev: true
-
/execa/6.1.0:
resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -5298,13 +3621,6 @@ packages:
resolution: {integrity: sha512-qKRta6N7BWEFVlyonVY/V+BMLgFqktCUV0QjT259ekAIlbVrMaFnFLxJ4s/JPl4tou56S1BzPufI60bLe29fHA==}
dev: false
- /fast-xml-parser/4.0.11:
- resolution: {integrity: sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==}
- hasBin: true
- dependencies:
- strnum: 1.0.5
- dev: false
-
/fastfall/1.5.1:
resolution: {integrity: sha512-KH6p+Z8AKPXnmA7+Iz2Lh8ARCMr+8WNPVludm1LGkZoD2MjY6LVnRMtTKhkdzI+jr0RzQWXKzKyBJm1zoHEL4Q==}
engines: {node: '>=0.10.0'}
@@ -5333,28 +3649,6 @@ packages:
socket.io: 4.5.4
dev: false
- /fastify/4.10.2:
- resolution: {integrity: sha512-0T+4zI6N3S8ex0LCZi3H4FasJR4AzWw834fUkPWvV8r6GBJkLmAOfFxH8f5V29Plef24IK0QSQD/tz1Nx+1UOA==}
- dependencies:
- '@fastify/ajv-compiler': 3.3.1
- '@fastify/error': 3.0.0
- '@fastify/fast-json-stringify-compiler': 4.1.0
- abstract-logging: 2.0.1
- avvio: 8.2.0
- content-type: 1.0.4
- find-my-way: 7.3.1
- light-my-request: 5.6.1
- pino: 8.6.1
- process-warning: 2.0.0
- proxy-addr: 2.0.7
- rfdc: 1.3.0
- secure-json-parse: 2.5.0
- semver: 7.3.8
- tiny-lru: 10.0.1
- transitivePeerDependencies:
- - supports-color
- dev: false
-
/fastify/4.11.0:
resolution: {integrity: sha512-JteZ8pjEqd+6n+azQnQfSJV8MUMxAmxbvC2Dx/Mybj039Lf/u3kda9Kq84uy/huCpqCzZoyHIZS5JFGF3wLztw==}
dependencies:
@@ -5400,14 +3694,6 @@ packages:
xtend: 4.0.2
dev: false
- /fetch-blob/3.2.0:
- resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
- engines: {node: ^12.20 || >= 14.13}
- dependencies:
- node-domexception: 1.0.0
- web-streams-polyfill: 3.2.1
- dev: false
-
/figures/3.2.0:
resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
engines: {node: '>=8'}
@@ -5479,55 +3765,24 @@ packages:
'@popperjs/core': 2.11.6
classnames: 2.3.2
flowbite: 1.5.4
+ dev: true
/flowbite/1.5.4:
resolution: {integrity: sha512-A4VTeJE+aHSbwrMzWvpTADhNgX8Njpb3DqRL26pFkOupklPg8cmNstZK8cXrFnBPxomOiX/OazZnhQM1BIZADQ==}
dependencies:
'@popperjs/core': 2.11.6
mini-svg-data-uri: 1.4.4
-
- /follow-redirects/1.15.2_debug@4.3.2:
- resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==}
- engines: {node: '>=4.0'}
- peerDependencies:
- debug: '*'
- peerDependenciesMeta:
- debug:
- optional: true
- dependencies:
- debug: 4.3.2
dev: true
- /form-data-encoder/2.0.1:
- resolution: {integrity: sha512-Oy+P9w5mnO4TWXVgUiQvggNKPI9/ummcSt5usuIV6HkaLKigwzPpoenhEqmGmx3zHqm6ZLJ+CR/99N8JLinaEw==}
- engines: {node: '>= 14.17'}
- dev: false
-
/form-data-encoder/2.1.2:
resolution: {integrity: sha512-FCaIOVTRA9E0siY6FeXid7D5yrCqpsErplUkE2a1BEiKj1BE9z6FbKB4ntDTwC4NVLie9p+4E9nX4mWwEOT05A==}
engines: {node: '>= 14.17'}
dev: false
- /form-data/3.0.1:
- resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==}
- engines: {node: '>= 6'}
- dependencies:
- asynckit: 0.4.0
- combined-stream: 1.0.8
- mime-types: 2.1.35
- dev: true
-
/format-specifiers/1.0.0:
resolution: {integrity: sha512-/xcmy6xn/DsR+V6flFj3E47yCbrsk70r90moAMENVkKckUPUG9CRE79S/2xajLVx1iADIoWx+1R304uMXB/riQ==}
dev: false
- /formdata-polyfill/4.0.10:
- resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
- engines: {node: '>=12.20.0'}
- dependencies:
- fetch-blob: 3.2.0
- dev: false
-
/forwarded/0.2.0:
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
engines: {node: '>= 0.6'}
@@ -5541,22 +3796,10 @@ packages:
engines: {node: '>= 0.6'}
dev: false
- /from/0.1.7:
- resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==}
-
/fs-constants/1.0.0:
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
dev: false
- /fs-extra/10.1.0:
- resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
- engines: {node: '>=12'}
- dependencies:
- graceful-fs: 4.2.10
- jsonfile: 6.1.0
- universalify: 2.0.0
- dev: false
-
/fs.realpath/1.0.0:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
@@ -5606,16 +3849,10 @@ packages:
has: 1.0.3
has-symbols: 1.0.3
- /get-stream/5.2.0:
- resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
- engines: {node: '>=8'}
- dependencies:
- pump: 3.0.0
- dev: false
-
/get-stream/6.0.1:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'}
+ dev: false
/get-symbol-description/1.0.0:
resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
@@ -5625,10 +3862,6 @@ packages:
get-intrinsic: 1.1.1
dev: true
- /get-tsconfig/4.2.0:
- resolution: {integrity: sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg==}
- dev: true
-
/get-value/3.0.1:
resolution: {integrity: sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==}
engines: {node: '>=6.0'}
@@ -5636,15 +3869,6 @@ packages:
isobject: 3.0.1
dev: false
- /gettext-parser/6.0.0:
- resolution: {integrity: sha512-eWFsR78gc/eKnzDgc919Us3cbxQbzxK1L8vAIZrKMQqOUgULyeqmczNlBjTlVTk2FaB7nV9C1oobd/PGBOqNmg==}
- dependencies:
- content-type: 1.0.4
- encoding: 0.1.13
- readable-stream: 4.1.0
- safe-buffer: 5.2.1
- dev: false
-
/glob-parent/5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'}
@@ -5714,40 +3938,10 @@ packages:
slash: 3.0.0
dev: true
- /globby/13.1.2:
- resolution: {integrity: sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- dependencies:
- dir-glob: 3.0.1
- fast-glob: 3.2.12
- ignore: 5.2.0
- merge2: 1.4.1
- slash: 4.0.0
- dev: false
-
/globrex/0.1.2:
resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
dev: true
- /got/12.3.1:
- resolution: {integrity: sha512-tS6+JMhBh4iXMSXF6KkIsRxmloPln31QHDlcb6Ec3bzxjjFJFr/8aXdpyuLmVc9I4i2HyBHYw1QU5K1ruUdpkw==}
- engines: {node: '>=14.16'}
- dependencies:
- '@sindresorhus/is': 5.3.0
- '@szmarczak/http-timer': 5.0.1
- '@types/cacheable-request': 6.0.2
- '@types/responselike': 1.0.0
- cacheable-lookup: 6.0.4
- cacheable-request: 7.0.2
- decompress-response: 6.0.0
- form-data-encoder: 2.0.1
- get-stream: 6.0.1
- http2-wrapper: 2.1.11
- lowercase-keys: 3.0.0
- p-cancelable: 3.0.0
- responselike: 2.0.0
- dev: false
-
/got/12.5.3:
resolution: {integrity: sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==}
engines: {node: '>=14.16'}
@@ -5767,6 +3961,7 @@ packages:
/graceful-fs/4.2.10:
resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
+ dev: true
/grapheme-splitter/1.0.4:
resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
@@ -5891,11 +4086,6 @@ packages:
numbered: 1.1.0
dev: false
- /human-signals/2.1.0:
- resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
- engines: {node: '>=10.17.0'}
- dev: true
-
/human-signals/3.0.1:
resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==}
engines: {node: '>=12.20.0'}
@@ -5908,13 +4098,6 @@ packages:
safer-buffer: 2.1.2
dev: true
- /iconv-lite/0.6.3:
- resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
- engines: {node: '>=0.10.0'}
- dependencies:
- safer-buffer: 2.1.2
- dev: false
-
/ieee754/1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
dev: false
@@ -5926,6 +4109,7 @@ packages:
/ignore/5.2.0:
resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==}
engines: {node: '>= 4'}
+ dev: true
/import-fresh/3.3.0:
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
@@ -6162,6 +4346,7 @@ packages:
/is-stream/2.0.1:
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
engines: {node: '>=8'}
+ dev: false
/is-stream/3.0.0:
resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
@@ -6213,11 +4398,6 @@ packages:
call-bind: 1.0.2
dev: true
- /is-what/4.1.8:
- resolution: {integrity: sha512-yq8gMao5upkPoGEU9LsB2P+K3Kt8Q3fQFCGyNCWOAnJAMzEXVV9drYb0TXr42TTliLLhKIBvulgAXgtLLnwzGA==}
- engines: {node: '>=12.13'}
- dev: false
-
/iserror/0.0.2:
resolution: {integrity: sha512-oKGGrFVaWwETimP3SiWwjDeY27ovZoyZPHtxblC4hCq9fXxed/jasx+ATWFFjCVSRZng8VTMsN1nDnGo6zMBSw==}
dev: false
@@ -6235,16 +4415,6 @@ packages:
engines: {node: '>=0.10.0'}
dev: false
- /joi/17.7.0:
- resolution: {integrity: sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==}
- dependencies:
- '@hapi/hoek': 9.3.0
- '@hapi/topo': 5.1.0
- '@sideway/address': 4.1.4
- '@sideway/formula': 3.0.0
- '@sideway/pinpoint': 2.0.0
- dev: true
-
/js-cookie/3.0.1:
resolution: {integrity: sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==}
engines: {node: '>=12'}
@@ -6311,14 +4481,6 @@ packages:
engines: {node: '>=6'}
hasBin: true
- /jsonfile/6.1.0:
- resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
- dependencies:
- universalify: 2.0.0
- optionalDependencies:
- graceful-fs: 4.2.10
- dev: false
-
/jsonwebtoken/9.0.0:
resolution: {integrity: sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==}
engines: {node: '>=12', npm: '>=6'}
@@ -6344,13 +4506,6 @@ packages:
safe-buffer: 5.2.1
dev: false
- /keyv/4.3.0:
- resolution: {integrity: sha512-C30Un9+63J0CsR7Wka5quXKqYZsT6dcRQ2aOwGcSc3RiQ4HGWpTAHlCA+puNfw2jA/s11EsxA1nCXgZRuRKMQQ==}
- dependencies:
- compress-brotli: 1.3.8
- json-buffer: 3.0.1
- dev: false
-
/keyv/4.5.0:
resolution: {integrity: sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==}
dependencies:
@@ -6373,11 +4528,6 @@ packages:
dotgitconfig: 1.1.2
dev: false
- /lazy-ass/1.6.0:
- resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==}
- engines: {node: '> 0.8'}
- dev: true
-
/levn/0.4.1:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
engines: {node: '>= 0.8.0'}
@@ -6478,10 +4628,6 @@ packages:
resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==}
dev: false
- /lodash.get/4.4.2:
- resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==}
- dev: false
-
/lodash.isplainobject/4.0.6:
resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
dev: false
@@ -6510,11 +4656,6 @@ packages:
resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==}
dev: false
- /lowercase-keys/2.0.0:
- resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
- engines: {node: '>=8'}
- dev: false
-
/lowercase-keys/3.0.0:
resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -6549,20 +4690,10 @@ packages:
dependencies:
sourcemap-codec: 1.4.8
- /magic-string/0.27.0:
- resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==}
- engines: {node: '>=12'}
- dependencies:
- '@jridgewell/sourcemap-codec': 1.4.13
- dev: true
-
/make-error/1.3.6:
resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
dev: false
- /map-stream/0.1.0:
- resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==}
-
/maybe-combine-errors/1.0.0:
resolution: {integrity: sha512-eefp6IduNPT6fVdwPp+1NgD0PML1NU5P6j1Mj5nz1nidX8/sWY7119WL8vTAHgqfsY74TzW0w1XPgdYEKkGZ5A==}
engines: {node: '>=10'}
@@ -6582,6 +4713,7 @@ packages:
/merge-stream/2.0.0:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ dev: false
/merge2/1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
@@ -6597,12 +4729,14 @@ packages:
/mime-db/1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
+ dev: false
/mime-types/2.1.35:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
dependencies:
mime-db: 1.52.0
+ dev: false
/mime/1.6.0:
resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
@@ -6610,12 +4744,6 @@ packages:
hasBin: true
dev: false
- /mime/3.0.0:
- resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
- engines: {node: '>=10.0.0'}
- hasBin: true
- dev: true
-
/mimic-fn/2.1.0:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
@@ -6626,11 +4754,6 @@ packages:
engines: {node: '>=12'}
dev: false
- /mimic-response/1.0.1:
- resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
- engines: {node: '>=4'}
- dev: false
-
/mimic-response/3.1.0:
resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
engines: {node: '>=10'}
@@ -6649,6 +4772,7 @@ packages:
/mini-svg-data-uri/1.4.4:
resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==}
hasBin: true
+ dev: true
/minimalistic-assert/1.0.1:
resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
@@ -6671,10 +4795,6 @@ packages:
resolution: {integrity: sha512-7Wl+Jz+IGWuSdgsQEJ4JunV0si/iMhg42MnQQG6h1R6TNeVenp4U9x5CC5v/gYqz/fENLQITAWXidNtVL0NNbw==}
dev: true
- /minimist/1.2.6:
- resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==}
- dev: false
-
/minimist/1.2.7:
resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==}
@@ -6700,11 +4820,6 @@ packages:
engines: {node: '>=4'}
dev: true
- /mrmime/1.0.1:
- resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==}
- engines: {node: '>=10'}
- dev: true
-
/ms/2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
@@ -6759,45 +4874,16 @@ packages:
lower-case: 1.1.4
dev: false
- /node-domexception/1.0.0:
- resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
- engines: {node: '>=10.5.0'}
- dev: false
-
/node-fetch/2.6.0:
resolution: {integrity: sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==}
engines: {node: 4.x || >=6.0.0}
dev: true
- /node-fetch/3.2.10:
- resolution: {integrity: sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- dependencies:
- data-uri-to-buffer: 4.0.0
- fetch-blob: 3.2.0
- formdata-polyfill: 4.0.10
- dev: false
-
- /node-fetch/3.3.0:
- resolution: {integrity: sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- dependencies:
- data-uri-to-buffer: 4.0.0
- fetch-blob: 3.2.0
- formdata-polyfill: 4.0.10
- dev: false
-
/node-forge/1.3.1:
resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
engines: {node: '>= 6.13.0'}
dev: false
- /node-gettext/3.0.0:
- resolution: {integrity: sha512-/VRYibXmVoN6tnSAY2JWhNRhWYJ8Cd844jrZU/DwLVoI4vBI6ceYbd8i42sYZ9uOgDH3S7vslIKOWV/ZrT2YBA==}
- dependencies:
- lodash.get: 4.4.2
- dev: false
-
/node-os-utils/1.3.7:
resolution: {integrity: sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q==}
dev: false
@@ -6849,11 +4935,6 @@ packages:
resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
engines: {node: '>=0.10.0'}
- /normalize-url/6.1.0:
- resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
- engines: {node: '>=10'}
- dev: false
-
/normalize-url/7.2.0:
resolution: {integrity: sha512-uhXOdZry0L6M2UIo9BTt7FdpBDiAGN/7oItedQwPKh8jh31ZlvC8U9Xl/EJ3aijDHaywXTW3QbZ6LuCocur1YA==}
engines: {node: '>=12.20'}
@@ -6875,13 +4956,6 @@ packages:
string.prototype.padend: 3.1.3
dev: true
- /npm-run-path/4.0.1:
- resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
- engines: {node: '>=8'}
- dependencies:
- path-key: 3.1.1
- dev: true
-
/npm-run-path/5.1.0:
resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -7132,32 +5206,6 @@ packages:
lines-and-columns: 1.2.4
dev: false
- /parse-request/5.0.2:
- resolution: {integrity: sha512-yu4biRHEWW7rydAUcKIbxpVfNTa/i0cTdalQLUb9sYSi287YK2OwWgMwN4Cu8KgjlMiUindR5ZHA32uqqcTeTw==}
- engines: {node: '>=14'}
- dependencies:
- browser-hrtime: 1.1.8
- bson-objectid: 2.0.4
- convert-hrtime: 3.0.0
- cookie: 0.5.0
- credit-card-type: 9.1.0
- debug: 4.3.4
- fast-safe-stringify: 2.1.1
- http-headers: 3.0.2
- is-array-buffer: 2.0.0
- is-buffer: 2.0.5
- is-stream: 2.0.1
- is-uuid: 1.0.2
- ms: 2.1.3
- no-case: 2.3.2
- qs: 6.11.0
- rfdc: 1.3.0
- sensitive-fields: 0.0.9
- url-parse: 1.5.10
- transitivePeerDependencies:
- - supports-color
- dev: false
-
/parse-request/5.1.0:
resolution: {integrity: sha512-CzdzrgihIpIOwQ12hDBln1qbltwDSTle/JkXKggLqrxFVMygcRPKiR6BnI2Za4opOcQgB6S4pt/bijD8tyrA3Q==}
engines: {node: '>=14'}
@@ -7225,11 +5273,7 @@ packages:
/path-type/4.0.0:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
-
- /pause-stream/0.0.11:
- resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==}
- dependencies:
- through: 2.3.8
+ dev: true
/pick-deep/1.0.0:
resolution: {integrity: sha512-Uy0VUtabou1sPl/vVClBFrWi4Ae/D3Vqu44FJawmm4lnduu5E16ykw8kh15fiUeLQ6lbmXQ0EMr3YIsqpLZl+A==}
@@ -7302,12 +5346,6 @@ packages:
hasBin: true
dev: true
- /playwright-core/1.28.1:
- resolution: {integrity: sha512-3PixLnGPno0E8rSBJjtwqTwJe3Yw72QwBBBxNoukIj3lEeBNXwbNiKrNuB1oyQgTBw5QHUhNO3SteEtHaMK6ag==}
- engines: {node: '>=14'}
- hasBin: true
- dev: true
-
/postcss-import/14.1.0_postcss@8.4.19:
resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==}
engines: {node: '>=10.0.0'}
@@ -7344,23 +5382,6 @@ packages:
postcss: 8.4.19
yaml: 1.10.2
- /postcss-load-config/4.0.1_postcss@8.4.19:
- resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==}
- engines: {node: '>= 14'}
- peerDependencies:
- postcss: '>=8.0.9'
- ts-node: '>=9.0.0'
- peerDependenciesMeta:
- postcss:
- optional: true
- ts-node:
- optional: true
- dependencies:
- lilconfig: 2.0.6
- postcss: 8.4.19
- yaml: 2.1.3
- dev: true
-
/postcss-nested/6.0.0_postcss@8.4.19:
resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==}
engines: {node: '>=12.0'}
@@ -7400,16 +5421,6 @@ packages:
fast-diff: 1.2.0
dev: true
- /prettier-plugin-svelte/2.8.1_3ndnxlh52lolrqe4kgjgbxb3xa:
- resolution: {integrity: sha512-KA3K1J3/wKDnCxW7ZDRA/QL2Q67N7Xs3gOERqJ5X1qFjq1DdnN3K1R29scSKwh+kA8FF67pXbYytUpvN/i3iQw==}
- peerDependencies:
- prettier: ^1.16.4 || ^2.0.0
- svelte: ^3.2.0
- dependencies:
- prettier: 2.8.0
- svelte: 3.53.1
- dev: true
-
/prettier-plugin-svelte/2.8.1_nryolsexf6k3znhuh4uzpugsem:
resolution: {integrity: sha512-KA3K1J3/wKDnCxW7ZDRA/QL2Q67N7Xs3gOERqJ5X1qFjq1DdnN3K1R29scSKwh+kA8FF67pXbYytUpvN/i3iQw==}
peerDependencies:
@@ -7426,27 +5437,12 @@ packages:
hasBin: true
dev: true
- /prettier/2.8.0:
- resolution: {integrity: sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==}
- engines: {node: '>=10.13.0'}
- hasBin: true
- dev: true
-
/prettier/2.8.2:
resolution: {integrity: sha512-BtRV9BcncDyI2tsuS19zzhzoxD8Dh8LiCx7j7tHzrkz8GFXAexeWFdi22mjE1d16dftH2qNaytVxqiRTGlMfpw==}
engines: {node: '>=10.13.0'}
hasBin: true
dev: true
- /prisma/4.6.1:
- resolution: {integrity: sha512-BR4itMCuzrDV4tn3e2TF+nh1zIX/RVU0isKtKoN28ADeoJ9nYaMhiuRRkFd2TZN8+l/XfYzoRKyHzUFXLQhmBQ==}
- engines: {node: '>=14.17'}
- hasBin: true
- requiresBuild: true
- dependencies:
- '@prisma/engines': 4.6.1
- dev: false
-
/prisma/4.8.1:
resolution: {integrity: sha512-ZMLnSjwulIeYfaU1O6/LF6PEJzxN5par5weykxMykS9Z6ara/j76JH3Yo2AH3bgJbPN4Z6NeCK9s5fDkzf33cg==}
engines: {node: '>=14.17'}
@@ -7477,13 +5473,6 @@ packages:
ipaddr.js: 1.9.1
dev: false
- /ps-tree/1.2.0:
- resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==}
- engines: {node: '>= 0.10'}
- hasBin: true
- dependencies:
- event-stream: 3.3.4
-
/pseudomap/1.0.2:
resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==}
dev: true
@@ -7686,12 +5675,6 @@ packages:
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
- /responselike/2.0.0:
- resolution: {integrity: sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==}
- dependencies:
- lowercase-keys: 2.0.0
- dev: false
-
/responselike/3.0.0:
resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==}
engines: {node: '>=14.16'}
@@ -7759,12 +5742,6 @@ packages:
tslib: 1.14.1
dev: true
- /rxjs/7.6.0:
- resolution: {integrity: sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==}
- dependencies:
- tslib: 2.4.1
- dev: true
-
/sade/1.8.1:
resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
engines: {node: '>=6'}
@@ -7854,6 +5831,7 @@ packages:
/set-cookie-parser/2.5.1:
resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==}
+ dev: false
/setprototypeof/1.2.0:
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
@@ -7907,15 +5885,6 @@ packages:
semver: 7.0.0
dev: true
- /sirv/2.0.2:
- resolution: {integrity: sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==}
- engines: {node: '>= 10'}
- dependencies:
- '@polka/url': 1.0.0-next.21
- mrmime: 1.0.1
- totalist: 3.0.0
- dev: true
-
/slash/1.0.0:
resolution: {integrity: sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==}
engines: {node: '>=0.10.0'}
@@ -7926,11 +5895,6 @@ packages:
engines: {node: '>=8'}
dev: true
- /slash/4.0.0:
- resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==}
- engines: {node: '>=12'}
- dev: false
-
/socket.io-adapter/2.4.0:
resolution: {integrity: sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==}
dev: false
@@ -8001,23 +5965,11 @@ packages:
source-map: 0.5.7
dev: true
- /source-map-support/0.5.21:
- resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
- dependencies:
- buffer-from: 1.1.2
- source-map: 0.6.1
- dev: true
-
/source-map/0.5.7:
resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
engines: {node: '>=0.10.0'}
dev: true
- /source-map/0.6.1:
- resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
- engines: {node: '>=0.10.0'}
- dev: true
-
/sourcemap-codec/1.4.8:
resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
deprecated: Please use @jridgewell/sourcemap-codec instead
@@ -8044,20 +5996,11 @@ packages:
resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==}
dev: false
- /split/0.3.3:
- resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==}
- dependencies:
- through: 2.3.8
-
/split2/4.1.0:
resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==}
engines: {node: '>= 10.x'}
dev: false
- /ssh-config/4.1.6:
- resolution: {integrity: sha512-YdPYn/2afoBonSFoMSvC1FraA/LKKrvy8UvbvAFGJ8gdlKuANvufLLkf8ynF2uq7Tl5+DQBIFyN37//09nAgNQ==}
- dev: false
-
/ssh-config/4.2.0:
resolution: {integrity: sha512-GZtg/g6ZSki0AUhpw0bgB4jLkfPnxf/Qjw1tRsTq+KWD+eqJe5c4Ggaihp+csaLtesUnUOte924a7kwVNJbt7A==}
dev: false
@@ -8074,22 +6017,6 @@ packages:
nan: 2.16.0
dev: false
- /start-server-and-test/1.14.0:
- resolution: {integrity: sha512-on5ELuxO2K0t8EmNj9MtVlFqwBMxfWOhu4U7uZD1xccVpFlOQKR93CSe0u98iQzfNxRyaNTb/CdadbNllplTsw==}
- engines: {node: '>=6'}
- hasBin: true
- dependencies:
- bluebird: 3.7.2
- check-more-types: 2.24.0
- debug: 4.3.2
- execa: 5.1.1
- lazy-ass: 1.6.0
- ps-tree: 1.2.0
- wait-on: 6.0.0_debug@4.3.2
- transitivePeerDependencies:
- - supports-color
- dev: true
-
/statuses/2.0.1:
resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
engines: {node: '>= 0.8'}
@@ -8105,28 +6032,11 @@ packages:
reusify: 1.0.4
dev: false
- /stream-browserify/3.0.0:
- resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==}
- dependencies:
- inherits: 2.0.4
- readable-stream: 3.6.0
- dev: false
-
- /stream-combiner/0.0.4:
- resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==}
- dependencies:
- duplexer: 0.1.2
-
/stream-wormhole/1.1.0:
resolution: {integrity: sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==}
engines: {node: '>=4.0.0'}
dev: false
- /streamsearch/1.1.0:
- resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
- engines: {node: '>=10.0.0'}
- dev: true
-
/string-width/4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
@@ -8206,11 +6116,6 @@ packages:
resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
engines: {node: '>=4'}
- /strip-final-newline/2.0.0:
- resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
- engines: {node: '>=6'}
- dev: true
-
/strip-final-newline/3.0.0:
resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
engines: {node: '>=12'}
@@ -8228,10 +6133,6 @@ packages:
engines: {node: '>=8'}
dev: true
- /strnum/1.0.5:
- resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==}
- dev: false
-
/super-regex/0.2.0:
resolution: {integrity: sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==}
engines: {node: '>=14.16'}
@@ -8241,13 +6142,6 @@ packages:
time-span: 5.1.0
dev: false
- /superjson/1.11.0:
- resolution: {integrity: sha512-6PfAg1FKhqkwWvPb2uXhH4MkMttdc17eJ91+Aoz4s1XUEDZFmLfFx/xVA3wgkPxAGy5dpozgGdK6V/n20Wj9yg==}
- engines: {node: '>=10'}
- dependencies:
- copy-anything: 3.0.3
- dev: false
-
/supports-color/2.0.0:
resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==}
engines: {node: '>=0.8.0'}
@@ -8270,34 +6164,6 @@ packages:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
- /svelte-check/2.9.2_g7z2chviobwh5b53nr2x4mtdq4:
- resolution: {integrity: sha512-DRi8HhnCiqiGR2YF9ervPGvtoYrheE09cXieCTEqeTPOTJzfoa54Py8rovIBv4bH4n5HgZYIyTQ3DDLHQLl2uQ==}
- hasBin: true
- peerDependencies:
- svelte: ^3.24.0
- dependencies:
- '@jridgewell/trace-mapping': 0.3.9
- chokidar: 3.5.3
- fast-glob: 3.2.12
- import-fresh: 3.3.0
- picocolors: 1.0.0
- sade: 1.8.1
- svelte: 3.53.1
- svelte-preprocess: 4.10.7_m6amlx2endawbdmypezbyercsm
- typescript: 4.9.4
- transitivePeerDependencies:
- - '@babel/core'
- - coffeescript
- - less
- - node-sass
- - postcss
- - postcss-load-config
- - pug
- - sass
- - stylus
- - sugarss
- dev: true
-
/svelte-check/2.9.2_mocwzvuqzrhb37u7s4hjvvzl3i:
resolution: {integrity: sha512-DRi8HhnCiqiGR2YF9ervPGvtoYrheE09cXieCTEqeTPOTJzfoa54Py8rovIBv4bH4n5HgZYIyTQ3DDLHQLl2uQ==}
hasBin: true
@@ -8335,112 +6201,6 @@ packages:
svelte: 3.53.1
dev: true
- /svelte-preprocess/4.10.7_jgeygver3mevbte7srfft5qwby:
- resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==}
- engines: {node: '>= 9.11.2'}
- requiresBuild: true
- peerDependencies:
- '@babel/core': ^7.10.2
- coffeescript: ^2.5.1
- less: ^3.11.3 || ^4.0.0
- node-sass: '*'
- postcss: ^7 || ^8
- postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0
- pug: ^3.0.0
- sass: ^1.26.8
- stylus: ^0.55.0
- sugarss: ^2.0.0
- svelte: ^3.23.0
- typescript: ^3.9.5 || ^4.0.0
- peerDependenciesMeta:
- '@babel/core':
- optional: true
- coffeescript:
- optional: true
- less:
- optional: true
- node-sass:
- optional: true
- postcss:
- optional: true
- postcss-load-config:
- optional: true
- pug:
- optional: true
- sass:
- optional: true
- stylus:
- optional: true
- sugarss:
- optional: true
- typescript:
- optional: true
- dependencies:
- '@types/pug': 2.0.6
- '@types/sass': 1.43.1
- detect-indent: 6.1.0
- magic-string: 0.25.9
- postcss: 8.4.19
- postcss-load-config: 4.0.1_postcss@8.4.19
- sorcery: 0.10.0
- strip-indent: 3.0.0
- svelte: 3.53.1
- typescript: 4.9.3
- dev: true
-
- /svelte-preprocess/4.10.7_m6amlx2endawbdmypezbyercsm:
- resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==}
- engines: {node: '>= 9.11.2'}
- requiresBuild: true
- peerDependencies:
- '@babel/core': ^7.10.2
- coffeescript: ^2.5.1
- less: ^3.11.3 || ^4.0.0
- node-sass: '*'
- postcss: ^7 || ^8
- postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0
- pug: ^3.0.0
- sass: ^1.26.8
- stylus: ^0.55.0
- sugarss: ^2.0.0
- svelte: ^3.23.0
- typescript: ^3.9.5 || ^4.0.0
- peerDependenciesMeta:
- '@babel/core':
- optional: true
- coffeescript:
- optional: true
- less:
- optional: true
- node-sass:
- optional: true
- postcss:
- optional: true
- postcss-load-config:
- optional: true
- pug:
- optional: true
- sass:
- optional: true
- stylus:
- optional: true
- sugarss:
- optional: true
- typescript:
- optional: true
- dependencies:
- '@types/pug': 2.0.6
- '@types/sass': 1.43.1
- detect-indent: 6.1.0
- magic-string: 0.25.9
- postcss: 8.4.19
- postcss-load-config: 4.0.1_postcss@8.4.19
- sorcery: 0.10.0
- strip-indent: 3.0.0
- svelte: 3.53.1
- typescript: 4.9.4
- dev: true
-
/svelte-preprocess/4.10.7_mvbmsfnr3ibpjsbee6imjcb33m:
resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==}
engines: {node: '>= 9.11.2'}
@@ -8640,6 +6400,7 @@ packages:
/through/2.3.8:
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+ dev: true
/time-span/5.1.0:
resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==}
@@ -8687,11 +6448,6 @@ packages:
resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==}
dev: false
- /totalist/3.0.0:
- resolution: {integrity: sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==}
- engines: {node: '>=6'}
- dev: true
-
/touch/3.1.0:
resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==}
hasBin: true
@@ -8735,37 +6491,6 @@ packages:
yn: 3.1.1
dev: false
- /ts-node/10.8.2_wup25etrarvlqkprac7h35hj7u:
- resolution: {integrity: sha512-LYdGnoGddf1D6v8REPtIH+5iq/gTDuZqv2/UJUU7tKjuEU8xVZorBM+buCGNjj+pGEud+sOoM4CX3/YzINpENA==}
- hasBin: true
- peerDependencies:
- '@swc/core': '>=1.2.50'
- '@swc/wasm': '>=1.2.50'
- '@types/node': '*'
- typescript: '>=2.7'
- peerDependenciesMeta:
- '@swc/core':
- optional: true
- '@swc/wasm':
- optional: true
- dependencies:
- '@cspotcode/source-map-support': 0.8.1
- '@tsconfig/node10': 1.0.8
- '@tsconfig/node12': 1.0.9
- '@tsconfig/node14': 1.0.1
- '@tsconfig/node16': 1.0.2
- '@types/node': 18.11.9
- acorn: 8.8.0
- acorn-walk: 8.2.0
- arg: 4.1.3
- create-require: 1.1.1
- diff: 4.0.2
- make-error: 1.3.6
- typescript: 4.9.3
- v8-compile-cache-lib: 3.0.1
- yn: 3.1.1
- dev: false
-
/tsconfig-paths/4.1.2:
resolution: {integrity: sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==}
engines: {node: '>=6'}
@@ -8779,6 +6504,7 @@ packages:
/tslib/2.4.1:
resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==}
+ dev: true
/tsutils/3.21.0_typescript@4.9.3:
resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
@@ -8800,17 +6526,6 @@ packages:
typescript: 4.9.4
dev: true
- /tsx/3.12.1:
- resolution: {integrity: sha512-Rcg1x+rNe7qwlP8j7kx4VjP/pJo/V57k+17hlrn6a7FuQLNwkaw5W4JF75tYornNVCxkXdSUnqlIT8JY/ttvIw==}
- hasBin: true
- dependencies:
- '@esbuild-kit/cjs-loader': 2.4.1
- '@esbuild-kit/core-utils': 3.0.0
- '@esbuild-kit/esm-loader': 2.5.4
- optionalDependencies:
- fsevents: 2.3.2
- dev: true
-
/tweetnacl/0.14.5:
resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
dev: false
@@ -8850,6 +6565,7 @@ packages:
resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==}
engines: {node: '>=4.2.0'}
hasBin: true
+ dev: true
/typescript/4.9.4:
resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==}
@@ -8875,23 +6591,11 @@ packages:
resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==}
dev: true
- /undici/5.13.0:
- resolution: {integrity: sha512-UDZKtwb2k7KRsK4SdXWG7ErXiL7yTGgLWvk2AXO1JMjgjh404nFo6tWSCM2xMpJwMPx3J8i/vfqEh1zOqvj82Q==}
- engines: {node: '>=12.18'}
- dependencies:
- busboy: 1.6.0
- dev: true
-
/unique-names-generator/4.7.1:
resolution: {integrity: sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow==}
engines: {node: '>=8'}
dev: false
- /universalify/2.0.0:
- resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
- engines: {node: '>= 10.0.0'}
- dev: false
-
/unset-value/2.0.1:
resolution: {integrity: sha512-2hvrBfjUE00PkqN+q0XP6yRAOGrR06uSiUoIQGZkc7GxvQ9H7v8quUPNtZjMg4uux69i8HWpIjLPUKwCuRGyNg==}
engines: {node: '>=10'}
@@ -8925,11 +6629,6 @@ packages:
/util-deprecate/1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
- /uuid/8.3.2:
- resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
- hasBin: true
- dev: false
-
/v8-compile-cache-lib/3.0.1:
resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
dev: false
@@ -8978,48 +6677,6 @@ packages:
fsevents: 2.3.2
dev: true
- /vitefu/0.2.3_vite@3.2.4:
- resolution: {integrity: sha512-75l7TTuU8isAhz1QFtNKjDkqjxvndfMC1AfIMjJ0ZQ59ZD0Ow9QOIsJJX16Wv9PS8f+zMzp6fHy5cCbKG/yVUQ==}
- peerDependencies:
- vite: ^3.0.0 || ^4.0.0
- peerDependenciesMeta:
- vite:
- optional: true
- dependencies:
- vite: 3.2.4
- dev: true
-
- /wait-on/6.0.0_debug@4.3.2:
- resolution: {integrity: sha512-tnUJr9p5r+bEYXPUdRseolmz5XqJTTj98JgOsfBn7Oz2dxfE2g3zw1jE+Mo8lopM3j3et/Mq1yW7kKX6qw7RVw==}
- engines: {node: '>=10.0.0'}
- hasBin: true
- dependencies:
- axios: 0.21.4_debug@4.3.2
- joi: 17.7.0
- lodash: 4.17.21
- minimist: 1.2.7
- rxjs: 7.6.0
- transitivePeerDependencies:
- - debug
- dev: true
-
- /wait-port/1.0.4:
- resolution: {integrity: sha512-w8Ftna3h6XSFWWc2JC5gZEgp64nz8bnaTp5cvzbJSZ53j+omktWTDdwXxEF0jM8YveviLgFWvNGrSvRHnkyHyw==}
- engines: {node: '>=10'}
- hasBin: true
- dependencies:
- chalk: 4.1.2
- commander: 9.4.1
- debug: 4.3.4
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /web-streams-polyfill/3.2.1:
- resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==}
- engines: {node: '>= 8'}
- dev: false
-
/which-boxed-primitive/1.0.2:
resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
dependencies:
@@ -9052,19 +6709,6 @@ packages:
/wrappy/1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
- /ws/8.11.0:
- resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==}
- engines: {node: '>=10.0.0'}
- peerDependencies:
- bufferutil: ^4.0.1
- utf-8-validate: ^5.0.2
- peerDependenciesMeta:
- bufferutil:
- optional: true
- utf-8-validate:
- optional: true
- dev: false
-
/ws/8.2.3:
resolution: {integrity: sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==}
engines: {node: '>=10.0.0'}
@@ -9098,10 +6742,6 @@ packages:
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
engines: {node: '>= 6'}
- /yaml/2.1.3:
- resolution: {integrity: sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==}
- engines: {node: '>= 14'}
-
/yn/3.1.1:
resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
engines: {node: '>=6'}
@@ -9128,27 +6768,3 @@ packages:
property-expr: 2.0.5
toposort: 2.0.2
dev: false
-
- /zod/3.19.1:
- resolution: {integrity: sha512-LYjZsEDhCdYET9ikFu6dVPGp2YH9DegXjdJToSzD9rO6fy4qiRYFoyEYwps88OseJlPyl2NOe2iJuhEhL7IpEA==}
- dev: false
-
- /zx/7.1.1:
- resolution: {integrity: sha512-5YlTO2AJ+Ku2YuZKSSSqnUKuagcM/f/j4LmHs15O84Ch80Z9gzR09ZK3gR7GV+rc8IFpz2H/XNFtFVmj31yrZA==}
- engines: {node: '>= 16.0.0'}
- hasBin: true
- dependencies:
- '@types/fs-extra': 9.0.13
- '@types/minimist': 1.2.2
- '@types/node': 18.11.18
- '@types/ps-tree': 1.1.2
- '@types/which': 2.0.1
- chalk: 5.1.2
- fs-extra: 10.1.0
- globby: 13.1.2
- minimist: 1.2.6
- node-fetch: 3.2.10
- ps-tree: 1.2.0
- which: 2.0.2
- yaml: 2.1.3
- dev: false